|
- (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
- (function (process){
- // vim:ts=4:sts=4:sw=4:
- /*!
- *
- * Copyright 2009-2012 Kris Kowal under the terms of the MIT
- * license found at http://github.com/kriskowal/q/raw/master/LICENSE
- *
- * With parts by Tyler Close
- * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
- * at http://www.opensource.org/licenses/mit-license.html
- * Forked at ref_send.js version: 2009-05-11
- *
- * With parts by Mark Miller
- * Copyright (C) 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
- (function (definition) {
- "use strict";
-
- // This file will function properly as a <script> tag, or a module
- // using CommonJS and NodeJS or RequireJS module formats. In
- // Common/Node/RequireJS, the module exports the Q API and when
- // executed as a simple <script>, it creates a Q global instead.
-
- // Montage Require
- if (typeof bootstrap === "function") {
- bootstrap("promise", definition);
-
- // CommonJS
- } else if (typeof exports === "object" && typeof module === "object") {
- module.exports = definition();
-
- // RequireJS
- } else if (typeof define === "function" && define.amd) {
- define(definition);
-
- // SES (Secure EcmaScript)
- } else if (typeof ses !== "undefined") {
- if (!ses.ok()) {
- return;
- } else {
- ses.makeQ = definition;
- }
-
- // <script>
- } else if (typeof window !== "undefined" || typeof self !== "undefined") {
- // Prefer window over self for add-on scripts. Use self for
- // non-windowed contexts.
- var global = typeof window !== "undefined" ? window : self;
-
- // Get the `window` object, save the previous Q global
- // and initialize Q as a global.
- var previousQ = global.Q;
- global.Q = definition();
-
- // Add a noConflict function so Q can be removed from the
- // global namespace.
- global.Q.noConflict = function () {
- global.Q = previousQ;
- return this;
- };
-
- } else {
- throw new Error("This environment was not anticipated by Q. Please file a bug.");
- }
-
- })(function () {
- "use strict";
-
- var hasStacks = false;
- try {
- throw new Error();
- } catch (e) {
- hasStacks = !!e.stack;
- }
-
- // All code after this point will be filtered from stack traces reported
- // by Q.
- var qStartingLine = captureLine();
- var qFileName;
-
- // shims
-
- // used for fallback in "allResolved"
- var noop = function () {};
-
- // Use the fastest possible means to execute a task in a future turn
- // of the event loop.
- var nextTick =(function () {
- // linked list of tasks (single, with head node)
- var head = {task: void 0, next: null};
- var tail = head;
- var flushing = false;
- var requestTick = void 0;
- var isNodeJS = false;
- // queue for late tasks, used by unhandled rejection tracking
- var laterQueue = [];
-
- function flush() {
- /* jshint loopfunc: true */
- var task, domain;
-
- while (head.next) {
- head = head.next;
- task = head.task;
- head.task = void 0;
- domain = head.domain;
-
- if (domain) {
- head.domain = void 0;
- domain.enter();
- }
- runSingle(task, domain);
-
- }
- while (laterQueue.length) {
- task = laterQueue.pop();
- runSingle(task);
- }
- flushing = false;
- }
- // runs a single function in the async queue
- function runSingle(task, domain) {
- try {
- task();
-
- } catch (e) {
- if (isNodeJS) {
- // In node, uncaught exceptions are considered fatal errors.
- // Re-throw them synchronously to interrupt flushing!
-
- // Ensure continuation if the uncaught exception is suppressed
- // listening "uncaughtException" events (as domains does).
- // Continue in next event to avoid tick recursion.
- if (domain) {
- domain.exit();
- }
- setTimeout(flush, 0);
- if (domain) {
- domain.enter();
- }
-
- throw e;
-
- } else {
- // In browsers, uncaught exceptions are not fatal.
- // Re-throw them asynchronously to avoid slow-downs.
- setTimeout(function () {
- throw e;
- }, 0);
- }
- }
-
- if (domain) {
- domain.exit();
- }
- }
-
- nextTick = function (task) {
- tail = tail.next = {
- task: task,
- domain: isNodeJS && process.domain,
- next: null
- };
-
- if (!flushing) {
- flushing = true;
- requestTick();
- }
- };
-
- if (typeof process === "object" &&
- process.toString() === "[object process]" && process.nextTick) {
- // Ensure Q is in a real Node environment, with a `process.nextTick`.
- // To see through fake Node environments:
- // * Mocha test runner - exposes a `process` global without a `nextTick`
- // * Browserify - exposes a `process.nexTick` function that uses
- // `setTimeout`. In this case `setImmediate` is preferred because
- // it is faster. Browserify's `process.toString()` yields
- // "[object Object]", while in a real Node environment
- // `process.nextTick()` yields "[object process]".
- isNodeJS = true;
-
- requestTick = function () {
- process.nextTick(flush);
- };
-
- } else if (typeof setImmediate === "function") {
- // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
- if (typeof window !== "undefined") {
- requestTick = setImmediate.bind(window, flush);
- } else {
- requestTick = function () {
- setImmediate(flush);
- };
- }
-
- } else if (typeof MessageChannel !== "undefined") {
- // modern browsers
- // http://www.nonblocking.io/2011/06/windownexttick.html
- var channel = new MessageChannel();
- // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
- // working message ports the first time a page loads.
- channel.port1.onmessage = function () {
- requestTick = requestPortTick;
- channel.port1.onmessage = flush;
- flush();
- };
- var requestPortTick = function () {
- // Opera requires us to provide a message payload, regardless of
- // whether we use it.
- channel.port2.postMessage(0);
- };
- requestTick = function () {
- setTimeout(flush, 0);
- requestPortTick();
- };
-
- } else {
- // old browsers
- requestTick = function () {
- setTimeout(flush, 0);
- };
- }
- // runs a task after all other tasks have been run
- // this is useful for unhandled rejection tracking that needs to happen
- // after all `then`d tasks have been run.
- nextTick.runAfter = function (task) {
- laterQueue.push(task);
- if (!flushing) {
- flushing = true;
- requestTick();
- }
- };
- return nextTick;
- })();
-
- // Attempt to make generics safe in the face of downstream
- // modifications.
- // There is no situation where this is necessary.
- // If you need a security guarantee, these primordials need to be
- // deeply frozen anyway, and if you don’t need a security guarantee,
- // this is just plain paranoid.
- // However, this **might** have the nice side-effect of reducing the size of
- // the minified code by reducing x.call() to merely x()
- // See Mark Miller’s explanation of what this does.
- // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
- var call = Function.call;
- function uncurryThis(f) {
- return function () {
- return call.apply(f, arguments);
- };
- }
- // This is equivalent, but slower:
- // uncurryThis = Function_bind.bind(Function_bind.call);
- // http://jsperf.com/uncurrythis
-
- var array_slice = uncurryThis(Array.prototype.slice);
-
- var array_reduce = uncurryThis(
- Array.prototype.reduce || function (callback, basis) {
- var index = 0,
- length = this.length;
- // concerning the initial value, if one is not provided
- if (arguments.length === 1) {
- // seek to the first value in the array, accounting
- // for the possibility that is is a sparse array
- do {
- if (index in this) {
- basis = this[index++];
- break;
- }
- if (++index >= length) {
- throw new TypeError();
- }
- } while (1);
- }
- // reduce
- for (; index < length; index++) {
- // account for the possibility that the array is sparse
- if (index in this) {
- basis = callback(basis, this[index], index);
- }
- }
- return basis;
- }
- );
-
- var array_indexOf = uncurryThis(
- Array.prototype.indexOf || function (value) {
- // not a very good shim, but good enough for our one use of it
- for (var i = 0; i < this.length; i++) {
- if (this[i] === value) {
- return i;
- }
- }
- return -1;
- }
- );
-
- var array_map = uncurryThis(
- Array.prototype.map || function (callback, thisp) {
- var self = this;
- var collect = [];
- array_reduce(self, function (undefined, value, index) {
- collect.push(callback.call(thisp, value, index, self));
- }, void 0);
- return collect;
- }
- );
-
- var object_create = Object.create || function (prototype) {
- function Type() { }
- Type.prototype = prototype;
- return new Type();
- };
-
- var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
-
- var object_keys = Object.keys || function (object) {
- var keys = [];
- for (var key in object) {
- if (object_hasOwnProperty(object, key)) {
- keys.push(key);
- }
- }
- return keys;
- };
-
- var object_toString = uncurryThis(Object.prototype.toString);
-
- function isObject(value) {
- return value === Object(value);
- }
-
- // generator related shims
-
- // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
- function isStopIteration(exception) {
- return (
- object_toString(exception) === "[object StopIteration]" ||
- exception instanceof QReturnValue
- );
- }
-
- // FIXME: Remove this helper and Q.return once ES6 generators are in
- // SpiderMonkey.
- var QReturnValue;
- if (typeof ReturnValue !== "undefined") {
- QReturnValue = ReturnValue;
- } else {
- QReturnValue = function (value) {
- this.value = value;
- };
- }
-
- // long stack traces
-
- var STACK_JUMP_SEPARATOR = "From previous event:";
-
- function makeStackTraceLong(error, promise) {
- // If possible, transform the error stack trace by removing Node and Q
- // cruft, then concatenating with the stack trace of `promise`. See #57.
- if (hasStacks &&
- promise.stack &&
- typeof error === "object" &&
- error !== null &&
- error.stack &&
- error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1
- ) {
- var stacks = [];
- for (var p = promise; !!p; p = p.source) {
- if (p.stack) {
- stacks.unshift(p.stack);
- }
- }
- stacks.unshift(error.stack);
-
- var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
- error.stack = filterStackString(concatedStacks);
- }
- }
-
- function filterStackString(stackString) {
- var lines = stackString.split("\n");
- var desiredLines = [];
- for (var i = 0; i < lines.length; ++i) {
- var line = lines[i];
-
- if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
- desiredLines.push(line);
- }
- }
- return desiredLines.join("\n");
- }
-
- function isNodeFrame(stackLine) {
- return stackLine.indexOf("(module.js:") !== -1 ||
- stackLine.indexOf("(node.js:") !== -1;
- }
-
- function getFileNameAndLineNumber(stackLine) {
- // Named functions: "at functionName (filename:lineNumber:columnNumber)"
- // In IE10 function name can have spaces ("Anonymous function") O_o
- var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
- if (attempt1) {
- return [attempt1[1], Number(attempt1[2])];
- }
-
- // Anonymous functions: "at filename:lineNumber:columnNumber"
- var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
- if (attempt2) {
- return [attempt2[1], Number(attempt2[2])];
- }
-
- // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
- var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
- if (attempt3) {
- return [attempt3[1], Number(attempt3[2])];
- }
- }
-
- function isInternalFrame(stackLine) {
- var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
-
- if (!fileNameAndLineNumber) {
- return false;
- }
-
- var fileName = fileNameAndLineNumber[0];
- var lineNumber = fileNameAndLineNumber[1];
-
- return fileName === qFileName &&
- lineNumber >= qStartingLine &&
- lineNumber <= qEndingLine;
- }
-
- // discover own file name and line number range for filtering stack
- // traces
- function captureLine() {
- if (!hasStacks) {
- return;
- }
-
- try {
- throw new Error();
- } catch (e) {
- var lines = e.stack.split("\n");
- var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
- var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
- if (!fileNameAndLineNumber) {
- return;
- }
-
- qFileName = fileNameAndLineNumber[0];
- return fileNameAndLineNumber[1];
- }
- }
-
- function deprecate(callback, name, alternative) {
- return function () {
- if (typeof console !== "undefined" &&
- typeof console.warn === "function") {
- console.warn(name + " is deprecated, use " + alternative +
- " instead.", new Error("").stack);
- }
- return callback.apply(callback, arguments);
- };
- }
-
- // end of shims
- // beginning of real work
-
- /**
- * Constructs a promise for an immediate reference, passes promises through, or
- * coerces promises from different systems.
- * @param value immediate reference or promise
- */
- function Q(value) {
- // If the object is already a Promise, return it directly. This enables
- // the resolve function to both be used to created references from objects,
- // but to tolerably coerce non-promises to promises.
- if (value instanceof Promise) {
- return value;
- }
-
- // assimilate thenables
- if (isPromiseAlike(value)) {
- return coerce(value);
- } else {
- return fulfill(value);
- }
- }
- Q.resolve = Q;
-
- /**
- * Performs a task in a future turn of the event loop.
- * @param {Function} task
- */
- Q.nextTick = nextTick;
-
- /**
- * Controls whether or not long stack traces will be on
- */
- Q.longStackSupport = false;
-
- // enable long stacks if Q_DEBUG is set
- if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
- Q.longStackSupport = true;
- }
-
- /**
- * Constructs a {promise, resolve, reject} object.
- *
- * `resolve` is a callback to invoke with a more resolved value for the
- * promise. To fulfill the promise, invoke `resolve` with any value that is
- * not a thenable. To reject the promise, invoke `resolve` with a rejected
- * thenable, or invoke `reject` with the reason directly. To resolve the
- * promise to another thenable, thus putting it in the same state, invoke
- * `resolve` with that other thenable.
- */
- Q.defer = defer;
- function defer() {
- // if "messages" is an "Array", that indicates that the promise has not yet
- // been resolved. If it is "undefined", it has been resolved. Each
- // element of the messages array is itself an array of complete arguments to
- // forward to the resolved promise. We coerce the resolution value to a
- // promise using the `resolve` function because it handles both fully
- // non-thenable values and other thenables gracefully.
- var messages = [], progressListeners = [], resolvedPromise;
-
- var deferred = object_create(defer.prototype);
- var promise = object_create(Promise.prototype);
-
- promise.promiseDispatch = function (resolve, op, operands) {
- var args = array_slice(arguments);
- if (messages) {
- messages.push(args);
- if (op === "when" && operands[1]) { // progress operand
- progressListeners.push(operands[1]);
- }
- } else {
- Q.nextTick(function () {
- resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
- });
- }
- };
-
- // XXX deprecated
- promise.valueOf = function () {
- if (messages) {
- return promise;
- }
- var nearerValue = nearer(resolvedPromise);
- if (isPromise(nearerValue)) {
- resolvedPromise = nearerValue; // shorten chain
- }
- return nearerValue;
- };
-
- promise.inspect = function () {
- if (!resolvedPromise) {
- return { state: "pending" };
- }
- return resolvedPromise.inspect();
- };
-
- if (Q.longStackSupport && hasStacks) {
- try {
- throw new Error();
- } catch (e) {
- // NOTE: don't try to use `Error.captureStackTrace` or transfer the
- // accessor around; that causes memory leaks as per GH-111. Just
- // reify the stack trace as a string ASAP.
- //
- // At the same time, cut off the first line; it's always just
- // "[object Promise]\n", as per the `toString`.
- promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
- }
- }
-
- // NOTE: we do the checks for `resolvedPromise` in each method, instead of
- // consolidating them into `become`, since otherwise we'd create new
- // promises with the lines `become(whatever(value))`. See e.g. GH-252.
-
- function become(newPromise) {
- resolvedPromise = newPromise;
- promise.source = newPromise;
-
- array_reduce(messages, function (undefined, message) {
- Q.nextTick(function () {
- newPromise.promiseDispatch.apply(newPromise, message);
- });
- }, void 0);
-
- messages = void 0;
- progressListeners = void 0;
- }
-
- deferred.promise = promise;
- deferred.resolve = function (value) {
- if (resolvedPromise) {
- return;
- }
-
- become(Q(value));
- };
-
- deferred.fulfill = function (value) {
- if (resolvedPromise) {
- return;
- }
-
- become(fulfill(value));
- };
- deferred.reject = function (reason) {
- if (resolvedPromise) {
- return;
- }
-
- become(reject(reason));
- };
- deferred.notify = function (progress) {
- if (resolvedPromise) {
- return;
- }
-
- array_reduce(progressListeners, function (undefined, progressListener) {
- Q.nextTick(function () {
- progressListener(progress);
- });
- }, void 0);
- };
-
- return deferred;
- }
-
- /**
- * Creates a Node-style callback that will resolve or reject the deferred
- * promise.
- * @returns a nodeback
- */
- defer.prototype.makeNodeResolver = function () {
- var self = this;
- return function (error, value) {
- if (error) {
- self.reject(error);
- } else if (arguments.length > 2) {
- self.resolve(array_slice(arguments, 1));
- } else {
- self.resolve(value);
- }
- };
- };
-
- /**
- * @param resolver {Function} a function that returns nothing and accepts
- * the resolve, reject, and notify functions for a deferred.
- * @returns a promise that may be resolved with the given resolve and reject
- * functions, or rejected by a thrown exception in resolver
- */
- Q.Promise = promise; // ES6
- Q.promise = promise;
- function promise(resolver) {
- if (typeof resolver !== "function") {
- throw new TypeError("resolver must be a function.");
- }
- var deferred = defer();
- try {
- resolver(deferred.resolve, deferred.reject, deferred.notify);
- } catch (reason) {
- deferred.reject(reason);
- }
- return deferred.promise;
- }
-
- promise.race = race; // ES6
- promise.all = all; // ES6
- promise.reject = reject; // ES6
- promise.resolve = Q; // ES6
-
- // XXX experimental. This method is a way to denote that a local value is
- // serializable and should be immediately dispatched to a remote upon request,
- // instead of passing a reference.
- Q.passByCopy = function (object) {
- //freeze(object);
- //passByCopies.set(object, true);
- return object;
- };
-
- Promise.prototype.passByCopy = function () {
- //freeze(object);
- //passByCopies.set(object, true);
- return this;
- };
-
- /**
- * If two promises eventually fulfill to the same value, promises that value,
- * but otherwise rejects.
- * @param x {Any*}
- * @param y {Any*}
- * @returns {Any*} a promise for x and y if they are the same, but a rejection
- * otherwise.
- *
- */
- Q.join = function (x, y) {
- return Q(x).join(y);
- };
-
- Promise.prototype.join = function (that) {
- return Q([this, that]).spread(function (x, y) {
- if (x === y) {
- // TODO: "===" should be Object.is or equiv
- return x;
- } else {
- throw new Error("Can't join: not the same: " + x + " " + y);
- }
- });
- };
-
- /**
- * Returns a promise for the first of an array of promises to become settled.
- * @param answers {Array[Any*]} promises to race
- * @returns {Any*} the first promise to be settled
- */
- Q.race = race;
- function race(answerPs) {
- return promise(function (resolve, reject) {
- // Switch to this once we can assume at least ES5
- // answerPs.forEach(function (answerP) {
- // Q(answerP).then(resolve, reject);
- // });
- // Use this in the meantime
- for (var i = 0, len = answerPs.length; i < len; i++) {
- Q(answerPs[i]).then(resolve, reject);
- }
- });
- }
-
- Promise.prototype.race = function () {
- return this.then(Q.race);
- };
-
- /**
- * Constructs a Promise with a promise descriptor object and optional fallback
- * function. The descriptor contains methods like when(rejected), get(name),
- * set(name, value), post(name, args), and delete(name), which all
- * return either a value, a promise for a value, or a rejection. The fallback
- * accepts the operation name, a resolver, and any further arguments that would
- * have been forwarded to the appropriate method above had a method been
- * provided with the proper name. The API makes no guarantees about the nature
- * of the returned object, apart from that it is usable whereever promises are
- * bought and sold.
- */
- Q.makePromise = Promise;
- function Promise(descriptor, fallback, inspect) {
- if (fallback === void 0) {
- fallback = function (op) {
- return reject(new Error(
- "Promise does not support operation: " + op
- ));
- };
- }
- if (inspect === void 0) {
- inspect = function () {
- return {state: "unknown"};
- };
- }
-
- var promise = object_create(Promise.prototype);
-
- promise.promiseDispatch = function (resolve, op, args) {
- var result;
- try {
- if (descriptor[op]) {
- result = descriptor[op].apply(promise, args);
- } else {
- result = fallback.call(promise, op, args);
- }
- } catch (exception) {
- result = reject(exception);
- }
- if (resolve) {
- resolve(result);
- }
- };
-
- promise.inspect = inspect;
-
- // XXX deprecated `valueOf` and `exception` support
- if (inspect) {
- var inspected = inspect();
- if (inspected.state === "rejected") {
- promise.exception = inspected.reason;
- }
-
- promise.valueOf = function () {
- var inspected = inspect();
- if (inspected.state === "pending" ||
- inspected.state === "rejected") {
- return promise;
- }
- return inspected.value;
- };
- }
-
- return promise;
- }
-
- Promise.prototype.toString = function () {
- return "[object Promise]";
- };
-
- Promise.prototype.then = function (fulfilled, rejected, progressed) {
- var self = this;
- var deferred = defer();
- var done = false; // ensure the untrusted promise makes at most a
- // single call to one of the callbacks
-
- function _fulfilled(value) {
- try {
- return typeof fulfilled === "function" ? fulfilled(value) : value;
- } catch (exception) {
- return reject(exception);
- }
- }
-
- function _rejected(exception) {
- if (typeof rejected === "function") {
- makeStackTraceLong(exception, self);
- try {
- return rejected(exception);
- } catch (newException) {
- return reject(newException);
- }
- }
- return reject(exception);
- }
-
- function _progressed(value) {
- return typeof progressed === "function" ? progressed(value) : value;
- }
-
- Q.nextTick(function () {
- self.promiseDispatch(function (value) {
- if (done) {
- return;
- }
- done = true;
-
- deferred.resolve(_fulfilled(value));
- }, "when", [function (exception) {
- if (done) {
- return;
- }
- done = true;
-
- deferred.resolve(_rejected(exception));
- }]);
- });
-
- // Progress propagator need to be attached in the current tick.
- self.promiseDispatch(void 0, "when", [void 0, function (value) {
- var newValue;
- var threw = false;
- try {
- newValue = _progressed(value);
- } catch (e) {
- threw = true;
- if (Q.onerror) {
- Q.onerror(e);
- } else {
- throw e;
- }
- }
-
- if (!threw) {
- deferred.notify(newValue);
- }
- }]);
-
- return deferred.promise;
- };
-
- Q.tap = function (promise, callback) {
- return Q(promise).tap(callback);
- };
-
- /**
- * Works almost like "finally", but not called for rejections.
- * Original resolution value is passed through callback unaffected.
- * Callback may return a promise that will be awaited for.
- * @param {Function} callback
- * @returns {Q.Promise}
- * @example
- * doSomething()
- * .then(...)
- * .tap(console.log)
- * .then(...);
- */
- Promise.prototype.tap = function (callback) {
- callback = Q(callback);
-
- return this.then(function (value) {
- return callback.fcall(value).thenResolve(value);
- });
- };
-
- /**
- * Registers an observer on a promise.
- *
- * Guarantees:
- *
- * 1. that fulfilled and rejected will be called only once.
- * 2. that either the fulfilled callback or the rejected callback will be
- * called, but not both.
- * 3. that fulfilled and rejected will not be called in this turn.
- *
- * @param value promise or immediate reference to observe
- * @param fulfilled function to be called with the fulfilled value
- * @param rejected function to be called with the rejection exception
- * @param progressed function to be called on any progress notifications
- * @return promise for the return value from the invoked callback
- */
- Q.when = when;
- function when(value, fulfilled, rejected, progressed) {
- return Q(value).then(fulfilled, rejected, progressed);
- }
-
- Promise.prototype.thenResolve = function (value) {
- return this.then(function () { return value; });
- };
-
- Q.thenResolve = function (promise, value) {
- return Q(promise).thenResolve(value);
- };
-
- Promise.prototype.thenReject = function (reason) {
- return this.then(function () { throw reason; });
- };
-
- Q.thenReject = function (promise, reason) {
- return Q(promise).thenReject(reason);
- };
-
- /**
- * If an object is not a promise, it is as "near" as possible.
- * If a promise is rejected, it is as "near" as possible too.
- * If it’s a fulfilled promise, the fulfillment value is nearer.
- * If it’s a deferred promise and the deferred has been resolved, the
- * resolution is "nearer".
- * @param object
- * @returns most resolved (nearest) form of the object
- */
-
- // XXX should we re-do this?
- Q.nearer = nearer;
- function nearer(value) {
- if (isPromise(value)) {
- var inspected = value.inspect();
- if (inspected.state === "fulfilled") {
- return inspected.value;
- }
- }
- return value;
- }
-
- /**
- * @returns whether the given object is a promise.
- * Otherwise it is a fulfilled value.
- */
- Q.isPromise = isPromise;
- function isPromise(object) {
- return object instanceof Promise;
- }
-
- Q.isPromiseAlike = isPromiseAlike;
- function isPromiseAlike(object) {
- return isObject(object) && typeof object.then === "function";
- }
-
- /**
- * @returns whether the given object is a pending promise, meaning not
- * fulfilled or rejected.
- */
- Q.isPending = isPending;
- function isPending(object) {
- return isPromise(object) && object.inspect().state === "pending";
- }
-
- Promise.prototype.isPending = function () {
- return this.inspect().state === "pending";
- };
-
- /**
- * @returns whether the given object is a value or fulfilled
- * promise.
- */
- Q.isFulfilled = isFulfilled;
- function isFulfilled(object) {
- return !isPromise(object) || object.inspect().state === "fulfilled";
- }
-
- Promise.prototype.isFulfilled = function () {
- return this.inspect().state === "fulfilled";
- };
-
- /**
- * @returns whether the given object is a rejected promise.
- */
- Q.isRejected = isRejected;
- function isRejected(object) {
- return isPromise(object) && object.inspect().state === "rejected";
- }
-
- Promise.prototype.isRejected = function () {
- return this.inspect().state === "rejected";
- };
-
- //// BEGIN UNHANDLED REJECTION TRACKING
-
- // This promise library consumes exceptions thrown in handlers so they can be
- // handled by a subsequent promise. The exceptions get added to this array when
- // they are created, and removed when they are handled. Note that in ES6 or
- // shimmed environments, this would naturally be a `Set`.
- var unhandledReasons = [];
- var unhandledRejections = [];
- var reportedUnhandledRejections = [];
- var trackUnhandledRejections = true;
-
- function resetUnhandledRejections() {
- unhandledReasons.length = 0;
- unhandledRejections.length = 0;
-
- if (!trackUnhandledRejections) {
- trackUnhandledRejections = true;
- }
- }
-
- function trackRejection(promise, reason) {
- if (!trackUnhandledRejections) {
- return;
- }
- if (typeof process === "object" && typeof process.emit === "function") {
- Q.nextTick.runAfter(function () {
- if (array_indexOf(unhandledRejections, promise) !== -1) {
- process.emit("unhandledRejection", reason, promise);
- reportedUnhandledRejections.push(promise);
- }
- });
- }
-
- unhandledRejections.push(promise);
- if (reason && typeof reason.stack !== "undefined") {
- unhandledReasons.push(reason.stack);
- } else {
- unhandledReasons.push("(no stack) " + reason);
- }
- }
-
- function untrackRejection(promise) {
- if (!trackUnhandledRejections) {
- return;
- }
-
- var at = array_indexOf(unhandledRejections, promise);
- if (at !== -1) {
- if (typeof process === "object" && typeof process.emit === "function") {
- Q.nextTick.runAfter(function () {
- var atReport = array_indexOf(reportedUnhandledRejections, promise);
- if (atReport !== -1) {
- process.emit("rejectionHandled", unhandledReasons[at], promise);
- reportedUnhandledRejections.splice(atReport, 1);
- }
- });
- }
- unhandledRejections.splice(at, 1);
- unhandledReasons.splice(at, 1);
- }
- }
-
- Q.resetUnhandledRejections = resetUnhandledRejections;
-
- Q.getUnhandledReasons = function () {
- // Make a copy so that consumers can't interfere with our internal state.
- return unhandledReasons.slice();
- };
-
- Q.stopUnhandledRejectionTracking = function () {
- resetUnhandledRejections();
- trackUnhandledRejections = false;
- };
-
- resetUnhandledRejections();
-
- //// END UNHANDLED REJECTION TRACKING
-
- /**
- * Constructs a rejected promise.
- * @param reason value describing the failure
- */
- Q.reject = reject;
- function reject(reason) {
- var rejection = Promise({
- "when": function (rejected) {
- // note that the error has been handled
- if (rejected) {
- untrackRejection(this);
- }
- return rejected ? rejected(reason) : this;
- }
- }, function fallback() {
- return this;
- }, function inspect() {
- return { state: "rejected", reason: reason };
- });
-
- // Note that the reason has not been handled.
- trackRejection(rejection, reason);
-
- return rejection;
- }
-
- /**
- * Constructs a fulfilled promise for an immediate reference.
- * @param value immediate reference
- */
- Q.fulfill = fulfill;
- function fulfill(value) {
- return Promise({
- "when": function () {
- return value;
- },
- "get": function (name) {
- return value[name];
- },
- "set": function (name, rhs) {
- value[name] = rhs;
- },
- "delete": function (name) {
- delete value[name];
- },
- "post": function (name, args) {
- // Mark Miller proposes that post with no name should apply a
- // promised function.
- if (name === null || name === void 0) {
- return value.apply(void 0, args);
- } else {
- return value[name].apply(value, args);
- }
- },
- "apply": function (thisp, args) {
- return value.apply(thisp, args);
- },
- "keys": function () {
- return object_keys(value);
- }
- }, void 0, function inspect() {
- return { state: "fulfilled", value: value };
- });
- }
-
- /**
- * Converts thenables to Q promises.
- * @param promise thenable promise
- * @returns a Q promise
- */
- function coerce(promise) {
- var deferred = defer();
- Q.nextTick(function () {
- try {
- promise.then(deferred.resolve, deferred.reject, deferred.notify);
- } catch (exception) {
- deferred.reject(exception);
- }
- });
- return deferred.promise;
- }
-
- /**
- * Annotates an object such that it will never be
- * transferred away from this process over any promise
- * communication channel.
- * @param object
- * @returns promise a wrapping of that object that
- * additionally responds to the "isDef" message
- * without a rejection.
- */
- Q.master = master;
- function master(object) {
- return Promise({
- "isDef": function () {}
- }, function fallback(op, args) {
- return dispatch(object, op, args);
- }, function () {
- return Q(object).inspect();
- });
- }
-
- /**
- * Spreads the values of a promised array of arguments into the
- * fulfillment callback.
- * @param fulfilled callback that receives variadic arguments from the
- * promised array
- * @param rejected callback that receives the exception if the promise
- * is rejected.
- * @returns a promise for the return value or thrown exception of
- * either callback.
- */
- Q.spread = spread;
- function spread(value, fulfilled, rejected) {
- return Q(value).spread(fulfilled, rejected);
- }
-
- Promise.prototype.spread = function (fulfilled, rejected) {
- return this.all().then(function (array) {
- return fulfilled.apply(void 0, array);
- }, rejected);
- };
-
- /**
- * The async function is a decorator for generator functions, turning
- * them into asynchronous generators. Although generators are only part
- * of the newest ECMAScript 6 drafts, this code does not cause syntax
- * errors in older engines. This code should continue to work and will
- * in fact improve over time as the language improves.
- *
- * ES6 generators are currently part of V8 version 3.19 with the
- * --harmony-generators runtime flag enabled. SpiderMonkey has had them
- * for longer, but under an older Python-inspired form. This function
- * works on both kinds of generators.
- *
- * Decorates a generator function such that:
- * - it may yield promises
- * - execution will continue when that promise is fulfilled
- * - the value of the yield expression will be the fulfilled value
- * - it returns a promise for the return value (when the generator
- * stops iterating)
- * - the decorated function returns a promise for the return value
- * of the generator or the first rejected promise among those
- * yielded.
- * - if an error is thrown in the generator, it propagates through
- * every following yield until it is caught, or until it escapes
- * the generator function altogether, and is translated into a
- * rejection for the promise returned by the decorated generator.
- */
- Q.async = async;
- function async(makeGenerator) {
- return function () {
- // when verb is "send", arg is a value
- // when verb is "throw", arg is an exception
- function continuer(verb, arg) {
- var result;
-
- // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
- // engine that has a deployed base of browsers that support generators.
- // However, SM's generators use the Python-inspired semantics of
- // outdated ES6 drafts. We would like to support ES6, but we'd also
- // like to make it possible to use generators in deployed browsers, so
- // we also support Python-style generators. At some point we can remove
- // this block.
-
- if (typeof StopIteration === "undefined") {
- // ES6 Generators
- try {
- result = generator[verb](arg);
- } catch (exception) {
- return reject(exception);
- }
- if (result.done) {
- return Q(result.value);
- } else {
- return when(result.value, callback, errback);
- }
- } else {
- // SpiderMonkey Generators
- // FIXME: Remove this case when SM does ES6 generators.
- try {
- result = generator[verb](arg);
- } catch (exception) {
- if (isStopIteration(exception)) {
- return Q(exception.value);
- } else {
- return reject(exception);
- }
- }
- return when(result, callback, errback);
- }
- }
- var generator = makeGenerator.apply(this, arguments);
- var callback = continuer.bind(continuer, "next");
- var errback = continuer.bind(continuer, "throw");
- return callback();
- };
- }
-
- /**
- * The spawn function is a small wrapper around async that immediately
- * calls the generator and also ends the promise chain, so that any
- * unhandled errors are thrown instead of forwarded to the error
- * handler. This is useful because it's extremely common to run
- * generators at the top-level to work with libraries.
- */
- Q.spawn = spawn;
- function spawn(makeGenerator) {
- Q.done(Q.async(makeGenerator)());
- }
-
- // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
- /**
- * Throws a ReturnValue exception to stop an asynchronous generator.
- *
- * This interface is a stop-gap measure to support generator return
- * values in older Firefox/SpiderMonkey. In browsers that support ES6
- * generators like Chromium 29, just use "return" in your generator
- * functions.
- *
- * @param value the return value for the surrounding generator
- * @throws ReturnValue exception with the value.
- * @example
- * // ES6 style
- * Q.async(function* () {
- * var foo = yield getFooPromise();
- * var bar = yield getBarPromise();
- * return foo + bar;
- * })
- * // Older SpiderMonkey style
- * Q.async(function () {
- * var foo = yield getFooPromise();
- * var bar = yield getBarPromise();
- * Q.return(foo + bar);
- * })
- */
- Q["return"] = _return;
- function _return(value) {
- throw new QReturnValue(value);
- }
-
- /**
- * The promised function decorator ensures that any promise arguments
- * are settled and passed as values (`this` is also settled and passed
- * as a value). It will also ensure that the result of a function is
- * always a promise.
- *
- * @example
- * var add = Q.promised(function (a, b) {
- * return a + b;
- * });
- * add(Q(a), Q(B));
- *
- * @param {function} callback The function to decorate
- * @returns {function} a function that has been decorated.
- */
- Q.promised = promised;
- function promised(callback) {
- return function () {
- return spread([this, all(arguments)], function (self, args) {
- return callback.apply(self, args);
- });
- };
- }
-
- /**
- * sends a message to a value in a future turn
- * @param object* the recipient
- * @param op the name of the message operation, e.g., "when",
- * @param args further arguments to be forwarded to the operation
- * @returns result {Promise} a promise for the result of the operation
- */
- Q.dispatch = dispatch;
- function dispatch(object, op, args) {
- return Q(object).dispatch(op, args);
- }
-
- Promise.prototype.dispatch = function (op, args) {
- var self = this;
- var deferred = defer();
- Q.nextTick(function () {
- self.promiseDispatch(deferred.resolve, op, args);
- });
- return deferred.promise;
- };
-
- /**
- * Gets the value of a property in a future turn.
- * @param object promise or immediate reference for target object
- * @param name name of property to get
- * @return promise for the property value
- */
- Q.get = function (object, key) {
- return Q(object).dispatch("get", [key]);
- };
-
- Promise.prototype.get = function (key) {
- return this.dispatch("get", [key]);
- };
-
- /**
- * Sets the value of a property in a future turn.
- * @param object promise or immediate reference for object object
- * @param name name of property to set
- * @param value new value of property
- * @return promise for the return value
- */
- Q.set = function (object, key, value) {
- return Q(object).dispatch("set", [key, value]);
- };
-
- Promise.prototype.set = function (key, value) {
- return this.dispatch("set", [key, value]);
- };
-
- /**
- * Deletes a property in a future turn.
- * @param object promise or immediate reference for target object
- * @param name name of property to delete
- * @return promise for the return value
- */
- Q.del = // XXX legacy
- Q["delete"] = function (object, key) {
- return Q(object).dispatch("delete", [key]);
- };
-
- Promise.prototype.del = // XXX legacy
- Promise.prototype["delete"] = function (key) {
- return this.dispatch("delete", [key]);
- };
-
- /**
- * Invokes a method in a future turn.
- * @param object promise or immediate reference for target object
- * @param name name of method to invoke
- * @param value a value to post, typically an array of
- * invocation arguments for promises that
- * are ultimately backed with `resolve` values,
- * as opposed to those backed with URLs
- * wherein the posted value can be any
- * JSON serializable object.
- * @return promise for the return value
- */
- // bound locally because it is used by other methods
- Q.mapply = // XXX As proposed by "Redsandro"
- Q.post = function (object, name, args) {
- return Q(object).dispatch("post", [name, args]);
- };
-
- Promise.prototype.mapply = // XXX As proposed by "Redsandro"
- Promise.prototype.post = function (name, args) {
- return this.dispatch("post", [name, args]);
- };
-
- /**
- * Invokes a method in a future turn.
- * @param object promise or immediate reference for target object
- * @param name name of method to invoke
- * @param ...args array of invocation arguments
- * @return promise for the return value
- */
- Q.send = // XXX Mark Miller's proposed parlance
- Q.mcall = // XXX As proposed by "Redsandro"
- Q.invoke = function (object, name /*...args*/) {
- return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
- };
-
- Promise.prototype.send = // XXX Mark Miller's proposed parlance
- Promise.prototype.mcall = // XXX As proposed by "Redsandro"
- Promise.prototype.invoke = function (name /*...args*/) {
- return this.dispatch("post", [name, array_slice(arguments, 1)]);
- };
-
- /**
- * Applies the promised function in a future turn.
- * @param object promise or immediate reference for target function
- * @param args array of application arguments
- */
- Q.fapply = function (object, args) {
- return Q(object).dispatch("apply", [void 0, args]);
- };
-
- Promise.prototype.fapply = function (args) {
- return this.dispatch("apply", [void 0, args]);
- };
-
- /**
- * Calls the promised function in a future turn.
- * @param object promise or immediate reference for target function
- * @param ...args array of application arguments
- */
- Q["try"] =
- Q.fcall = function (object /* ...args*/) {
- return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
- };
-
- Promise.prototype.fcall = function (/*...args*/) {
- return this.dispatch("apply", [void 0, array_slice(arguments)]);
- };
-
- /**
- * Binds the promised function, transforming return values into a fulfilled
- * promise and thrown errors into a rejected one.
- * @param object promise or immediate reference for target function
- * @param ...args array of application arguments
- */
- Q.fbind = function (object /*...args*/) {
- var promise = Q(object);
- var args = array_slice(arguments, 1);
- return function fbound() {
- return promise.dispatch("apply", [
- this,
- args.concat(array_slice(arguments))
- ]);
- };
- };
- Promise.prototype.fbind = function (/*...args*/) {
- var promise = this;
- var args = array_slice(arguments);
- return function fbound() {
- return promise.dispatch("apply", [
- this,
- args.concat(array_slice(arguments))
- ]);
- };
- };
-
- /**
- * Requests the names of the owned properties of a promised
- * object in a future turn.
- * @param object promise or immediate reference for target object
- * @return promise for the keys of the eventually settled object
- */
- Q.keys = function (object) {
- return Q(object).dispatch("keys", []);
- };
-
- Promise.prototype.keys = function () {
- return this.dispatch("keys", []);
- };
-
- /**
- * Turns an array of promises into a promise for an array. If any of
- * the promises gets rejected, the whole array is rejected immediately.
- * @param {Array*} an array (or promise for an array) of values (or
- * promises for values)
- * @returns a promise for an array of the corresponding values
- */
- // By Mark Miller
- // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
- Q.all = all;
- function all(promises) {
- return when(promises, function (promises) {
- var pendingCount = 0;
- var deferred = defer();
- array_reduce(promises, function (undefined, promise, index) {
- var snapshot;
- if (
- isPromise(promise) &&
- (snapshot = promise.inspect()).state === "fulfilled"
- ) {
- promises[index] = snapshot.value;
- } else {
- ++pendingCount;
- when(
- promise,
- function (value) {
- promises[index] = value;
- if (--pendingCount === 0) {
- deferred.resolve(promises);
- }
- },
- deferred.reject,
- function (progress) {
- deferred.notify({ index: index, value: progress });
- }
- );
- }
- }, void 0);
- if (pendingCount === 0) {
- deferred.resolve(promises);
- }
- return deferred.promise;
- });
- }
-
- Promise.prototype.all = function () {
- return all(this);
- };
-
- /**
- * Returns the first resolved promise of an array. Prior rejected promises are
- * ignored. Rejects only if all promises are rejected.
- * @param {Array*} an array containing values or promises for values
- * @returns a promise fulfilled with the value of the first resolved promise,
- * or a rejected promise if all promises are rejected.
- */
- Q.any = any;
-
- function any(promises) {
- if (promises.length === 0) {
- return Q.resolve();
- }
-
- var deferred = Q.defer();
- var pendingCount = 0;
- array_reduce(promises, function (prev, current, index) {
- var promise = promises[index];
-
- pendingCount++;
-
- when(promise, onFulfilled, onRejected, onProgress);
- function onFulfilled(result) {
- deferred.resolve(result);
- }
- function onRejected() {
- pendingCount--;
- if (pendingCount === 0) {
- deferred.reject(new Error(
- "Can't get fulfillment value from any promise, all " +
- "promises were rejected."
- ));
- }
- }
- function onProgress(progress) {
- deferred.notify({
- index: index,
- value: progress
- });
- }
- }, undefined);
-
- return deferred.promise;
- }
-
- Promise.prototype.any = function () {
- return any(this);
- };
-
- /**
- * Waits for all promises to be settled, either fulfilled or
- * rejected. This is distinct from `all` since that would stop
- * waiting at the first rejection. The promise returned by
- * `allResolved` will never be rejected.
- * @param promises a promise for an array (or an array) of promises
- * (or values)
- * @return a promise for an array of promises
- */
- Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
- function allResolved(promises) {
- return when(promises, function (promises) {
- promises = array_map(promises, Q);
- return when(all(array_map(promises, function (promise) {
- return when(promise, noop, noop);
- })), function () {
- return promises;
- });
- });
- }
-
- Promise.prototype.allResolved = function () {
- return allResolved(this);
- };
-
- /**
- * @see Promise#allSettled
- */
- Q.allSettled = allSettled;
- function allSettled(promises) {
- return Q(promises).allSettled();
- }
-
- /**
- * Turns an array of promises into a promise for an array of their states (as
- * returned by `inspect`) when they have all settled.
- * @param {Array[Any*]} values an array (or promise for an array) of values (or
- * promises for values)
- * @returns {Array[State]} an array of states for the respective values.
- */
- Promise.prototype.allSettled = function () {
- return this.then(function (promises) {
- return all(array_map(promises, function (promise) {
- promise = Q(promise);
- function regardless() {
- return promise.inspect();
- }
- return promise.then(regardless, regardless);
- }));
- });
- };
-
- /**
- * Captures the failure of a promise, giving an oportunity to recover
- * with a callback. If the given promise is fulfilled, the returned
- * promise is fulfilled.
- * @param {Any*} promise for something
- * @param {Function} callback to fulfill the returned promise if the
- * given promise is rejected
- * @returns a promise for the return value of the callback
- */
- Q.fail = // XXX legacy
- Q["catch"] = function (object, rejected) {
- return Q(object).then(void 0, rejected);
- };
-
- Promise.prototype.fail = // XXX legacy
- Promise.prototype["catch"] = function (rejected) {
- return this.then(void 0, rejected);
- };
-
- /**
- * Attaches a listener that can respond to progress notifications from a
- * promise's originating deferred. This listener receives the exact arguments
- * passed to ``deferred.notify``.
- * @param {Any*} promise for something
- * @param {Function} callback to receive any progress notifications
- * @returns the given promise, unchanged
- */
- Q.progress = progress;
- function progress(object, progressed) {
- return Q(object).then(void 0, void 0, progressed);
- }
-
- Promise.prototype.progress = function (progressed) {
- return this.then(void 0, void 0, progressed);
- };
-
- /**
- * Provides an opportunity to observe the settling of a promise,
- * regardless of whether the promise is fulfilled or rejected. Forwards
- * the resolution to the returned promise when the callback is done.
- * The callback can return a promise to defer completion.
- * @param {Any*} promise
- * @param {Function} callback to observe the resolution of the given
- * promise, takes no arguments.
- * @returns a promise for the resolution of the given promise when
- * ``fin`` is done.
- */
- Q.fin = // XXX legacy
- Q["finally"] = function (object, callback) {
- return Q(object)["finally"](callback);
- };
-
- Promise.prototype.fin = // XXX legacy
- Promise.prototype["finally"] = function (callback) {
- callback = Q(callback);
- return this.then(function (value) {
- return callback.fcall().then(function () {
- return value;
- });
- }, function (reason) {
- // TODO attempt to recycle the rejection with "this".
- return callback.fcall().then(function () {
- throw reason;
- });
- });
- };
-
- /**
- * Terminates a chain of promises, forcing rejections to be
- * thrown as exceptions.
- * @param {Any*} promise at the end of a chain of promises
- * @returns nothing
- */
- Q.done = function (object, fulfilled, rejected, progress) {
- return Q(object).done(fulfilled, rejected, progress);
- };
-
- Promise.prototype.done = function (fulfilled, rejected, progress) {
- var onUnhandledError = function (error) {
- // forward to a future turn so that ``when``
- // does not catch it and turn it into a rejection.
- Q.nextTick(function () {
- makeStackTraceLong(error, promise);
- if (Q.onerror) {
- Q.onerror(error);
- } else {
- throw error;
- }
- });
- };
-
- // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
- var promise = fulfilled || rejected || progress ?
- this.then(fulfilled, rejected, progress) :
- this;
-
- if (typeof process === "object" && process && process.domain) {
- onUnhandledError = process.domain.bind(onUnhandledError);
- }
-
- promise.then(void 0, onUnhandledError);
- };
-
- /**
- * Causes a promise to be rejected if it does not get fulfilled before
- * some milliseconds time out.
- * @param {Any*} promise
- * @param {Number} milliseconds timeout
- * @param {Any*} custom error message or Error object (optional)
- * @returns a promise for the resolution of the given promise if it is
- * fulfilled before the timeout, otherwise rejected.
- */
- Q.timeout = function (object, ms, error) {
- return Q(object).timeout(ms, error);
- };
-
- Promise.prototype.timeout = function (ms, error) {
- var deferred = defer();
- var timeoutId = setTimeout(function () {
- if (!error || "string" === typeof error) {
- error = new Error(error || "Timed out after " + ms + " ms");
- error.code = "ETIMEDOUT";
- }
- deferred.reject(error);
- }, ms);
-
- this.then(function (value) {
- clearTimeout(timeoutId);
- deferred.resolve(value);
- }, function (exception) {
- clearTimeout(timeoutId);
- deferred.reject(exception);
- }, deferred.notify);
-
- return deferred.promise;
- };
-
- /**
- * Returns a promise for the given value (or promised value), some
- * milliseconds after it resolved. Passes rejections immediately.
- * @param {Any*} promise
- * @param {Number} milliseconds
- * @returns a promise for the resolution of the given promise after milliseconds
- * time has elapsed since the resolution of the given promise.
- * If the given promise rejects, that is passed immediately.
- */
- Q.delay = function (object, timeout) {
- if (timeout === void 0) {
- timeout = object;
- object = void 0;
- }
- return Q(object).delay(timeout);
- };
-
- Promise.prototype.delay = function (timeout) {
- return this.then(function (value) {
- var deferred = defer();
- setTimeout(function () {
- deferred.resolve(value);
- }, timeout);
- return deferred.promise;
- });
- };
-
- /**
- * Passes a continuation to a Node function, which is called with the given
- * arguments provided as an array, and returns a promise.
- *
- * Q.nfapply(FS.readFile, [__filename])
- * .then(function (content) {
- * })
- *
- */
- Q.nfapply = function (callback, args) {
- return Q(callback).nfapply(args);
- };
-
- Promise.prototype.nfapply = function (args) {
- var deferred = defer();
- var nodeArgs = array_slice(args);
- nodeArgs.push(deferred.makeNodeResolver());
- this.fapply(nodeArgs).fail(deferred.reject);
- return deferred.promise;
- };
-
- /**
- * Passes a continuation to a Node function, which is called with the given
- * arguments provided individually, and returns a promise.
- * @example
- * Q.nfcall(FS.readFile, __filename)
- * .then(function (content) {
- * })
- *
- */
- Q.nfcall = function (callback /*...args*/) {
- var args = array_slice(arguments, 1);
- return Q(callback).nfapply(args);
- };
-
- Promise.prototype.nfcall = function (/*...args*/) {
- var nodeArgs = array_slice(arguments);
- var deferred = defer();
- nodeArgs.push(deferred.makeNodeResolver());
- this.fapply(nodeArgs).fail(deferred.reject);
- return deferred.promise;
- };
-
- /**
- * Wraps a NodeJS continuation passing function and returns an equivalent
- * version that returns a promise.
- * @example
- * Q.nfbind(FS.readFile, __filename)("utf-8")
- * .then(console.log)
- * .done()
- */
- Q.nfbind =
- Q.denodeify = function (callback /*...args*/) {
- var baseArgs = array_slice(arguments, 1);
- return function () {
- var nodeArgs = baseArgs.concat(array_slice(arguments));
- var deferred = defer();
- nodeArgs.push(deferred.makeNodeResolver());
- Q(callback).fapply(nodeArgs).fail(deferred.reject);
- return deferred.promise;
- };
- };
-
- Promise.prototype.nfbind =
- Promise.prototype.denodeify = function (/*...args*/) {
- var args = array_slice(arguments);
- args.unshift(this);
- return Q.denodeify.apply(void 0, args);
- };
-
- Q.nbind = function (callback, thisp /*...args*/) {
- var baseArgs = array_slice(arguments, 2);
- return function () {
- var nodeArgs = baseArgs.concat(array_slice(arguments));
- var deferred = defer();
- nodeArgs.push(deferred.makeNodeResolver());
- function bound() {
- return callback.apply(thisp, arguments);
- }
- Q(bound).fapply(nodeArgs).fail(deferred.reject);
- return deferred.promise;
- };
- };
-
- Promise.prototype.nbind = function (/*thisp, ...args*/) {
- var args = array_slice(arguments, 0);
- args.unshift(this);
- return Q.nbind.apply(void 0, args);
- };
-
- /**
- * Calls a method of a Node-style object that accepts a Node-style
- * callback with a given array of arguments, plus a provided callback.
- * @param object an object that has the named method
- * @param {String} name name of the method of object
- * @param {Array} args arguments to pass to the method; the callback
- * will be provided by Q and appended to these arguments.
- * @returns a promise for the value or error
- */
- Q.nmapply = // XXX As proposed by "Redsandro"
- Q.npost = function (object, name, args) {
- return Q(object).npost(name, args);
- };
-
- Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
- Promise.prototype.npost = function (name, args) {
- var nodeArgs = array_slice(args || []);
- var deferred = defer();
- nodeArgs.push(deferred.makeNodeResolver());
- this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
- return deferred.promise;
- };
-
- /**
- * Calls a method of a Node-style object that accepts a Node-style
- * callback, forwarding the given variadic arguments, plus a provided
- * callback argument.
- * @param object an object that has the named method
- * @param {String} name name of the method of object
- * @param ...args arguments to pass to the method; the callback will
- * be provided by Q and appended to these arguments.
- * @returns a promise for the value or error
- */
- Q.nsend = // XXX Based on Mark Miller's proposed "send"
- Q.nmcall = // XXX Based on "Redsandro's" proposal
- Q.ninvoke = function (object, name /*...args*/) {
- var nodeArgs = array_slice(arguments, 2);
- var deferred = defer();
- nodeArgs.push(deferred.makeNodeResolver());
- Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
- return deferred.promise;
- };
-
- Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
- Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
- Promise.prototype.ninvoke = function (name /*...args*/) {
- var nodeArgs = array_slice(arguments, 1);
- var deferred = defer();
- nodeArgs.push(deferred.makeNodeResolver());
- this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
- return deferred.promise;
- };
-
- /**
- * If a function would like to support both Node continuation-passing-style and
- * promise-returning-style, it can end its internal promise chain with
- * `nodeify(nodeback)`, forwarding the optional nodeback argument. If the user
- * elects to use a nodeback, the result will be sent there. If they do not
- * pass a nodeback, they will receive the result promise.
- * @param object a result (or a promise for a result)
- * @param {Function} nodeback a Node.js-style callback
- * @returns either the promise or nothing
- */
- Q.nodeify = nodeify;
- function nodeify(object, nodeback) {
- return Q(object).nodeify(nodeback);
- }
-
- Promise.prototype.nodeify = function (nodeback) {
- if (nodeback) {
- this.then(function (value) {
- Q.nextTick(function () {
- nodeback(null, value);
- });
- }, function (error) {
- Q.nextTick(function () {
- nodeback(error);
- });
- });
- } else {
- return this;
- }
- };
-
- Q.noConflict = function() {
- throw new Error("Q.noConflict only works when Q is used as a global");
- };
-
- // All code before this point will be filtered from stack traces.
- var qEndingLine = captureLine();
-
- return Q;
-
- });
-
- }).call(this,require('_process'))
-
- },{"_process":10}],2:[function(require,module,exports){
- module.exports={
- "android": ["4.0.4", "4.2.2", "4.4.2", "5.0", "5.1", "6.0", "7.0"],
- "ios": ["4", "5", "6", "7", "8", "9", "10"],
- "windows": ["8.1", "10"]
- }
- },{}],3:[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- var telemetry = require('telemetry-helper');
-
- var osVersions;
-
- var currentDeviceId;
- var devicesById;
- var isVirtual = true;
- var baseProps;
-
- var versionMap = {
- 'windows': {
- '8.1': '6.3.9600.0',
- '10': '10.0.143939.0'
- }
- };
-
- var displayedPlatforms = {
- 'android': 'Android',
- 'ios': 'iOS',
- 'windows': 'Windows'
- };
-
- var devicePluginPlatformMap = {
- 'android': 'Android',
- 'ios': 'iOS',
- 'osx': 'Mac OS X',
- 'ubuntu': 'Linux'
- };
-
- module.exports = {
- init: function (deviceInfo, props) {
- currentDeviceId = deviceInfo.deviceId;
- devicesById = deviceInfo.platformDevices;
- baseProps = props;
- },
-
- selectDevice: function (deviceId) {
- currentDeviceId = deviceId;
- return getCurrentDevice();
- }
- };
-
- Object.defineProperties(module.exports, {
- osVersions: {
- get: function () {
- osVersions = osVersions || require('../../devices/os-versions.json');
- return osVersions[getCurrentDevice().platform];
- }
- },
-
- currentDevice: {
- get: function () {
- return getCurrentDevice();
- }
- },
-
- devicesById: {
- get: function () {
- return devicesById;
- }
- },
-
- isVirtual: {
- get: function () {
- return isVirtual;
- },
- set: function(value) {
- if (value !== isVirtual) {
- isVirtual = value;
- telemetry.sendUITelemetry(Object.assign({}, baseProps, {control: 'is-virtual-device'}));
- }
- }
- },
-
- /**
- * The "pretty" platform value we display
- */
- displayedPlatform: {
- get: function () {
- // The "pretty" platform string we dispoly
- var platform = getCurrentDevice().platform;
- var displayedPlatform = displayedPlatforms[platform];
- if (!displayedPlatform) {
- displayedPlatform = platform.charAt(0).toUpperCase() + platform.slice(1);
- displayedPlatforms[platform] = displayedPlatform;
- }
- return displayedPlatform;
- }
- },
-
- /**
- * The "platform" value we provide the device plugin
- */
- currentDevicePlatform: {
- get: function () {
- var platform = getCurrentDevice().platform;
- return devicePluginPlatformMap[platform] || platform;
- }
- },
-
- currentDeviceVersion: {
- get: function () {
- var device = getCurrentDevice();
- var osVersion = device['os-version'];
- var versionTemplate = device['device-version-template'];
- if (versionTemplate === '<os-version>') {
- return osVersion;
- }
-
- if (versionTemplate === '<map-os-version>') {
- var platform = device.platform;
- var mappedVersion = versionMap[platform] && versionMap[platform][osVersion];
- return mappedVersion || '(unknown)';
- }
- return versionTemplate;
- }
- }
- });
-
- function getCurrentDevice() {
- return devicesById[currentDeviceId];
- }
-
- },{"../../devices/os-versions.json":2,"telemetry-helper":"telemetry-helper"}],4:[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // Based on Apache Cordova geolocation plugin's PositionError implementation.
- // See https://github.com/apache/cordova-plugin-geolocation/blob/master/www/PositionError.js
-
- /**
- * Position error object
- *
- * @constructor
- * @param code
- * @param message
- */
- var PositionError = function(code, message) {
- this.code = code || null;
- this.message = message || '';
- };
-
- PositionError.prototype.PERMISSION_DENIED = PositionError.PERMISSION_DENIED = 1;
- PositionError.prototype.POSITION_UNAVAILABLE = PositionError.POSITION_UNAVAILABLE = 2;
- PositionError.prototype.TIMEOUT = PositionError.TIMEOUT = 3;
-
- module.exports = PositionError;
-
- },{}],5:[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // Based in part on code from Apache Ripple, https://github.com/apache/incubator-ripple
-
- var db = require('db'),
- exception = require('exception'),
- utils = require('utils'),
- _positionInfo = {
- 'latitude': 43.465187,
- 'longitude': -80.522372,
- 'altitude': 100,
- 'accuracy': 150,
- 'altitudeAccuracy': 80,
- 'heading': 0,
- 'speed': 0
- };
-
- var messages;
-
- function _serialize(settings) {
- var tempSettings = utils.copy(settings);
- tempSettings.position.timeStamp = 'new Date(' + tempSettings.position.timeStamp.getTime() + ')';
- return tempSettings;
- }
-
- function _validatePositionInfo(pInfo) {
- return (pInfo && !(isNaN(pInfo.latitude) ||
- isNaN(pInfo.longitude) ||
- isNaN(pInfo.altitude) ||
- isNaN(pInfo.accuracy) ||
- isNaN(pInfo.altitudeAccuracy) ||
- isNaN(pInfo.heading) ||
- isNaN(pInfo.speed))) ? true : false;
- }
-
- var self = {
- initialize: function (msgs) {
- messages = msgs;
-
- var settings = db.retrieveObject('geosettings');
- if (settings) {
- utils.forEach(_positionInfo, function (value, key) {
- _positionInfo[key] = parseFloat(settings.position[key] || value);
- });
-
- self.timeout = settings.timeout;
- self.delay = settings.delay || 0;
- }
- },
-
- getPositionInfo: function () {
- var pi = utils.copy(_positionInfo);
- pi.timeStamp = new Date();
-
- return pi;
- },
-
- updatePositionInfo: function (newPositionInfo, delay, timeout) {
- if (!_validatePositionInfo(newPositionInfo)) {
- exception.raise(exception.types.Geo, 'invalid positionInfo object');
- }
-
- _positionInfo = utils.copy(newPositionInfo);
- _positionInfo.timeStamp = new Date();
-
- self.delay = delay || 0;
- self.timeout = timeout;
-
- db.saveObject('geosettings', _serialize({
- position: _positionInfo,
- delay: self.delay,
- timeout: self.timeout
- }));
-
- if (!messages) {
- throw 'geo-model has not been initialized';
- }
-
- messages.emit('position-info-updated', _positionInfo);
- },
-
- timeout: false,
- delay: 0,
- map: {}
- };
-
-
- module.exports = self;
-
- },{"db":"db","exception":"exception","utils":"utils"}],6:[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- var db = require('db'),
- event = require('event');
-
- var _sims = null;
-
- module.exports = {
- get sims() {
- if (!_sims) {
- _sims = db.retrieveObject('saved-sims') || [];
- }
- return _sims;
- },
-
- addSim: function (sim) {
- var sims = this.sims;
- sims.push(sim);
- db.saveObject('saved-sims', sims);
- event.trigger('saved-sim-added', [sim]);
- },
-
- removeSim: function (sim) {
- var sims = this.sims;
- var simIndex = sim;
- if (typeof simIndex === 'object') {
- simIndex = sims.indexOf(simIndex);
- if (simIndex < 0) {
- throw 'Tried to remove sim object that didn\'t exist';
- }
- } else if (typeof simIndex === 'number') {
- if (simIndex < 0 || simIndex >= sims.length) {
- throw 'Invalid saved sim index ' + simIndex + ' (should be from 0 to ' + sims.length - 1 + ')';
- }
- sim = sims[simIndex];
- } else {
- throw 'Invalid value passed to removeSim(): ' + sim;
- }
-
- sims.splice(simIndex, 1);
- db.saveObject('saved-sims', sims);
- event.trigger('saved-sim-removed', [sim, simIndex]);
- },
-
- findSavedSim: function(service, action) {
- var sims = this.sims;
-
- var savedSim = null;
-
- sims.some(function (sim) {
- if (sim.service === service && sim.action === action) {
- savedSim = sim;
- return true;
- }
- return false;
- });
-
- return savedSim;
- }
- };
-
-
- },{"db":"db","event":"event"}],7:[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- /*global io: false */
-
- var Q = require('q'),
- simStatus = require('sim-status'),
- telemetry = require('telemetry-helper');
-
- var socket;
- var serviceToPluginMap;
-
- function getSuccess(index) {
- return function (result) {
- console.log('Success callback for index: ' + index + '; result: ' + result);
- var data = { index: index, result: result };
- socket.emit('exec-success', data);
- };
- }
-
- function getFailure(index) {
- return function (error) {
- console.log('Failure callback for index: ' + index + '; error: ' + error);
- var data = { index: index, error: error };
- socket.emit('exec-failure', data);
- };
- }
-
- function registerSimHost() {
- socket.emit('register-simulation-host');
- }
-
- Object.defineProperty(module.exports, 'socket', {
- get: function () {
- return socket; // Will be undefined if called before initialize().
- }
- });
-
- module.exports.initialize = function (pluginHandlers, services) {
- var deferred = Q.defer();
-
- serviceToPluginMap = services;
- socket = io();
-
- socket.on('init-telemetry', function () {
- telemetry.init(socket);
- });
-
- socket.on('refresh', function () {
- document.location.reload(true);
- });
-
- socket.on('retheme', function () {
- var themeLink = document.head.querySelector('link[href="sim-host-theme.css"]');
- if (themeLink) {
- // Trigger the script to reload
- themeLink.href = 'sim-host-theme.css';
- }
- });
-
- socket.on('connect', function () {
- registerSimHost();
- });
-
- socket.on('connect_error', function (err) {
- deferred.reject(err);
- });
-
- socket.on('connect_timeout', function (err) {
- deferred.reject(err);
- });
-
- socket.on('app-plugin-list', function () {
- // TODO: process the list of plugins (issue #87)
- socket.emit('start');
- simStatus._fireAppHostReady();
- });
-
- socket.once('init', function (device) {
- deferred.resolve(device);
-
- socket.on('exec', function (data) {
- var index;
-
- if (!data) {
- throw 'Exec called on simulation host without exec info';
- }
-
- index = data.index;
- if (typeof index !== 'number') {
- throw 'Exec called on simulation host without an index specified';
- }
-
- var success = data.hasSuccess ? getSuccess(index) : null;
- var failure = data.hasFail ? getFailure(index) : null;
- var service = data.service;
- if (!service) {
- throw 'Exec called on simulation host without a service specified';
- }
-
- var action = data.action;
- if (!action) {
- throw 'Exec called on simulation host without an action specified';
- }
-
- console.log('Exec ' + service + '.' + action + ' (index: ' + index + ')');
-
- var handler = pluginHandlers[service] && pluginHandlers[service][action];
- var telemetryProps = { service: service, action: action };
- if (!handler) {
- telemetryProps.handled = 'none';
- handler = pluginHandlers['*']['*'];
- handler(success, failure, service, action, data.args);
- } else {
- telemetryProps.handled = 'sim-host';
- handler(success, failure, data.args);
- }
-
- telemetry.sendClientTelemetry('exec', telemetryProps);
- });
- });
-
- socket.on('init', function () {
- socket.emit('ready');
- });
-
- return deferred.promise;
- };
-
- module.exports.notifyPluginsReady = function () {
- telemetry.registerPluginServices(serviceToPluginMap);
- };
-
- },{"q":1,"sim-status":"sim-status","telemetry-helper":"telemetry-helper"}],8:[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- var dialog = require('dialog'),
- utils = require('utils');
-
- var uniqueIdSuffix = 0;
- var interactiveElementSelector = '* /deep/ input, * /deep/ select, * /deep/ button, * /deep/ textarea';
-
- function initialize(changePanelVisibilityCallback) {
- registerCustomElement('cordova-panel', {
- proto: {
- cordovaCollapsed: {
- set: function (value) {
- var icon = this.shadowRoot.querySelector('.cordova-collapse-icon');
- var content = this.shadowRoot.querySelector('.cordova-content');
- var isCurrentlyCollapsed = icon.classList.contains('cordova-collapsed');
-
- if (value && !isCurrentlyCollapsed) {
- collapsePanel(icon, content);
- } else if (!value && isCurrentlyCollapsed) {
- expandPanel(icon, content);
- }
- }
- },
- enabled: {
- set: function (value) {
- if (value) {
- if (this.elementEnabledState) {
- this.elementEnabledState.forEach(function (enabledState) {
- enabledState.element.disabled = enabledState.disabled;
- });
- delete this.elementEnabledState;
- this.shadowRoot.querySelector('.cordova-panel-inner').setAttribute('tabIndex', '0');
- }
- } else {
- this.elementEnabledState = [];
- Array.prototype.forEach.call(this.querySelectorAll(interactiveElementSelector), function (element) {
- this.elementEnabledState.push({element: element, disabled: element.disabled});
- element.disabled = true;
- }, this);
- this.shadowRoot.querySelector('.cordova-panel-inner').setAttribute('tabIndex', '');
- }
- }
- },
- focus: {
- value: function () {
- this.shadowRoot.querySelector('.cordova-panel-inner').focus();
- }
- }
- },
- initialize: function () {
- var content = this.shadowRoot.querySelector('.cordova-content');
- var panelId = this.getAttribute('id');
- var collapseIcon = this.shadowRoot.querySelector('.cordova-collapse-icon');
-
- this.shadowRoot.querySelector('.cordova-header .spoken-text span').textContent = this.getAttribute('caption');
- this.shadowRoot.querySelector('.cordova-header .spoken-text span').setAttribute('title', this.getAttribute('caption'));
- this.shadowRoot.querySelector('.cordova-header .spoken-text').setAttribute('aria-label', this.getAttribute('spoken-text') || this.getAttribute('caption'));
-
- function expandCollapse() {
- var collapsed = collapseIcon.classList.contains('cordova-collapsed');
-
- if (collapsed) {
- expandPanel(collapseIcon, content);
- } else {
- collapsePanel(collapseIcon, content);
- }
-
- if (changePanelVisibilityCallback && typeof changePanelVisibilityCallback === 'function') {
- changePanelVisibilityCallback(panelId, !collapsed);
- }
- }
-
- this.shadowRoot.querySelector('.cordova-header').addEventListener('click', expandCollapse);
- this.shadowRoot.querySelector('.cordova-panel-inner').addEventListener('keydown', function (e) {
- if (e.target === this && e.keyCode === 32 && !isModifyKeyPressed(e)) {
- expandCollapse();
- }
- });
- }
- });
-
- registerCustomElement('cordova-dialog', {
- proto: {
- show: {
- value: function () {
- document.getElementById('popup-window').style.display = '';
- this.style.display = '';
- this.querySelector('.cordova-panel-inner').focus();
- }
- },
- hide: {
- value: function () {
- document.getElementById('popup-window').style.display = 'none';
- this.style.display = 'none';
- }
- }
- },
- initialize: function () {
- this.shadowRoot.querySelector('.cordova-header .spoken-text span').textContent = this.getAttribute('caption');
- this.shadowRoot.querySelector('.cordova-header .spoken-text span').setAttribute('title', this.getAttribute('caption'));
- this.shadowRoot.querySelector('.cordova-header .spoken-text').setAttribute('aria-label', this.getAttribute('spoken-text') || this.getAttribute('caption'));
-
- this.shadowRoot.querySelector('.cordova-close-icon').addEventListener('click', function () {
- dialog.hideDialog();
- });
- this.addEventListener('keydown', function (e) {
- if (e.keyCode === 27 && !isModifyKeyPressed(e)) {
- // Escape key pressed
- dialog.hideDialog();
- }
- });
- }
- });
-
- registerCustomElement('cordova-item-list', {
- proto: {
- addItem: {
- value: function (item) {
- this.appendChild(item);
- }
- },
- removeItem: {
- value: function (item) {
- this.removeChild(this.children[item]);
- }
- }
- },
- initialize: function () {
- this.classList.add('cordova-group');
- }
- });
-
- registerCustomElement('cordova-item', {
- proto: {
- focus: {
- value: function () {
- this.shadowRoot.querySelector('.cordova-item-wrapper').focus();
- }
- }
- },
- initialize: function () {
- this.classList.add('cordova-group');
-
- this.addEventListener('mousedown', function () {
- var that = this;
- window.setTimeout(function () {
- if (document.activeElement !== that) {
- that.focus();
- }
- }, 0);
- });
-
- var that = this;
- this.shadowRoot.querySelector('.close-button').addEventListener('click', function () {
- removeItem(that);
- });
-
- this.addEventListener('keydown', function (e) {
- if (isModifyKeyPressed(e)) {
- return;
- }
-
- var list, childIndex;
-
- switch (e.keyCode) {
- case 46:
- // Delete key
- removeItem(this, true);
- break;
-
- case 38:
- // Up arrow
- e.preventDefault();
- list = this.parentNode;
- childIndex = getItemIndex(this, list);
- if (childIndex > 0) {
- list.children[childIndex - 1].focus();
- }
- break;
-
- case 40:
- // Down arrow
- e.preventDefault();
- list = this.parentNode;
- childIndex = getItemIndex(this, list);
- if (childIndex < list.children.length - 1) {
- list.children[childIndex + 1].focus();
- }
- break;
- }
- });
-
- function getItemIndex(item, list) {
- return list && list.tagName === 'CORDOVA-ITEM-LIST' ? Array.prototype.indexOf.call(list.children, item) : -1;
- }
-
- function removeItem(item, setFocus) {
- var list = item.parentNode;
-
- // If we're within a list, calculate index in the list
- var childIndex = getItemIndex(item, list);
- if (childIndex > -1) {
- // Raise an event on ourselves
- var itemRemovedEvent = new CustomEvent('itemremoved', { detail: { itemIndex: childIndex }, bubbles: true });
- item.dispatchEvent(itemRemovedEvent);
-
- list.removeChild(item);
-
- if (setFocus) {
- var itemCount = list.children.length;
- if (itemCount > 0) {
- if (childIndex >= itemCount) {
- childIndex = itemCount - 1;
- }
- list.children[childIndex].focus();
- } else {
- // If no items left, set focus to containing panel if there is one
- var panel = findParent(list, 'cordova-panel');
- panel && panel.focus();
- }
- }
- }
- }
- }
- });
-
- registerCustomElement('cordova-panel-row', {
- initialize: function () {
- this.classList.add('cordova-panel-row');
- this.classList.add('cordova-group');
- }
- });
-
- registerCustomElement('cordova-group', {
- initialize: function () {
- this.classList.add('cordova-group');
- }
- });
-
- registerCustomElement('cordova-checkbox', {
- proto: {
- checked: {
- get: function () {
- return this.shadowRoot.querySelector('input').checked;
- },
- set: function (value) {
- setValueSafely(this.shadowRoot.querySelector('input'), 'checked', value);
- }
- },
- focus: {
- value: function () {
- this.shadowRoot.querySelector('input').focus();
- }
- }
- },
- initialize: function () {
- if (this.parentNode.tagName === 'CORDOVA-PANEL') {
- this.classList.add('cordova-panel-row');
- this.classList.add('cordova-group');
- } else {
- // Reverse the order of the checkbox and caption
- this.shadowRoot.appendChild(this.shadowRoot.querySelector('label'));
- }
-
- if (this.hasAttribute('spoken')) {
- this.shadowRoot.querySelector('label').setAttribute('aria-hidden', false);
- }
- },
- mungeIds: 'cordova-checkbox-template-input'
- });
-
- registerCustomElement('cordova-radio', {
- proto: {
- checked: {
- get: function () {
- return this.shadowRoot.querySelector('input').checked;
- },
- set: function (value) {
- setValueSafely(this.shadowRoot.querySelector('input'), 'checked', value);
- }
- },
- focus: {
- value: function () {
- this.shadowRoot.querySelector('input').focus();
- }
- }
- },
- initialize: function () {
- var isChecked = this.getAttribute('checked');
- if (isChecked && isChecked.toLowerCase() === 'true') {
- this.shadowRoot.querySelector('input').checked = true;
- }
-
- var parentGroup = findParent(this, 'cordova-group');
- if (parentGroup) {
- var radioButton = this.shadowRoot.querySelector('input');
- radioButton.setAttribute('name', parentGroup.id);
- }
- },
- mungeIds: 'cordova-radio-template-input'
- });
-
- registerCustomElement('cordova-label', {
- proto: {
- value: {
- set: function (value) {
- setValueSafely(this.shadowRoot.querySelector('label'), 'textContent', value);
- },
- get: function () {
- return this.shadowRoot.querySelector('label').textContent;
- }
- }
- },
- initialize: function () {
- var label = this.shadowRoot.querySelector('label');
- label.textContent = this.getAttribute('label');
- label.setAttribute('for', this.getAttribute('for'));
- this.setAttribute('for', '');
-
- if (this.hasAttribute('spoken')) {
- label.setAttribute('aria-hidden', 'false');
- }
- }
- });
-
- registerCustomElement('cordova-text-entry', {
- proto: {
- value: {
- set: function (value) {
- setValueSafely(this.shadowRoot.querySelector('input'), 'value', value);
- },
-
- get: function () {
- return this.shadowRoot.querySelector('input').value;
- }
- },
- disabled: {
- set: function (value) {
- setValueSafely(this.shadowRoot.querySelector('input'), 'disabled', value);
- }
- },
- focus: {
- value: function () {
- this.shadowRoot.querySelector('input').focus();
- }
- }
- },
- initialize: function () {
- this.shadowRoot.querySelector('label').textContent = this.getAttribute('label');
- this.classList.add('cordova-panel-row');
- this.classList.add('cordova-group');
- },
- eventTarget: 'input',
- mungeIds: 'cordova-text-entry-template-input'
- });
-
- registerCustomElement('cordova-number-entry', {
- proto: {
- value: {
- set: function (value) {
- if (utils.isNumber(value)) {
- this._internalValue = value;
- } else {
- value = this._internalValue;
- }
-
- setValueSafely(this.shadowRoot.querySelector('input'), 'value', value);
- },
-
- get: function () {
- return this.shadowRoot.querySelector('input').value;
- }
- },
- disabled: {
- set: function (value) {
- setValueSafely(this.shadowRoot.querySelector('input'), 'disabled', value);
- }
- },
- focus: {
- value: function () {
- this.shadowRoot.querySelector('input').focus();
- }
- }
- },
- initialize: function () {
- var displayLabel = this.getAttribute('label');
- this.shadowRoot.querySelector('label').textContent = displayLabel;
- this.classList.add('cordova-panel-row');
- this.classList.add('cordova-group');
- this._internalValue = 0;
-
- var input = this.shadowRoot.querySelector('input');
- input.setAttribute('aria-label', this.getAttribute('spoken-text') || displayLabel);
-
- var maxValue = this.getAttribute('max'),
- minValue = this.getAttribute('min'),
- value = this.getAttribute('value'),
- step = this.getAttribute('step');
-
- // initialize _internalValue with one of the available values,
- // otherwise it remains 0
- if (value !== null && utils.isNumber(value)) {
- this._internalValue = value;
- } else if (minValue !== null && utils.isNumber(minValue)) {
- this._internalValue = minValue;
- } else if (maxValue !== null && utils.isNumber(maxValue) && this._internalValue > parseFloat(maxValue)) {
- this._internalValue = maxValue;
- }
-
- if (maxValue !== null) input.setAttribute('max', maxValue);
- if (minValue !== null) input.setAttribute('min', minValue);
- if (step !== null) input.setAttribute('step', step);
- if (value !== null) input.setAttribute('value', value);
-
- // verify and force the input value to be a valid number
- input.addEventListener('input', function (event) {
- var value = event.target.value;
-
- if (utils.isNumber(value)) {
- this._internalValue = value;
- } else {
- // the new value is not a number, set the value to the
- // latest number value
- input.value = this._internalValue;
- return false;
- }
- }.bind(this));
- },
- eventTarget:'input',
- mungeIds: 'cordova-number-entry-template-input'
- });
-
- registerCustomElement('cordova-labeled-value', {
- proto: {
- label: {
- set: function (value) {
- setValueSafely(this.shadowRoot.querySelector('label'), 'textContent', value);
- },
-
- get: function () {
- return this.shadowRoot.querySelector('label').textContent;
- }
- },
- value: {
- set: function (value) {
- setValueSafely(this.shadowRoot.querySelector('span'), 'textContent', value);
- setValueSafely(this.shadowRoot.querySelector('span'), 'title', value);
- },
-
- get: function () {
- return this.shadowRoot.querySelector('span').textContent;
- }
- }
- },
- initialize: function () {
- this.shadowRoot.querySelector('label').textContent = this.getAttribute('label');
- this.shadowRoot.querySelector('span').textContent = this.getAttribute('value');
- this.shadowRoot.querySelector('span').setAttribute('title', this.getAttribute('value'));
- this.classList.add('cordova-panel-row');
- this.classList.add('cordova-group');
- }
- });
-
- registerCustomElement('cordova-button', {
- proto: {
- focus: {
- value: function () {
- this.shadowRoot.querySelector('button').focus();
- }
- }
- },
- initialize: function () {
- var readLabel = this.getAttribute('spoken-text');
- if (readLabel) {
- this.shadowRoot.querySelector('button').setAttribute('aria-label', readLabel);
- }
- },
- eventTarget: 'button'
- });
-
- registerCustomElement('cordova-file', {
- proto: {
- input: {
- get: function () {
- return this.shadowRoot.querySelector('input');
- }
- },
- files: {
- get: function () {
- return this.shadowRoot.querySelector('input').files;
- }
- },
- accept: {
- set: function (value) {
- setValueSafely(this.shadowRoot.querySelector('input'), 'accept', value);
- }
- }
- },
- eventTarget: 'input'
- });
-
- registerCustomElement('cordova-combo', {
- proto: {
- options: {
- get: function () {
- return this.shadowRoot.querySelector('select').options;
- }
- },
- selectedIndex: {
- get: function () {
- return this.shadowRoot.querySelector('select').selectedIndex;
- }
- },
- value: {
- get: function () {
- return this.shadowRoot.querySelector('select').value;
- },
- set: function (value) {
- setValueSafely(this.shadowRoot.querySelector('select'), 'value', value);
- }
- },
- appendChild: {
- value: function (node) {
- this.shadowRoot.querySelector('select').appendChild(node);
- }
- },
- focus: {
- value: function () {
- this.shadowRoot.querySelector('select').focus();
- }
- }
- },
- initialize: function () {
- this.classList.add('cordova-panel-row');
- this.classList.add('cordova-group');
- var select = this.shadowRoot.querySelector('select');
-
- var name = this.getAttribute('name');
- if (name) {
- select.setAttribute('name', name);
- }
-
- var label = this.getAttribute('label');
- if (label) {
- this.shadowRoot.querySelector('label').textContent = label;
- } else {
- select.style.width = this.style.width || '100%';
- select.style.minWidth = this.style.minWidth;
- }
-
- var readLabel = this.getAttribute('spoken-text');
- if (readLabel) {
- select.setAttribute('aria-label', readLabel);
- }
-
- // Move option elements to be children of select element
- var options = this.querySelectorAll('option');
- Array.prototype.forEach.call(options, function (option) {
- select.appendChild(option);
- });
- },
- eventTarget:'select',
- mungeIds: 'cordova-combo-template-select'
- });
- }
-
- /**
- * @param name The name of the custom element (corresponds to tag in html files).
- * @param opts - options for the creation of the element.
- * @param opts.proto Properties to set on the prototype.
- * @param opts.initialize Function to call when the custom element is initialized.
- * @param opts.eventTarget Selector for object to redirect events to.
- * @param opts.mungeIds An id or array of ids to 'munge' by pre-pending with custom element id or random value (to
- * ensure unique in document)
- */
- function registerCustomElement(name, opts) {
- var protoProperties = opts.proto;
- var initializeCallback = opts.initialize;
- var eventTargetSelector = opts.eventTarget;
- var mungeIds = opts.mungeIds;
-
- if (mungeIds && !Array.isArray(mungeIds)) {
- mungeIds = [mungeIds];
- }
-
- var constructorName = name.split('-').map(function (bit) {
- return bit.charAt(0).toUpperCase() + bit.substr(1);
- }).join('');
-
- var proto = Object.create(HTMLElement.prototype);
- if (protoProperties) {
- Object.defineProperties(proto, protoProperties);
- }
-
- function initialize() {
- this.initialized = true;
-
- var eventTarget = eventTargetSelector && this.shadowRoot.querySelector(eventTargetSelector);
- if (eventTarget) {
- // Make sure added events are redirected. Add more on<event> handlers here as we find they're needed
- Object.defineProperties(this, {
- addEventListener: {
- value: function (a, b, c) {
- eventTarget.addEventListener(a, b, c);
- }
- },
- click: {
- value: eventTarget.click
- },
- onclick: {
- get: function () {
- return eventTarget.onclick;
- },
- set: function (value) {
- eventTarget.onclick = value;
- }
- },
- onchange: {
- get: function () {
- return eventTarget.onchange;
- },
- set: function (value) {
- eventTarget.onchange = value;
- }
- }
- });
- }
-
- // We don't allow inline event handlers. Detect them and strip.
- var atts = this.attributes;
- Array.prototype.forEach.call(atts, function (att) {
- if (att.name.indexOf('on') === 0) {
- console.error('Unsupported inline event handlers detected: ' + name + '.' + att.name + '="' + att.value + '"');
- this.removeAttribute(att.name);
- }
- }, this);
-
-
- // Initialize if it is required
- initializeCallback && initializeCallback.call(this);
-
- // Apply attributes
- }
-
- proto.attachedCallback = function () {
- if (!this.initialized) {
- // If it hasn't already been initialized, do so now.
- initialize.call(this);
- }
- };
-
- proto.createdCallback = function () {
- var t = document.getElementById(name + '-template');
- var shadowRoot = this.createShadowRoot();
- shadowRoot.appendChild(document.importNode(t.content, true));
-
- if (mungeIds) {
- mungeIds.forEach(function (idToMunge) {
- var mungedId = idToMunge + '-' + uniqueIdSuffix++;
- var target = shadowRoot.querySelector('#' + idToMunge);
- if (target) {
- target.setAttribute('id', mungedId);
- }
-
- var forElement = shadowRoot.querySelector('[for=' + idToMunge + ']');
- if (forElement) {
- forElement.setAttribute('for', mungedId);
- }
- });
- }
-
- if (initializeCallback && this.ownerDocument === document) {
- // If it is being created in the main document, initialize immediately.
- initialize.call(this);
- }
- };
-
- window[constructorName] = document.registerElement(name, {
- prototype: proto
- });
- }
-
- function isModifyKeyPressed(e) {
- return e.altKey || e.ctrlKey || e.shiftKey || e.metaKey;
- }
-
- function collapsePanel(iconElem, content) {
- iconElem.classList.add('cordova-collapsed');
- content.style.display = 'none';
- content.style.height = '0';
- }
-
- function expandPanel(iconElem, content) {
- iconElem.classList.remove('cordova-collapsed');
- content.style.display = '';
- content.style.height = '';
- }
-
- function findParent(element, tag) {
- if (!Array.isArray(tag)) {
- tag = [tag];
- }
-
- var parent = element.parentNode;
- return parent && parent.tagName ? tag.indexOf(parent.tagName.toLowerCase()) > -1 ? parent : findParent(parent, tag) : null;
- }
-
- function setValueSafely(el, prop, value) {
- // In IE, setting the property when the element hasn't yet been added to the document can fail (like an issue with
- // the webcomponents polyfill), so do it after a setTimeout().
- if (el.ownerDocument.contains(el)) {
- el[prop] = value;
- } else {
- window.setTimeout(function () {
- el[prop] = value;
- }, 0);
- }
- }
-
- module.exports = {
- initialize: initialize
- };
-
- if (!Array.prototype.find) {
- Array.prototype.find = function (predicate) {
- if (this == null) {
- throw new TypeError('Array.prototype.find called on null or undefined');
- }
- if (typeof predicate !== 'function') {
- throw new TypeError('predicate must be a function');
- }
- var list = Object(this);
- var length = list.length >>> 0;
- var thisArg = arguments[1];
- var value;
-
- for (var i = 0; i < length; i++) {
- value = list[i];
- if (predicate.call(thisArg, value, i, list)) {
- return value;
- }
- }
- return undefined;
- };
- }
-
- },{"dialog":"dialog","utils":"utils"}],9:[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- require('polyfills');
-
- var customElements = require('./custom-elements'),
- db = require('db'),
- dialog = require('dialog'),
- Messages = require('messages'),
- Q = require('q'),
- socket = require('../protocol/socket');
-
- var COLLAPSED_PANELS_KEY = 'collapsed-panels';
-
- var plugins;
- var pluginHandlers = {};
- var serviceToPluginMap = {};
- var initSocketPromise = socket.initialize(pluginHandlers, serviceToPluginMap);
-
- customElements.initialize(changePanelVisibilityCallback);
-
- window.addEventListener('DOMContentLoaded', function () {
- sizeContent();
- Q.all([db.initialize(), initSocketPromise]).then(function (result) {
- initializePlugins(result[1]);
-
- // Some panels, like geolocation, need to be fully initialized before they can be hidden, otherwise they will
- // stop working. For that reason, we restore the initial collapse state to the panels only after plugin
- // initialization.
- getCollapsedPanels().forEach(function (panelId) {
- var panel = document.getElementById(panelId);
- if (panel) {
- panel.cordovaCollapsed = true;
- }
- });
- }).done();
- });
-
- window.addEventListener('resize', function () {
- sizeContent();
- });
-
- function changePanelVisibilityCallback(id, isNowCollapsed) {
- var collapsedPanels = getCollapsedPanels();
- var index = collapsedPanels.indexOf(id);
-
- if (isNowCollapsed && index === -1) {
- collapsedPanels.push(id);
- } else if (!isNowCollapsed && index > -1) {
- collapsedPanels.splice(index, 1);
- }
-
- db.saveObject(COLLAPSED_PANELS_KEY, collapsedPanels);
- }
-
- function getCollapsedPanels() {
- var collapsedPanels = db.retrieveObject(COLLAPSED_PANELS_KEY);
-
- if (!Array.isArray(collapsedPanels)) {
- collapsedPanels = [];
- }
-
- return collapsedPanels;
- }
-
- function sizeContent() {
- // Size the content area to keep column widths fixed
- var bodyWidth = parseInt(window.getComputedStyle(document.body).width);
- var panelWidth = parseInt(window.getComputedStyle(document.querySelector('cordova-panel')).width);
-
- // Ratio of column to panel width is 323 to 320. Unfortunately we can't get the column width directly, as the
- // computed value is inconsistent between browsers. So if we change either of these widths, we'll need to update
- // this equation.
- var columnWidth = panelWidth / 320 * 323 + 3;
-
- var contentWidth = (Math.floor((bodyWidth - 1) / columnWidth) || 1) * columnWidth;
- document.querySelector('.cordova-main').style.width = contentWidth + 'px';
- }
-
- var pluginMessages = {};
- function applyPlugins(plugins, clobberScope, clobberToPluginMap) {
- Object.keys(plugins).forEach(function (pluginId) {
- var plugin = plugins[pluginId];
- if (plugin) {
- if (typeof plugin === 'function') {
- pluginMessages[pluginId] = pluginMessages[pluginId] || new Messages(pluginId, socket.socket);
- plugin = plugin(pluginMessages[pluginId]);
- plugins[pluginId] = plugin;
- }
- if (clobberScope) {
- clobber(plugin, clobberScope, clobberToPluginMap, pluginId);
- }
- }
- });
- }
-
- function clobber(clobbers, scope, clobberToPluginMap, pluginId) {
- Object.keys(clobbers).forEach(function (key) {
- if (clobberToPluginMap && pluginId) {
- clobberToPluginMap[key] = pluginId;
- }
-
- if (clobbers[key] && typeof clobbers[key] === 'object') {
- scope[key] = scope[key] || {};
- clobber(clobbers[key], scope[key]);
- } else {
- scope[key] = clobbers[key];
- }
- });
- }
-
- function initializePlugins(device) {
- plugins = {
- 'cordova-plugin-geolocation': require('cordova-plugin-geolocation'),
- 'exec': require('exec'),
- 'events': require('events'),
- 'cordova-plugin-device': require('cordova-plugin-device'),
- 'cordova-plugin-camera': require('cordova-plugin-camera')
- };
-
- var pluginHandlersDefinitions = {
- 'cordova-plugin-geolocation': require('cordova-plugin-geolocation-handlers'),
- 'exec': require('exec-handlers'),
- 'cordova-plugin-device': require('cordova-plugin-device-handlers'),
- 'cordova-plugin-statusbar': require('cordova-plugin-statusbar-handlers'),
- 'android-platform-core': require('android-platform-core-handlers')
- };
-
- applyPlugins(plugins);
- applyPlugins(pluginHandlersDefinitions, pluginHandlers, serviceToPluginMap);
-
- // Hide and register dialogs
- Array.prototype.forEach.call(document.getElementById('popup-window').children, function (dialogRef) {
- dialog.pluginDialogs[dialogRef.id] = dialogRef;
- dialogRef.style.display = 'none';
- });
-
- Object.keys(plugins).forEach(function (pluginId) {
- try {
- plugins[pluginId] && plugins[pluginId].initialize && plugins[pluginId].initialize(device);
- } catch (e) {
- console.error('Error initializing plugin ' + pluginId);
- console.error(e);
- }
- });
-
- socket.notifyPluginsReady();
- }
-
- },{"../protocol/socket":7,"./custom-elements":8,"android-platform-core-handlers":"android-platform-core-handlers","cordova-plugin-camera":"cordova-plugin-camera","cordova-plugin-device":"cordova-plugin-device","cordova-plugin-device-handlers":"cordova-plugin-device-handlers","cordova-plugin-geolocation":"cordova-plugin-geolocation","cordova-plugin-geolocation-handlers":"cordova-plugin-geolocation-handlers","cordova-plugin-statusbar-handlers":"cordova-plugin-statusbar-handlers","db":"db","dialog":"dialog","events":"events","exec":"exec","exec-handlers":"exec-handlers","messages":"messages","polyfills":"polyfills","q":1}],10:[function(require,module,exports){
- // shim for using process in browser
- var process = module.exports = {};
-
- // cached from whatever global is present so that test runners that stub it
- // don't break things. But we need to wrap it in a try catch in case it is
- // wrapped in strict mode code which doesn't define any globals. It's inside a
- // function because try/catches deoptimize in certain engines.
-
- var cachedSetTimeout;
- var cachedClearTimeout;
-
- (function () {
- try {
- cachedSetTimeout = setTimeout;
- } catch (e) {
- cachedSetTimeout = function () {
- throw new Error('setTimeout is not defined');
- }
- }
- try {
- cachedClearTimeout = clearTimeout;
- } catch (e) {
- cachedClearTimeout = function () {
- throw new Error('clearTimeout is not defined');
- }
- }
- } ())
- function runTimeout(fun) {
- if (cachedSetTimeout === setTimeout) {
- //normal enviroments in sane situations
- 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);
- }
- try {
- // when when somebody has screwed with setTimeout but no I.E. maddness
- return cachedClearTimeout(marker);
- } catch (e){
- try {
- // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
- return cachedClearTimeout.call(null, marker);
- } catch (e){
- // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
- // Some versions of I.E. have different rules for clearTimeout vs setTimeout
- return cachedClearTimeout.call(this, marker);
- }
- }
-
-
-
- }
- var queue = [];
- var draining = false;
- var currentQueue;
- var queueIndex = -1;
-
- function cleanUpNextTick() {
- if (!draining || !currentQueue) {
- return;
- }
- draining = false;
- if (currentQueue.length) {
- queue = currentQueue.concat(queue);
- } else {
- queueIndex = -1;
- }
- if (queue.length) {
- drainQueue();
- }
- }
-
- function drainQueue() {
- if (draining) {
- return;
- }
- var timeout = runTimeout(cleanUpNextTick);
- draining = true;
-
- var len = queue.length;
- while(len) {
- currentQueue = queue;
- queue = [];
- while (++queueIndex < len) {
- if (currentQueue) {
- currentQueue[queueIndex].run();
- }
- }
- queueIndex = -1;
- len = queue.length;
- }
- currentQueue = null;
- draining = false;
- runClearTimeout(timeout);
- }
-
- process.nextTick = function (fun) {
- var args = new Array(arguments.length - 1);
- if (arguments.length > 1) {
- for (var i = 1; i < arguments.length; i++) {
- args[i - 1] = arguments[i];
- }
- }
- queue.push(new Item(fun, args));
- if (queue.length === 1 && !draining) {
- runTimeout(drainQueue);
- }
- };
-
- // v8 likes predictible objects
- function Item(fun, array) {
- this.fun = fun;
- this.array = array;
- }
- Item.prototype.run = function () {
- this.fun.apply(null, this.array);
- };
- process.title = 'browser';
- process.browser = true;
- process.env = {};
- process.argv = [];
- process.version = ''; // empty string to avoid regexp issues
- process.versions = {};
-
- function noop() {}
-
- process.on = noop;
- process.addListener = noop;
- process.once = noop;
- process.off = noop;
- process.removeListener = noop;
- process.removeAllListeners = noop;
- process.emit = noop;
-
- process.binding = function (name) {
- throw new Error('process.binding is not supported');
- };
-
- process.cwd = function () { return '/' };
- process.chdir = function (dir) {
- throw new Error('process.chdir is not supported');
- };
- process.umask = function() { return 0; };
-
- },{}],"android-platform-core-handlers":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- module.exports = {
- 'CoreAndroid': {
- 'show': function (success, fail, service, action, args) {
- success && success();
- },
- 'messageChannel': function (success, fail, service, action, args) {
- // This call is used to communicate the messageChannel callback to the native Java code. Since we don't need
- // that, we just swallow this and do nothing.
- }
- }
- };
-
- },{}],"argscheck":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // Based in part on code from Apache Cordova (https://github.com/apache/cordova-js)
-
- var utils = require('utils');
-
- var moduleExports = module.exports;
-
- var typeMap = {
- 'A': 'Array',
- 'D': 'Date',
- 'N': 'Number',
- 'S': 'String',
- 'F': 'Function',
- 'O': 'Object'
- };
-
- function extractParamName(callee, argIndex) {
- return (/.*?\((.*?)\)/).exec(callee)[1].split(', ')[argIndex];
- }
-
- function checkArgs(spec, functionName, args, opt_callee) {
- if (!moduleExports.enableChecks) {
- return;
- }
- var errMsg = null;
- var typeName;
- for (var i = 0; i < spec.length; ++i) {
- var c = spec.charAt(i),
- cUpper = c.toUpperCase(),
- arg = args[i];
- // Asterix means allow anything.
- if (c == '*') {
- continue;
- }
- typeName = utils.typeName(arg);
- if ((arg === null || arg === undefined) && c == cUpper) {
- continue;
- }
- if (typeName != typeMap[cUpper]) {
- errMsg = 'Expected ' + typeMap[cUpper];
- break;
- }
- }
- if (errMsg) {
- errMsg += ', but got ' + typeName + '.';
- errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg;
- throw TypeError(errMsg);
- }
- }
-
- function getValue(value, defaultValue) {
- return value === undefined ? defaultValue : value;
- }
-
- moduleExports.checkArgs = checkArgs;
- moduleExports.getValue = getValue;
- moduleExports.enableChecks = true;
-
-
- },{"utils":"utils"}],"cordova-plugin-camera":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- var dialog = require('dialog');
- var telemetry = require('telemetry-helper');
-
- var baseProps = {
- plugin: 'cordova-plugin-camera',
- panel: 'camera'
- };
-
- module.exports = function (messages) {
- var filenameInput,
- dialogFilenameInput,
- dialogImg,
- dialogSelectedFile,
- preSelectedFile;
-
- messages.register('takePicture', function (args, callback) {
- if (document.getElementById('camera-prompt').checked) {
- dialog.showDialog('camera-choose-image', function (msg) {
- if (msg === 'showing') {
- // Not we use .onclick etc here rather than addEventListener() to ensure we replace any existing
- // handler with one that uses the appropriate value of 'callback' from the current closure.
- document.getElementById('camera-dialog-use-image').onclick = function () {
- dialog.hideDialog('camera-choose-image');
- if (dialogSelectedFile) {
- getPicture(dialogSelectedFile, callback, args);
- } else {
- callback(null, null);
- }
- };
- document.getElementById('camera-dialog-cancel').onclick = function () {
- dialog.hideDialog('camera-choose-image');
- callback(null, null);
- };
- }
- });
- } else if (document.getElementById('camera-file').checked) {
- getPicture(preSelectedFile, callback, args);
- }
- });
-
- function getPicture(file, callback, args) {
- if (args && args[1] === 0) {
- /* Destination type is DATA_URL */
- createDataUrl(file, callback);
- } else {
- createArrayBuffer(file, callback);
- }
- }
-
- function createArrayBuffer(blob, callback) {
- var reader = new FileReader();
- reader.onloadend = function () {
- callback(reader.error, { data: reader.result, type: blob.type });
- };
- reader.readAsArrayBuffer(blob);
- }
-
- function createDataUrl(blob, callback) {
- var reader = new FileReader();
- reader.onloadend = function () {
- var imageData = reader.result;
- if (imageData) {
- imageData = imageData.substr(imageData.indexOf(',') + 1);
- }
- callback(reader.error, imageData);
- };
- reader.readAsDataURL(blob);
- }
-
- return {
- initialize: function () {
- filenameInput = document.getElementById('camera-filename');
- dialogFilenameInput = document.getElementById('camera-dialog-filename');
- dialogImg = document.getElementById('camera-dialog-image');
- var panelImg = document.getElementById('camera-img');
-
- // Setup handlers for choosing an image in the panel
- filenameInput.accept = 'image/*';
- document.getElementById('camera-choose-filename').addEventListener('click', function () {
- telemetry.sendUITelemetry(Object.assign({}, baseProps, { control: 'camera-choose-filename' }));
- filenameInput.input.click();
- });
-
- filenameInput.addEventListener('change', function () {
- if (filenameInput.files[0]) {
- preSelectedFile = filenameInput.files[0];
- panelImg.src = URL.createObjectURL(preSelectedFile);
- panelImg.style.display = '';
- }
- });
-
- // Setup handlers for choosing an image in the dialog
- dialogFilenameInput.accept = 'image/*';
- document.getElementById('camera-dialog-choose-filename').addEventListener('click', function () {
- dialogFilenameInput.input.click();
- });
-
- dialogFilenameInput.addEventListener('change', function () {
- if (dialogFilenameInput.files[0]) {
- dialogSelectedFile = dialogFilenameInput.files[0];
-
- dialogImg.src = URL.createObjectURL(dialogSelectedFile);
- dialogImg.style.display = '';
- document.getElementById('camera-dialog-use-image').style.display = '';
- }
- });
-
- var previousSelection = 'camera-prompt';
- function handleRadioClick(radioName) {
- if (radioName !== previousSelection) {
- previousSelection = radioName;
- telemetry.sendUITelemetry(Object.assign({}, baseProps, { control: radioName }));
- }
- }
-
- document.getElementById('camera-prompt').onclick = handleRadioClick.bind(this, 'camera-prompt');
- document.getElementById('camera-file').onclick = handleRadioClick.bind(this, 'camera-file');
- }
- };
- };
-
- },{"dialog":"dialog","telemetry-helper":"telemetry-helper"}],"cordova-plugin-device-handlers":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- var deviceModel = require('./device-model');
-
- module.exports = {
- 'Device': {
- 'getDeviceInfo': function (success, fail, args) {
- var device = deviceModel.currentDevice;
- success({
- model: device.model,
- manufacturer: device.manufacturer,
- platform: deviceModel.currentDevicePlatform,
- uuid: device.uuid,
- version: deviceModel.currentDeviceVersion,
- isVirtual: deviceModel.isVirtual,
- serial: device.serial
- });
- }
- }
- };
-
- },{"./device-model":3}],"cordova-plugin-device":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- var telemetry = require('telemetry-helper'),
- simStatus = require('sim-status'),
- deviceModel = require('./device-model');
-
- var baseProps = {
- plugin: 'cordova-plugin-device',
- panel: 'device'
- };
-
- function initialize(deviceInfo, messages) {
- deviceModel.init(deviceInfo, baseProps);
-
- var device = deviceModel.currentDevice;
-
- document.getElementById('device-platform').value = deviceModel.displayedPlatform;
-
- var deviceList = document.getElementById('device-list');
- getSortedDevices().forEach(function (device) {
- var option = document.createElement('option');
- option.value = device.id;
-
- var caption = document.createTextNode(device.name);
- option.appendChild(caption);
- deviceList.appendChild(option);
- });
- deviceList.addEventListener('change', selectedDeviceChanged);
- deviceList.value = device.id;
-
- var osVersions = deviceModel.osVersions;
- var osVersionList = document.getElementById('device-os-version');
- if (osVersions) {
- osVersions.forEach(function (version) {
- var option = document.createElement('option');
- option.value = version;
-
- var caption = document.createTextNode(version);
- option.appendChild(caption);
- osVersionList.appendChild(option);
- });
- osVersionList.style.display = '';
- osVersionList.addEventListener('change', osVersionChanged);
- } else {
- osVersionList.style.display = 'none';
- }
-
- updateDevice();
- registerTelemetryEvents();
-
- function selectedDeviceChanged() {
- var deviceId = this.value;
- deviceModel.selectDevice(deviceId);
- updateDevice();
- messages.refreshAppHost(deviceModel.currentDevice);
- }
-
- function osVersionChanged(e) {
- deviceModel.currentDevice['os-version'] = this.value;
- var device = deviceModel.currentDevice;
- document.getElementById('device-os-version').value = device['os-version'];
- messages.refreshAppHost(device);
- }
-
- function updateDevice() {
- var device = deviceModel.currentDevice;
- var viewportWidth = device.viewport.width;
- var viewportHeight = device.viewport.height;
-
- document.getElementById('device-os-version').value = device['os-version'];
- document.getElementById('device-model').value = device.model;
- document.getElementById('device-manufacturer').value = device.manufacturer;
- document.getElementById('device-uuid').value = device.uuid;
- document.getElementById('device-version').value = deviceModel.currentDeviceVersion;
- document.getElementById('is-virtual-device').checked = deviceModel.isVirtual;
- document.getElementById('device-serial').value = device.serial;
- document.getElementById('device-resolution').value = device.resolution.width + ' x ' + device.resolution.height;
- document.getElementById('device-viewport-size').value = viewportWidth + ' x ' + viewportHeight;
- document.getElementById('device-pixel-ratio').value = device['pixel-ratio'];
-
- notifyResize(messages, {
- width: viewportWidth,
- height: viewportHeight,
- pixelRatio: device['pixel-ratio']
- });
- }
- }
-
- function getSortedDevices() {
- // Created a sorted array of devices
- var devicesById = deviceModel.devicesById;
- var devices = Object.getOwnPropertyNames(devicesById).map(function (deviceId) {
- return devicesById[deviceId];
- });
-
- devices.sort(function (left, right) {
- left = left.name.toUpperCase();
- right = right.name.toUpperCase();
- if (left < right) {
- return -1;
- }
- if (right < left) {
- return 1;
- }
- return 0;
- });
-
- return devices;
- }
-
- function notifyResize(messages, dimensions) {
- var width = parseInt(dimensions.width);
- var height = parseInt(dimensions.height);
- var pixelRatio = parseFloat(dimensions.pixelRatio);
-
- if (isNaN(width) || isNaN(height)) {
- return;
- }
-
- messages.emitDebug('resize-viewport', {
- width: width,
- height: height,
- pixelRatio: pixelRatio
- });
- }
-
- function registerTelemetryEvents() {
- var deviceList = document.getElementById('device-list');
- deviceList.addEventListener('change', function () {
- telemetry.sendUITelemetry(Object.assign({}, baseProps, {
- control: 'device-list',
- value: deviceList.value
- }));
- });
-
- var osVersionList = document.getElementById('device-os-version');
- osVersionList.addEventListener('change', function () {
- telemetry.sendUITelemetry(Object.assign({}, baseProps, {
- control: 'device-os-version',
- value: deviceList.value
- }));
- });
-
- var virtualDeviceCheckbox = document.getElementById('is-virtual-device');
- virtualDeviceCheckbox.addEventListener('click', function () {
- deviceModel.isVirtual = virtualDeviceCheckbox.checked;
- });
- }
-
- module.exports = function (messages) {
- var cordovaVersionLabel = document.getElementById('device-cordova-version');
-
- cordovaVersionLabel.value = 'Querying...';
-
- simStatus.whenAppHostReady(function () {
- messages.call('cordova-version').then(function (version) {
- cordovaVersionLabel.value = version;
- }).fail(function () {
- cordovaVersionLabel.value = 'unknown';
- });
- });
-
- return {
- initialize: function (deviceInfo) {
- initialize(deviceInfo, messages);
- }
- };
- };
-
- },{"./device-model":3,"sim-status":"sim-status","telemetry-helper":"telemetry-helper"}],"cordova-plugin-geolocation-handlers":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // Based in part on code from Apache Ripple (https://github.com/apache/incubator-ripple)
-
- module.exports = function (messages) {
- var geo = require('./geo-model'),
- utils = require('utils'),
- PositionError = require('./PositionError'),
- _watches = {};
-
- function _getCurrentPosition(win, fail) {
- var delay = (geo.delay || 0) * 1000;
- window.setTimeout(function () {
- if (geo.timeout) {
- if (fail) {
- fail(new PositionError(PositionError.TIMEOUT, 'Position retrieval timed out.'));
- }
- } else {
- win(geo.getPositionInfo())
- }
- }, delay);
- }
-
- messages.on('position-info-updated', function (message, pi) {
- utils.forEach(_watches, function (watch) {
- try {
- _getCurrentPosition(watch.win, watch.fail);
- } catch (e) {
- console.log(e);
- }
- });
- });
-
- return {
- Geolocation: {
- getLocation: function (success, error) {
- _getCurrentPosition(success, error);
- },
- addWatch: function (success, error, args) {
- _watches[args[0]] = {
- win: success,
- fail: error
- };
- _getCurrentPosition(success, error);
- },
- clearWatch: function (success, error, args) {
- delete _watches[args[0]];
- if (success && typeof (success) === 'function') {
- success();
- }
- },
- getPermission: function (success, fail, args) {
- success();
- }
- }
- };
- };
-
- },{"./PositionError":4,"./geo-model":5,"utils":"utils"}],"cordova-plugin-geolocation":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // Based in part on code from Apache Ripple (https://github.com/apache/incubator-ripple)
-
- /*global OpenLayers: false */
- var telemetry = require('telemetry-helper');
-
- var baseProps = {
- plugin: 'cordova-plugin-geolocation',
- panel: 'geolocation'
- };
-
- // For telemetry about interacting with the map using the mouse, we "batch" the mouse events to prevent sending too many messages.
- var mouseEventHoldDelay = 1000; // The inactivity delay to wait before sending a telemetry event when the user interacts with the map.
- var pendingMouseEvents = 0; // The number of mouse events that are "on hold".
-
- module.exports = function (messages) {
- var constants = require('sim-constants'),
- geo = require('./geo-model'),
- db = require('db'),
- event = require('event'),
- utils = require('utils'),
- navUtils = utils.navHelper(),
- _gpsMapZoomLevel;
-
- geo.initialize(messages);
-
- function _updateGpsMap() {
- var positionInfo = geo.getPositionInfo(),
- mapContainer = document.getElementById(constants.GEO.OPTIONS.MAP_CONTAINER),
- geoZoomValue = document.getElementById(constants.GEO.MAP_ZOOM_LEVEL_CONTAINER);
-
- if (mapContainer) {
- geo.map.setCenter(new OpenLayers.LonLat(positionInfo.longitude, positionInfo.latitude) // Center of the map
- .transform(
- new OpenLayers.Projection('EPSG:4326'), // transform from WGS 1984
- new OpenLayers.Projection('EPSG:900913') // to Spherical Mercator Projection
- ),
- _gpsMapZoomLevel,
- true // don't trigger dragging events
- );
- }
-
- if (geoZoomValue) {
- geoZoomValue.innerHTML = _gpsMapZoomLevel;
- }
- }
-
- function _updateGpsMapZoom(goUp) {
- var inc = goUp ? 1 : -1;
- _gpsMapZoomSet(_gpsMapZoomLevel + inc);
- _updateGpsMap();
- }
-
- function _gpsMapZoomSet(value) {
- _gpsMapZoomLevel = Math.max(Math.min(value, constants.GEO.MAP_ZOOM_MAX), constants.GEO.MAP_ZOOM_MIN);
- document.getElementById(constants.GEO.MAP_ZOOM_LEVEL_CONTAINER).innerHTML = _gpsMapZoomLevel;
- db.save(constants.GEO.MAP_ZOOM_KEY, _gpsMapZoomLevel);
- }
-
- function mapEventTelemetryHandler() {
- pendingMouseEvents++;
- setTimeout(function () {
- --pendingMouseEvents;
-
- if (pendingMouseEvents === 0) {
- telemetry.sendUITelemetry(Object.assign({}, baseProps, { control: 'geo-map-container' }));
- }
- }, mouseEventHoldDelay);
- }
-
- function registerTelemetryEvents() {
- // Register the simple events (onclick / onchange / etc -> send the control ID).
- var basicTelemetryEvents = [
- { control: 'geo-latitude' },
- { control: 'geo-longitude' },
- { control: 'geo-altitude' },
- { control: 'geo-accuracy' },
- { control: 'geo-altitude-accuracy' },
- { control: 'geo-heading' },
- { control: 'geo-speed' },
- { control: 'geo-delay' },
- { control: 'geo-gpxfile-button', event: 'click' },
- { control: 'geo-map-zoom-decrease', event: 'click' },
- { control: 'geo-map-zoom-increase', event: 'click' }
- ];
-
- basicTelemetryEvents.forEach(function (controlEvent) {
- registerTelemetryForControl(controlEvent.control, controlEvent.event);
- });
-
- // Register the event for the timeout checkbox.
- // Clicking the checkbox's label fires the click event twice, so keep track of the previous state. Note that we can't use the change event because the component seems to swallow it.
- var previousTimeoutState = false;
- var geoTimeoutCheckbox = document.querySelector('#geo-timeout');
-
- geoTimeoutCheckbox.onclick = function () {
- if (geoTimeoutCheckbox.checked !== previousTimeoutState) {
- previousTimeoutState = geoTimeoutCheckbox.checked;
- telemetry.sendUITelemetry(Object.assign({}, baseProps, { control: 'geo-timeout' }));
- }
- };
-
- // Register the event for the Go button.
- document.getElementById('geo-gpx-go').onclick = function () {
- var rateList = document.getElementById('geo-gpxmultiplier-select');
- var option = rateList.options[rateList.selectedIndex];
-
- telemetry.sendUITelemetry(Object.assign({}, baseProps, { control: 'geo-gpx-go', value: option.value }));
- };
-
- // Register the event for zooming with the mouse wheel on the map.
- document.getElementById('geo-map-container').onwheel = mapEventTelemetryHandler;
- }
-
- function registerTelemetryForControl(controlId, event) {
- event = event || 'change';
- document.getElementById(controlId).addEventListener(event, telemetry.sendUITelemetry.bind(this, Object.assign({}, baseProps, { control: controlId })));
- }
-
- return {
- panel: {
- domId: 'gps-container',
- collapsed: true,
- pane: 'right'
- },
-
- initialize: function () {
- var GEO_OPTIONS = constants.GEO.OPTIONS,
- positionInfo = geo.getPositionInfo(),
- positionUpdatedMessage = 'position-info-updated',
- latitude = document.getElementById(GEO_OPTIONS.LATITUDE),
- longitude = document.getElementById(GEO_OPTIONS.LONGITUDE),
- altitude = document.getElementById(GEO_OPTIONS.ALTITUDE),
- accuracy = document.getElementById(GEO_OPTIONS.ACCURACY),
- altitudeAccuracy = document.getElementById(GEO_OPTIONS.ALTITUDE_ACCURACY),
- heading = document.getElementById(GEO_OPTIONS.HEADING),
- speed = document.getElementById(GEO_OPTIONS.SPEED),
- delay = document.getElementById(GEO_OPTIONS.DELAY),
- delayLabel = document.getElementById(GEO_OPTIONS.DELAY_LABEL),
- headingLabel = document.getElementById(GEO_OPTIONS.HEADING_LABEL),
- headingMapLabel = document.getElementById(GEO_OPTIONS.HEADING_MAP_LABEL),
- timeout = document.getElementById(GEO_OPTIONS.TIMEOUT),
- gpxMultiplier = document.getElementById(GEO_OPTIONS.GPXMULTIPLIER),
- gpxReplayStatus = document.getElementById(GEO_OPTIONS.GPXREPLAYSTATUS),
- gpxGo = document.getElementById(GEO_OPTIONS.GPXGO),
- mapMarker = document.getElementById(GEO_OPTIONS.MAP_MARKER),
- mapContainer = document.getElementById(GEO_OPTIONS.MAP_CONTAINER),
- map = null,
- track = [],
- _replayingGpxFile = false,
- _haltGpxReplay = false;
-
- var updateGeoPending = false;
- function updateGeo() {
- if (!updateGeoPending) {
- updateGeoPending = true;
- window.setTimeout(function () {
- geo.updatePositionInfo({
- latitude: parseFloat(latitude.value),
- longitude: parseFloat(longitude.value),
- altitude: parseInt(altitude.value, 10),
- accuracy: parseInt(accuracy.value, 10),
- altitudeAccuracy: parseInt(altitudeAccuracy.value, 10),
- heading: heading.value ? parseFloat(heading.value) : 0, // HACK: see techdebt http://www.pivotaltracker.com/story/show/5478847
- speed: speed.value ? parseInt(speed.value, 10) : 0, // HACK: see techdebt http://www.pivotaltracker.com/story/show/5478847
- timeStamp: new Date()
- },
- delay.value,
- timeout.checked);
- updateGeoPending = false;
- }, 0);
- }
- }
-
- function onHeadingValueUpdated(value) {
- heading.value = value;
-
- var headingDeg = parseInt(heading.value),
- headingText = navUtils.getDirection(headingDeg);
-
- headingLabel.value = headingText;
- headingMapLabel.innerHTML = headingText + '</br>' + headingDeg + '°';
-
- var style = ['-webkit-transform', '-ms-transform', '-moz-transform', '-o-transform', 'transform'].map(function (prop) {
- return prop + ': rotate(' + headingDeg + 'deg);';
- }).join(' ');
- mapMarker.setAttribute('style', style);
- }
-
- function updateHeadingValues() {
- // notify globally that heading has changed
- messages.emit('device-orientation-updated', heading.value, true);
- }
-
- function updateValsFromMap() {
- var center = geo.map.getCenter().transform(
- new OpenLayers.Projection('EPSG:900913'),
- new OpenLayers.Projection('EPSG:4326'));
- longitude.value = center.lon;
- latitude.value = center.lat;
-
- _gpsMapZoomSet(geo.map.zoom);
- updateGeo();
- }
-
- function initializeValues() {
- latitude.value = positionInfo.latitude;
- longitude.value = positionInfo.longitude;
- altitude.value = positionInfo.altitude;
- accuracy.value = positionInfo.accuracy;
- altitudeAccuracy.value = positionInfo.altitudeAccuracy;
-
- delay.value = document.getElementById(GEO_OPTIONS.DELAY_LABEL).value = geo.delay || 0;
- if (geo.timeout) {
- timeout.checked = true;
- }
- updateHeadingValues();
- }
-
- function initMap() {
- // override image location so we don't have to include image assets
- OpenLayers.ImgPath = 'http://openlayers.org/api/img/';
-
- // init map
- geo.map = new OpenLayers.Map(mapContainer, { controls: [], theme: null });
-
- // add controls and OSM map layer
- geo.map.addLayer(new OpenLayers.Layer.OSM());
- geo.map.addControl(new OpenLayers.Control.Navigation());
-
- // override behaviour of click to pan and double click to zoom in
- var clickHandler = new OpenLayers.Handler.Click(
- this,
- {
- click: function (e) {
- var lonlat = geo.map.getLonLatFromViewPortPx(e.xy);
- mapEventTelemetryHandler();
- geo.map.panTo(new OpenLayers.LonLat(lonlat.lon, lonlat.lat), _gpsMapZoomLevel);
- },
-
- dblclick: function () {
- mapEventTelemetryHandler();
- _updateGpsMapZoom(true);
- }
- },
- { double: true }
- );
-
- // add click handler to map
- clickHandler.setMap(geo.map);
- clickHandler.activate();
-
- // update long and lat when map is panned
- geo.map.events.register('moveend', map, function () {
- mapEventTelemetryHandler();
- updateValsFromMap();
- });
-
- event.on('ApplicationState', function (obj) {
- if (obj && obj[0].id === 'gps-container' && obj.hasClass('ui-box-open')) {
- _updateGpsMap();
- }
- });
- }
-
- function loadGpxFile(filename) {
- var reader = new FileReader(),
- t,
- att,
- lastAtt,
- _ele,
- _timestamp,
- _lastTimestamp,
- _useTimestamp = new Date().getTime(),
- _tempTimestamp,
- _tempPosition,
- _lastPosition,
- _useLastTimestamp,
- _heading = 0,
- _speed = 0,
- _dist = 0;
-
- reader.onload = function (e) {
- function parseXml(xml) {
- return new DOMParser().parseFromString(xml, 'text/xml');
- }
-
- t = parseXml(e.target.result).querySelectorAll('trkpt');
-
- track = [];
-
- utils.forEach(t, function (p, i) {
- if (!isNaN(i)) {
- att = t[i].attributes;
- _ele = t[i].querySelectorAll('ele')[0];
- _timestamp = t[i].querySelectorAll('time')[0];
-
- if (_timestamp) {
- //files recorded with endomondo and others have timestamps, this is not a route plan but a record of a track
- _useTimestamp = new Date(_timestamp.innerHTML).getTime();
- }
-
- if (t[i - 1]) {
- lastAtt = t[i - 1].attributes;
- _lastTimestamp = t[i - 1].querySelectorAll('time')[0];
-
- _dist = navUtils.getDistance(att['lat'].value, att['lon'].value, lastAtt['lat'].value, lastAtt['lon'].value);
-
- if (_lastTimestamp) {
- _useLastTimestamp = new Date(_lastTimestamp.innerHTML).getTime();
- }
- else {
- //routes from YOURS come in as tracks (rather than routes under the GPX schema), but with no timestamps. This is a route.
- _useLastTimestamp = _useTimestamp;
- _useTimestamp += Math.round(_dist / 22.2222 * 1000); //80km/h in m/s
- }
-
- _heading = navUtils.getHeading(lastAtt['lat'].value, lastAtt['lon'].value, att['lat'].value, att['lon'].value);
- _speed = (_dist / ((_useTimestamp - _useLastTimestamp) / 1000)).toFixed(2);
-
- if (!_lastTimestamp) {
- //on YOURS routes, make sure we have at least one update a second
- _tempTimestamp = _useLastTimestamp;
-
- while (_useTimestamp - _tempTimestamp > 1000) {
- _tempTimestamp += 1000;
- _lastPosition = track[track.length - 1].coords;
- _tempPosition = navUtils.simulateTravel(_lastPosition.latitude, _lastPosition.longitude, _heading, _speed);
- track.push({
- coords: {
- latitude: _tempPosition.latitude,
- longitude: _tempPosition.longitude,
- altitude: _ele ? _ele.innerHTML : 0,
- accuracy: 150,
- altitudeAccuracy: 80,
- heading: _heading,
- speed: _speed
- },
- timestamp: _tempTimestamp
- });
- }
- }
- }
-
- track.push({
- coords: {
- latitude: att.lat.value,
- longitude: att.lon.value,
- altitude: _ele ? _ele.innerHTML : 0,
- accuracy: 150,
- altitudeAccuracy: 80,
- heading: _heading,
- speed: _speed
- },
- timestamp: _useTimestamp
- });
- }
- });
- };
- reader.onerror = function (e) {
- console.log('Error reading gpx file ' + filename + ': ' + e);
- };
- reader.readAsText(filename, 'UTF-8');
- }
-
- function replayGpxTrack() {
- if (_replayingGpxFile) {
- _haltGpxReplay = true;
- gpxGo.textContent = constants.GEO.GPXGO_LABELS.GO;
- }
- else {
- if (track.length > 0) {
- _haltGpxReplay = false;
- gpxGo.textContent = constants.GEO.GPXGO_LABELS.STOP;
-
- latitude.value = track[0].coords.latitude;
- longitude.value = track[0].coords.longitude;
- altitude.value = track[0].coords.altitude;
- accuracy.value = track[0].coords.accuracy;
- altitudeAccuracy.value = track[0].coords.altitudeAccuracy;
- heading.value = track[0].coords.heading;
- speed.value = track[0].coords.speed;
-
- updateGeo();
- updateHeadingValues();
-
- moveNextGpxTrack(1);
- }
- }
- }
-
- function moveNextGpxTrack(i) {
- if (_haltGpxReplay) {
- _replayingGpxFile = false;
- _haltGpxReplay = false;
- console.log('User interrupted replay of GPX file.');
- }
- else {
- _replayingGpxFile = true;
- var _timeMultiplier = !isNaN(gpxMultiplier.value) ? gpxMultiplier.value : 1,
- _step = 0,
- _interval = 0;
-
- while (_interval < 250) {
- _step++;
- if ((i + _step) >= track.length) {
- break;
- }
- _interval = (track[i + _step].timestamp - track[i].timestamp) / _timeMultiplier;
- }
-
- gpxReplayStatus.textContent = (_interval / 1000).toFixed(2) + 's (' + (_interval / 1000 * _timeMultiplier).toFixed(2) + 's realtime), ' + (i + 1) + ' of ' + track.length + ' (stepping ' + _step + ' at ' + _timeMultiplier + 'x)';
-
- setTimeout(function () {
- latitude.value = track[i].coords.latitude;
- longitude.value = track[i].coords.longitude;
- altitude.value = track[i].coords.altitude;
- accuracy.value = track[i].coords.accuracy;
- altitudeAccuracy.value = track[i].coords.altitudeAccuracy;
- heading.value = track[i].coords.heading;
- speed.value = track[i].coords.speed;
-
- updateGeo();
- updateHeadingValues();
-
- if (track[i + _step]) {
- moveNextGpxTrack(i + _step);
- }
- else {
- if (i < track.length - 1) {
- moveNextGpxTrack(track.length - 1);
- }
- else {
- _replayingGpxFile = false;
- gpxGo.textContent = constants.GEO.GPXGO_LABELS.GO;
- console.log('Finished replaying GPX file.');
- }
- }
- }, _interval);
- }
- }
-
- _gpsMapZoomLevel = db.retrieve(constants.GEO.MAP_ZOOM_KEY) || 14;
-
- document.querySelector('#geo-map-zoom-decrease').addEventListener('click', function () {
- _updateGpsMapZoom(false);
- });
- document.querySelector('#geo-map-zoom-increase').addEventListener('click', function () {
- _updateGpsMapZoom(true);
- });
-
- latitude.addEventListener('change', updateGeo);
- longitude.addEventListener('change', updateGeo);
- altitude.addEventListener('change', updateGeo);
- accuracy.addEventListener('change', updateGeo);
- altitudeAccuracy.addEventListener('change', updateGeo);
- speed.addEventListener('change', updateGeo);
-
- delay.addEventListener('change', function () {
- updateGeo();
- delayLabel.value = delay.value;
- });
-
- delay.addEventListener('input', function () {
- updateGeo();
- delayLabel.value = delay.value;
- });
-
- timeout.addEventListener('click', updateGeo);
-
- var gpxFileLoader = document.querySelector('#' + GEO_OPTIONS.GPXFILE);
- var gpxFileButton = document.querySelector('#geo-gpxfile-button');
- gpxFileButton.addEventListener('click', function () {
- gpxFileLoader.input.click();
- });
- gpxFileLoader.accept = '.gpx,.GPX';
- gpxFileLoader.addEventListener('change', function () {
- // It is possible to have no file selected and still get a change event.
- // You do this by selecting something, then selecting nothing.
- // You select nothing by cancelling out of the file picker dialog.
- var selectedFiles = this.files;
- if (selectedFiles.length > 0) {
- loadGpxFile(selectedFiles[0]);
- gpxFileButton.textContent = selectedFiles[0].name;
- } else {
- gpxFileButton.textContent = 'Choose File';
- }
- });
-
- gpxGo.addEventListener('click', function () {
- replayGpxTrack();
- });
-
- heading.addEventListener('change', function () {
- updateGeo();
- updateHeadingValues();
- });
-
- heading.addEventListener('input', function () {
- updateGeo();
- updateHeadingValues();
- });
-
- heading.value = positionInfo.heading;
- speed.value = positionInfo.speed;
-
- initMap();
-
- messages.on('device-orientation-updated', function (event, value) {
- onHeadingValueUpdated(value);
- }, true); // global event
-
- initializeValues();
-
- messages.on(positionUpdatedMessage, function () {
- _updateGpsMap();
- });
-
- updateGeo();
-
- registerTelemetryEvents();
- }
- };
- };
-
- },{"./geo-model":5,"db":"db","event":"event","sim-constants":"sim-constants","telemetry-helper":"telemetry-helper","utils":"utils"}],"cordova-plugin-statusbar-handlers":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- module.exports = {
- 'StatusBar': {
- '_ready': function (successCallback) {
- // Report to the app that the status bar is hidden
- successCallback(false);
- }
- }
- };
-
- },{}],"db":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // Based in part on code from Apache Ripple, https://github.com/apache/incubator-ripple
-
- var Q = require('q'),
- utils = require('utils'),
- constants = require('sim-constants'),
- event = require('event'),
- DB_NAME = 'ripple',
- cache,
- self,
- opendb;
-
- // TODO: This could use some refactoring..
-
- function saveToStorage() {
- localStorage[DB_NAME] = JSON.stringify(cache);
- }
-
- function validateAndSetPrefix(prefix) {
- if (prefix) {
- utils.validateArgumentType(prefix, 'string');
- }
-
- return prefix || constants.COMMON.PREFIX;
- }
-
- function createKey(key, prefix) {
- return validateAndSetPrefix(prefix) + key;
- }
-
- function createItem(key, value, prefix) {
- return {
- id: createKey(key, prefix),
- key: key,
- value: value,
- prefix: validateAndSetPrefix(prefix)
- };
- }
-
- function save(key, value, prefix, callback) {
- var item = createItem(key, value, prefix);
- cache[item.id] = item;
-
- if (!window.openDatabase) {
- saveToStorage();
- if (callback) { callback(); }
- } else {
- opendb.transaction(function (tx) {
- tx.executeSql('REPLACE INTO persistence (id, key, value, prefix) VALUES (?, ?, ?, ?)', [item.id, item.key, item.value, item.prefix], function () {
- return callback && callback();
- });
- });
- }
- }
-
- function retrieve(key, prefix) {
- var item = cache[createKey(key, prefix)];
- return item ? item.value : undefined;
- }
-
- function retrieveAll(prefix, callback) {
- var result = {};
-
- if (prefix) {
- utils.forEach(cache, function (value) {
- if (value.prefix === prefix) {
- result[value.key] = value.value;
- }
- });
- }
-
- if (callback) { callback(result); }
- }
-
- function remove(key, prefix, callback) {
- var id = createKey(key, prefix);
-
- delete cache[id];
-
- if (!window.openDatabase) {
- saveToStorage();
- if (callback) { callback(); }
- } else {
- opendb.transaction(function (tx) {
- tx.executeSql('DELETE FROM persistence WHERE key = ? AND prefix = ?', [key, validateAndSetPrefix(prefix)], function () {
- return callback && callback();
- });
- });
- }
- }
-
- function removeAll(callback) {
- cache = {};
-
- if (!window.openDatabase) {
- delete localStorage[DB_NAME];
- saveToStorage();
- } else {
- opendb.transaction(function (tx) {
- tx.executeSql('DELETE FROM persistence', [], function () {
- return callback && callback();
- });
- });
- }
- }
-
- self = {
- save: function (key, value, prefix, callback) {
- save(key, value, prefix, callback);
- event.trigger('StorageUpdatedEvent');
- },
-
- saveObject: function (key, obj, prefix, callback) {
- save(key, JSON.stringify(obj), prefix, callback);
- event.trigger('StorageUpdatedEvent');
- },
-
- retrieve: function (key, prefix) {
- return retrieve(key, prefix);
- },
-
- retrieveObject: function (key, prefix) {
- var retrievedValue = retrieve(key, prefix);
- return retrievedValue ? JSON.parse(retrievedValue) : retrievedValue;
- },
-
- retrieveAll: function (prefix, callback) {
- return retrieveAll(prefix, callback);
- },
-
- remove: function (key, prefix, callback) {
- event.trigger('StorageUpdatedEvent');
- remove(key, prefix, callback);
- },
-
- removeAll: function (callback) {
- removeAll(callback);
- event.trigger('StorageUpdatedEvent');
- },
-
- initialize: function () {
- var d = Q.defer();
-
- if (!window.openDatabase) {
- var store = localStorage[DB_NAME];
- cache = store ? JSON.parse(store) : {};
- saveToStorage();
- d.resolve();
- } else {
- cache = {};
- opendb = openDatabase('tinyHippos', '1.0', 'tiny Hippos persistence', 2 * 1024 * 1024);
- opendb.transaction(function (tx) {
- tx.executeSql('CREATE TABLE IF NOT EXISTS persistence (id unique, key, value, prefix)');
-
- tx.executeSql('SELECT id, key, value, prefix FROM persistence', [], function (tx, results) {
- var len = results.rows.length, i, item;
-
- for (i = 0; i < len; i++) {
- item = results.rows.item(i);
- cache[item.id] = item;
- }
-
- d.resolve();
- });
- });
- }
-
- return d.promise;
- }
- };
-
- module.exports = self;
-
- },{"event":"event","q":1,"sim-constants":"sim-constants","utils":"utils"}],"dialog":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- // This module manages the queuing of dialogs. The simulation host must register dialogs (by adding them to
- // pluginDialogs) and handle the actual showing/hiding when requested (via hide() and show() methods attach to
- // the registered dialog object).
-
- var pluginDialogs = {};
-
- var currentDialogId = null;
- var dialogQueue = [];
-
- module.exports.pluginDialogs = pluginDialogs;
-
- var panelsDisabled = false;
- var activeElement = null;
-
- function showDialog(dialogId, cb) {
- var dialog = pluginDialogs[dialogId];
- if (!dialog) {
- throw 'No dialog defined with id ' + dialogId;
- }
-
- // If a dialog is currently showing, queue this one to show later
- if (currentDialogId) {
- dialogQueue.push({id: dialogId, callback: cb});
- return;
- }
-
- // Notify callback we're about to show
- cb && cb('showing');
-
- currentDialogId = dialogId;
-
- // Disable the panels if they're not already
- if (!panelsDisabled) {
- activeElement = document.activeElement;
- getPanels().forEach(function (panel) {
- panel.enabled = false;
- });
- panelsDisabled = true;
- }
-
- dialog.show();
-
- // Notify callback we're shown
- cb && cb('shown');
- }
- module.exports.showDialog = showDialog;
-
- function hideDialog(dialogId) {
- if (!dialogId) {
- dialogId = currentDialogId;
- if (!dialogId) {
- throw 'Trying to hide dialog when none is showing.';
- }
- } else {
- if (dialogId !== currentDialogId) {
- throw 'Trying to hide a dialog that isn\'t currently showing: ' + dialogId;
- }
- }
-
- var dialog = pluginDialogs[dialogId];
- if (!dialog) {
- throw 'No dialog defined with id ' + dialogId;
- }
-
- currentDialogId = null;
- dialog.hide();
-
- // After a timeout, see if there are more dialogs to show
- window.setTimeout(function () {
- if (currentDialogId) {
- return;
- }
-
- var dialogInfo = findNextDialog();
- if (dialogInfo) {
- showDialog(dialogInfo.id, dialogInfo.callback);
- } else {
- // No dialog to show? Re-enable the panels
- getPanels().forEach(function (panel) {
- panel.enabled = true;
- });
-
- if (activeElement) {
- activeElement.focus();
- activeElement = null;
- }
-
- panelsDisabled = false;
- }
- }, 0);
- }
- module.exports.hideDialog = hideDialog;
-
- function getPanels() {
- return Array.prototype.slice.call(document.querySelectorAll('body /deep/ cordova-panel'));
- }
-
- function findNextDialog() {
- while (dialogQueue.length) {
- var dialogInfo = dialogQueue.shift();
- var cb = dialogInfo.callback;
- // If there's a callback, it must explicitly return 'false' (not a falsy value) in response to 'query-show' to
- // prevent the dialog from showing.
- if (!cb || cb('query-show') !== false) {
- return dialogInfo;
- }
- }
- return null;
- }
-
- },{}],"events":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- var telemetry = require('telemetry-helper');
-
- var baseProps = {
- plugin: 'events',
- panel: 'events'
- };
-
- module.exports = function (messages) {
- function initialize() {
- var eventList = document.getElementById('event-list');
- var events = ['backbutton', 'menubutton', 'pause', 'resume', 'searchbutton', 'online', 'offline'];
- events.forEach(function (event) {
- var option = document.createElement('option');
- option.value = event;
- var caption = document.createTextNode(event);
- option.appendChild(caption);
- eventList.appendChild(option);
- });
- document.getElementById('event-fire').addEventListener('click', function () {
- var eventList = document.getElementById('event-list');
- var option = eventList.options[eventList.selectedIndex];
-
- telemetry.sendUITelemetry(Object.assign({}, baseProps, { control: 'event-fire', value: option.value }));
- messages.call('event', option.value).then(function (result) {
- console.log('Fired event: ' + result);
- }, function (err) {
- console.log('Firing event failed: ' + err);
- });
- });
- }
-
- return {
- initialize: initialize
- };
- };
-
- },{"telemetry-helper":"telemetry-helper"}],"event":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // Based in part on code from Apache Ripple, https://github.com/apache/incubator-ripple
-
- var utils = require('utils'),
- exception = require('exception'),
- _listeners = {};
-
- function _on(eventType, listener, scope, once) {
- if (!eventType) {
- throw 'eventType must be truthy';
- }
- _listeners[eventType] = _listeners[eventType] || [];
- _listeners[eventType].push({
- func: listener,
- scope: scope,
- once: !!once
- });
- }
-
- function _trigger(listener, args, sync) {
- try {
- if (sync) {
- listener.func.apply(listener.scope, args);
- }
- else {
- setTimeout(function () {
- listener.func.apply(listener.scope, args);
- }, 1);
- }
- }
- catch (e) {
- exception.handle(e);
- }
- }
-
- module.exports = {
- on: function (eventType, listener, scope) {
- _on(eventType, listener, scope, false);
- },
-
- once: function (eventType, listener, scope) {
- _on(eventType, listener, scope, true);
- },
-
- trigger: function (eventType, args, sync) {
- args = args || [];
- sync = sync || false;
-
- var listeners = _listeners[eventType];
-
- if (listeners) {
- listeners.forEach(function (listener) {
- _trigger(listener, args, sync);
- });
-
- _listeners[eventType] = listeners.filter(function (listener) {
- return !listener.once;
- });
- }
- },
-
- eventHasSubscriber: function (eventType) {
- return !!_listeners[eventType];
- },
-
- getEventSubscribers: function (eventType) {
- return utils.copy(_listeners[eventType]) || [];
- },
-
- clear: function (eventType) {
- if (eventType) {
- delete _listeners[eventType];
- }
- }
- };
-
- },{"exception":"exception","utils":"utils"}],"exception":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // Based in part on code from Apache Ripple, https://github.com/apache/incubator-ripple
-
- function _getStack(depth) {
- var caller,
- stack = '',
- count = 0;
-
- try {
- /*jshint noarg:false*/ // THIS SHOULD NOT be a common occurrence..
- caller = arguments.callee.caller.arguments.callee.caller;
-
- while (count <= depth && caller) {
- stack += 'function: ' + caller.toString().match(/function\s?(.*)\{/)[1] + '\n';
- caller = caller.arguments.callee.caller;
- count++;
- }
- } catch (e) {
- stack = 'failed to determine stack trace (' + (e.name || e.type) + ' :: ' + e.message + ')';
- }
-
- return stack;
- }
-
- module.exports = {
-
- types: {
- Application: 'Application',
- ArgumentLength: 'ArgumentLength',
- ArgumentType: 'ArgumentType',
- Argument: 'Argument',
- NotificationType: 'NotificationType',
- NotificationStateType: 'NotificationStateType',
- DomObjectNotFound: 'DomObjectNotFound',
- LayoutType: 'LayoutType',
- DeviceNotFound: 'DeviceNotFound',
- tinyHipposMaskedException: 'tinyHipposMaskedException',
- Geo: 'Geo',
- Accelerometer: 'Accelerometer',
- MethodNotImplemented: 'MethodNotImplemented',
- InvalidState: 'InvalidState',
- ApplicationState: 'ApplicationState'
- },
-
- handle: function handle(exception, reThrow) {
- reThrow = reThrow || false;
-
- var eMsg = exception.message || 'exception caught!',
- msg = eMsg + '\n\n' + (exception.stack || '*no stack provided*') + '\n\n';
-
- console.error(msg);
-
- if (reThrow) {
- throw exception;
- }
- },
-
- raise: function raise(exceptionType, message, customExceptionObject) {
- var obj = customExceptionObject || {
- type: '',
- message: '',
-
- toString: function () {
- var result = this.name + ': \'' + this.message + '\'';
-
- if (this.stack) {
- result += '\n' + this.stack;
- }
- return result;
- }
- };
-
- message = message || '';
-
- obj.name = exceptionType;
- obj.type = exceptionType;
- // TODO: include the exception objects original message if exists
- obj.message = message;
- obj.stack = _getStack(5);
-
- throw obj;
- }
- };
-
- },{}],"exec-handlers":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- var dialog = require('dialog');
- var savedSims = require('./saved-sims');
- var telemetry = require('telemetry-helper');
-
- // Handle any calls not handled by anything else...
- module.exports = {
- '*': {
- '*': function (success, fail, service, action, args) {
- // If there is no success or fail method provided, then there is no point in us trying to handle it, so we
- // don't.
- if (!success && !fail) {
- return;
- }
-
- // If we have a saved sim for this service.action, use that
- if (handleSavedSim(success, fail, service, action)) {
- return;
- }
-
- // Otherwise show the dialog
- dialog.showDialog('exec-dialog', function (msg) {
- if (msg === 'query-show') {
- // Display of the dialog was delayed for some reason. Check if in the meantime we have a saved value
- // for this call.
- return !handleSavedSim(success, fail, service, action);
- } else if (msg === 'showing') {
- // Prepare the dialog for showing
- var successButton = document.getElementById('exec-success');
- var failureButton = document.getElementById('exec-failure');
- var resultField = document.getElementById('exec-response');
- var errorDisplay = document.getElementById('exec-error');
-
- errorDisplay.style.display = 'none';
- document.getElementById('exec-service').textContent = service;
- document.getElementById('exec-action').textContent = action;
- document.getElementById('exec-args').textContent = (args || []).map(JSON.stringify).join(', ');
-
- /*eslint-disable no-inner-declarations */
- function handleSuccess() {
- exec(success, true);
- }
-
- function handleFailure() {
- exec(fail);
- }
-
- function exec(func, isSuccess) {
- var result = resultField.value;
- var shouldPersist = document.getElementById('exec-persist').checked;
-
- try {
- result = result && JSON.parse(result);
- } catch (e) {
- document.getElementById('exec-parse-error').textContent = e.toString();
- errorDisplay.style.display = '';
- return;
- }
-
- dialog.hideDialog('exec-dialog');
-
- if (shouldPersist) {
- savedSims.addSim({ service: service, action: action, args: args, value: result, success: isSuccess });
- }
-
- sendExecUnhandledTelemetry(service, action, false, isSuccess, resultHasValue(result), shouldPersist);
- func.apply(null, result ? [result] : []);
- }
- /*eslint-enable no-inner-declarations */
-
- // Do this each time to capture the values from the current closure. Also, use this approach rather than
- // addEventListener(), as it can prove difficult to remove the event listener.
- successButton.onclick = handleSuccess;
- failureButton.onclick = handleFailure;
-
- resultField.value = '';
- }
- });
- }
- }
- };
-
- function handleSavedSim(success, fail, service, action) {
- var savedSim = savedSims.findSavedSim(service, action);
- if (savedSim) {
- var isSuccess = !!savedSim.success;
- sendExecUnhandledTelemetry(service, action, true, isSuccess, resultHasValue(savedSim.value));
-
- if (isSuccess) {
- success(savedSim.value);
- } else {
- fail(savedSim.value);
- }
- return true;
- }
- return false;
- }
-
- /**
- * Sends an 'exec-unhandled' telemetry event to the server.
- *
- * @param {string} service The name of the plugin's service.
- * @param {string} action The name of the plugin's action.
- * @param {boolean} hasPersisted Whether or not the exec call already had a persiste result (no dialog popup was shown to the user).
- * @param {boolean} isSuccess Whether or not the result is a success (as in, the plugin action's success callback was used).
- * @param {boolean} hasResult Whether or not the result contains a value (as opposed to being empty / the default JSON object {}).
- * @param {boolean=} saveResult Whether the user chose to persist the result. This is ignored if hasPersisted is true, because in that case the user wasn't presented the dialog popup.
- */
- function sendExecUnhandledTelemetry(service, action, hasPersisted, isSuccess, hasResult, saveResult) {
- var props = {
- 'service': service,
- 'action': action,
- 'has-persisted-result': hasPersisted,
- 'is-success': isSuccess,
- 'has-result-value': hasResult
- };
-
- if (!hasPersisted) {
- props['save-result'] = !!saveResult;
- }
-
- telemetry.sendClientTelemetry('exec-unhandled', props);
- }
-
- /**
- * Determines whether the user typed something in the unhandled exec popup.
- *
- * @param {any} result The content of the text entry.
- * @returns {boolean} Whether the user entered a value.
- */
- function resultHasValue(result) {
- return typeof result !== 'undefined' && result !== '';
- }
-
- },{"./saved-sims":6,"dialog":"dialog","telemetry-helper":"telemetry-helper"}],"exec":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- /*global CordovaLabeledValue: false, CordovaItem: false */
- // These globals are cordova-simulate custom elements.
-
- var savedSims = require('./saved-sims');
- var event = require('event');
-
- var emptyLabel;
- var execList;
-
- module.exports = {
- initialize: function () {
- var sims = savedSims.sims;
-
- emptyLabel = document.getElementById('empty-label');
- execList = document.getElementById('exec-list');
- execList.addEventListener('itemremoved', function (e) {
- savedSims.removeSim(e.detail.itemIndex);
-
- if (!savedSims.sims.length) {
- showEmptyLabel();
- }
- });
-
- event.on('saved-sim-added', function (sim) {
- hideEmptyLabel();
- execList.addItem(cordovaItemFromSim(sim));
- });
-
- if (sims && sims.length) {
- sims.forEach(function (sim) {
- execList.addItem(cordovaItemFromSim(sim));
- });
- } else {
- // Create a "No values saved" item
- showEmptyLabel();
- }
- }
- };
-
- function cordovaItemFromSim(sim) {
- var labeledValue = new CordovaLabeledValue();
- labeledValue.label = sim.service + '.' + sim.action;
-
- var value = sim.value;
- if (typeof value === 'object') {
- try {
- value = JSON.stringify(value);
- } catch (e) {
- // ignore
- }
- }
-
- labeledValue.value = value;
- var cordovaItem = new CordovaItem();
- cordovaItem.appendChild(labeledValue);
- return cordovaItem;
- }
-
- function showEmptyLabel() {
- emptyLabel.classList.remove('cordova-hidden');
- execList.classList.add('cordova-hidden');
- }
-
- function hideEmptyLabel() {
- emptyLabel.classList.add('cordova-hidden');
- execList.classList.remove('cordova-hidden');
- }
-
-
- },{"./saved-sims":6,"event":"event"}],"jquery.min":[function(require,module,exports){
- /*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
- !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){
- return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=L.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var Q=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,R=["Top","Right","Bottom","Left"],S=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},T=/^(?:checkbox|radio)$/i;!function(){var a=l.createDocumentFragment(),b=a.appendChild(l.createElement("div")),c=l.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||l,d=c.documentElement,e=c.body,a.pageX=b.clientX+(d&&d.scrollLeft||e&&e.scrollLeft||0)-(d&&d.clientLeft||e&&e.clientLeft||0),a.pageY=b.clientY+(d&&d.scrollTop||e&&e.scrollTop||0)-(d&&d.clientTop||e&&e.clientTop||0)),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=W.test(e)?this.mouseHooks:V.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=l),3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==_()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===_()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?Z:$):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:$,isPropagationStopped:$,isImmediatePropagationStopped:$,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=Z,a&&a.preventDefault&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=Z,a&&a.stopPropagation&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=Z,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=L.access(d,b);e||d.addEventListener(a,c,!0),L.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=L.access(d,b)-1;e?L.access(d,b,e):(d.removeEventListener(a,c,!0),L.remove(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(g in a)this.on(g,b,c,a[g],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=$;else if(!d)return this;return 1===e&&(f=d,d=function(a){return n().off(a),f.apply(this,arguments)},d.guid=f.guid||(f.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=$),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ia={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1></$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp("^("+Q+")(.*)$","i"),Ba=new RegExp("^([+-])=("+Q+")","i"),Ca={position:"absolute",visibility:"hidden",display:"block"},Da={letterSpacing:"0",fontWeight:"400"},Ea=["Webkit","O","Moz","ms"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Ha(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ia(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?"border":"content"),d,f)+"px"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",ta(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),"normal"===e&&b in Da&&(e=Da[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pa=/queueHooks$/,Qa=[Va],Ra={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||ta(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?ta(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta("show"),slideUp:Ta("hide"),slideToggle:Ta("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),La=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ma||(Ma=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(Ma),Ma=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a=l.createElement("input"),b=l.createElement("select"),c=b.appendChild(l.createElement("option"));a.type="checkbox",k.checkOn=""!==a.value,k.optSelected=c.selected,b.disabled=!0,k.optDisabled=!c.disabled,a=l.createElement("input"),a.value="t",a.type="radio",k.radioValue="t"===a.value}();var Ya,Za,$a=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return J(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)),
- void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ab," ").indexOf(b)>=0)return!0;return!1}});var bb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cb=n.now(),db=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \t]*([^\r\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\/\//,kb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lb={},mb={},nb="*/".concat("*"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:"GET",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+"").replace(eb,"").replace(jb,pb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pb[3]||("http:"===pb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,"$1_="+cb++):d+(db.test(d)?"&":"?")+"_="+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nb+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&").replace(vb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&"withCredentials"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cb[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("<script>").prop({async:!0,charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&e("error"===a.type?404:200,a.type)}),l.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Fb=[],Gb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Fb.pop()||n.expando+"_"+cb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Gb.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Gb,"$1"+e):b.jsonp!==!1&&(b.url+=(db.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Fb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||l;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var Hb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Hb)return Hb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e,dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,f||[a.responseText,b,a])}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var Ib=a.document.documentElement;function Jb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(typeof d.getBoundingClientRect!==U&&(e=d.getBoundingClientRect()),c=Jb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||Ib;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ib})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b,c){var d="pageYOffset"===c;n.fn[b]=function(e){return J(this,function(b,e,f){var g=Jb(b);return void 0===f?g?g[c]:b[e]:void(g?g.scrollTo(d?a.pageXOffset:f,d?f:a.pageYOffset):b[e]=f)},b,e,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=ya(k.pixelPosition,function(a,c){return c?(c=xa(a,b),va.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return J(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Kb=a.jQuery,Lb=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Lb),b&&a.jQuery===n&&(a.jQuery=Kb),n},typeof b===U&&(a.jQuery=a.$=n),n});
-
- },{}],"messages":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- var Q = require('q');
-
- // Plugin communications layer. Two types of communication are supported:
- // 1. Messages - when emitted, any local handlers are notified, and it is also sent across to web sockets connection
- // where any remote handlers are notified. There can be any number of local and/or remote handlers. There is no
- // opportunity to respond.
- // 2. Methods - calls across the web socket connection where there can be a single handler that can return a single
- // value or error value.
-
- function Messages(pluginId, socket) {
- this.pluginId = pluginId;
- this.socket = socket;
- this.messages = {};
- this.methods = {};
-
- var that = this;
- socket.on('plugin-message', function (data) {
- if (data.pluginId === pluginId) {
- notify.call(that, that.messages, data.message, data.data);
- }
- });
- socket.on('plugin-method', function (data, callback) {
- if (data.pluginId === pluginId) {
- var handler = that.methods && that.methods[data.method];
- if (handler) {
- var args = data.args;
- args.push(callback);
- handler.apply(this, args);
- }
- }
- });
- }
-
- Messages._globalMessages = {};
-
- function notify(messagesObj, message, data) {
- // Notifies local listeners of a message
- var handlers = messagesObj && messagesObj[message];
- if (handlers) {
- handlers.forEach(function (handler) {
- handler.call(this, message, data);
- });
- }
- }
-
- Messages.prototype = {
- // Call and register for methods
-
- /**
- * @desc Calls the specified method, with any number of parameters. Return a promise.
- * @param method
- */
- call: function (method) {
- var d = Q.defer();
- this.socket.emit('plugin-method', {
- pluginId: this.pluginId,
- method: method,
- args: Array.prototype.slice.call(arguments, 1)
- }, function (err, result) {
- if (err) {
- d.reject(err);
- } else {
- d.resolve(result);
- }
- });
- return d.promise;
- },
-
- register: function(method, handler) {
- // Can only ever have one handler for a method. Cancel by calling with handler null or undefined.
- this.methods[method] = handler;
- return this;
- },
-
- // Emit and handle messages
- emit: function (message, data, isGlobal) {
- // Pass the message across the socket
- var eventName,
- messagesObj;
-
- if (isGlobal) {
- eventName = 'global-plugin-message';
- messagesObj = Messages._globalMessages;
- } else {
- eventName = 'plugin-message';
- messagesObj = this.messages;
- }
-
- this.socket.emit(eventName, {
- pluginId: this.pluginId,
- message: message,
- data: data
- });
-
- // Notify any local listeners
- notify.call(this, messagesObj, message, data);
- },
-
- // Emit messages destined to external debug-hosts
- emitDebug: function(message, data) {
- this.socket.emit('debug-message', {
- pluginId: this.pluginId,
- message: message,
- data: data
- });
- },
-
- refreshAppHost: function (device) {
- this.socket.emit('refresh-app-host', device);
- },
-
- on: function (message, handler, isGlobal) {
- var messagesObj = (!isGlobal) ? this.messages : Messages._globalMessages;
-
- if (!messagesObj[message]) {
- messagesObj[message] = [handler];
- } else {
- messagesObj[message].push(handler);
- }
- return this;
- },
-
- off: function (message, handler) {
- var handlers = this.messages[message];
- if (!handlers) {
- // try on the global messages handlers
- handlers = Messages._globalMessages[message];
- if (!handlers) {
- return this;
- }
- }
-
- var pos = handlers.indexOf(handler);
- while (pos > -1) {
- handlers.splice(pos, 1);
- pos = handlers.indexOf(handler);
- }
- }
- };
-
- module.exports = Messages;
-
- },{"q":1}],"polyfills":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
-
- if (typeof Object.assign != 'function') {
- (function () {
- Object.assign = function (target) {
- 'use strict';
- if (target === undefined || target === null) {
- throw new TypeError('Cannot convert undefined or null to object');
- }
-
- var output = Object(target);
- for (var index = 1; index < arguments.length; index++) {
- var source = arguments[index];
- if (source !== undefined && source !== null) {
- for (var nextKey in source) {
- if (Object.prototype.hasOwnProperty.call(source, nextKey)) {
- output[nextKey] = source[nextKey];
- }
- }
- }
- }
- return output;
- };
- })();
- }
-
- },{}],"sim-constants":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // Based in part on code from Apache Ripple, https://github.com/apache/incubator-ripple
-
- module.exports = {
- 'API_URL': 'https://rippleapi.herokuapp.com',
-
- 'SERVICES': {
- 'GOOGLE_MAPS_URI': 'http://maps.google.com/maps/api/staticmap?size=476x476&maptype=roadmap',
- 'GOOGLE_MAPS_API_KEY': 'ABQIAAAA-CaPZHXR-0Tzhui_h6gpjhSE_2rGlnYiB7L-ZGVwgaut5s7OYRSlBAaHCzBuZf2_23_vrCOfPxXHjA'
- },
-
- 'FS_SIZE': 1024 * 1024 * 10,
-
- 'COMMON': {
- 'APPLICATION_STATE': 'ui-application-state-',
- 'PREFIX': 'tinyhippos-',
- 'MENU_BUTTON' : 'menu-button',
- 'BACK_BUTTON' : 'back-button',
- 'HTML_CONTAINER' : 'document',
- 'INFO_SECTION': 'information-sub-container',
- 'ORIENTATION_SELECT_PORTRAIT_ID' : 'layout-portrait',
- 'ORIENTATION_SELECT_LANDSCAPE_ID' : 'layout-landscape',
- 'PLATFORM_SELECT_ID': 'platform-select',
- 'DEVICE_SELECT_ID': 'device-select',
- 'STORAGE_TABLE_BODY_CLASS': 'preferences-list-body',
- 'STORAGE_COUNT_CONTAINER_ID': 'preferences-count',
- 'GEO_MAP_CONTAINER_ID': 'geo-map',
- 'FILESYSTEM_UPDATE_BUTTON_ID_WITH_HASH': '#update-filesystem-button',
- 'APPLICATIONS_CONTAINER_ID': 'widget-applications-content',
- 'STORAGE_CLEAR_BUTTON_ID': 'preferences-clear-button',
- 'CHANGE_PLATFORM_BUTTON_ID': 'change-platform',
- 'AJAX_LOADER_CONTAINER_CLASS': '.loader',
- 'IRRELEVANT_CLASS': 'irrelevant',
- 'MULTIMEDIA_VOLUME_SLIDER_ID': 'media-volume',
- 'MULTIMEDIA_VOLUME_FIELD_ID': 'media-volume-value',
- 'MULTIMEDIA_AUDIO_STATE_FIELD_ID': 'media-audio-state',
- 'MULTIMEDIA_AUDIO_PLAYING_FIELD_ID': 'multimedia-isaudioplaying',
- 'MULTIMEDIA_AUDIO_PROGRESS_ID': 'media-audio-progress',
- 'MULTIMEDIA_AUDIO_FILE_FIELD_ID': 'media-audio-file',
- 'MULTIMEDIA_VIDEO_STATE_FIELD_ID': 'media-video-state',
- 'MULTIMEDIA_VIDEO_PLAYING_FIELD_ID': 'multimedia-isvideoplaying',
- 'MULTIMEDIA_VIDEO_PROGRESS_ID': 'media-video-progress',
- 'MULTIMEDIA_VIDEO_FILE_FIELD_ID': 'media-video-file',
- 'EXTENSION_URL_CONTAINER': 'extension-url',
- 'SECURITY_LEVEL': 'security-level'
- },
-
- 'FILESYSTEM': {
- 'PERSISTENCE_KEY': 'filesystem',
- 'INPUT_PREFIX_ID': '#panel-filesystem-'
- },
-
- 'PLATFORM': {
- 'DEFAULT': {
- 'name': 'cordova',
- 'version': '1.0.0'
- }
- },
-
- 'ENCAPSULATOR': {
- 'DEFAULT_HEIGHT': 684,
- 'DEFAULT_WIDTH': 480
- },
-
- 'GEO': {
- 'OPTIONS' : {
- 'LATITUDE' : 'geo-latitude',
- 'LONGITUDE' : 'geo-longitude',
- 'ALTITUDE' : 'geo-altitude',
- 'CELL_ID' : 'geo-cellid',
- 'ACCURACY' : 'geo-accuracy',
- 'ALTITUDE_ACCURACY' : 'geo-altitude-accuracy',
- 'HEADING' : 'geo-heading',
- 'SPEED' : 'geo-speed',
- 'TIME_STAMP' : 'geo-timestamp',
- 'DELAY' : 'geo-delay',
- 'DELAY_LABEL' : 'geo-delay-label',
- 'HEADING_LABEL' : 'geo-heading-label',
- 'HEADING_MAP_LABEL' : 'geo-map-direction-label',
- 'IMAGE' : 'geo-map-img',
- 'MAP_MARKER' : 'geo-map-marker',
- 'MAP_CONTAINER' : 'geo-map-container',
- 'TIMEOUT' : 'geo-timeout',
- 'GPXFILE': 'geo-gpxfile',
- 'GPXGO': 'geo-gpx-go',
- 'GPXMULTIPLIER': 'geo-gpxmultiplier-select',
- 'GPXREPLAYSTATUS': 'geo-gpxreplaystatus'
- },
- 'MAP_ZOOM_MAX': 18,
- 'MAP_ZOOM_MIN': 0,
- 'MAP_ZOOM_LEVEL_CONTAINER': 'geo-map-zoomlevel-value',
- 'MAP_ZOOM_KEY': 'geo-map-zoom-key',
- 'GPXGO_LABELS': {
- 'GO': 'Go',
- 'STOP': 'Stop'
- }
- },
-
- 'PUSH': {
- 'OPTIONS' : {
- 'PAYLOAD' : 'push-text'
- }
- },
-
- 'TELEPHONY': {
- 'CALL_LIST_KEY': 'telephony-call-list-key'
- },
-
- 'PIM': {
- 'ADDRESS_LIST_KEY': 'pim-address-list-key',
- 'CALENDAR_LIST_KEY': 'pim-calendar-list-key'
- },
-
- 'CAMERA': {
- 'WINDOW_ANIMATION': 'images/dance.gif',
- 'WARNING_TEXT': 'The runtime simulated saving the camera file to {file}. If you need to access this file in your application, please copy a file to the saved location'
- },
-
- 'AUDIOPLAYER' : {
- 'WARNING_TEXT': 'The runtime simulated saving the audio file to {file}. If you need to access this file in your application, please copy a file to the saved location'
- },
-
- 'API_APPLICATION': {
- 'NO_APPLICATIONS_MESSAGE': 'No applications available for your platform'
- },
-
- 'NOTIFICATIONS': {
- 'MESSAGE_CONTAINER_CLASS': 'notification-message-div',
- 'MAIN_CONTAINER_CLASS': 'panel-notification',
- 'CLOSE_BUTTON_CLASS': 'panel-notification-closebtn',
- 'MESSAGE_TEXT_CONTAINER_CLASS': 'panel-notification-text',
- 'CSS_PREFIX': 'panel-notification-',
- 'STATE_TYPES': {
- 'OPEN': 1,
- 'CLOSE': 2
- }
- },
-
- 'BATTERY_STATUS' : {
- 'BATTERY_STATUS_KEY': 'battery-status-key',
- 'IS_PLUGGED_KEY' : 'is-plugged-key',
- 'LEVEL_LABEL' : 'battery-level-label',
- 'LEVEL_VALUE' : 'battery-level',
- 'IS_PLUGGED_CHECKBOX' : 'is-plugged'
- },
-
- 'CSS_PREFIX': {
- 'IRRELEVANT' : 'irrelevant'
- },
-
- 'STORAGE': {
- 'PAIR_DELIMETER' : ',',
- 'KEY_VALUE_DELIMETER' : '|'
- },
-
- 'REGEX': {
- 'GEO' : /^geo-/,
- 'URL': /^((https?|ftp|gopher|telnet|file|notes|ms-help):((\/\/)|(\\\\))+[\w\d:#@%\/;$()~_?\+-=\\\.&]*)$/,
- //'Email': /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/
- 'EMAIL': /^([^@\s]+)@((?:[\-a-z0-9]+\.)+[a-z]{2,})$/,
- 'WC3_DTF': /^((\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)|(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)|(\d{4})-(\d\d)-(\d\d)|(\d{4})-(\d\d)|(\d\d\d\d))$/,
- 'NON_RELATIVE_URI': /^https?:\/\/|^file:\/\//
- },
-
- 'CONFIG': {
- 'SUCCESS_CSS': {
- 'true': 'ui-text-pass',
- 'false': 'ui-text-fail',
- 'missing': 'ui-text-missing'
- }
- },
-
- 'SETTINGS': {
- 'TOOLTIPS_TOGGLE_DIV': '#settings-toggletooltips',
- 'TOOLTIPS_KEY': 'tool-tips-key'
- },
-
- 'UI': {
- 'JQUERY_UI_BUTTON_CLASSES': 'ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only',
- 'JQUERY_UI_INPUT_CLASSES': 'ui-state-default ui-corner-all',
- 'PANEL_TABLE_CLASS': 'panel-table',
- 'RIGHT_RANGE_LABEL_CLASS': 'range-label',
- 'LEFT_RANGE_LABEL_CLASS': 'range-label-left',
- 'TEXT_LABEL_CLASS': 'ui-text-label',
- 'SCREEN_PPI': 96
- },
-
- 'MULTIMEDIA': {
- 'AUDIO_STATES': {
- 'OPENED': 'opened',
- 'STOPPED': 'stopped',
- 'PAUSED': 'paused',
- 'PLAYING': 'playing',
- 'COMPLETED': 'completed'
- }
- },
-
- 'LANG': {
- 'ISO6392_LIST': ['abk', 'ace', 'ach', 'ada', 'ady', 'aar', 'afh', 'afr', 'afa', 'ain', 'aka', 'akk', 'alb/sqi', 'gsw', 'ale', 'alg', 'tut', 'amh', 'anp', 'apa', 'ara', 'arg', 'arp', 'arw', 'arm/hye', 'rup', 'art', 'asm', 'ast', 'ath', 'aus', 'map', 'ava', 'ave', 'awa', 'aym', 'aze', 'ban', 'bat', 'bal', 'bam', 'bai', 'bad', 'bnt', 'bas', 'bak', 'baq/eus', 'btk', 'bej', 'bel', 'bem', 'ben', 'ber', 'bho', 'bih', 'bik', 'byn', 'bin', 'bis', 'zbl', 'nob', 'bos', 'bra', 'bre', 'bug', 'bul', 'bua', 'bur/mya', 'cad', 'spa', 'cat', 'cau', 'ceb', 'cel', 'cai', 'khm', 'chg', 'cmc', 'cha', 'che', 'chr', 'nya', 'chy', 'chb', 'chi/zho', 'chn', 'chp', 'cho', 'zha', 'chu', 'chk', 'chv', 'nwc', 'syc', 'rar', 'cop', 'cor', 'cos', 'cre', 'mus', 'crp', 'cpe', 'cpf', 'cpp', 'crh', 'hrv', 'cus', 'cze/ces', 'dak', 'dan', 'dar', 'del', 'div', 'zza', 'din', 'doi', 'dgr', 'dra', 'dua', 'dut/nld', 'dum', 'dyu', 'dzo', 'frs', 'efi', 'egy', 'eka', 'elx', 'eng', 'enm', 'ang', 'myv', 'epo', 'est', 'ewe', 'ewo', 'fan', 'fat', 'fao', 'fij', 'fil', 'fin', 'fiu', 'fon', 'fre/fra', 'frm', 'fro', 'fur', 'ful', 'gaa', 'gla', 'car', 'glg', 'lug', 'gay', 'gba', 'gez', 'geo/kat', 'ger/deu', 'nds', 'gmh', 'goh', 'gem', 'kik', 'gil', 'gon', 'gor', 'got', 'grb', 'grc', 'gre/ell', 'kal', 'grn', 'guj', 'gwi', 'hai', 'hat', 'hau', 'haw', 'heb', 'her', 'hil', 'him', 'hin', 'hmo', 'hit', 'hmn', 'hun', 'hup', 'iba', 'ice/isl', 'ido', 'ibo', 'ijo', 'ilo', 'arc', 'smn', 'inc', 'ine', 'ind', 'inh', 'ina', 'ile', 'iku', 'ipk', 'ira', 'gle', 'mga', 'sga', 'iro', 'ita', 'jpn', 'jav', 'kac', 'jrb', 'jpr', 'kbd', 'kab', 'xal', 'kam', 'kan', 'kau', 'pam', 'kaa', 'krc', 'krl', 'kar', 'kas', 'csb', 'kaw', 'kaz', 'kha', 'khi', 'kho', 'kmb', 'kin', 'kir', 'tlh', 'kom', 'kon', 'kok', 'kor', 'kos', 'kpe', 'kro', 'kua', 'kum', 'kur', 'kru', 'kut', 'lad', 'lah', 'lam', 'day', 'lao', 'lat', 'lav', 'ltz', 'lez', 'lim', 'lin', 'lit', 'jbo', 'dsb', 'loz', 'lub', 'lua', 'lui', 'smj', 'lun', 'luo', 'lus', 'mac/mkd', 'mad', 'mag', 'mai', 'mak', 'mlg', 'may/msa', 'mal', 'mlt', 'mnc', 'mdr', 'man', 'mni', 'mno', 'glv', 'mao/mri', 'arn', 'mar', 'chm', 'mah', 'mwr', 'mas', 'myn', 'men', 'mic', 'min', 'mwl', 'moh', 'mdf', 'rum/ron', 'mkh', 'lol', 'mon', 'mos', 'mul', 'mun', 'nqo', 'nah', 'nau', 'nav', 'nde', 'nbl', 'ndo', 'nap', 'new', 'nep', 'nia', 'nic', 'ssa', 'niu', 'zxx', 'nog', 'non', 'nai', 'frr', 'sme', 'nso', 'nor', 'nno', 'nub', 'iii', 'nym', 'nyn', 'nyo', 'nzi', 'oci', 'pro', 'oji', 'ori', 'orm', 'osa', 'oss', 'oto', 'pal', 'pau', 'pli', 'pag', 'pan', 'pap', 'paa', 'pus', 'per/fas', 'peo', 'phi', 'phn', 'pon', 'pol', 'por', 'pra', 'que', 'raj', 'rap', 'qaa-qtz', 'roa', 'roh', 'rom', 'run', 'rus', 'sal', 'sam', 'smi', 'smo', 'sad', 'sag', 'san', 'sat', 'srd', 'sas', 'sco', 'sel', 'sem', 'srp', 'srr', 'shn', 'sna', 'scn', 'sid', 'sgn', 'bla', 'snd', 'sin', 'sit', 'sio', 'sms', 'den', 'sla', 'slo/slk', 'slv', 'sog', 'som', 'son', 'snk', 'wen', 'sot', 'sai', 'alt', 'sma', 'srn', 'suk', 'sux', 'sun', 'sus', 'swa', 'ssw', 'swe', 'syr', 'tgl', 'tah', 'tai', 'tgk', 'tmh', 'tam', 'tat', 'tel', 'ter', 'tet', 'tha', 'tib/bod', 'tig', 'tir', 'tem', 'tiv', 'tli', 'tpi', 'tkl', 'tog', 'ton', 'tsi', 'tso', 'tsn', 'tum', 'tup', 'tur', 'ota', 'tuk', 'tvl', 'tyv', 'twi', 'udm', 'uga', 'uig', 'ukr', 'umb', 'mis', 'und', 'hsb', 'urd', 'uzb', 'vai', 'ven', 'vie', 'vol', 'vot', 'wak', 'wln', 'war', 'was', 'wel/cym', 'fry', 'wal', 'wol', 'xho', 'sah', 'yao', 'yap', 'yid', 'yor', 'ypk', 'znd', 'zap', 'zen', 'zul', 'zun']
- },
-
- 'XHR': {
- PROXY_SETTING: 'settings-xhr-proxy-setting',
- PROXY_SETTINGS_LIST: {
- remote: 'remote',
- local: 'local',
- disabled: 'disabled'
- },
- DEFAULT_LOCAL_PORT: 4400,
- DEFAULT_LOCAL_ROUTE: '/ripple',
- LOCAL_PROXY_PORT_SETTING: 'settings-xhr-proxy-local-port',
- LOCAL_PROXY_ROUTE_SETTING: 'settings-xhr-proxy-local-route'
- }
- };
-
- },{}],"sim-status":[function(require,module,exports){
- // Copyright 2016 Intel Corporation. All rights reserved.
-
- var isAppHostReady = false,
- appHostReadyHandlers = [];
-
- function whenAppHostReady(handler) {
- var idx;
- if (typeof handler !== 'function') {
- return;
- }
- idx = appHostReadyHandlers.push({'handler': handler, 'fired': false});
- if (isAppHostReady) {
- handler();
- appHostReadyHandlers[idx-1].fired = true;
- }
- }
-
- function fireAppHostReady() {
- isAppHostReady = true;
- appHostReadyHandlers.forEach(function (element) {
- if (!element.fired) {
- element.handler();
- element.fired = true;
- }
- });
- }
-
- /* Internal use function */
- module.exports._fireAppHostReady = fireAppHostReady;
- /* Public API */
- module.exports.whenAppHostReady = whenAppHostReady;
-
- },{}],"socket.io":[function(require,module,exports){
- (function (global){
- /* @version 1.4.5 */
- (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.io=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(_dereq_,module,exports){module.exports=_dereq_("./lib/")},{"./lib/":2}],2:[function(_dereq_,module,exports){module.exports=_dereq_("./socket");module.exports.parser=_dereq_("engine.io-parser")},{"./socket":3,"engine.io-parser":19}],3:[function(_dereq_,module,exports){(function(global){var transports=_dereq_("./transports");var Emitter=_dereq_("component-emitter");var debug=_dereq_("debug")("engine.io-client:socket");var index=_dereq_("indexof");var parser=_dereq_("engine.io-parser");var parseuri=_dereq_("parseuri");var parsejson=_dereq_("parsejson");var parseqs=_dereq_("parseqs");module.exports=Socket;function noop(){}function Socket(uri,opts){if(!(this instanceof Socket))return new Socket(uri,opts);opts=opts||{};if(uri&&"object"==typeof uri){opts=uri;uri=null}if(uri){uri=parseuri(uri);opts.hostname=uri.host;opts.secure=uri.protocol=="https"||uri.protocol=="wss";opts.port=uri.port;if(uri.query)opts.query=uri.query}else if(opts.host){opts.hostname=parseuri(opts.host).host}this.secure=null!=opts.secure?opts.secure:global.location&&"https:"==location.protocol;if(opts.hostname&&!opts.port){opts.port=this.secure?"443":"80"}this.agent=opts.agent||false;this.hostname=opts.hostname||(global.location?location.hostname:"localhost");this.port=opts.port||(global.location&&location.port?location.port:this.secure?443:80);this.query=opts.query||{};if("string"==typeof this.query)this.query=parseqs.decode(this.query);this.upgrade=false!==opts.upgrade;this.path=(opts.path||"/engine.io").replace(/\/$/,"")+"/";this.forceJSONP=!!opts.forceJSONP;this.jsonp=false!==opts.jsonp;this.forceBase64=!!opts.forceBase64;this.enablesXDR=!!opts.enablesXDR;this.timestampParam=opts.timestampParam||"t";this.timestampRequests=opts.timestampRequests;this.transports=opts.transports||["polling","websocket"];this.readyState="";this.writeBuffer=[];this.policyPort=opts.policyPort||843;this.rememberUpgrade=opts.rememberUpgrade||false;this.binaryType=null;this.onlyBinaryUpgrades=opts.onlyBinaryUpgrades;this.perMessageDeflate=false!==opts.perMessageDeflate?opts.perMessageDeflate||{}:false;if(true===this.perMessageDeflate)this.perMessageDeflate={};if(this.perMessageDeflate&&null==this.perMessageDeflate.threshold){this.perMessageDeflate.threshold=1024}this.pfx=opts.pfx||null;this.key=opts.key||null;this.passphrase=opts.passphrase||null;this.cert=opts.cert||null;this.ca=opts.ca||null;this.ciphers=opts.ciphers||null;this.rejectUnauthorized=opts.rejectUnauthorized===undefined?null:opts.rejectUnauthorized;var freeGlobal=typeof global=="object"&&global;if(freeGlobal.global===freeGlobal){if(opts.extraHeaders&&Object.keys(opts.extraHeaders).length>0){this.extraHeaders=opts.extraHeaders}}this.open()}Socket.priorWebsocketSuccess=false;Emitter(Socket.prototype);Socket.protocol=parser.protocol;Socket.Socket=Socket;Socket.Transport=_dereq_("./transport");Socket.transports=_dereq_("./transports");Socket.parser=_dereq_("engine.io-parser");Socket.prototype.createTransport=function(name){debug('creating transport "%s"',name);var query=clone(this.query);query.EIO=parser.protocol;query.transport=name;if(this.id)query.sid=this.id;var transport=new transports[name]({agent:this.agent,hostname:this.hostname,port:this.port,secure:this.secure,path:this.path,query:query,forceJSONP:this.forceJSONP,jsonp:this.jsonp,forceBase64:this.forceBase64,enablesXDR:this.enablesXDR,timestampRequests:this.timestampRequests,timestampParam:this.timestampParam,policyPort:this.policyPort,socket:this,pfx:this.pfx,key:this.key,passphrase:this.passphrase,cert:this.cert,ca:this.ca,ciphers:this.ciphers,rejectUnauthorized:this.rejectUnauthorized,perMessageDeflate:this.perMessageDeflate,extraHeaders:this.extraHeaders});return transport};function clone(obj){var o={};for(var i in obj){if(obj.hasOwnProperty(i)){o[i]=obj[i]}}return o}Socket.prototype.open=function(){var transport;if(this.rememberUpgrade&&Socket.priorWebsocketSuccess&&this.transports.indexOf("websocket")!=-1){transport="websocket"}else if(0===this.transports.length){var self=this;setTimeout(function(){self.emit("error","No transports available")},0);return}else{transport=this.transports[0]}this.readyState="opening";try{transport=this.createTransport(transport)}catch(e){this.transports.shift();this.open();return}transport.open();this.setTransport(transport)};Socket.prototype.setTransport=function(transport){debug("setting transport %s",transport.name);var self=this;if(this.transport){debug("clearing existing transport %s",this.transport.name);this.transport.removeAllListeners()}this.transport=transport;transport.on("drain",function(){self.onDrain()}).on("packet",function(packet){self.onPacket(packet)}).on("error",function(e){self.onError(e)}).on("close",function(){self.onClose("transport close")})};Socket.prototype.probe=function(name){debug('probing transport "%s"',name);var transport=this.createTransport(name,{probe:1}),failed=false,self=this;Socket.priorWebsocketSuccess=false;function onTransportOpen(){if(self.onlyBinaryUpgrades){var upgradeLosesBinary=!this.supportsBinary&&self.transport.supportsBinary;failed=failed||upgradeLosesBinary}if(failed)return;debug('probe transport "%s" opened',name);transport.send([{type:"ping",data:"probe"}]);transport.once("packet",function(msg){if(failed)return;if("pong"==msg.type&&"probe"==msg.data){debug('probe transport "%s" pong',name);self.upgrading=true;self.emit("upgrading",transport);if(!transport)return;Socket.priorWebsocketSuccess="websocket"==transport.name;debug('pausing current transport "%s"',self.transport.name);self.transport.pause(function(){if(failed)return;if("closed"==self.readyState)return;debug("changing transport and sending upgrade packet");cleanup();self.setTransport(transport);transport.send([{type:"upgrade"}]);self.emit("upgrade",transport);transport=null;self.upgrading=false;self.flush()})}else{debug('probe transport "%s" failed',name);var err=new Error("probe error");err.transport=transport.name;self.emit("upgradeError",err)}})}function freezeTransport(){if(failed)return;failed=true;cleanup();transport.close();transport=null}function onerror(err){var error=new Error("probe error: "+err);error.transport=transport.name;freezeTransport();debug('probe transport "%s" failed because of error: %s',name,err);self.emit("upgradeError",error)}function onTransportClose(){onerror("transport closed")}function onclose(){onerror("socket closed")}function onupgrade(to){if(transport&&to.name!=transport.name){debug('"%s" works - aborting "%s"',to.name,transport.name);freezeTransport()}}function cleanup(){transport.removeListener("open",onTransportOpen);transport.removeListener("error",onerror);transport.removeListener("close",onTransportClose);self.removeListener("close",onclose);self.removeListener("upgrading",onupgrade)}transport.once("open",onTransportOpen);transport.once("error",onerror);transport.once("close",onTransportClose);this.once("close",onclose);this.once("upgrading",onupgrade);transport.open()};Socket.prototype.onOpen=function(){debug("socket open");this.readyState="open";Socket.priorWebsocketSuccess="websocket"==this.transport.name;this.emit("open");this.flush();if("open"==this.readyState&&this.upgrade&&this.transport.pause){debug("starting upgrade probes");for(var i=0,l=this.upgrades.length;i<l;i++){this.probe(this.upgrades[i])}}};Socket.prototype.onPacket=function(packet){if("opening"==this.readyState||"open"==this.readyState){debug('socket receive: type "%s", data "%s"',packet.type,packet.data);this.emit("packet",packet);this.emit("heartbeat");switch(packet.type){case"open":this.onHandshake(parsejson(packet.data));break;case"pong":this.setPing();this.emit("pong");break;case"error":var err=new Error("server error");err.code=packet.data;this.onError(err);break;case"message":this.emit("data",packet.data);this.emit("message",packet.data);break}}else{debug('packet received with socket readyState "%s"',this.readyState)}};Socket.prototype.onHandshake=function(data){this.emit("handshake",data);this.id=data.sid;this.transport.query.sid=data.sid;this.upgrades=this.filterUpgrades(data.upgrades);this.pingInterval=data.pingInterval;this.pingTimeout=data.pingTimeout;this.onOpen();if("closed"==this.readyState)return;this.setPing();this.removeListener("heartbeat",this.onHeartbeat);this.on("heartbeat",this.onHeartbeat)};Socket.prototype.onHeartbeat=function(timeout){clearTimeout(this.pingTimeoutTimer);var self=this;self.pingTimeoutTimer=setTimeout(function(){if("closed"==self.readyState)return;self.onClose("ping timeout")},timeout||self.pingInterval+self.pingTimeout)};Socket.prototype.setPing=function(){var self=this;clearTimeout(self.pingIntervalTimer);self.pingIntervalTimer=setTimeout(function(){debug("writing ping packet - expecting pong within %sms",self.pingTimeout);self.ping();self.onHeartbeat(self.pingTimeout)},self.pingInterval)};Socket.prototype.ping=function(){var self=this;this.sendPacket("ping",function(){self.emit("ping")})};Socket.prototype.onDrain=function(){this.writeBuffer.splice(0,this.prevBufferLen);this.prevBufferLen=0;if(0===this.writeBuffer.length){this.emit("drain")}else{this.flush()}};Socket.prototype.flush=function(){if("closed"!=this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){debug("flushing %d packets in socket",this.writeBuffer.length);this.transport.send(this.writeBuffer);this.prevBufferLen=this.writeBuffer.length;this.emit("flush")}};Socket.prototype.write=Socket.prototype.send=function(msg,options,fn){this.sendPacket("message",msg,options,fn);return this};Socket.prototype.sendPacket=function(type,data,options,fn){if("function"==typeof data){fn=data;data=undefined}if("function"==typeof options){fn=options;options=null}if("closing"==this.readyState||"closed"==this.readyState){return}options=options||{};options.compress=false!==options.compress;var packet={type:type,data:data,options:options};this.emit("packetCreate",packet);this.writeBuffer.push(packet);if(fn)this.once("flush",fn);this.flush()};Socket.prototype.close=function(){if("opening"==this.readyState||"open"==this.readyState){this.readyState="closing";var self=this;if(this.writeBuffer.length){this.once("drain",function(){if(this.upgrading){waitForUpgrade()}else{close()}})}else if(this.upgrading){waitForUpgrade()}else{close()}}function close(){self.onClose("forced close");debug("socket closing - telling transport to close");self.transport.close()}function cleanupAndClose(){self.removeListener("upgrade",cleanupAndClose);self.removeListener("upgradeError",cleanupAndClose);close()}function waitForUpgrade(){self.once("upgrade",cleanupAndClose);self.once("upgradeError",cleanupAndClose)}return this};Socket.prototype.onError=function(err){debug("socket error %j",err);Socket.priorWebsocketSuccess=false;this.emit("error",err);this.onClose("transport error",err)};Socket.prototype.onClose=function(reason,desc){if("opening"==this.readyState||"open"==this.readyState||"closing"==this.readyState){debug('socket close with reason: "%s"',reason);var self=this;clearTimeout(this.pingIntervalTimer);clearTimeout(this.pingTimeoutTimer);this.transport.removeAllListeners("close");this.transport.close();this.transport.removeAllListeners();this.readyState="closed";this.id=null;this.emit("close",reason,desc);self.writeBuffer=[];self.prevBufferLen=0}};Socket.prototype.filterUpgrades=function(upgrades){var filteredUpgrades=[];for(var i=0,j=upgrades.length;i<j;i++){if(~index(this.transports,upgrades[i]))filteredUpgrades.push(upgrades[i])}return filteredUpgrades}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{"./transport":4,"./transports":5,"component-emitter":15,debug:17,"engine.io-parser":19,indexof:23,parsejson:26,parseqs:27,parseuri:28}],4:[function(_dereq_,module,exports){var parser=_dereq_("engine.io-parser");var Emitter=_dereq_("component-emitter");module.exports=Transport;function Transport(opts){this.path=opts.path;this.hostname=opts.hostname;this.port=opts.port;this.secure=opts.secure;this.query=opts.query;this.timestampParam=opts.timestampParam;this.timestampRequests=opts.timestampRequests;this.readyState="";this.agent=opts.agent||false;this.socket=opts.socket;this.enablesXDR=opts.enablesXDR;this.pfx=opts.pfx;this.key=opts.key;this.passphrase=opts.passphrase;this.cert=opts.cert;this.ca=opts.ca;this.ciphers=opts.ciphers;this.rejectUnauthorized=opts.rejectUnauthorized;this.extraHeaders=opts.extraHeaders}Emitter(Transport.prototype);Transport.prototype.onError=function(msg,desc){var err=new Error(msg);err.type="TransportError";err.description=desc;this.emit("error",err);return this};Transport.prototype.open=function(){if("closed"==this.readyState||""==this.readyState){this.readyState="opening";this.doOpen()}return this};Transport.prototype.close=function(){if("opening"==this.readyState||"open"==this.readyState){this.doClose();this.onClose()}return this};Transport.prototype.send=function(packets){if("open"==this.readyState){this.write(packets)}else{throw new Error("Transport not open")}};Transport.prototype.onOpen=function(){this.readyState="open";this.writable=true;this.emit("open")};Transport.prototype.onData=function(data){var packet=parser.decodePacket(data,this.socket.binaryType);this.onPacket(packet)};Transport.prototype.onPacket=function(packet){this.emit("packet",packet)};Transport.prototype.onClose=function(){this.readyState="closed";this.emit("close")}},{"component-emitter":15,"engine.io-parser":19}],5:[function(_dereq_,module,exports){(function(global){var XMLHttpRequest=_dereq_("xmlhttprequest-ssl");var XHR=_dereq_("./polling-xhr");var JSONP=_dereq_("./polling-jsonp");var websocket=_dereq_("./websocket");exports.polling=polling;exports.websocket=websocket;function polling(opts){var xhr;var xd=false;var xs=false;var jsonp=false!==opts.jsonp;if(global.location){var isSSL="https:"==location.protocol;var port=location.port;if(!port){port=isSSL?443:80}xd=opts.hostname!=location.hostname||port!=opts.port;xs=opts.secure!=isSSL}opts.xdomain=xd;opts.xscheme=xs;xhr=new XMLHttpRequest(opts);if("open"in xhr&&!opts.forceJSONP){return new XHR(opts)}else{if(!jsonp)throw new Error("JSONP disabled");return new JSONP(opts)}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{"./polling-jsonp":6,"./polling-xhr":7,"./websocket":9,"xmlhttprequest-ssl":10}],6:[function(_dereq_,module,exports){(function(global){var Polling=_dereq_("./polling");var inherit=_dereq_("component-inherit");module.exports=JSONPPolling;var rNewline=/\n/g;var rEscapedNewline=/\\n/g;var callbacks;var index=0;function empty(){}function JSONPPolling(opts){Polling.call(this,opts);this.query=this.query||{};if(!callbacks){if(!global.___eio)global.___eio=[];callbacks=global.___eio}this.index=callbacks.length;var self=this;callbacks.push(function(msg){self.onData(msg)});this.query.j=this.index;if(global.document&&global.addEventListener){global.addEventListener("beforeunload",function(){if(self.script)self.script.onerror=empty},false)}}inherit(JSONPPolling,Polling);JSONPPolling.prototype.supportsBinary=false;JSONPPolling.prototype.doClose=function(){if(this.script){this.script.parentNode.removeChild(this.script);this.script=null}if(this.form){this.form.parentNode.removeChild(this.form);this.form=null;this.iframe=null}Polling.prototype.doClose.call(this)};JSONPPolling.prototype.doPoll=function(){var self=this;var script=document.createElement("script");if(this.script){this.script.parentNode.removeChild(this.script);this.script=null}script.async=true;script.src=this.uri();script.onerror=function(e){self.onError("jsonp poll error",e)};var insertAt=document.getElementsByTagName("script")[0];if(insertAt){insertAt.parentNode.insertBefore(script,insertAt)}else{(document.head||document.body).appendChild(script)}this.script=script;var isUAgecko="undefined"!=typeof navigator&&/gecko/i.test(navigator.userAgent);if(isUAgecko){setTimeout(function(){var iframe=document.createElement("iframe");document.body.appendChild(iframe);document.body.removeChild(iframe)},100)}};JSONPPolling.prototype.doWrite=function(data,fn){var self=this;if(!this.form){var form=document.createElement("form");var area=document.createElement("textarea");var id=this.iframeId="eio_iframe_"+this.index;var iframe;form.className="socketio";form.style.position="absolute";form.style.top="-1000px";form.style.left="-1000px";form.target=id;form.method="POST";form.setAttribute("accept-charset","utf-8");area.name="d";form.appendChild(area);document.body.appendChild(form);this.form=form;this.area=area}this.form.action=this.uri();function complete(){initIframe();fn()}function initIframe(){if(self.iframe){try{self.form.removeChild(self.iframe)}catch(e){self.onError("jsonp polling iframe removal error",e)}}try{var html='<iframe src="javascript:0" name="'+self.iframeId+'">';iframe=document.createElement(html)}catch(e){iframe=document.createElement("iframe");iframe.name=self.iframeId;iframe.src="javascript:0"}iframe.id=self.iframeId;self.form.appendChild(iframe);self.iframe=iframe}initIframe();data=data.replace(rEscapedNewline,"\\\n");this.area.value=data.replace(rNewline,"\\n");try{this.form.submit()}catch(e){}if(this.iframe.attachEvent){this.iframe.onreadystatechange=function(){if(self.iframe.readyState=="complete"){complete()}}}else{this.iframe.onload=complete}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{"./polling":8,"component-inherit":16}],7:[function(_dereq_,module,exports){(function(global){var XMLHttpRequest=_dereq_("xmlhttprequest-ssl");var Polling=_dereq_("./polling");var Emitter=_dereq_("component-emitter");var inherit=_dereq_("component-inherit");var debug=_dereq_("debug")("engine.io-client:polling-xhr");module.exports=XHR;module.exports.Request=Request;function empty(){}function XHR(opts){Polling.call(this,opts);if(global.location){var isSSL="https:"==location.protocol;var port=location.port;if(!port){port=isSSL?443:80}this.xd=opts.hostname!=global.location.hostname||port!=opts.port;this.xs=opts.secure!=isSSL}else{this.extraHeaders=opts.extraHeaders}}inherit(XHR,Polling);XHR.prototype.supportsBinary=true;XHR.prototype.request=function(opts){opts=opts||{};opts.uri=this.uri();opts.xd=this.xd;opts.xs=this.xs;opts.agent=this.agent||false;opts.supportsBinary=this.supportsBinary;opts.enablesXDR=this.enablesXDR;opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;opts.extraHeaders=this.extraHeaders;return new Request(opts)};XHR.prototype.doWrite=function(data,fn){var isBinary=typeof data!=="string"&&data!==undefined;var req=this.request({method:"POST",data:data,isBinary:isBinary});var self=this;req.on("success",fn);req.on("error",function(err){self.onError("xhr post error",err)});this.sendXhr=req};XHR.prototype.doPoll=function(){debug("xhr poll");var req=this.request();var self=this;req.on("data",function(data){self.onData(data)});req.on("error",function(err){self.onError("xhr poll error",err)});this.pollXhr=req};function Request(opts){this.method=opts.method||"GET";this.uri=opts.uri;this.xd=!!opts.xd;this.xs=!!opts.xs;this.async=false!==opts.async;this.data=undefined!=opts.data?opts.data:null;this.agent=opts.agent;this.isBinary=opts.isBinary;this.supportsBinary=opts.supportsBinary;this.enablesXDR=opts.enablesXDR;this.pfx=opts.pfx;this.key=opts.key;this.passphrase=opts.passphrase;this.cert=opts.cert;this.ca=opts.ca;this.ciphers=opts.ciphers;this.rejectUnauthorized=opts.rejectUnauthorized;this.extraHeaders=opts.extraHeaders;this.create()}Emitter(Request.prototype);Request.prototype.create=function(){var opts={agent:this.agent,xdomain:this.xd,xscheme:this.xs,enablesXDR:this.enablesXDR};opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;var xhr=this.xhr=new XMLHttpRequest(opts);var self=this;try{debug("xhr open %s: %s",this.method,this.uri);xhr.open(this.method,this.uri,this.async);try{if(this.extraHeaders){xhr.setDisableHeaderCheck(true);for(var i in this.extraHeaders){if(this.extraHeaders.hasOwnProperty(i)){xhr.setRequestHeader(i,this.extraHeaders[i])}}}}catch(e){}if(this.supportsBinary){xhr.responseType="arraybuffer"}if("POST"==this.method){try{if(this.isBinary){xhr.setRequestHeader("Content-type","application/octet-stream")}else{xhr.setRequestHeader("Content-type","text/plain;charset=UTF-8")}}catch(e){}}if("withCredentials"in xhr){xhr.withCredentials=true}if(this.hasXDR()){xhr.onload=function(){self.onLoad()};xhr.onerror=function(){self.onError(xhr.responseText)}}else{xhr.onreadystatechange=function(){if(4!=xhr.readyState)return;if(200==xhr.status||1223==xhr.status){self.onLoad()}else{setTimeout(function(){self.onError(xhr.status)},0)}}}debug("xhr data %s",this.data);xhr.send(this.data)}catch(e){setTimeout(function(){self.onError(e)},0);return}if(global.document){this.index=Request.requestsCount++;Request.requests[this.index]=this}};Request.prototype.onSuccess=function(){this.emit("success");this.cleanup()};Request.prototype.onData=function(data){this.emit("data",data);this.onSuccess()};Request.prototype.onError=function(err){this.emit("error",err);this.cleanup(true)};Request.prototype.cleanup=function(fromError){if("undefined"==typeof this.xhr||null===this.xhr){return}if(this.hasXDR()){this.xhr.onload=this.xhr.onerror=empty}else{this.xhr.onreadystatechange=empty}if(fromError){try{this.xhr.abort()}catch(e){}}if(global.document){delete Request.requests[this.index]}this.xhr=null};Request.prototype.onLoad=function(){var data;try{var contentType;try{contentType=this.xhr.getResponseHeader("Content-Type").split(";")[0]}catch(e){}if(contentType==="application/octet-stream"){data=this.xhr.response}else{if(!this.supportsBinary){data=this.xhr.responseText}else{try{data=String.fromCharCode.apply(null,new Uint8Array(this.xhr.response))}catch(e){var ui8Arr=new Uint8Array(this.xhr.response);var dataArray=[];for(var idx=0,length=ui8Arr.length;idx<length;idx++){dataArray.push(ui8Arr[idx])}data=String.fromCharCode.apply(null,dataArray)}}}}catch(e){this.onError(e)}if(null!=data){this.onData(data)}};Request.prototype.hasXDR=function(){return"undefined"!==typeof global.XDomainRequest&&!this.xs&&this.enablesXDR};Request.prototype.abort=function(){this.cleanup()};if(global.document){Request.requestsCount=0;Request.requests={};if(global.attachEvent){global.attachEvent("onunload",unloadHandler)}else if(global.addEventListener){global.addEventListener("beforeunload",unloadHandler,false)}}function unloadHandler(){for(var i in Request.requests){if(Request.requests.hasOwnProperty(i)){Request.requests[i].abort()}}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{"./polling":8,"component-emitter":15,"component-inherit":16,debug:17,"xmlhttprequest-ssl":10}],8:[function(_dereq_,module,exports){var Transport=_dereq_("../transport");var parseqs=_dereq_("parseqs");var parser=_dereq_("engine.io-parser");var inherit=_dereq_("component-inherit");var yeast=_dereq_("yeast");var debug=_dereq_("debug")("engine.io-client:polling");module.exports=Polling;var hasXHR2=function(){var XMLHttpRequest=_dereq_("xmlhttprequest-ssl");var xhr=new XMLHttpRequest({xdomain:false});return null!=xhr.responseType}();function Polling(opts){var forceBase64=opts&&opts.forceBase64;if(!hasXHR2||forceBase64){this.supportsBinary=false}Transport.call(this,opts)}inherit(Polling,Transport);Polling.prototype.name="polling";Polling.prototype.doOpen=function(){this.poll()};Polling.prototype.pause=function(onPause){var pending=0;var self=this;this.readyState="pausing";function pause(){debug("paused");self.readyState="paused";onPause()}if(this.polling||!this.writable){var total=0;if(this.polling){debug("we are currently polling - waiting to pause");total++;this.once("pollComplete",function(){debug("pre-pause polling complete");--total||pause()})}if(!this.writable){debug("we are currently writing - waiting to pause");total++;this.once("drain",function(){debug("pre-pause writing complete");--total||pause()})}}else{pause()}};Polling.prototype.poll=function(){debug("polling");this.polling=true;this.doPoll();this.emit("poll")};Polling.prototype.onData=function(data){var self=this;debug("polling got data %s",data);var callback=function(packet,index,total){if("opening"==self.readyState){self.onOpen()}if("close"==packet.type){self.onClose();return false}self.onPacket(packet)};parser.decodePayload(data,this.socket.binaryType,callback);if("closed"!=this.readyState){this.polling=false;this.emit("pollComplete");if("open"==this.readyState){this.poll()}else{debug('ignoring poll - transport state "%s"',this.readyState)}}};Polling.prototype.doClose=function(){var self=this;function close(){debug("writing close packet");self.write([{type:"close"}])}if("open"==this.readyState){debug("transport open - closing");close()}else{debug("transport not open - deferring close");this.once("open",close)}};Polling.prototype.write=function(packets){var self=this;this.writable=false;var callbackfn=function(){self.writable=true;self.emit("drain")};var self=this;parser.encodePayload(packets,this.supportsBinary,function(data){self.doWrite(data,callbackfn)})};Polling.prototype.uri=function(){var query=this.query||{};var schema=this.secure?"https":"http";var port="";if(false!==this.timestampRequests){query[this.timestampParam]=yeast()}if(!this.supportsBinary&&!query.sid){query.b64=1}query=parseqs.encode(query);if(this.port&&("https"==schema&&this.port!=443||"http"==schema&&this.port!=80)){port=":"+this.port}if(query.length){query="?"+query}var ipv6=this.hostname.indexOf(":")!==-1;return schema+"://"+(ipv6?"["+this.hostname+"]":this.hostname)+port+this.path+query}},{"../transport":4,"component-inherit":16,debug:17,"engine.io-parser":19,parseqs:27,"xmlhttprequest-ssl":10,yeast:30}],9:[function(_dereq_,module,exports){(function(global){var Transport=_dereq_("../transport");var parser=_dereq_("engine.io-parser");var parseqs=_dereq_("parseqs");var inherit=_dereq_("component-inherit");var yeast=_dereq_("yeast");var debug=_dereq_("debug")("engine.io-client:websocket");var BrowserWebSocket=global.WebSocket||global.MozWebSocket;var WebSocket=BrowserWebSocket;if(!WebSocket&&typeof window==="undefined"){try{WebSocket=_dereq_("ws")}catch(e){}}module.exports=WS;function WS(opts){var forceBase64=opts&&opts.forceBase64;if(forceBase64){this.supportsBinary=false}this.perMessageDeflate=opts.perMessageDeflate;Transport.call(this,opts)}inherit(WS,Transport);WS.prototype.name="websocket";WS.prototype.supportsBinary=true;WS.prototype.doOpen=function(){if(!this.check()){return}var self=this;var uri=this.uri();var protocols=void 0;var opts={agent:this.agent,perMessageDeflate:this.perMessageDeflate};opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;if(this.extraHeaders){opts.headers=this.extraHeaders}this.ws=BrowserWebSocket?new WebSocket(uri):new WebSocket(uri,protocols,opts);if(this.ws.binaryType===undefined){this.supportsBinary=false}if(this.ws.supports&&this.ws.supports.binary){this.supportsBinary=true;this.ws.binaryType="buffer"}else{this.ws.binaryType="arraybuffer"}this.addEventListeners()};WS.prototype.addEventListeners=function(){var self=this;this.ws.onopen=function(){self.onOpen()};this.ws.onclose=function(){self.onClose()};this.ws.onmessage=function(ev){self.onData(ev.data)};this.ws.onerror=function(e){self.onError("websocket error",e)}};if("undefined"!=typeof navigator&&/iPad|iPhone|iPod/i.test(navigator.userAgent)){WS.prototype.onData=function(data){var self=this;setTimeout(function(){Transport.prototype.onData.call(self,data)},0)}}WS.prototype.write=function(packets){var self=this;this.writable=false;var total=packets.length;for(var i=0,l=total;i<l;i++){(function(packet){parser.encodePacket(packet,self.supportsBinary,function(data){if(!BrowserWebSocket){var opts={};if(packet.options){opts.compress=packet.options.compress}if(self.perMessageDeflate){var len="string"==typeof data?global.Buffer.byteLength(data):data.length;if(len<self.perMessageDeflate.threshold){opts.compress=false}}}try{if(BrowserWebSocket){self.ws.send(data)}else{self.ws.send(data,opts)}}catch(e){debug("websocket closed before onclose event")}--total||done()})})(packets[i])}function done(){self.emit("flush");setTimeout(function(){self.writable=true;self.emit("drain")},0)}};WS.prototype.onClose=function(){Transport.prototype.onClose.call(this)};WS.prototype.doClose=function(){if(typeof this.ws!=="undefined"){this.ws.close()}};WS.prototype.uri=function(){var query=this.query||{};var schema=this.secure?"wss":"ws";var port="";if(this.port&&("wss"==schema&&this.port!=443||"ws"==schema&&this.port!=80)){port=":"+this.port}if(this.timestampRequests){query[this.timestampParam]=yeast()}if(!this.supportsBinary){query.b64=1}query=parseqs.encode(query);if(query.length){query="?"+query}var ipv6=this.hostname.indexOf(":")!==-1;return schema+"://"+(ipv6?"["+this.hostname+"]":this.hostname)+port+this.path+query};WS.prototype.check=function(){return!!WebSocket&&!("__initialize"in WebSocket&&this.name===WS.prototype.name)}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{"../transport":4,"component-inherit":16,debug:17,"engine.io-parser":19,parseqs:27,ws:undefined,yeast:30}],10:[function(_dereq_,module,exports){var hasCORS=_dereq_("has-cors");module.exports=function(opts){var xdomain=opts.xdomain;var xscheme=opts.xscheme;var enablesXDR=opts.enablesXDR;try{if("undefined"!=typeof XMLHttpRequest&&(!xdomain||hasCORS)){return new XMLHttpRequest}}catch(e){}try{if("undefined"!=typeof XDomainRequest&&!xscheme&&enablesXDR){return new XDomainRequest}}catch(e){}if(!xdomain){try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}}},{"has-cors":22}],11:[function(_dereq_,module,exports){module.exports=after;function after(count,callback,err_cb){var bail=false;err_cb=err_cb||noop;proxy.count=count;return count===0?callback():proxy;function proxy(err,result){if(proxy.count<=0){throw new Error("after called too many times")}--proxy.count;if(err){bail=true;callback(err);callback=err_cb}else if(proxy.count===0&&!bail){callback(null,result)}}}function noop(){}},{}],12:[function(_dereq_,module,exports){module.exports=function(arraybuffer,start,end){var bytes=arraybuffer.byteLength;start=start||0;end=end||bytes;if(arraybuffer.slice){return arraybuffer.slice(start,end)}if(start<0){start+=bytes}if(end<0){end+=bytes}if(end>bytes){end=bytes}if(start>=bytes||start>=end||bytes===0){return new ArrayBuffer(0)}var abv=new Uint8Array(arraybuffer);var result=new Uint8Array(end-start);for(var i=start,ii=0;i<end;i++,ii++){result[ii]=abv[i]}return result.buffer}},{}],13:[function(_dereq_,module,exports){(function(chars){"use strict";exports.encode=function(arraybuffer){var bytes=new Uint8Array(arraybuffer),i,len=bytes.length,base64="";for(i=0;i<len;i+=3){base64+=chars[bytes[i]>>2];
- base64+=chars[(bytes[i]&3)<<4|bytes[i+1]>>4];base64+=chars[(bytes[i+1]&15)<<2|bytes[i+2]>>6];base64+=chars[bytes[i+2]&63]}if(len%3===2){base64=base64.substring(0,base64.length-1)+"="}else if(len%3===1){base64=base64.substring(0,base64.length-2)+"=="}return base64};exports.decode=function(base64){var bufferLength=base64.length*.75,len=base64.length,i,p=0,encoded1,encoded2,encoded3,encoded4;if(base64[base64.length-1]==="="){bufferLength--;if(base64[base64.length-2]==="="){bufferLength--}}var arraybuffer=new ArrayBuffer(bufferLength),bytes=new Uint8Array(arraybuffer);for(i=0;i<len;i+=4){encoded1=chars.indexOf(base64[i]);encoded2=chars.indexOf(base64[i+1]);encoded3=chars.indexOf(base64[i+2]);encoded4=chars.indexOf(base64[i+3]);bytes[p++]=encoded1<<2|encoded2>>4;bytes[p++]=(encoded2&15)<<4|encoded3>>2;bytes[p++]=(encoded3&3)<<6|encoded4&63}return arraybuffer}})("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")},{}],14:[function(_dereq_,module,exports){(function(global){var BlobBuilder=global.BlobBuilder||global.WebKitBlobBuilder||global.MSBlobBuilder||global.MozBlobBuilder;var blobSupported=function(){try{var a=new Blob(["hi"]);return a.size===2}catch(e){return false}}();var blobSupportsArrayBufferView=blobSupported&&function(){try{var b=new Blob([new Uint8Array([1,2])]);return b.size===2}catch(e){return false}}();var blobBuilderSupported=BlobBuilder&&BlobBuilder.prototype.append&&BlobBuilder.prototype.getBlob;function mapArrayBufferViews(ary){for(var i=0;i<ary.length;i++){var chunk=ary[i];if(chunk.buffer instanceof ArrayBuffer){var buf=chunk.buffer;if(chunk.byteLength!==buf.byteLength){var copy=new Uint8Array(chunk.byteLength);copy.set(new Uint8Array(buf,chunk.byteOffset,chunk.byteLength));buf=copy.buffer}ary[i]=buf}}}function BlobBuilderConstructor(ary,options){options=options||{};var bb=new BlobBuilder;mapArrayBufferViews(ary);for(var i=0;i<ary.length;i++){bb.append(ary[i])}return options.type?bb.getBlob(options.type):bb.getBlob()}function BlobConstructor(ary,options){mapArrayBufferViews(ary);return new Blob(ary,options||{})}module.exports=function(){if(blobSupported){return blobSupportsArrayBufferView?global.Blob:BlobConstructor}else if(blobBuilderSupported){return BlobBuilderConstructor}else{return undefined}}()}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{}],15:[function(_dereq_,module,exports){module.exports=Emitter;function Emitter(obj){if(obj)return mixin(obj)}function mixin(obj){for(var key in Emitter.prototype){obj[key]=Emitter.prototype[key]}return obj}Emitter.prototype.on=Emitter.prototype.addEventListener=function(event,fn){this._callbacks=this._callbacks||{};(this._callbacks[event]=this._callbacks[event]||[]).push(fn);return this};Emitter.prototype.once=function(event,fn){var self=this;this._callbacks=this._callbacks||{};function on(){self.off(event,on);fn.apply(this,arguments)}on.fn=fn;this.on(event,on);return this};Emitter.prototype.off=Emitter.prototype.removeListener=Emitter.prototype.removeAllListeners=Emitter.prototype.removeEventListener=function(event,fn){this._callbacks=this._callbacks||{};if(0==arguments.length){this._callbacks={};return this}var callbacks=this._callbacks[event];if(!callbacks)return this;if(1==arguments.length){delete this._callbacks[event];return this}var cb;for(var i=0;i<callbacks.length;i++){cb=callbacks[i];if(cb===fn||cb.fn===fn){callbacks.splice(i,1);break}}return this};Emitter.prototype.emit=function(event){this._callbacks=this._callbacks||{};var args=[].slice.call(arguments,1),callbacks=this._callbacks[event];if(callbacks){callbacks=callbacks.slice(0);for(var i=0,len=callbacks.length;i<len;++i){callbacks[i].apply(this,args)}}return this};Emitter.prototype.listeners=function(event){this._callbacks=this._callbacks||{};return this._callbacks[event]||[]};Emitter.prototype.hasListeners=function(event){return!!this.listeners(event).length}},{}],16:[function(_dereq_,module,exports){module.exports=function(a,b){var fn=function(){};fn.prototype=b.prototype;a.prototype=new fn;a.prototype.constructor=a}},{}],17:[function(_dereq_,module,exports){exports=module.exports=_dereq_("./debug");exports.log=log;exports.formatArgs=formatArgs;exports.save=save;exports.load=load;exports.useColors=useColors;exports.storage="undefined"!=typeof chrome&&"undefined"!=typeof chrome.storage?chrome.storage.local:localstorage();exports.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"];function useColors(){return"WebkitAppearance"in document.documentElement.style||window.console&&(console.firebug||console.exception&&console.table)||navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31}exports.formatters.j=function(v){return JSON.stringify(v)};function formatArgs(){var args=arguments;var useColors=this.useColors;args[0]=(useColors?"%c":"")+this.namespace+(useColors?" %c":" ")+args[0]+(useColors?"%c ":" ")+"+"+exports.humanize(this.diff);if(!useColors)return args;var c="color: "+this.color;args=[args[0],c,"color: inherit"].concat(Array.prototype.slice.call(args,1));var index=0;var lastC=0;args[0].replace(/%[a-z%]/g,function(match){if("%%"===match)return;index++;if("%c"===match){lastC=index}});args.splice(lastC,0,c);return args}function log(){return"object"===typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function save(namespaces){try{if(null==namespaces){exports.storage.removeItem("debug")}else{exports.storage.debug=namespaces}}catch(e){}}function load(){var r;try{r=exports.storage.debug}catch(e){}return r}exports.enable(load());function localstorage(){try{return window.localStorage}catch(e){}}},{"./debug":18}],18:[function(_dereq_,module,exports){exports=module.exports=debug;exports.coerce=coerce;exports.disable=disable;exports.enable=enable;exports.enabled=enabled;exports.humanize=_dereq_("ms");exports.names=[];exports.skips=[];exports.formatters={};var prevColor=0;var prevTime;function selectColor(){return exports.colors[prevColor++%exports.colors.length]}function debug(namespace){function disabled(){}disabled.enabled=false;function enabled(){var self=enabled;var curr=+new Date;var ms=curr-(prevTime||curr);self.diff=ms;self.prev=prevTime;self.curr=curr;prevTime=curr;if(null==self.useColors)self.useColors=exports.useColors();if(null==self.color&&self.useColors)self.color=selectColor();var args=Array.prototype.slice.call(arguments);args[0]=exports.coerce(args[0]);if("string"!==typeof args[0]){args=["%o"].concat(args)}var index=0;args[0]=args[0].replace(/%([a-z%])/g,function(match,format){if(match==="%%")return match;index++;var formatter=exports.formatters[format];if("function"===typeof formatter){var val=args[index];match=formatter.call(self,val);args.splice(index,1);index--}return match});if("function"===typeof exports.formatArgs){args=exports.formatArgs.apply(self,args)}var logFn=enabled.log||exports.log||console.log.bind(console);logFn.apply(self,args)}enabled.enabled=true;var fn=exports.enabled(namespace)?enabled:disabled;fn.namespace=namespace;return fn}function enable(namespaces){exports.save(namespaces);var split=(namespaces||"").split(/[\s,]+/);var len=split.length;for(var i=0;i<len;i++){if(!split[i])continue;namespaces=split[i].replace(/\*/g,".*?");if(namespaces[0]==="-"){exports.skips.push(new RegExp("^"+namespaces.substr(1)+"$"))}else{exports.names.push(new RegExp("^"+namespaces+"$"))}}}function disable(){exports.enable("")}function enabled(name){var i,len;for(i=0,len=exports.skips.length;i<len;i++){if(exports.skips[i].test(name)){return false}}for(i=0,len=exports.names.length;i<len;i++){if(exports.names[i].test(name)){return true}}return false}function coerce(val){if(val instanceof Error)return val.stack||val.message;return val}},{ms:25}],19:[function(_dereq_,module,exports){(function(global){var keys=_dereq_("./keys");var hasBinary=_dereq_("has-binary");var sliceBuffer=_dereq_("arraybuffer.slice");var base64encoder=_dereq_("base64-arraybuffer");var after=_dereq_("after");var utf8=_dereq_("utf8");var isAndroid=navigator.userAgent.match(/Android/i);var isPhantomJS=/PhantomJS/i.test(navigator.userAgent);var dontSendBlobs=isAndroid||isPhantomJS;exports.protocol=3;var packets=exports.packets={open:0,close:1,ping:2,pong:3,message:4,upgrade:5,noop:6};var packetslist=keys(packets);var err={type:"error",data:"parser error"};var Blob=_dereq_("blob");exports.encodePacket=function(packet,supportsBinary,utf8encode,callback){if("function"==typeof supportsBinary){callback=supportsBinary;supportsBinary=false}if("function"==typeof utf8encode){callback=utf8encode;utf8encode=null}var data=packet.data===undefined?undefined:packet.data.buffer||packet.data;if(global.ArrayBuffer&&data instanceof ArrayBuffer){return encodeArrayBuffer(packet,supportsBinary,callback)}else if(Blob&&data instanceof global.Blob){return encodeBlob(packet,supportsBinary,callback)}if(data&&data.base64){return encodeBase64Object(packet,callback)}var encoded=packets[packet.type];if(undefined!==packet.data){encoded+=utf8encode?utf8.encode(String(packet.data)):String(packet.data)}return callback(""+encoded)};function encodeBase64Object(packet,callback){var message="b"+exports.packets[packet.type]+packet.data.data;return callback(message)}function encodeArrayBuffer(packet,supportsBinary,callback){if(!supportsBinary){return exports.encodeBase64Packet(packet,callback)}var data=packet.data;var contentArray=new Uint8Array(data);var resultBuffer=new Uint8Array(1+data.byteLength);resultBuffer[0]=packets[packet.type];for(var i=0;i<contentArray.length;i++){resultBuffer[i+1]=contentArray[i]}return callback(resultBuffer.buffer)}function encodeBlobAsArrayBuffer(packet,supportsBinary,callback){if(!supportsBinary){return exports.encodeBase64Packet(packet,callback)}var fr=new FileReader;fr.onload=function(){packet.data=fr.result;exports.encodePacket(packet,supportsBinary,true,callback)};return fr.readAsArrayBuffer(packet.data)}function encodeBlob(packet,supportsBinary,callback){if(!supportsBinary){return exports.encodeBase64Packet(packet,callback)}if(dontSendBlobs){return encodeBlobAsArrayBuffer(packet,supportsBinary,callback)}var length=new Uint8Array(1);length[0]=packets[packet.type];var blob=new Blob([length.buffer,packet.data]);return callback(blob)}exports.encodeBase64Packet=function(packet,callback){var message="b"+exports.packets[packet.type];if(Blob&&packet.data instanceof global.Blob){var fr=new FileReader;fr.onload=function(){var b64=fr.result.split(",")[1];callback(message+b64)};return fr.readAsDataURL(packet.data)}var b64data;try{b64data=String.fromCharCode.apply(null,new Uint8Array(packet.data))}catch(e){var typed=new Uint8Array(packet.data);var basic=new Array(typed.length);for(var i=0;i<typed.length;i++){basic[i]=typed[i]}b64data=String.fromCharCode.apply(null,basic)}message+=global.btoa(b64data);return callback(message)};exports.decodePacket=function(data,binaryType,utf8decode){if(typeof data=="string"||data===undefined){if(data.charAt(0)=="b"){return exports.decodeBase64Packet(data.substr(1),binaryType)}if(utf8decode){try{data=utf8.decode(data)}catch(e){return err}}var type=data.charAt(0);if(Number(type)!=type||!packetslist[type]){return err}if(data.length>1){return{type:packetslist[type],data:data.substring(1)}}else{return{type:packetslist[type]}}}var asArray=new Uint8Array(data);var type=asArray[0];var rest=sliceBuffer(data,1);if(Blob&&binaryType==="blob"){rest=new Blob([rest])}return{type:packetslist[type],data:rest}};exports.decodeBase64Packet=function(msg,binaryType){var type=packetslist[msg.charAt(0)];if(!global.ArrayBuffer){return{type:type,data:{base64:true,data:msg.substr(1)}}}var data=base64encoder.decode(msg.substr(1));if(binaryType==="blob"&&Blob){data=new Blob([data])}return{type:type,data:data}};exports.encodePayload=function(packets,supportsBinary,callback){if(typeof supportsBinary=="function"){callback=supportsBinary;supportsBinary=null}var isBinary=hasBinary(packets);if(supportsBinary&&isBinary){if(Blob&&!dontSendBlobs){return exports.encodePayloadAsBlob(packets,callback)}return exports.encodePayloadAsArrayBuffer(packets,callback)}if(!packets.length){return callback("0:")}function setLengthHeader(message){return message.length+":"+message}function encodeOne(packet,doneCallback){exports.encodePacket(packet,!isBinary?false:supportsBinary,true,function(message){doneCallback(null,setLengthHeader(message))})}map(packets,encodeOne,function(err,results){return callback(results.join(""))})};function map(ary,each,done){var result=new Array(ary.length);var next=after(ary.length,done);var eachWithIndex=function(i,el,cb){each(el,function(error,msg){result[i]=msg;cb(error,result)})};for(var i=0;i<ary.length;i++){eachWithIndex(i,ary[i],next)}}exports.decodePayload=function(data,binaryType,callback){if(typeof data!="string"){return exports.decodePayloadAsBinary(data,binaryType,callback)}if(typeof binaryType==="function"){callback=binaryType;binaryType=null}var packet;if(data==""){return callback(err,0,1)}var length="",n,msg;for(var i=0,l=data.length;i<l;i++){var chr=data.charAt(i);if(":"!=chr){length+=chr}else{if(""==length||length!=(n=Number(length))){return callback(err,0,1)}msg=data.substr(i+1,n);if(length!=msg.length){return callback(err,0,1)}if(msg.length){packet=exports.decodePacket(msg,binaryType,true);if(err.type==packet.type&&err.data==packet.data){return callback(err,0,1)}var ret=callback(packet,i+n,l);if(false===ret)return}i+=n;length=""}}if(length!=""){return callback(err,0,1)}};exports.encodePayloadAsArrayBuffer=function(packets,callback){if(!packets.length){return callback(new ArrayBuffer(0))}function encodeOne(packet,doneCallback){exports.encodePacket(packet,true,true,function(data){return doneCallback(null,data)})}map(packets,encodeOne,function(err,encodedPackets){var totalLength=encodedPackets.reduce(function(acc,p){var len;if(typeof p==="string"){len=p.length}else{len=p.byteLength}return acc+len.toString().length+len+2},0);var resultArray=new Uint8Array(totalLength);var bufferIndex=0;encodedPackets.forEach(function(p){var isString=typeof p==="string";var ab=p;if(isString){var view=new Uint8Array(p.length);for(var i=0;i<p.length;i++){view[i]=p.charCodeAt(i)}ab=view.buffer}if(isString){resultArray[bufferIndex++]=0}else{resultArray[bufferIndex++]=1}var lenStr=ab.byteLength.toString();for(var i=0;i<lenStr.length;i++){resultArray[bufferIndex++]=parseInt(lenStr[i])}resultArray[bufferIndex++]=255;var view=new Uint8Array(ab);for(var i=0;i<view.length;i++){resultArray[bufferIndex++]=view[i]}});return callback(resultArray.buffer)})};exports.encodePayloadAsBlob=function(packets,callback){function encodeOne(packet,doneCallback){exports.encodePacket(packet,true,true,function(encoded){var binaryIdentifier=new Uint8Array(1);binaryIdentifier[0]=1;if(typeof encoded==="string"){var view=new Uint8Array(encoded.length);for(var i=0;i<encoded.length;i++){view[i]=encoded.charCodeAt(i)}encoded=view.buffer;binaryIdentifier[0]=0}var len=encoded instanceof ArrayBuffer?encoded.byteLength:encoded.size;var lenStr=len.toString();var lengthAry=new Uint8Array(lenStr.length+1);for(var i=0;i<lenStr.length;i++){lengthAry[i]=parseInt(lenStr[i])}lengthAry[lenStr.length]=255;if(Blob){var blob=new Blob([binaryIdentifier.buffer,lengthAry.buffer,encoded]);doneCallback(null,blob)}})}map(packets,encodeOne,function(err,results){return callback(new Blob(results))})};exports.decodePayloadAsBinary=function(data,binaryType,callback){if(typeof binaryType==="function"){callback=binaryType;binaryType=null}var bufferTail=data;var buffers=[];var numberTooLong=false;while(bufferTail.byteLength>0){var tailArray=new Uint8Array(bufferTail);var isString=tailArray[0]===0;var msgLength="";for(var i=1;;i++){if(tailArray[i]==255)break;if(msgLength.length>310){numberTooLong=true;break}msgLength+=tailArray[i]}if(numberTooLong)return callback(err,0,1);bufferTail=sliceBuffer(bufferTail,2+msgLength.length);msgLength=parseInt(msgLength);var msg=sliceBuffer(bufferTail,0,msgLength);if(isString){try{msg=String.fromCharCode.apply(null,new Uint8Array(msg))}catch(e){var typed=new Uint8Array(msg);msg="";for(var i=0;i<typed.length;i++){msg+=String.fromCharCode(typed[i])}}}buffers.push(msg);bufferTail=sliceBuffer(bufferTail,msgLength)}var total=buffers.length;buffers.forEach(function(buffer,i){callback(exports.decodePacket(buffer,binaryType,true),i,total)})}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{"./keys":20,after:11,"arraybuffer.slice":12,"base64-arraybuffer":13,blob:14,"has-binary":21,utf8:29}],20:[function(_dereq_,module,exports){module.exports=Object.keys||function keys(obj){var arr=[];var has=Object.prototype.hasOwnProperty;for(var i in obj){if(has.call(obj,i)){arr.push(i)}}return arr}},{}],21:[function(_dereq_,module,exports){(function(global){var isArray=_dereq_("isarray");module.exports=hasBinary;function hasBinary(data){function _hasBinary(obj){if(!obj)return false;if(global.Buffer&&global.Buffer.isBuffer(obj)||global.ArrayBuffer&&obj instanceof ArrayBuffer||global.Blob&&obj instanceof Blob||global.File&&obj instanceof File){return true}if(isArray(obj)){for(var i=0;i<obj.length;i++){if(_hasBinary(obj[i])){return true}}}else if(obj&&"object"==typeof obj){if(obj.toJSON){obj=obj.toJSON()}for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key)&&_hasBinary(obj[key])){return true}}}return false}return _hasBinary(data)}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{isarray:24}],22:[function(_dereq_,module,exports){try{module.exports=typeof XMLHttpRequest!=="undefined"&&"withCredentials"in new XMLHttpRequest}catch(err){module.exports=false}},{}],23:[function(_dereq_,module,exports){var indexOf=[].indexOf;module.exports=function(arr,obj){if(indexOf)return arr.indexOf(obj);for(var i=0;i<arr.length;++i){if(arr[i]===obj)return i}return-1}},{}],24:[function(_dereq_,module,exports){module.exports=Array.isArray||function(arr){return Object.prototype.toString.call(arr)=="[object Array]"}},{}],25:[function(_dereq_,module,exports){var s=1e3;var m=s*60;var h=m*60;var d=h*24;var y=d*365.25;module.exports=function(val,options){options=options||{};if("string"==typeof val)return parse(val);return options.long?long(val):short(val)};function parse(str){str=""+str;if(str.length>1e4)return;var match=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str);if(!match)return;var n=parseFloat(match[1]);var type=(match[2]||"ms").toLowerCase();switch(type){case"years":case"year":case"yrs":case"yr":case"y":return n*y;case"days":case"day":case"d":return n*d;case"hours":case"hour":case"hrs":case"hr":case"h":return n*h;case"minutes":case"minute":case"mins":case"min":case"m":return n*m;case"seconds":case"second":case"secs":case"sec":case"s":return n*s;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n}}function short(ms){if(ms>=d)return Math.round(ms/d)+"d";if(ms>=h)return Math.round(ms/h)+"h";if(ms>=m)return Math.round(ms/m)+"m";if(ms>=s)return Math.round(ms/s)+"s";return ms+"ms"}function long(ms){return plural(ms,d,"day")||plural(ms,h,"hour")||plural(ms,m,"minute")||plural(ms,s,"second")||ms+" ms"}function plural(ms,n,name){if(ms<n)return;if(ms<n*1.5)return Math.floor(ms/n)+" "+name;return Math.ceil(ms/n)+" "+name+"s"}},{}],26:[function(_dereq_,module,exports){(function(global){var rvalidchars=/^[\],:{}\s]*$/;var rvalidescape=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;var rvalidtokens=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;var rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g;var rtrimLeft=/^\s+/;var rtrimRight=/\s+$/;module.exports=function parsejson(data){if("string"!=typeof data||!data){return null}data=data.replace(rtrimLeft,"").replace(rtrimRight,"");if(global.JSON&&JSON.parse){return JSON.parse(data)}if(rvalidchars.test(data.replace(rvalidescape,"@").replace(rvalidtokens,"]").replace(rvalidbraces,""))){return new Function("return "+data)()}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{}],27:[function(_dereq_,module,exports){exports.encode=function(obj){var str="";for(var i in obj){if(obj.hasOwnProperty(i)){if(str.length)str+="&";str+=encodeURIComponent(i)+"="+encodeURIComponent(obj[i])}}return str};exports.decode=function(qs){var qry={};var pairs=qs.split("&");for(var i=0,l=pairs.length;i<l;i++){var pair=pairs[i].split("=");qry[decodeURIComponent(pair[0])]=decodeURIComponent(pair[1])}return qry}},{}],28:[function(_dereq_,module,exports){var re=/^(?:(?![^:@]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/;var parts=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];module.exports=function parseuri(str){var src=str,b=str.indexOf("["),e=str.indexOf("]");if(b!=-1&&e!=-1){str=str.substring(0,b)+str.substring(b,e).replace(/:/g,";")+str.substring(e,str.length)}var m=re.exec(str||""),uri={},i=14;while(i--){uri[parts[i]]=m[i]||""}if(b!=-1&&e!=-1){uri.source=src;uri.host=uri.host.substring(1,uri.host.length-1).replace(/;/g,":");uri.authority=uri.authority.replace("[","").replace("]","").replace(/;/g,":");uri.ipv6uri=true}return uri}},{}],29:[function(_dereq_,module,exports){(function(global){(function(root){var freeExports=typeof exports=="object"&&exports;var freeModule=typeof module=="object"&&module&&module.exports==freeExports&&module;var freeGlobal=typeof global=="object"&&global;if(freeGlobal.global===freeGlobal||freeGlobal.window===freeGlobal){root=freeGlobal}var stringFromCharCode=String.fromCharCode;function ucs2decode(string){var output=[];var counter=0;var length=string.length;var value;var extra;while(counter<length){value=string.charCodeAt(counter++);if(value>=55296&&value<=56319&&counter<length){extra=string.charCodeAt(counter++);if((extra&64512)==56320){output.push(((value&1023)<<10)+(extra&1023)+65536)}else{output.push(value);counter--}}else{output.push(value)}}return output}function ucs2encode(array){var length=array.length;var index=-1;var value;var output="";while(++index<length){value=array[index];if(value>65535){value-=65536;output+=stringFromCharCode(value>>>10&1023|55296);value=56320|value&1023}output+=stringFromCharCode(value)}return output}function checkScalarValue(codePoint){if(codePoint>=55296&&codePoint<=57343){throw Error("Lone surrogate U+"+codePoint.toString(16).toUpperCase()+" is not a scalar value")}}function createByte(codePoint,shift){return stringFromCharCode(codePoint>>shift&63|128)}function encodeCodePoint(codePoint){if((codePoint&4294967168)==0){return stringFromCharCode(codePoint)}var symbol="";if((codePoint&4294965248)==0){symbol=stringFromCharCode(codePoint>>6&31|192)}else if((codePoint&4294901760)==0){checkScalarValue(codePoint);symbol=stringFromCharCode(codePoint>>12&15|224);symbol+=createByte(codePoint,6)}else if((codePoint&4292870144)==0){symbol=stringFromCharCode(codePoint>>18&7|240);symbol+=createByte(codePoint,12);symbol+=createByte(codePoint,6)}symbol+=stringFromCharCode(codePoint&63|128);return symbol}function utf8encode(string){var codePoints=ucs2decode(string);var length=codePoints.length;var index=-1;var codePoint;var byteString="";while(++index<length){codePoint=codePoints[index];byteString+=encodeCodePoint(codePoint)}return byteString}function readContinuationByte(){if(byteIndex>=byteCount){throw Error("Invalid byte index")}var continuationByte=byteArray[byteIndex]&255;byteIndex++;if((continuationByte&192)==128){return continuationByte&63}throw Error("Invalid continuation byte")}function decodeSymbol(){var byte1;var byte2;var byte3;var byte4;var codePoint;if(byteIndex>byteCount){throw Error("Invalid byte index")}if(byteIndex==byteCount){return false}byte1=byteArray[byteIndex]&255;byteIndex++;if((byte1&128)==0){return byte1}if((byte1&224)==192){var byte2=readContinuationByte();codePoint=(byte1&31)<<6|byte2;if(codePoint>=128){return codePoint}else{throw Error("Invalid continuation byte")}}if((byte1&240)==224){byte2=readContinuationByte();byte3=readContinuationByte();codePoint=(byte1&15)<<12|byte2<<6|byte3;if(codePoint>=2048){checkScalarValue(codePoint);return codePoint}else{throw Error("Invalid continuation byte")}}if((byte1&248)==240){byte2=readContinuationByte();byte3=readContinuationByte();byte4=readContinuationByte();codePoint=(byte1&15)<<18|byte2<<12|byte3<<6|byte4;if(codePoint>=65536&&codePoint<=1114111){return codePoint}}throw Error("Invalid UTF-8 detected")}var byteArray;var byteCount;var byteIndex;function utf8decode(byteString){byteArray=ucs2decode(byteString);byteCount=byteArray.length;byteIndex=0;var codePoints=[];var tmp;while((tmp=decodeSymbol())!==false){codePoints.push(tmp)}return ucs2encode(codePoints)}var utf8={version:"2.0.0",encode:utf8encode,decode:utf8decode};if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){define(function(){return utf8})}else if(freeExports&&!freeExports.nodeType){if(freeModule){freeModule.exports=utf8}else{var object={};var hasOwnProperty=object.hasOwnProperty;for(var key in utf8){hasOwnProperty.call(utf8,key)&&(freeExports[key]=utf8[key])}}}else{root.utf8=utf8}})(this)}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{}],30:[function(_dereq_,module,exports){"use strict";var alphabet="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_".split(""),length=64,map={},seed=0,i=0,prev;function encode(num){var encoded="";do{encoded=alphabet[num%length]+encoded;num=Math.floor(num/length)}while(num>0);return encoded}function decode(str){var decoded=0;for(i=0;i<str.length;i++){decoded=decoded*length+map[str.charAt(i)]}return decoded}function yeast(){var now=encode(+new Date);if(now!==prev)return seed=0,prev=now;return now+"."+encode(seed++)}for(;i<length;i++)map[alphabet[i]]=i;yeast.encode=encode;yeast.decode=decode;module.exports=yeast},{}],31:[function(_dereq_,module,exports){var url=_dereq_("./url");var parser=_dereq_("socket.io-parser");var Manager=_dereq_("./manager");var debug=_dereq_("debug")("socket.io-client");module.exports=exports=lookup;var cache=exports.managers={};function lookup(uri,opts){if(typeof uri=="object"){opts=uri;uri=undefined}opts=opts||{};var parsed=url(uri);var source=parsed.source;var id=parsed.id;var path=parsed.path;var sameNamespace=cache[id]&&path in cache[id].nsps;var newConnection=opts.forceNew||opts["force new connection"]||false===opts.multiplex||sameNamespace;var io;if(newConnection){debug("ignoring socket cache for %s",source);io=Manager(source,opts)}else{if(!cache[id]){debug("new io instance for %s",source);cache[id]=Manager(source,opts)}io=cache[id]}return io.socket(parsed.path)}exports.protocol=parser.protocol;exports.connect=lookup;exports.Manager=_dereq_("./manager");exports.Socket=_dereq_("./socket")},{"./manager":32,"./socket":34,"./url":35,debug:39,"socket.io-parser":47}],32:[function(_dereq_,module,exports){var eio=_dereq_("engine.io-client");var Socket=_dereq_("./socket");var Emitter=_dereq_("component-emitter");var parser=_dereq_("socket.io-parser");var on=_dereq_("./on");var bind=_dereq_("component-bind");var debug=_dereq_("debug")("socket.io-client:manager");var indexOf=_dereq_("indexof");var Backoff=_dereq_("backo2");var has=Object.prototype.hasOwnProperty;module.exports=Manager;function Manager(uri,opts){if(!(this instanceof Manager))return new Manager(uri,opts);if(uri&&"object"==typeof uri){opts=uri;uri=undefined}opts=opts||{};opts.path=opts.path||"/socket.io";this.nsps={};this.subs=[];this.opts=opts;this.reconnection(opts.reconnection!==false);this.reconnectionAttempts(opts.reconnectionAttempts||Infinity);this.reconnectionDelay(opts.reconnectionDelay||1e3);this.reconnectionDelayMax(opts.reconnectionDelayMax||5e3);this.randomizationFactor(opts.randomizationFactor||.5);this.backoff=new Backoff({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()});this.timeout(null==opts.timeout?2e4:opts.timeout);this.readyState="closed";this.uri=uri;this.connecting=[];this.lastPing=null;this.encoding=false;this.packetBuffer=[];this.encoder=new parser.Encoder;this.decoder=new parser.Decoder;this.autoConnect=opts.autoConnect!==false;if(this.autoConnect)this.open()}Manager.prototype.emitAll=function(){this.emit.apply(this,arguments);for(var nsp in this.nsps){if(has.call(this.nsps,nsp)){this.nsps[nsp].emit.apply(this.nsps[nsp],arguments)}}};Manager.prototype.updateSocketIds=function(){for(var nsp in this.nsps){if(has.call(this.nsps,nsp)){this.nsps[nsp].id=this.engine.id}}};Emitter(Manager.prototype);Manager.prototype.reconnection=function(v){if(!arguments.length)return this._reconnection;this._reconnection=!!v;return this};Manager.prototype.reconnectionAttempts=function(v){if(!arguments.length)return this._reconnectionAttempts;this._reconnectionAttempts=v;return this};Manager.prototype.reconnectionDelay=function(v){if(!arguments.length)return this._reconnectionDelay;this._reconnectionDelay=v;this.backoff&&this.backoff.setMin(v);return this};Manager.prototype.randomizationFactor=function(v){if(!arguments.length)return this._randomizationFactor;this._randomizationFactor=v;this.backoff&&this.backoff.setJitter(v);return this};Manager.prototype.reconnectionDelayMax=function(v){if(!arguments.length)return this._reconnectionDelayMax;this._reconnectionDelayMax=v;this.backoff&&this.backoff.setMax(v);return this};Manager.prototype.timeout=function(v){if(!arguments.length)return this._timeout;this._timeout=v;return this};Manager.prototype.maybeReconnectOnOpen=function(){if(!this.reconnecting&&this._reconnection&&this.backoff.attempts===0){this.reconnect()}};Manager.prototype.open=Manager.prototype.connect=function(fn){debug("readyState %s",this.readyState);if(~this.readyState.indexOf("open"))return this;debug("opening %s",this.uri);this.engine=eio(this.uri,this.opts);var socket=this.engine;var self=this;this.readyState="opening";this.skipReconnect=false;var openSub=on(socket,"open",function(){self.onopen();fn&&fn()});var errorSub=on(socket,"error",function(data){debug("connect_error");self.cleanup();self.readyState="closed";self.emitAll("connect_error",data);if(fn){var err=new Error("Connection error");err.data=data;fn(err)}else{self.maybeReconnectOnOpen()}});if(false!==this._timeout){var timeout=this._timeout;debug("connect attempt will timeout after %d",timeout);var timer=setTimeout(function(){debug("connect attempt timed out after %d",timeout);openSub.destroy();socket.close();socket.emit("error","timeout");self.emitAll("connect_timeout",timeout)},timeout);this.subs.push({destroy:function(){clearTimeout(timer)}})}this.subs.push(openSub);this.subs.push(errorSub);return this};Manager.prototype.onopen=function(){debug("open");this.cleanup();this.readyState="open";this.emit("open");var socket=this.engine;this.subs.push(on(socket,"data",bind(this,"ondata")));this.subs.push(on(socket,"ping",bind(this,"onping")));this.subs.push(on(socket,"pong",bind(this,"onpong")));this.subs.push(on(socket,"error",bind(this,"onerror")));this.subs.push(on(socket,"close",bind(this,"onclose")));this.subs.push(on(this.decoder,"decoded",bind(this,"ondecoded")))};Manager.prototype.onping=function(){this.lastPing=new Date;this.emitAll("ping")};Manager.prototype.onpong=function(){this.emitAll("pong",new Date-this.lastPing)};Manager.prototype.ondata=function(data){this.decoder.add(data)};Manager.prototype.ondecoded=function(packet){this.emit("packet",packet)};Manager.prototype.onerror=function(err){debug("error",err);this.emitAll("error",err)};Manager.prototype.socket=function(nsp){var socket=this.nsps[nsp];if(!socket){socket=new Socket(this,nsp);this.nsps[nsp]=socket;var self=this;socket.on("connecting",onConnecting);
- socket.on("connect",function(){socket.id=self.engine.id});if(this.autoConnect){onConnecting()}}function onConnecting(){if(!~indexOf(self.connecting,socket)){self.connecting.push(socket)}}return socket};Manager.prototype.destroy=function(socket){var index=indexOf(this.connecting,socket);if(~index)this.connecting.splice(index,1);if(this.connecting.length)return;this.close()};Manager.prototype.packet=function(packet){debug("writing packet %j",packet);var self=this;if(!self.encoding){self.encoding=true;this.encoder.encode(packet,function(encodedPackets){for(var i=0;i<encodedPackets.length;i++){self.engine.write(encodedPackets[i],packet.options)}self.encoding=false;self.processPacketQueue()})}else{self.packetBuffer.push(packet)}};Manager.prototype.processPacketQueue=function(){if(this.packetBuffer.length>0&&!this.encoding){var pack=this.packetBuffer.shift();this.packet(pack)}};Manager.prototype.cleanup=function(){debug("cleanup");var sub;while(sub=this.subs.shift())sub.destroy();this.packetBuffer=[];this.encoding=false;this.lastPing=null;this.decoder.destroy()};Manager.prototype.close=Manager.prototype.disconnect=function(){debug("disconnect");this.skipReconnect=true;this.reconnecting=false;if("opening"==this.readyState){this.cleanup()}this.backoff.reset();this.readyState="closed";if(this.engine)this.engine.close()};Manager.prototype.onclose=function(reason){debug("onclose");this.cleanup();this.backoff.reset();this.readyState="closed";this.emit("close",reason);if(this._reconnection&&!this.skipReconnect){this.reconnect()}};Manager.prototype.reconnect=function(){if(this.reconnecting||this.skipReconnect)return this;var self=this;if(this.backoff.attempts>=this._reconnectionAttempts){debug("reconnect failed");this.backoff.reset();this.emitAll("reconnect_failed");this.reconnecting=false}else{var delay=this.backoff.duration();debug("will wait %dms before reconnect attempt",delay);this.reconnecting=true;var timer=setTimeout(function(){if(self.skipReconnect)return;debug("attempting reconnect");self.emitAll("reconnect_attempt",self.backoff.attempts);self.emitAll("reconnecting",self.backoff.attempts);if(self.skipReconnect)return;self.open(function(err){if(err){debug("reconnect attempt error");self.reconnecting=false;self.reconnect();self.emitAll("reconnect_error",err.data)}else{debug("reconnect success");self.onreconnect()}})},delay);this.subs.push({destroy:function(){clearTimeout(timer)}})}};Manager.prototype.onreconnect=function(){var attempt=this.backoff.attempts;this.reconnecting=false;this.backoff.reset();this.updateSocketIds();this.emitAll("reconnect",attempt)}},{"./on":33,"./socket":34,backo2:36,"component-bind":37,"component-emitter":38,debug:39,"engine.io-client":1,indexof:42,"socket.io-parser":47}],33:[function(_dereq_,module,exports){module.exports=on;function on(obj,ev,fn){obj.on(ev,fn);return{destroy:function(){obj.removeListener(ev,fn)}}}},{}],34:[function(_dereq_,module,exports){var parser=_dereq_("socket.io-parser");var Emitter=_dereq_("component-emitter");var toArray=_dereq_("to-array");var on=_dereq_("./on");var bind=_dereq_("component-bind");var debug=_dereq_("debug")("socket.io-client:socket");var hasBin=_dereq_("has-binary");module.exports=exports=Socket;var events={connect:1,connect_error:1,connect_timeout:1,connecting:1,disconnect:1,error:1,reconnect:1,reconnect_attempt:1,reconnect_failed:1,reconnect_error:1,reconnecting:1,ping:1,pong:1};var emit=Emitter.prototype.emit;function Socket(io,nsp){this.io=io;this.nsp=nsp;this.json=this;this.ids=0;this.acks={};this.receiveBuffer=[];this.sendBuffer=[];this.connected=false;this.disconnected=true;if(this.io.autoConnect)this.open()}Emitter(Socket.prototype);Socket.prototype.subEvents=function(){if(this.subs)return;var io=this.io;this.subs=[on(io,"open",bind(this,"onopen")),on(io,"packet",bind(this,"onpacket")),on(io,"close",bind(this,"onclose"))]};Socket.prototype.open=Socket.prototype.connect=function(){if(this.connected)return this;this.subEvents();this.io.open();if("open"==this.io.readyState)this.onopen();this.emit("connecting");return this};Socket.prototype.send=function(){var args=toArray(arguments);args.unshift("message");this.emit.apply(this,args);return this};Socket.prototype.emit=function(ev){if(events.hasOwnProperty(ev)){emit.apply(this,arguments);return this}var args=toArray(arguments);var parserType=parser.EVENT;if(hasBin(args)){parserType=parser.BINARY_EVENT}var packet={type:parserType,data:args};packet.options={};packet.options.compress=!this.flags||false!==this.flags.compress;if("function"==typeof args[args.length-1]){debug("emitting packet with ack id %d",this.ids);this.acks[this.ids]=args.pop();packet.id=this.ids++}if(this.connected){this.packet(packet)}else{this.sendBuffer.push(packet)}delete this.flags;return this};Socket.prototype.packet=function(packet){packet.nsp=this.nsp;this.io.packet(packet)};Socket.prototype.onopen=function(){debug("transport is open - connecting");if("/"!=this.nsp){this.packet({type:parser.CONNECT})}};Socket.prototype.onclose=function(reason){debug("close (%s)",reason);this.connected=false;this.disconnected=true;delete this.id;this.emit("disconnect",reason)};Socket.prototype.onpacket=function(packet){if(packet.nsp!=this.nsp)return;switch(packet.type){case parser.CONNECT:this.onconnect();break;case parser.EVENT:this.onevent(packet);break;case parser.BINARY_EVENT:this.onevent(packet);break;case parser.ACK:this.onack(packet);break;case parser.BINARY_ACK:this.onack(packet);break;case parser.DISCONNECT:this.ondisconnect();break;case parser.ERROR:this.emit("error",packet.data);break}};Socket.prototype.onevent=function(packet){var args=packet.data||[];debug("emitting event %j",args);if(null!=packet.id){debug("attaching ack callback to event");args.push(this.ack(packet.id))}if(this.connected){emit.apply(this,args)}else{this.receiveBuffer.push(args)}};Socket.prototype.ack=function(id){var self=this;var sent=false;return function(){if(sent)return;sent=true;var args=toArray(arguments);debug("sending ack %j",args);var type=hasBin(args)?parser.BINARY_ACK:parser.ACK;self.packet({type:type,id:id,data:args})}};Socket.prototype.onack=function(packet){var ack=this.acks[packet.id];if("function"==typeof ack){debug("calling ack %s with %j",packet.id,packet.data);ack.apply(this,packet.data);delete this.acks[packet.id]}else{debug("bad ack %s",packet.id)}};Socket.prototype.onconnect=function(){this.connected=true;this.disconnected=false;this.emit("connect");this.emitBuffered()};Socket.prototype.emitBuffered=function(){var i;for(i=0;i<this.receiveBuffer.length;i++){emit.apply(this,this.receiveBuffer[i])}this.receiveBuffer=[];for(i=0;i<this.sendBuffer.length;i++){this.packet(this.sendBuffer[i])}this.sendBuffer=[]};Socket.prototype.ondisconnect=function(){debug("server disconnect (%s)",this.nsp);this.destroy();this.onclose("io server disconnect")};Socket.prototype.destroy=function(){if(this.subs){for(var i=0;i<this.subs.length;i++){this.subs[i].destroy()}this.subs=null}this.io.destroy(this)};Socket.prototype.close=Socket.prototype.disconnect=function(){if(this.connected){debug("performing disconnect (%s)",this.nsp);this.packet({type:parser.DISCONNECT})}this.destroy();if(this.connected){this.onclose("io client disconnect")}return this};Socket.prototype.compress=function(compress){this.flags=this.flags||{};this.flags.compress=compress;return this}},{"./on":33,"component-bind":37,"component-emitter":38,debug:39,"has-binary":41,"socket.io-parser":47,"to-array":51}],35:[function(_dereq_,module,exports){(function(global){var parseuri=_dereq_("parseuri");var debug=_dereq_("debug")("socket.io-client:url");module.exports=url;function url(uri,loc){var obj=uri;var loc=loc||global.location;if(null==uri)uri=loc.protocol+"//"+loc.host;if("string"==typeof uri){if("/"==uri.charAt(0)){if("/"==uri.charAt(1)){uri=loc.protocol+uri}else{uri=loc.host+uri}}if(!/^(https?|wss?):\/\//.test(uri)){debug("protocol-less url %s",uri);if("undefined"!=typeof loc){uri=loc.protocol+"//"+uri}else{uri="https://"+uri}}debug("parse %s",uri);obj=parseuri(uri)}if(!obj.port){if(/^(http|ws)$/.test(obj.protocol)){obj.port="80"}else if(/^(http|ws)s$/.test(obj.protocol)){obj.port="443"}}obj.path=obj.path||"/";var ipv6=obj.host.indexOf(":")!==-1;var host=ipv6?"["+obj.host+"]":obj.host;obj.id=obj.protocol+"://"+host+":"+obj.port;obj.href=obj.protocol+"://"+host+(loc&&loc.port==obj.port?"":":"+obj.port);return obj}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{debug:39,parseuri:45}],36:[function(_dereq_,module,exports){module.exports=Backoff;function Backoff(opts){opts=opts||{};this.ms=opts.min||100;this.max=opts.max||1e4;this.factor=opts.factor||2;this.jitter=opts.jitter>0&&opts.jitter<=1?opts.jitter:0;this.attempts=0}Backoff.prototype.duration=function(){var ms=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var rand=Math.random();var deviation=Math.floor(rand*this.jitter*ms);ms=(Math.floor(rand*10)&1)==0?ms-deviation:ms+deviation}return Math.min(ms,this.max)|0};Backoff.prototype.reset=function(){this.attempts=0};Backoff.prototype.setMin=function(min){this.ms=min};Backoff.prototype.setMax=function(max){this.max=max};Backoff.prototype.setJitter=function(jitter){this.jitter=jitter}},{}],37:[function(_dereq_,module,exports){var slice=[].slice;module.exports=function(obj,fn){if("string"==typeof fn)fn=obj[fn];if("function"!=typeof fn)throw new Error("bind() requires a function");var args=slice.call(arguments,2);return function(){return fn.apply(obj,args.concat(slice.call(arguments)))}}},{}],38:[function(_dereq_,module,exports){module.exports=Emitter;function Emitter(obj){if(obj)return mixin(obj)}function mixin(obj){for(var key in Emitter.prototype){obj[key]=Emitter.prototype[key]}return obj}Emitter.prototype.on=Emitter.prototype.addEventListener=function(event,fn){this._callbacks=this._callbacks||{};(this._callbacks["$"+event]=this._callbacks["$"+event]||[]).push(fn);return this};Emitter.prototype.once=function(event,fn){function on(){this.off(event,on);fn.apply(this,arguments)}on.fn=fn;this.on(event,on);return this};Emitter.prototype.off=Emitter.prototype.removeListener=Emitter.prototype.removeAllListeners=Emitter.prototype.removeEventListener=function(event,fn){this._callbacks=this._callbacks||{};if(0==arguments.length){this._callbacks={};return this}var callbacks=this._callbacks["$"+event];if(!callbacks)return this;if(1==arguments.length){delete this._callbacks["$"+event];return this}var cb;for(var i=0;i<callbacks.length;i++){cb=callbacks[i];if(cb===fn||cb.fn===fn){callbacks.splice(i,1);break}}return this};Emitter.prototype.emit=function(event){this._callbacks=this._callbacks||{};var args=[].slice.call(arguments,1),callbacks=this._callbacks["$"+event];if(callbacks){callbacks=callbacks.slice(0);for(var i=0,len=callbacks.length;i<len;++i){callbacks[i].apply(this,args)}}return this};Emitter.prototype.listeners=function(event){this._callbacks=this._callbacks||{};return this._callbacks["$"+event]||[]};Emitter.prototype.hasListeners=function(event){return!!this.listeners(event).length}},{}],39:[function(_dereq_,module,exports){arguments[4][17][0].apply(exports,arguments)},{"./debug":40,dup:17}],40:[function(_dereq_,module,exports){arguments[4][18][0].apply(exports,arguments)},{dup:18,ms:44}],41:[function(_dereq_,module,exports){(function(global){var isArray=_dereq_("isarray");module.exports=hasBinary;function hasBinary(data){function _hasBinary(obj){if(!obj)return false;if(global.Buffer&&global.Buffer.isBuffer&&global.Buffer.isBuffer(obj)||global.ArrayBuffer&&obj instanceof ArrayBuffer||global.Blob&&obj instanceof Blob||global.File&&obj instanceof File){return true}if(isArray(obj)){for(var i=0;i<obj.length;i++){if(_hasBinary(obj[i])){return true}}}else if(obj&&"object"==typeof obj){if(obj.toJSON&&"function"==typeof obj.toJSON){obj=obj.toJSON()}for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key)&&_hasBinary(obj[key])){return true}}}return false}return _hasBinary(data)}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{isarray:43}],42:[function(_dereq_,module,exports){arguments[4][23][0].apply(exports,arguments)},{dup:23}],43:[function(_dereq_,module,exports){arguments[4][24][0].apply(exports,arguments)},{dup:24}],44:[function(_dereq_,module,exports){arguments[4][25][0].apply(exports,arguments)},{dup:25}],45:[function(_dereq_,module,exports){arguments[4][28][0].apply(exports,arguments)},{dup:28}],46:[function(_dereq_,module,exports){(function(global){var isArray=_dereq_("isarray");var isBuf=_dereq_("./is-buffer");exports.deconstructPacket=function(packet){var buffers=[];var packetData=packet.data;function _deconstructPacket(data){if(!data)return data;if(isBuf(data)){var placeholder={_placeholder:true,num:buffers.length};buffers.push(data);return placeholder}else if(isArray(data)){var newData=new Array(data.length);for(var i=0;i<data.length;i++){newData[i]=_deconstructPacket(data[i])}return newData}else if("object"==typeof data&&!(data instanceof Date)){var newData={};for(var key in data){newData[key]=_deconstructPacket(data[key])}return newData}return data}var pack=packet;pack.data=_deconstructPacket(packetData);pack.attachments=buffers.length;return{packet:pack,buffers:buffers}};exports.reconstructPacket=function(packet,buffers){var curPlaceHolder=0;function _reconstructPacket(data){if(data&&data._placeholder){var buf=buffers[data.num];return buf}else if(isArray(data)){for(var i=0;i<data.length;i++){data[i]=_reconstructPacket(data[i])}return data}else if(data&&"object"==typeof data){for(var key in data){data[key]=_reconstructPacket(data[key])}return data}return data}packet.data=_reconstructPacket(packet.data);packet.attachments=undefined;return packet};exports.removeBlobs=function(data,callback){function _removeBlobs(obj,curKey,containingObject){if(!obj)return obj;if(global.Blob&&obj instanceof Blob||global.File&&obj instanceof File){pendingBlobs++;var fileReader=new FileReader;fileReader.onload=function(){if(containingObject){containingObject[curKey]=this.result}else{bloblessData=this.result}if(!--pendingBlobs){callback(bloblessData)}};fileReader.readAsArrayBuffer(obj)}else if(isArray(obj)){for(var i=0;i<obj.length;i++){_removeBlobs(obj[i],i,obj)}}else if(obj&&"object"==typeof obj&&!isBuf(obj)){for(var key in obj){_removeBlobs(obj[key],key,obj)}}}var pendingBlobs=0;var bloblessData=data;_removeBlobs(bloblessData);if(!pendingBlobs){callback(bloblessData)}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{"./is-buffer":48,isarray:43}],47:[function(_dereq_,module,exports){var debug=_dereq_("debug")("socket.io-parser");var json=_dereq_("json3");var isArray=_dereq_("isarray");var Emitter=_dereq_("component-emitter");var binary=_dereq_("./binary");var isBuf=_dereq_("./is-buffer");exports.protocol=4;exports.types=["CONNECT","DISCONNECT","EVENT","BINARY_EVENT","ACK","BINARY_ACK","ERROR"];exports.CONNECT=0;exports.DISCONNECT=1;exports.EVENT=2;exports.ACK=3;exports.ERROR=4;exports.BINARY_EVENT=5;exports.BINARY_ACK=6;exports.Encoder=Encoder;exports.Decoder=Decoder;function Encoder(){}Encoder.prototype.encode=function(obj,callback){debug("encoding packet %j",obj);if(exports.BINARY_EVENT==obj.type||exports.BINARY_ACK==obj.type){encodeAsBinary(obj,callback)}else{var encoding=encodeAsString(obj);callback([encoding])}};function encodeAsString(obj){var str="";var nsp=false;str+=obj.type;if(exports.BINARY_EVENT==obj.type||exports.BINARY_ACK==obj.type){str+=obj.attachments;str+="-"}if(obj.nsp&&"/"!=obj.nsp){nsp=true;str+=obj.nsp}if(null!=obj.id){if(nsp){str+=",";nsp=false}str+=obj.id}if(null!=obj.data){if(nsp)str+=",";str+=json.stringify(obj.data)}debug("encoded %j as %s",obj,str);return str}function encodeAsBinary(obj,callback){function writeEncoding(bloblessData){var deconstruction=binary.deconstructPacket(bloblessData);var pack=encodeAsString(deconstruction.packet);var buffers=deconstruction.buffers;buffers.unshift(pack);callback(buffers)}binary.removeBlobs(obj,writeEncoding)}function Decoder(){this.reconstructor=null}Emitter(Decoder.prototype);Decoder.prototype.add=function(obj){var packet;if("string"==typeof obj){packet=decodeString(obj);if(exports.BINARY_EVENT==packet.type||exports.BINARY_ACK==packet.type){this.reconstructor=new BinaryReconstructor(packet);if(this.reconstructor.reconPack.attachments===0){this.emit("decoded",packet)}}else{this.emit("decoded",packet)}}else if(isBuf(obj)||obj.base64){if(!this.reconstructor){throw new Error("got binary data when not reconstructing a packet")}else{packet=this.reconstructor.takeBinaryData(obj);if(packet){this.reconstructor=null;this.emit("decoded",packet)}}}else{throw new Error("Unknown type: "+obj)}};function decodeString(str){var p={};var i=0;p.type=Number(str.charAt(0));if(null==exports.types[p.type])return error();if(exports.BINARY_EVENT==p.type||exports.BINARY_ACK==p.type){var buf="";while(str.charAt(++i)!="-"){buf+=str.charAt(i);if(i==str.length)break}if(buf!=Number(buf)||str.charAt(i)!="-"){throw new Error("Illegal attachments")}p.attachments=Number(buf)}if("/"==str.charAt(i+1)){p.nsp="";while(++i){var c=str.charAt(i);if(","==c)break;p.nsp+=c;if(i==str.length)break}}else{p.nsp="/"}var next=str.charAt(i+1);if(""!==next&&Number(next)==next){p.id="";while(++i){var c=str.charAt(i);if(null==c||Number(c)!=c){--i;break}p.id+=str.charAt(i);if(i==str.length)break}p.id=Number(p.id)}if(str.charAt(++i)){try{p.data=json.parse(str.substr(i))}catch(e){return error()}}debug("decoded %s as %j",str,p);return p}Decoder.prototype.destroy=function(){if(this.reconstructor){this.reconstructor.finishedReconstruction()}};function BinaryReconstructor(packet){this.reconPack=packet;this.buffers=[]}BinaryReconstructor.prototype.takeBinaryData=function(binData){this.buffers.push(binData);if(this.buffers.length==this.reconPack.attachments){var packet=binary.reconstructPacket(this.reconPack,this.buffers);this.finishedReconstruction();return packet}return null};BinaryReconstructor.prototype.finishedReconstruction=function(){this.reconPack=null;this.buffers=[]};function error(data){return{type:exports.ERROR,data:"parser error"}}},{"./binary":46,"./is-buffer":48,"component-emitter":49,debug:39,isarray:43,json3:50}],48:[function(_dereq_,module,exports){(function(global){module.exports=isBuf;function isBuf(obj){return global.Buffer&&global.Buffer.isBuffer(obj)||global.ArrayBuffer&&obj instanceof ArrayBuffer}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{}],49:[function(_dereq_,module,exports){arguments[4][15][0].apply(exports,arguments)},{dup:15}],50:[function(_dereq_,module,exports){(function(global){(function(){var isLoader=typeof define==="function"&&define.amd;var objectTypes={"function":true,object:true};var freeExports=objectTypes[typeof exports]&&exports&&!exports.nodeType&&exports;var root=objectTypes[typeof window]&&window||this,freeGlobal=freeExports&&objectTypes[typeof module]&&module&&!module.nodeType&&typeof global=="object"&&global;if(freeGlobal&&(freeGlobal["global"]===freeGlobal||freeGlobal["window"]===freeGlobal||freeGlobal["self"]===freeGlobal)){root=freeGlobal}function runInContext(context,exports){context||(context=root["Object"]());exports||(exports=root["Object"]());var Number=context["Number"]||root["Number"],String=context["String"]||root["String"],Object=context["Object"]||root["Object"],Date=context["Date"]||root["Date"],SyntaxError=context["SyntaxError"]||root["SyntaxError"],TypeError=context["TypeError"]||root["TypeError"],Math=context["Math"]||root["Math"],nativeJSON=context["JSON"]||root["JSON"];if(typeof nativeJSON=="object"&&nativeJSON){exports.stringify=nativeJSON.stringify;exports.parse=nativeJSON.parse}var objectProto=Object.prototype,getClass=objectProto.toString,isProperty,forEach,undef;var isExtended=new Date(-0xc782b5b800cec);try{isExtended=isExtended.getUTCFullYear()==-109252&&isExtended.getUTCMonth()===0&&isExtended.getUTCDate()===1&&isExtended.getUTCHours()==10&&isExtended.getUTCMinutes()==37&&isExtended.getUTCSeconds()==6&&isExtended.getUTCMilliseconds()==708}catch(exception){}function has(name){if(has[name]!==undef){return has[name]}var isSupported;if(name=="bug-string-char-index"){isSupported="a"[0]!="a"}else if(name=="json"){isSupported=has("json-stringify")&&has("json-parse")}else{var value,serialized='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if(name=="json-stringify"){var stringify=exports.stringify,stringifySupported=typeof stringify=="function"&&isExtended;if(stringifySupported){(value=function(){return 1}).toJSON=value;try{stringifySupported=stringify(0)==="0"&&stringify(new Number)==="0"&&stringify(new String)=='""'&&stringify(getClass)===undef&&stringify(undef)===undef&&stringify()===undef&&stringify(value)==="1"&&stringify([value])=="[1]"&&stringify([undef])=="[null]"&&stringify(null)=="null"&&stringify([undef,getClass,null])=="[null,null,null]"&&stringify({a:[value,true,false,null,"\x00\b\n\f\r "]})==serialized&&stringify(null,value)==="1"&&stringify([1,2],null,1)=="[\n 1,\n 2\n]"&&stringify(new Date(-864e13))=='"-271821-04-20T00:00:00.000Z"'&&stringify(new Date(864e13))=='"+275760-09-13T00:00:00.000Z"'&&stringify(new Date(-621987552e5))=='"-000001-01-01T00:00:00.000Z"'&&stringify(new Date(-1))=='"1969-12-31T23:59:59.999Z"'}catch(exception){stringifySupported=false}}isSupported=stringifySupported}if(name=="json-parse"){var parse=exports.parse;if(typeof parse=="function"){try{if(parse("0")===0&&!parse(false)){value=parse(serialized);var parseSupported=value["a"].length==5&&value["a"][0]===1;if(parseSupported){try{parseSupported=!parse('" "')}catch(exception){}if(parseSupported){try{parseSupported=parse("01")!==1}catch(exception){}}if(parseSupported){try{parseSupported=parse("1.")!==1}catch(exception){}}}}}catch(exception){parseSupported=false}}isSupported=parseSupported}}return has[name]=!!isSupported}if(!has("json")){var functionClass="[object Function]",dateClass="[object Date]",numberClass="[object Number]",stringClass="[object String]",arrayClass="[object Array]",booleanClass="[object Boolean]";var charIndexBuggy=has("bug-string-char-index");if(!isExtended){var floor=Math.floor;var Months=[0,31,59,90,120,151,181,212,243,273,304,334];var getDay=function(year,month){return Months[month]+365*(year-1970)+floor((year-1969+(month=+(month>1)))/4)-floor((year-1901+month)/100)+floor((year-1601+month)/400)}}if(!(isProperty=objectProto.hasOwnProperty)){isProperty=function(property){var members={},constructor;if((members.__proto__=null,members.__proto__={toString:1},members).toString!=getClass){isProperty=function(property){var original=this.__proto__,result=property in(this.__proto__=null,this);this.__proto__=original;return result}}else{constructor=members.constructor;isProperty=function(property){var parent=(this.constructor||constructor).prototype;return property in this&&!(property in parent&&this[property]===parent[property])}}members=null;return isProperty.call(this,property)}}forEach=function(object,callback){var size=0,Properties,members,property;(Properties=function(){this.valueOf=0}).prototype.valueOf=0;members=new Properties;for(property in members){if(isProperty.call(members,property)){size++}}Properties=members=null;if(!size){members=["valueOf","toString","toLocaleString","propertyIsEnumerable","isPrototypeOf","hasOwnProperty","constructor"];forEach=function(object,callback){var isFunction=getClass.call(object)==functionClass,property,length;var hasProperty=!isFunction&&typeof object.constructor!="function"&&objectTypes[typeof object.hasOwnProperty]&&object.hasOwnProperty||isProperty;for(property in object){if(!(isFunction&&property=="prototype")&&hasProperty.call(object,property)){callback(property)}}for(length=members.length;property=members[--length];hasProperty.call(object,property)&&callback(property));}}else if(size==2){forEach=function(object,callback){var members={},isFunction=getClass.call(object)==functionClass,property;for(property in object){if(!(isFunction&&property=="prototype")&&!isProperty.call(members,property)&&(members[property]=1)&&isProperty.call(object,property)){callback(property)}}}}else{forEach=function(object,callback){var isFunction=getClass.call(object)==functionClass,property,isConstructor;for(property in object){if(!(isFunction&&property=="prototype")&&isProperty.call(object,property)&&!(isConstructor=property==="constructor")){callback(property)}}if(isConstructor||isProperty.call(object,property="constructor")){callback(property)}}}return forEach(object,callback)};if(!has("json-stringify")){var Escapes={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"};var leadingZeroes="000000";var toPaddedString=function(width,value){return(leadingZeroes+(value||0)).slice(-width)};var unicodePrefix="\\u00";var quote=function(value){var result='"',index=0,length=value.length,useCharIndex=!charIndexBuggy||length>10;var symbols=useCharIndex&&(charIndexBuggy?value.split(""):value);for(;index<length;index++){var charCode=value.charCodeAt(index);switch(charCode){case 8:case 9:case 10:case 12:case 13:case 34:case 92:result+=Escapes[charCode];break;default:if(charCode<32){result+=unicodePrefix+toPaddedString(2,charCode.toString(16));break}result+=useCharIndex?symbols[index]:value.charAt(index)}}return result+'"'};var serialize=function(property,object,callback,properties,whitespace,indentation,stack){var value,className,year,month,date,time,hours,minutes,seconds,milliseconds,results,element,index,length,prefix,result;try{value=object[property]}catch(exception){}if(typeof value=="object"&&value){className=getClass.call(value);if(className==dateClass&&!isProperty.call(value,"toJSON")){if(value>-1/0&&value<1/0){if(getDay){date=floor(value/864e5);for(year=floor(date/365.2425)+1970-1;getDay(year+1,0)<=date;year++);for(month=floor((date-getDay(year,0))/30.42);getDay(year,month+1)<=date;month++);date=1+date-getDay(year,month);time=(value%864e5+864e5)%864e5;hours=floor(time/36e5)%24;minutes=floor(time/6e4)%60;seconds=floor(time/1e3)%60;milliseconds=time%1e3}else{year=value.getUTCFullYear();month=value.getUTCMonth();date=value.getUTCDate();hours=value.getUTCHours();minutes=value.getUTCMinutes();seconds=value.getUTCSeconds();milliseconds=value.getUTCMilliseconds()}value=(year<=0||year>=1e4?(year<0?"-":"+")+toPaddedString(6,year<0?-year:year):toPaddedString(4,year))+"-"+toPaddedString(2,month+1)+"-"+toPaddedString(2,date)+"T"+toPaddedString(2,hours)+":"+toPaddedString(2,minutes)+":"+toPaddedString(2,seconds)+"."+toPaddedString(3,milliseconds)+"Z"}else{value=null}}else if(typeof value.toJSON=="function"&&(className!=numberClass&&className!=stringClass&&className!=arrayClass||isProperty.call(value,"toJSON"))){value=value.toJSON(property)}}if(callback){value=callback.call(object,property,value)}if(value===null){return"null"}className=getClass.call(value);if(className==booleanClass){return""+value}else if(className==numberClass){return value>-1/0&&value<1/0?""+value:"null"}else if(className==stringClass){return quote(""+value)}if(typeof value=="object"){for(length=stack.length;length--;){if(stack[length]===value){throw TypeError()}}stack.push(value);results=[];prefix=indentation;indentation+=whitespace;if(className==arrayClass){for(index=0,length=value.length;index<length;index++){element=serialize(index,value,callback,properties,whitespace,indentation,stack);results.push(element===undef?"null":element)}result=results.length?whitespace?"[\n"+indentation+results.join(",\n"+indentation)+"\n"+prefix+"]":"["+results.join(",")+"]":"[]"}else{forEach(properties||value,function(property){var element=serialize(property,value,callback,properties,whitespace,indentation,stack);if(element!==undef){results.push(quote(property)+":"+(whitespace?" ":"")+element)}});result=results.length?whitespace?"{\n"+indentation+results.join(",\n"+indentation)+"\n"+prefix+"}":"{"+results.join(",")+"}":"{}"}stack.pop();return result}};exports.stringify=function(source,filter,width){var whitespace,callback,properties,className;if(objectTypes[typeof filter]&&filter){if((className=getClass.call(filter))==functionClass){callback=filter}else if(className==arrayClass){properties={};for(var index=0,length=filter.length,value;index<length;value=filter[index++],(className=getClass.call(value),className==stringClass||className==numberClass)&&(properties[value]=1));}}if(width){if((className=getClass.call(width))==numberClass){if((width-=width%1)>0){for(whitespace="",width>10&&(width=10);whitespace.length<width;whitespace+=" ");}}else if(className==stringClass){whitespace=width.length<=10?width:width.slice(0,10)}}return serialize("",(value={},value[""]=source,value),callback,properties,whitespace,"",[])}}if(!has("json-parse")){var fromCharCode=String.fromCharCode;var Unescapes={92:"\\",34:'"',47:"/",98:"\b",116:" ",110:"\n",102:"\f",114:"\r"};var Index,Source;var abort=function(){Index=Source=null;throw SyntaxError()};var lex=function(){var source=Source,length=source.length,value,begin,position,isSigned,charCode;while(Index<length){charCode=source.charCodeAt(Index);switch(charCode){case 9:case 10:case 13:case 32:Index++;break;case 123:case 125:case 91:case 93:case 58:case 44:value=charIndexBuggy?source.charAt(Index):source[Index];Index++;return value;case 34:for(value="@",Index++;Index<length;){charCode=source.charCodeAt(Index);if(charCode<32){abort()}else if(charCode==92){charCode=source.charCodeAt(++Index);switch(charCode){case 92:case 34:case 47:case 98:case 116:case 110:case 102:case 114:value+=Unescapes[charCode];Index++;break;case 117:begin=++Index;for(position=Index+4;Index<position;Index++){charCode=source.charCodeAt(Index);if(!(charCode>=48&&charCode<=57||charCode>=97&&charCode<=102||charCode>=65&&charCode<=70)){abort()}}value+=fromCharCode("0x"+source.slice(begin,Index));break;default:abort()}}else{if(charCode==34){break}charCode=source.charCodeAt(Index);begin=Index;while(charCode>=32&&charCode!=92&&charCode!=34){charCode=source.charCodeAt(++Index)}value+=source.slice(begin,Index)}}if(source.charCodeAt(Index)==34){Index++;return value}abort();default:begin=Index;if(charCode==45){isSigned=true;charCode=source.charCodeAt(++Index)}if(charCode>=48&&charCode<=57){if(charCode==48&&(charCode=source.charCodeAt(Index+1),charCode>=48&&charCode<=57)){abort()}isSigned=false;for(;Index<length&&(charCode=source.charCodeAt(Index),charCode>=48&&charCode<=57);Index++);if(source.charCodeAt(Index)==46){position=++Index;for(;position<length&&(charCode=source.charCodeAt(position),charCode>=48&&charCode<=57);position++);if(position==Index){abort()}Index=position}charCode=source.charCodeAt(Index);if(charCode==101||charCode==69){charCode=source.charCodeAt(++Index);if(charCode==43||charCode==45){Index++}for(position=Index;position<length&&(charCode=source.charCodeAt(position),charCode>=48&&charCode<=57);position++);if(position==Index){abort()}Index=position}return+source.slice(begin,Index)}if(isSigned){abort()}if(source.slice(Index,Index+4)=="true"){Index+=4;return true}else if(source.slice(Index,Index+5)=="false"){Index+=5;return false}else if(source.slice(Index,Index+4)=="null"){Index+=4;return null}abort()}}return"$"};var get=function(value){var results,hasMembers;if(value=="$"){abort()}if(typeof value=="string"){if((charIndexBuggy?value.charAt(0):value[0])=="@"){return value.slice(1)}if(value=="["){results=[];for(;;hasMembers||(hasMembers=true)){value=lex();if(value=="]"){break}if(hasMembers){if(value==","){value=lex();if(value=="]"){abort()}}else{abort()}}if(value==","){abort()}results.push(get(value))}return results}else if(value=="{"){results={};for(;;hasMembers||(hasMembers=true)){value=lex();if(value=="}"){break}if(hasMembers){if(value==","){value=lex();if(value=="}"){abort()}}else{abort()}}if(value==","||typeof value!="string"||(charIndexBuggy?value.charAt(0):value[0])!="@"||lex()!=":"){abort()}results[value.slice(1)]=get(lex())
- }return results}abort()}return value};var update=function(source,property,callback){var element=walk(source,property,callback);if(element===undef){delete source[property]}else{source[property]=element}};var walk=function(source,property,callback){var value=source[property],length;if(typeof value=="object"&&value){if(getClass.call(value)==arrayClass){for(length=value.length;length--;){update(value,length,callback)}}else{forEach(value,function(property){update(value,property,callback)})}}return callback.call(source,property,value)};exports.parse=function(source,callback){var result,value;Index=0;Source=""+source;result=get(lex());if(lex()!="$"){abort()}Index=Source=null;return callback&&getClass.call(callback)==functionClass?walk((value={},value[""]=result,value),"",callback):result}}}exports["runInContext"]=runInContext;return exports}if(freeExports&&!isLoader){runInContext(root,freeExports)}else{var nativeJSON=root.JSON,previousJSON=root["JSON3"],isRestored=false;var JSON3=runInContext(root,root["JSON3"]={noConflict:function(){if(!isRestored){isRestored=true;root.JSON=nativeJSON;root["JSON3"]=previousJSON;nativeJSON=previousJSON=null}return JSON3}});root.JSON={parse:JSON3.parse,stringify:JSON3.stringify}}if(isLoader){define(function(){return JSON3})}}).call(this)}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:typeof global!=="undefined"?global:{})},{}],51:[function(_dereq_,module,exports){module.exports=toArray;function toArray(list,index){var array=[];index=index||0;for(var i=index||0;i<list.length;i++){array[i-index]=list[i]}return array}},{}]},{},[31])(31)});
-
- }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
- },{}],"telemetry-helper":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
-
- var clientSocket;
- var serviceToPluginMap;
- var pendingTelemetryEvents = [];
-
- function init(socket) {
- clientSocket = socket;
- trySendPendingEvents();
- }
-
- function registerPluginServices(pluginServices) {
- serviceToPluginMap = pluginServices;
- trySendPendingEvents();
- }
-
- function trySendPendingEvents() {
- if (!clientSocket) {
- return;
- }
-
- var unsent = [];
-
- pendingTelemetryEvents.forEach(function (eventData) {
- if (mustMapServiceToPlugin(eventData) && !serviceToPluginMap) {
- unsent.push(eventData);
- } else {
- sendClientTelemetry(eventData);
- }
- });
-
- pendingTelemetryEvents = unsent;
- }
-
- function mustMapServiceToPlugin(eventData) {
- return !!eventData.props.service && !eventData.plugin;
- }
-
- function sendClientTelemetry(event, props, piiProps) {
- var eventData = {
- event: event,
- props: props,
- piiProps: piiProps
- };
-
- if (!clientSocket) {
- pendingTelemetryEvents.push(eventData);
- return;
- }
-
- if (mustMapServiceToPlugin(eventData)) {
- if (!serviceToPluginMap) {
- pendingTelemetryEvents.push(eventData);
- return;
- }
-
- eventData.props.plugin = serviceToPluginMap[eventData.props.service] || '_unknown';
- }
-
- clientSocket.emit('telemetry', eventData);
- }
-
- function sendUITelemetry(uiControlData) {
- sendClientTelemetry('plugin-ui-interaction', uiControlData);
- }
-
- module.exports.init = init;
- module.exports.registerPluginServices = registerPluginServices;
- module.exports.sendClientTelemetry = sendClientTelemetry;
- module.exports.sendUITelemetry = sendUITelemetry;
-
- },{}],"utils":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // Based in part on code from Apache Ripple, https://github.com/apache/incubator-ripple
-
- var self,
- exception = require('exception');
-
- self = module.exports = {
- validateArgumentType: function (arg, argType, customExceptionType, customExceptionMessage, customExceptionObject) {
- var invalidArg = false,
- msg;
-
- switch (argType) {
- case 'array':
- if (!(arg instanceof Array)) {
- invalidArg = true;
- }
- break;
- case 'date':
- if (!(arg instanceof Date)) {
- invalidArg = true;
- }
- break;
- case 'integer':
- if (typeof arg === 'number') {
- if (arg !== Math.floor(arg)) {
- invalidArg = true;
- }
- }
- else {
- invalidArg = true;
- }
- break;
- default:
- if (typeof arg !== argType) {
- invalidArg = true;
- }
- break;
- }
-
- if (invalidArg) {
- msg = customExceptionMessage + ('\n\nInvalid Argument type. argument: ' + arg + ' ==> was expected to be of type: ' + argType);
- exception.raise((customExceptionType || exception.types.ArgumentType), msg, customExceptionObject);
- }
- },
-
- forEach: function (obj, action, scope) {
- if (obj instanceof Array) {
- return obj.forEach(action, scope);
- } else {
- self.map(obj, action, scope);
- }
- },
-
- map: function (obj, func, scope) {
- var i,
- returnVal = null,
- result = [];
-
- //MozHack for NamedNodeMap
- /* jshint ignore:start */
- if (window.MozNamedAttrMap) {
- NamedNodeMap = window.MozNamedAttrMap;
- }
- /* jshint ignore:end */
-
- if (obj instanceof Array) {
- return obj.map(func, scope);
- } else if (obj instanceof NamedNodeMap) {
- for (i = 0; i < obj.length; i++) {
- returnVal = func.apply(scope, [obj[i], i]);
- result.push(returnVal);
- }
- } else {
- for (i in obj) {
- if (obj.hasOwnProperty(i)) {
- returnVal = func.apply(scope, [obj[i], i]);
- result.push(returnVal);
- }
- }
- }
-
- return result;
- },
-
- bindAutoSaveEvent: function (selector, saveCallback) {
- var oldSetTimeoutId;
- var node = document.querySelector(selector);
-
- if (!node) {
- console.log('AUTO SAVE: REINSTATE ONCE WE HAVE ' + selector + ' ELEMENT');
- return;
- }
-
- node.addEventListener('keyup', function (event) {
- if (event.keyCode !== 9) {
- clearTimeout(oldSetTimeoutId);
- oldSetTimeoutId = window.setTimeout(function () {
- saveCallback();
- }, 500);
- }
- });
- },
-
- mixin: function (mixin, to) {
- for (var prop in mixin) {
- if (Object.hasOwnProperty.call(mixin, prop)) {
- to[prop] = mixin[prop];
- }
- }
- },
-
- copy: function (obj) {
- var i,
- newObj = Array.isArray(obj) ? [] : {};
-
- if (typeof obj === 'number' ||
- typeof obj === 'string' ||
- typeof obj === 'boolean' ||
- obj === null ||
- obj === undefined) {
- return obj;
- }
-
- if (obj instanceof Date) {
- return new Date(obj);
- }
-
- if (obj instanceof RegExp) {
- return new RegExp(obj);
- }
-
- for (i in obj) {
- if (obj.hasOwnProperty(i)) {
- if (obj[i] && typeof obj[i] === 'object') {
- if (obj[i] instanceof Date) {
- newObj[i] = obj[i];
- }
- else {
- newObj[i] = self.copy(obj[i]);
- }
- }
- else {
- newObj[i] = obj[i];
- }
- }
- }
-
- return newObj;
- },
-
- navHelper: function () {
- return {
- Directions: {
- N: 'N',
- NE: 'NE',
- E: 'E',
- SE: 'SE',
- S: 'S',
- SW: 'SW',
- W: 'W',
- NW: 'NW'
- },
-
- /**
- * Get the direction according to the heading value.
- * @param {number} heading A number from 0 to 359.99.
- * @return {string} direction It can be one of the following: N, NE, E, SE, S, SW, W or NW.
- */
- getDirection: function (heading) {
- if (heading > 337.5 || (heading >= 0 && heading <= 22.5)) {
- return this.Directions.N;
- }
-
- if (heading > 22.5 && heading <= 67.5) {
- return this.Directions.NE;
- }
-
- if (heading > 67.5 && heading <= 112.5) {
- return this.Directions.E;
- }
-
- if (heading > 112.5 && heading <= 157.5) {
- return this.Directions.SE;
- }
-
- if (heading > 157.5 && heading <= 202.5) {
- return this.Directions.S;
- }
-
- if (heading > 202.5 && heading <= 247.5) {
- return this.Directions.SW;
- }
-
- if (heading > 247.5 && heading <= 292.5) {
- return this.Directions.W;
- }
-
- // heading > 292.5 && heading <= 337.5
- return this.Directions.NW;
- },
-
- getHeading: function (lat1, lon1, lat2, lon2) {
- var dLon = this.rad(lon2 - lon1),
- llat1 = this.rad(lat1),
- llat2 = this.rad(lat2),
- y = Math.sin(dLon) * Math.cos(llat2),
- x = Math.cos(llat1) * Math.sin(llat2) - Math.sin(llat1) * Math.cos(llat2) * Math.cos(dLon);
- return (this.deg(Math.atan2(y, x)) + 360) % 360;
- },
-
- getDistance: function (lat1, lon1, lat2, lon2) {
- var dLat = this.rad(lat2 - lat1),
- dLon = this.rad(lon2 - lon1),
- a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(this.rad(lat1)) * Math.cos(this.rad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2),
- c = 2 * Math.asin(Math.sqrt(a)),
- d = 6378100 * c;
- return d;
- },
-
- simulateTravel: function (lat, lon, hdg, dist) {
- var lat1 = this.rad(lat),
- lon1 = this.rad(lon),
- brng = this.rad(hdg),
- angularDistance = dist / 6378100,
- lat2 = Math.asin(Math.sin(lat1) * Math.cos(angularDistance) + Math.cos(lat1) * Math.sin(angularDistance) * Math.cos(brng)),
- lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(angularDistance) * Math.cos(lat1), Math.cos(angularDistance) - Math.sin(lat1) * Math.sin(lat2));
- lon2 = (lon2 + 3 * Math.PI) % (2 * Math.PI) - Math.PI; // Normalize to -180..+180
-
- return {
- latitude: this.deg(lat2),
- longitude: this.deg(lon2)
- };
- },
-
- deg: function (num) {
- return num * 180 / Math.PI;
- },
-
- rad: function (num) {
- return num * Math.PI / 180;
- }
- };
- },
-
- createUUID: function () {
- return createUUIDPart(4) + '-' +
- createUUIDPart(2) + '-' +
- createUUIDPart(2) + '-' +
- createUUIDPart(2) + '-' +
- createUUIDPart(6);
- },
-
- typeName: function (val) {
- return Object.prototype.toString.call(val).slice(8, -1);
- },
-
- parseUrl: function (url) {
- var a = document.createElement('a');
-
- a.href = url;
-
- return {
- href: a.href,
- host: a.host,
- origin: a.origin,
- port: a.port,
- protocol: a.protocol,
- search: a.search
- };
- },
-
- isSameOriginRequest: function (url) {
- url = this.parseUrl(url);
-
- if (url.port !== location.port) {
- return false;
- }
-
- var sameOrigin = url.href.match(location.origin.replace(/www\./, '')) ||
- !url.href.match(/^https?:\/\/|^file:\/\//);
-
- return !!sameOrigin;
- },
-
- isNumber: function (value) {
- var type = typeof value;
-
- return (type === 'number' || type === 'string') && !isNaN(value - parseFloat(value));
- }
- };
-
- function createUUIDPart(length) {
- var uuidpart = '';
- for (var i = 0; i < length; i++) {
- var uuidchar = parseInt((Math.random() * 256), 10).toString(16);
- if (uuidchar.length == 1) {
- uuidchar = '0' + uuidchar;
- }
- uuidpart += uuidchar;
- }
- return uuidpart;
- }
-
- },{"exception":"exception"}],"webcomponents.min":[function(require,module,exports){
- /**
- * @license
- * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
- * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
- * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
- * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
- * Code distributed by Google as part of the polymer project is also
- * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
- */
- // @version 0.7.20
- !function(){window.WebComponents=window.WebComponents||{flags:{}};var e="webcomponents.js",t=document.querySelector('script[src*="'+e+'"]'),n={};if(!n.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var t,r=e.split("=");r[0]&&(t=r[0].match(/wc-(.+)/))&&(n[t[1]]=r[1]||!0)}),t)for(var r,o=0;r=t.attributes[o];o++)"src"!==r.name&&(n[r.name]=r.value||!0);if(n.log&&n.log.split){var i=n.log.split(",");n.log={},i.forEach(function(e){n.log[e]=!0})}else n.log={}}n.shadow=n.shadow||n.shadowdom||n.polyfill,"native"===n.shadow?n.shadow=!1:n.shadow=n.shadow||!HTMLElement.prototype.createShadowRoot,n.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=n.register),WebComponents.flags=n}(),WebComponents.flags.shadow&&("undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),window.ShadowDOMPolyfill={},function(e){"use strict";function t(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var e=new Function("return true;");return e()}catch(t){return!1}}function n(e){if(!e)throw new Error("Assertion failed")}function r(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];A(e,o,F(t,o))}return e}function o(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];switch(o){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}A(e,o,F(t,o))}return e}function i(e,t){for(var n=0;n<t.length;n++)if(t[n]in e)return t[n]}function a(e,t,n){U.value=n,A(e,t,U)}function s(e,t){var n=e.__proto__||Object.getPrototypeOf(e);if(q)try{W(n)}catch(r){n=n.__proto__}var o=R.get(n);if(o)return o;var i=s(n),a=E(i);return g(n,a,t),a}function c(e,t){w(e,t,!0)}function l(e,t){w(t,e,!1)}function u(e){return/^on[a-z]+$/.test(e)}function d(e){return/^[a-zA-Z_$][a-zA-Z_$0-9]*$/.test(e)}function p(e){return k&&d(e)?new Function("return this.__impl4cf1e782hg__."+e):function(){return this.__impl4cf1e782hg__[e]}}function h(e){return k&&d(e)?new Function("v","this.__impl4cf1e782hg__."+e+" = v"):function(t){this.__impl4cf1e782hg__[e]=t}}function f(e){return k&&d(e)?new Function("return this.__impl4cf1e782hg__."+e+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[e].apply(this.__impl4cf1e782hg__,arguments)}}function m(e,t){try{return Object.getOwnPropertyDescriptor(e,t)}catch(n){return B}}function w(t,n,r,o){for(var i=W(t),a=0;a<i.length;a++){var s=i[a];if("polymerBlackList_"!==s&&!(s in n||t.polymerBlackList_&&t.polymerBlackList_[s])){q&&t.__lookupGetter__(s);var c,l,d=m(t,s);if("function"!=typeof d.value){var w=u(s);c=w?e.getEventHandlerGetter(s):p(s),(d.writable||d.set||V)&&(l=w?e.getEventHandlerSetter(s):h(s));var v=V||d.configurable;A(n,s,{get:c,set:l,configurable:v,enumerable:d.enumerable})}else r&&(n[s]=f(s))}}}function v(e,t,n){if(null!=e){var r=e.prototype;g(r,t,n),o(t,e)}}function g(e,t,r){var o=t.prototype;n(void 0===R.get(e)),R.set(e,t),I.set(o,e),c(e,o),r&&l(o,r),a(o,"constructor",t),t.prototype=o}function b(e,t){return R.get(t.prototype)===e}function y(e){var t=Object.getPrototypeOf(e),n=s(t),r=E(n);return g(t,r,e),r}function E(e){function t(t){e.call(this,t)}var n=Object.create(e.prototype);return n.constructor=t,t.prototype=n,t}function _(e){return e&&e.__impl4cf1e782hg__}function S(e){return!_(e)}function T(e){if(null===e)return null;n(S(e));var t=e.__wrapper8e3dd93a60__;return null!=t?t:e.__wrapper8e3dd93a60__=new(s(e,e))(e)}function M(e){return null===e?null:(n(_(e)),e.__impl4cf1e782hg__)}function O(e){return e.__impl4cf1e782hg__}function L(e,t){t.__impl4cf1e782hg__=e,e.__wrapper8e3dd93a60__=t}function N(e){return e&&_(e)?M(e):e}function C(e){return e&&!_(e)?T(e):e}function j(e,t){null!==t&&(n(S(e)),n(void 0===t||_(t)),e.__wrapper8e3dd93a60__=t)}function D(e,t,n){G.get=n,A(e.prototype,t,G)}function H(e,t){D(e,t,function(){return T(this.__impl4cf1e782hg__[t])})}function x(e,t){e.forEach(function(e){t.forEach(function(t){e.prototype[t]=function(){var e=C(this);return e[t].apply(e,arguments)}})})}var R=new WeakMap,I=new WeakMap,P=Object.create(null),k=t(),A=Object.defineProperty,W=Object.getOwnPropertyNames,F=Object.getOwnPropertyDescriptor,U={value:void 0,configurable:!0,enumerable:!1,writable:!0};W(window);var q=/Firefox/.test(navigator.userAgent),B={get:function(){},set:function(e){},configurable:!0,enumerable:!0},V=function(){var e=Object.getOwnPropertyDescriptor(Node.prototype,"nodeType");return e&&!e.get&&!e.set}(),G={get:void 0,configurable:!0,enumerable:!0};e.addForwardingProperties=c,e.assert=n,e.constructorTable=R,e.defineGetter=D,e.defineWrapGetter=H,e.forwardMethodsToWrapper=x,e.isIdentifierName=d,e.isWrapper=_,e.isWrapperFor=b,e.mixin=r,e.nativePrototypeTable=I,e.oneOf=i,e.registerObject=y,e.registerWrapper=v,e.rewrap=j,e.setWrapper=L,e.unsafeUnwrap=O,e.unwrap=M,e.unwrapIfNeeded=N,e.wrap=T,e.wrapIfNeeded=C,e.wrappers=P}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t,n){return{index:e,removed:t,addedCount:n}}function n(){}var r=0,o=1,i=2,a=3;n.prototype={calcEditDistances:function(e,t,n,r,o,i){for(var a=i-o+1,s=n-t+1,c=new Array(a),l=0;a>l;l++)c[l]=new Array(s),c[l][0]=l;for(var u=0;s>u;u++)c[0][u]=u;for(var l=1;a>l;l++)for(var u=1;s>u;u++)if(this.equals(e[t+u-1],r[o+l-1]))c[l][u]=c[l-1][u-1];else{var d=c[l-1][u]+1,p=c[l][u-1]+1;c[l][u]=p>d?d:p}return c},spliceOperationsFromEditDistances:function(e){for(var t=e.length-1,n=e[0].length-1,s=e[t][n],c=[];t>0||n>0;)if(0!=t)if(0!=n){var l,u=e[t-1][n-1],d=e[t-1][n],p=e[t][n-1];l=p>d?u>d?d:u:u>p?p:u,l==u?(u==s?c.push(r):(c.push(o),s=u),t--,n--):l==d?(c.push(a),t--,s=d):(c.push(i),n--,s=p)}else c.push(a),t--;else c.push(i),n--;return c.reverse(),c},calcSplices:function(e,n,s,c,l,u){var d=0,p=0,h=Math.min(s-n,u-l);if(0==n&&0==l&&(d=this.sharedPrefix(e,c,h)),s==e.length&&u==c.length&&(p=this.sharedSuffix(e,c,h-d)),n+=d,l+=d,s-=p,u-=p,s-n==0&&u-l==0)return[];if(n==s){for(var f=t(n,[],0);u>l;)f.removed.push(c[l++]);return[f]}if(l==u)return[t(n,[],s-n)];for(var m=this.spliceOperationsFromEditDistances(this.calcEditDistances(e,n,s,c,l,u)),f=void 0,w=[],v=n,g=l,b=0;b<m.length;b++)switch(m[b]){case r:f&&(w.push(f),f=void 0),v++,g++;break;case o:f||(f=t(v,[],0)),f.addedCount++,v++,f.removed.push(c[g]),g++;break;case i:f||(f=t(v,[],0)),f.addedCount++,v++;break;case a:f||(f=t(v,[],0)),f.removed.push(c[g]),g++}return f&&w.push(f),w},sharedPrefix:function(e,t,n){for(var r=0;n>r;r++)if(!this.equals(e[r],t[r]))return r;return n},sharedSuffix:function(e,t,n){for(var r=e.length,o=t.length,i=0;n>i&&this.equals(e[--r],t[--o]);)i++;return i},calculateSplices:function(e,t){return this.calcSplices(e,0,e.length,t,0,t.length)},equals:function(e,t){return e===t}},e.ArraySplice=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(){a=!1;var e=i.slice(0);i=[];for(var t=0;t<e.length;t++)(0,e[t])()}function n(e){i.push(e),a||(a=!0,r(t,0))}var r,o=window.MutationObserver,i=[],a=!1;if(o){var s=1,c=new o(t),l=document.createTextNode(s);c.observe(l,{characterData:!0}),r=function(){s=(s+1)%2,l.data=s}}else r=window.setTimeout;e.setEndOfMicrotask=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.scheduled_||(e.scheduled_=!0,f.push(e),m||(u(n),m=!0))}function n(){for(m=!1;f.length;){var e=f;f=[],e.sort(function(e,t){return e.uid_-t.uid_});for(var t=0;t<e.length;t++){var n=e[t];n.scheduled_=!1;var r=n.takeRecords();i(n),r.length&&n.callback_(r,n)}}}function r(e,t){this.type=e,this.target=t,this.addedNodes=new p.NodeList,this.removedNodes=new p.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function o(e,t){for(;e;e=e.parentNode){var n=h.get(e);if(n)for(var r=0;r<n.length;r++){var o=n[r];o.options.subtree&&o.addTransientObserver(t)}}}function i(e){for(var t=0;t<e.nodes_.length;t++){var n=e.nodes_[t],r=h.get(n);if(!r)return;for(var o=0;o<r.length;o++){var i=r[o];i.observer===e&&i.removeTransientObservers()}}}function a(e,n,o){for(var i=Object.create(null),a=Object.create(null),s=e;s;s=s.parentNode){var c=h.get(s);if(c)for(var l=0;l<c.length;l++){var u=c[l],d=u.options;if((s===e||d.subtree)&&("attributes"!==n||d.attributes)&&("attributes"!==n||!d.attributeFilter||null===o.namespace&&-1!==d.attributeFilter.indexOf(o.name))&&("characterData"!==n||d.characterData)&&("childList"!==n||d.childList)){var p=u.observer;i[p.uid_]=p,("attributes"===n&&d.attributeOldValue||"characterData"===n&&d.characterDataOldValue)&&(a[p.uid_]=o.oldValue)}}}for(var f in i){var p=i[f],m=new r(n,e);"name"in o&&"namespace"in o&&(m.attributeName=o.name,m.attributeNamespace=o.namespace),o.addedNodes&&(m.addedNodes=o.addedNodes),o.removedNodes&&(m.removedNodes=o.removedNodes),o.previousSibling&&(m.previousSibling=o.previousSibling),o.nextSibling&&(m.nextSibling=o.nextSibling),void 0!==a[f]&&(m.oldValue=a[f]),t(p),p.records_.push(m)}}function s(e){if(this.childList=!!e.childList,this.subtree=!!e.subtree,"attributes"in e||!("attributeOldValue"in e||"attributeFilter"in e)?this.attributes=!!e.attributes:this.attributes=!0,"characterDataOldValue"in e&&!("characterData"in e)?this.characterData=!0:this.characterData=!!e.characterData,!this.attributes&&(e.attributeOldValue||"attributeFilter"in e)||!this.characterData&&e.characterDataOldValue)throw new TypeError;if(this.characterData=!!e.characterData,this.attributeOldValue=!!e.attributeOldValue,this.characterDataOldValue=!!e.characterDataOldValue,"attributeFilter"in e){if(null==e.attributeFilter||"object"!=typeof e.attributeFilter)throw new TypeError;this.attributeFilter=w.call(e.attributeFilter)}else this.attributeFilter=null}function c(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++v,this.scheduled_=!1}function l(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var u=e.setEndOfMicrotask,d=e.wrapIfNeeded,p=e.wrappers,h=new WeakMap,f=[],m=!1,w=Array.prototype.slice,v=0;c.prototype={constructor:c,observe:function(e,t){e=d(e);var n,r=new s(t),o=h.get(e);o||h.set(e,o=[]);for(var i=0;i<o.length;i++)o[i].observer===this&&(n=o[i],n.removeTransientObservers(),n.options=r);n||(n=new l(this,e,r),o.push(n),this.nodes_.push(e))},disconnect:function(){this.nodes_.forEach(function(e){for(var t=h.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}},l.prototype={addTransientObserver:function(e){if(e!==this.target){t(this.observer),this.transientObservedNodes.push(e);var n=h.get(e);n||h.set(e,n=[]),n.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[];for(var t=0;t<e.length;t++)for(var n=e[t],r=h.get(n),o=0;o<r.length;o++)if(r[o]===this){r.splice(o,1);break}}},e.enqueueMutation=a,e.registerTransientObservers=o,e.wrappers.MutationObserver=c,e.wrappers.MutationRecord=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){this.root=e,this.parent=t}function n(e,t){if(e.treeScope_!==t){e.treeScope_=t;for(var r=e.shadowRoot;r;r=r.olderShadowRoot)r.treeScope_.parent=t;for(var o=e.firstChild;o;o=o.nextSibling)n(o,t)}}function r(n){if(n instanceof e.wrappers.Window,n.treeScope_)return n.treeScope_;var o,i=n.parentNode;return o=i?r(i):new t(n,null),n.treeScope_=o}t.prototype={get renderer(){return this.root instanceof e.wrappers.ShadowRoot?e.getRendererForHost(this.root.host):null},contains:function(e){for(;e;e=e.parent)if(e===this)return!0;return!1}},e.TreeScope=t,e.getTreeScope=r,e.setTreeScope=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e instanceof G.ShadowRoot}function n(e){return A(e).root}function r(e,r){var s=[],c=e;for(s.push(c);c;){var l=a(c);if(l&&l.length>0){for(var u=0;u<l.length;u++){var p=l[u];if(i(p)){var h=n(p),f=h.olderShadowRoot;f&&s.push(f)}s.push(p)}c=l[l.length-1]}else if(t(c)){if(d(e,c)&&o(r))break;c=c.host,s.push(c)}else c=c.parentNode,c&&s.push(c)}return s}function o(e){if(!e)return!1;switch(e.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function i(e){return e instanceof HTMLShadowElement}function a(t){return e.getDestinationInsertionPoints(t)}function s(e,t){if(0===e.length)return t;t instanceof G.Window&&(t=t.document);for(var n=A(t),r=e[0],o=A(r),i=l(n,o),a=0;a<e.length;a++){var s=e[a];if(A(s)===i)return s}return e[e.length-1]}function c(e){for(var t=[];e;e=e.parent)t.push(e);return t}function l(e,t){for(var n=c(e),r=c(t),o=null;n.length>0&&r.length>0;){var i=n.pop(),a=r.pop();if(i!==a)break;o=i}return o}function u(e,t,n){t instanceof G.Window&&(t=t.document);var o,i=A(t),a=A(n),s=r(n,e),o=l(i,a);o||(o=a.root);for(var c=o;c;c=c.parent)for(var u=0;u<s.length;u++){var d=s[u];if(A(d)===c)return d}return null}function d(e,t){return A(e)===A(t)}function p(e){if(!K.get(e)&&(K.set(e,!0),f(V(e),V(e.target)),P)){var t=P;throw P=null,t}}function h(e){switch(e.type){case"load":case"beforeunload":case"unload":return!0}return!1}function f(t,n){if($.get(t))throw new Error("InvalidStateError");$.set(t,!0),e.renderAllPending();var o,i,a;if(h(t)&&!t.bubbles){var s=n;s instanceof G.Document&&(a=s.defaultView)&&(i=s,o=[])}if(!o)if(n instanceof G.Window)a=n,o=[];else if(o=r(n,t),!h(t)){var s=o[o.length-1];s instanceof G.Document&&(a=s.defaultView)}return ne.set(t,o),m(t,o,a,i)&&w(t,o,a,i)&&v(t,o,a,i),J.set(t,re),Y["delete"](t,null),$["delete"](t),t.defaultPrevented}function m(e,t,n,r){var o=oe;if(n&&!g(n,e,o,t,r))return!1;for(var i=t.length-1;i>0;i--)if(!g(t[i],e,o,t,r))return!1;return!0}function w(e,t,n,r){var o=ie,i=t[0]||n;return g(i,e,o,t,r)}function v(e,t,n,r){for(var o=ae,i=1;i<t.length;i++)if(!g(t[i],e,o,t,r))return;n&&t.length>0&&g(n,e,o,t,r)}function g(e,t,n,r,o){var i=z.get(e);if(!i)return!0;var a=o||s(r,e);if(a===e){if(n===oe)return!0;n===ae&&(n=ie)}else if(n===ae&&!t.bubbles)return!0;if("relatedTarget"in t){var c=B(t),l=c.relatedTarget;if(l){if(l instanceof Object&&l.addEventListener){var d=V(l),p=u(t,e,d);if(p===a)return!0}else p=null;Z.set(t,p)}}J.set(t,n);var h=t.type,f=!1;X.set(t,a),Y.set(t,e),i.depth++;for(var m=0,w=i.length;w>m;m++){var v=i[m];if(v.removed)f=!0;else if(!(v.type!==h||!v.capture&&n===oe||v.capture&&n===ae))try{if("function"==typeof v.handler?v.handler.call(e,t):v.handler.handleEvent(t),ee.get(t))return!1}catch(g){P||(P=g)}}if(i.depth--,f&&0===i.depth){var b=i.slice();i.length=0;for(var m=0;m<b.length;m++)b[m].removed||i.push(b[m])}return!Q.get(t)}function b(e,t,n){this.type=e,this.handler=t,this.capture=Boolean(n)}function y(e,t){if(!(e instanceof se))return V(T(se,"Event",e,t));var n=e;return be||"beforeunload"!==n.type||this instanceof M?void U(n,this):new M(n)}function E(e){return e&&e.relatedTarget?Object.create(e,{relatedTarget:{value:B(e.relatedTarget)}}):e}function _(e,t,n){var r=window[e],o=function(t,n){return t instanceof r?void U(t,this):V(T(r,e,t,n))};if(o.prototype=Object.create(t.prototype),n&&W(o.prototype,n),r)try{F(r,o,new r("temp"))}catch(i){F(r,o,document.createEvent(e))}return o}function S(e,t){return function(){arguments[t]=B(arguments[t]);var n=B(this);n[e].apply(n,arguments)}}function T(e,t,n,r){if(ve)return new e(n,E(r));var o=B(document.createEvent(t)),i=we[t],a=[n];return Object.keys(i).forEach(function(e){var t=null!=r&&e in r?r[e]:i[e];"relatedTarget"===e&&(t=B(t)),a.push(t)}),o["init"+t].apply(o,a),o}function M(e){y.call(this,e)}function O(e){return"function"==typeof e?!0:e&&e.handleEvent}function L(e){switch(e){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function N(e){U(e,this)}function C(e){return e instanceof G.ShadowRoot&&(e=e.host),B(e)}function j(e,t){var n=z.get(e);if(n)for(var r=0;r<n.length;r++)if(!n[r].removed&&n[r].type===t)return!0;return!1}function D(e,t){for(var n=B(e);n;n=n.parentNode)if(j(V(n),t))return!0;return!1}function H(e){k(e,Ee)}function x(t,n,o,i){e.renderAllPending();var a=V(_e.call(q(n),o,i));if(!a)return null;var c=r(a,null),l=c.lastIndexOf(t);return-1==l?null:(c=c.slice(0,l),s(c,t))}function R(e){return function(){var t=te.get(this);return t&&t[e]&&t[e].value||null}}function I(e){var t=e.slice(2);return function(n){var r=te.get(this);r||(r=Object.create(null),te.set(this,r));var o=r[e];if(o&&this.removeEventListener(t,o.wrapped,!1),"function"==typeof n){var i=function(t){var r=n.call(this,t);r===!1?t.preventDefault():"onbeforeunload"===e&&"string"==typeof r&&(t.returnValue=r)};this.addEventListener(t,i,!1),r[e]={value:n,wrapped:i}}}}var P,k=e.forwardMethodsToWrapper,A=e.getTreeScope,W=e.mixin,F=e.registerWrapper,U=e.setWrapper,q=e.unsafeUnwrap,B=e.unwrap,V=e.wrap,G=e.wrappers,z=(new WeakMap,new WeakMap),K=new WeakMap,$=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,J=new WeakMap,Q=new WeakMap,ee=new WeakMap,te=new WeakMap,ne=new WeakMap,re=0,oe=1,ie=2,ae=3;b.prototype={equals:function(e){return this.handler===e.handler&&this.type===e.type&&this.capture===e.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var se=window.Event;se.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},y.prototype={get target(){return X.get(this)},get currentTarget(){return Y.get(this)},get eventPhase(){return J.get(this)},get path(){var e=ne.get(this);return e?e.slice():[]},stopPropagation:function(){Q.set(this,!0)},stopImmediatePropagation:function(){Q.set(this,!0),ee.set(this,!0)}};var ce=function(){var e=document.createEvent("Event");return e.initEvent("test",!0,!0),e.preventDefault(),e.defaultPrevented}();ce||(y.prototype.preventDefault=function(){this.cancelable&&(q(this).preventDefault(),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}),F(se,y,document.createEvent("Event"));var le=_("UIEvent",y),ue=_("CustomEvent",y),de={get relatedTarget(){var e=Z.get(this);return void 0!==e?e:V(B(this).relatedTarget)}},pe=W({initMouseEvent:S("initMouseEvent",14)},de),he=W({initFocusEvent:S("initFocusEvent",5)},de),fe=_("MouseEvent",le,pe),me=_("FocusEvent",le,he),we=Object.create(null),ve=function(){try{new window.FocusEvent("focus")}catch(e){return!1}return!0}();if(!ve){var ge=function(e,t,n){if(n){var r=we[n];t=W(W({},r),t)}we[e]=t};ge("Event",{bubbles:!1,cancelable:!1}),ge("CustomEvent",{detail:null},"Event"),ge("UIEvent",{view:null,detail:0},"Event"),ge("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ge("FocusEvent",{relatedTarget:null},"UIEvent")}var be=window.BeforeUnloadEvent;M.prototype=Object.create(y.prototype),W(M.prototype,{get returnValue(){return q(this).returnValue},set returnValue(e){q(this).returnValue=e}}),be&&F(be,M);var ye=window.EventTarget,Ee=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(e){var t=e.prototype;Ee.forEach(function(e){Object.defineProperty(t,e+"_",{value:t[e]})})}),N.prototype={addEventListener:function(e,t,n){if(O(t)&&!L(e)){var r=new b(e,t,n),o=z.get(this);if(o){for(var i=0;i<o.length;i++)if(r.equals(o[i]))return}else o=[],o.depth=0,z.set(this,o);o.push(r);var a=C(this);a.addEventListener_(e,p,!0)}},removeEventListener:function(e,t,n){n=Boolean(n);var r=z.get(this);if(r){for(var o=0,i=!1,a=0;a<r.length;a++)r[a].type===e&&r[a].capture===n&&(o++,r[a].handler===t&&(i=!0,r[a].remove()));if(i&&1===o){var s=C(this);s.removeEventListener_(e,p,!0)}}},dispatchEvent:function(t){var n=B(t),r=n.type;K.set(n,!1),e.renderAllPending();var o;D(this,r)||(o=function(){},this.addEventListener(r,o,!0));try{return B(this).dispatchEvent_(n)}finally{o&&this.removeEventListener(r,o,!0)}}},ye&&F(ye,N);var _e=document.elementFromPoint;e.elementFromPoint=x,e.getEventHandlerGetter=R,e.getEventHandlerSetter=I,e.wrapEventTargetMethods=H,e.wrappers.BeforeUnloadEvent=M,e.wrappers.CustomEvent=ue,e.wrappers.Event=y,e.wrappers.EventTarget=N,e.wrappers.FocusEvent=me,e.wrappers.MouseEvent=fe,e.wrappers.UIEvent=le}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,m)}function n(e){l(e,this)}function r(){this.length=0,t(this,"length")}function o(e){for(var t=new r,o=0;o<e.length;o++)t[o]=new n(e[o]);return t.length=o,t}function i(e){a.call(this,e)}var a=e.wrappers.UIEvent,s=e.mixin,c=e.registerWrapper,l=e.setWrapper,u=e.unsafeUnwrap,d=e.wrap,p=window.TouchEvent;if(p){var h;try{h=document.createEvent("TouchEvent")}catch(f){return}var m={enumerable:!1};n.prototype={get target(){return d(u(this).target)}};var w={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(e){w.get=function(){return u(this)[e]},Object.defineProperty(n.prototype,e,w)}),r.prototype={item:function(e){return this[e]}},i.prototype=Object.create(a.prototype),s(i.prototype,{get touches(){return o(u(this).touches)},get targetTouches(){return o(u(this).targetTouches)},get changedTouches(){return o(u(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),c(p,i,h),e.wrappers.Touch=n,e.wrappers.TouchEvent=i,e.wrappers.TouchList=r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,s)}function n(){this.length=0,t(this,"length")}function r(e){if(null==e)return e;for(var t=new n,r=0,o=e.length;o>r;r++)t[r]=a(e[r]);return t.length=o,t}function o(e,t){e.prototype[t]=function(){return r(i(this)[t].apply(i(this),arguments))}}var i=e.unsafeUnwrap,a=e.wrap,s={enumerable:!1};n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=o,e.wrapNodeList=r}(window.ShadowDOMPolyfill),function(e){"use strict";e.wrapHTMLCollection=e.wrapNodeList,e.wrappers.HTMLCollection=e.wrappers.NodeList}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){O(e instanceof _)}function n(e){var t=new T;return t[0]=e,t.length=1,t}function r(e,t,n){N(t,"childList",{removedNodes:n,previousSibling:e.previousSibling,nextSibling:e.nextSibling})}function o(e,t){N(e,"childList",{removedNodes:t})}function i(e,t,r,o){if(e instanceof DocumentFragment){var i=s(e);U=!0;for(var a=i.length-1;a>=0;a--)e.removeChild(i[a]),i[a].parentNode_=t;U=!1;for(var a=0;a<i.length;a++)i[a].previousSibling_=i[a-1]||r,i[a].nextSibling_=i[a+1]||o;return r&&(r.nextSibling_=i[0]),o&&(o.previousSibling_=i[i.length-1]),i}var i=n(e),c=e.parentNode;return c&&c.removeChild(e),e.parentNode_=t,e.previousSibling_=r,e.nextSibling_=o,r&&(r.nextSibling_=e),o&&(o.previousSibling_=e),i}function a(e){if(e instanceof DocumentFragment)return s(e);var t=n(e),o=e.parentNode;return o&&r(e,o,t),t}function s(e){for(var t=new T,n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t.length=n,o(e,t),t}function c(e){return e}function l(e,t){R(e,t),e.nodeIsInserted_()}function u(e,t){for(var n=C(t),r=0;r<e.length;r++)l(e[r],n)}function d(e){R(e,new M(e,null))}function p(e){for(var t=0;t<e.length;t++)d(e[t])}function h(e,t){var n=e.nodeType===_.DOCUMENT_NODE?e:e.ownerDocument;n!==t.ownerDocument&&n.adoptNode(t)}function f(t,n){if(n.length){var r=t.ownerDocument;if(r!==n[0].ownerDocument)for(var o=0;o<n.length;o++)e.adoptNodeNoRemove(n[o],r)}}function m(e,t){f(e,t);var n=t.length;if(1===n)return P(t[0]);for(var r=P(e.ownerDocument.createDocumentFragment()),o=0;n>o;o++)r.appendChild(P(t[o]));return r}function w(e){if(void 0!==e.firstChild_)for(var t=e.firstChild_;t;){var n=t;t=t.nextSibling_,n.parentNode_=n.previousSibling_=n.nextSibling_=void 0}e.firstChild_=e.lastChild_=void 0}function v(e){if(e.invalidateShadowRenderer()){for(var t=e.firstChild;t;){O(t.parentNode===e);var n=t.nextSibling,r=P(t),o=r.parentNode;o&&X.call(o,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}else for(var n,i=P(e),a=i.firstChild;a;)n=a.nextSibling,X.call(i,a),a=n}function g(e){var t=e.parentNode;return t&&t.invalidateShadowRenderer()}function b(e){for(var t,n=0;n<e.length;n++)t=e[n],t.parentNode.removeChild(t)}function y(e,t,n){var r;if(r=A(n?q.call(n,I(e),!1):B.call(I(e),!1)),t){for(var o=e.firstChild;o;o=o.nextSibling)r.appendChild(y(o,!0,n));if(e instanceof F.HTMLTemplateElement)for(var i=r.content,o=e.content.firstChild;o;o=o.nextSibling)i.appendChild(y(o,!0,n))}return r}function E(e,t){if(!t||C(e)!==C(t))return!1;for(var n=t;n;n=n.parentNode)if(n===e)return!0;return!1}function _(e){O(e instanceof V),S.call(this,e),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var S=e.wrappers.EventTarget,T=e.wrappers.NodeList,M=e.TreeScope,O=e.assert,L=e.defineWrapGetter,N=e.enqueueMutation,C=e.getTreeScope,j=e.isWrapper,D=e.mixin,H=e.registerTransientObservers,x=e.registerWrapper,R=e.setTreeScope,I=e.unsafeUnwrap,P=e.unwrap,k=e.unwrapIfNeeded,A=e.wrap,W=e.wrapIfNeeded,F=e.wrappers,U=!1,q=document.importNode,B=window.Node.prototype.cloneNode,V=window.Node,G=window.DocumentFragment,z=(V.prototype.appendChild,V.prototype.compareDocumentPosition),K=V.prototype.isEqualNode,$=V.prototype.insertBefore,X=V.prototype.removeChild,Y=V.prototype.replaceChild,Z=/Trident|Edge/.test(navigator.userAgent),J=Z?function(e,t){try{X.call(e,t)}catch(n){if(!(e instanceof G))throw n}}:function(e,t){X.call(e,t)};_.prototype=Object.create(S.prototype),D(_.prototype,{appendChild:function(e){return this.insertBefore(e,null)},insertBefore:function(e,n){t(e);var r;n?j(n)?r=P(n):(r=n,n=A(r)):(n=null,r=null),n&&O(n.parentNode===this);var o,s=n?n.previousSibling:this.lastChild,c=!this.invalidateShadowRenderer()&&!g(e);if(o=c?a(e):i(e,this,s,n),c)h(this,e),w(this),$.call(I(this),P(e),r);else{s||(this.firstChild_=o[0]),n||(this.lastChild_=o[o.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var l=r?r.parentNode:I(this);l?$.call(l,m(this,o),r):f(this,o)}return N(this,"childList",{addedNodes:o,nextSibling:n,previousSibling:s}),u(o,this),e},removeChild:function(e){if(t(e),e.parentNode!==this){for(var r=!1,o=(this.childNodes,this.firstChild);o;o=o.nextSibling)if(o===e){r=!0;break}if(!r)throw new Error("NotFoundError")}var i=P(e),a=e.nextSibling,s=e.previousSibling;if(this.invalidateShadowRenderer()){var c=this.firstChild,l=this.lastChild,u=i.parentNode;u&&J(u,i),c===e&&(this.firstChild_=a),l===e&&(this.lastChild_=s),s&&(s.nextSibling_=a),a&&(a.previousSibling_=s),e.previousSibling_=e.nextSibling_=e.parentNode_=void 0}else w(this),J(I(this),i);return U||N(this,"childList",{removedNodes:n(e),nextSibling:a,previousSibling:s}),H(this,e),e},replaceChild:function(e,r){t(e);var o;if(j(r)?o=P(r):(o=r,r=A(o)),r.parentNode!==this)throw new Error("NotFoundError");var s,c=r.nextSibling,l=r.previousSibling,p=!this.invalidateShadowRenderer()&&!g(e);return p?s=a(e):(c===e&&(c=e.nextSibling),s=i(e,this,l,c)),p?(h(this,e),w(this),Y.call(I(this),P(e),o)):(this.firstChild===r&&(this.firstChild_=s[0]),this.lastChild===r&&(this.lastChild_=s[s.length-1]),r.previousSibling_=r.nextSibling_=r.parentNode_=void 0,o.parentNode&&Y.call(o.parentNode,m(this,s),o)),N(this,"childList",{addedNodes:s,removedNodes:n(r),nextSibling:c,previousSibling:l}),d(r),u(s,this),r},nodeIsInserted_:function(){for(var e=this.firstChild;e;e=e.nextSibling)e.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:A(I(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:A(I(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:A(I(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:A(I(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:A(I(this).previousSibling)},get parentElement(){for(var e=this.parentNode;e&&e.nodeType!==_.ELEMENT_NODE;)e=e.parentNode;return e},get textContent(){for(var e="",t=this.firstChild;t;t=t.nextSibling)t.nodeType!=_.COMMENT_NODE&&(e+=t.textContent);return e},set textContent(e){null==e&&(e="");var t=c(this.childNodes);if(this.invalidateShadowRenderer()){if(v(this),""!==e){var n=I(this).ownerDocument.createTextNode(e);this.appendChild(n)}}else w(this),I(this).textContent=e;var r=c(this.childNodes);N(this,"childList",{addedNodes:r,removedNodes:t}),p(t),u(r,this)},get childNodes(){for(var e=new T,t=0,n=this.firstChild;n;n=n.nextSibling)e[t++]=n;return e.length=t,e},cloneNode:function(e){return y(this,e)},contains:function(e){return E(this,W(e))},compareDocumentPosition:function(e){return z.call(I(this),k(e))},isEqualNode:function(e){return K.call(I(this),k(e))},normalize:function(){for(var e,t,n=c(this.childNodes),r=[],o="",i=0;i<n.length;i++)t=n[i],t.nodeType===_.TEXT_NODE?e||t.data.length?e?(o+=t.data,r.push(t)):e=t:this.removeChild(t):(e&&r.length&&(e.data+=o,b(r)),r=[],o="",e=null,t.childNodes.length&&t.normalize());e&&r.length&&(e.data+=o,b(r))}}),L(_,"ownerDocument"),x(V,_,document.createDocumentFragment()),delete _.prototype.querySelector,delete _.prototype.querySelectorAll,_.prototype=D(Object.create(S.prototype),_.prototype),e.cloneNode=y,e.nodeWasAdded=l,e.nodeWasRemoved=d,e.nodesWereAdded=u,e.nodesWereRemoved=p,e.originalInsertBefore=$,e.originalRemoveChild=X,e.snapshotNodeList=c,e.wrappers.Node=_}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n,r,o){for(var i=null,a=null,s=0,c=t.length;c>s;s++)i=b(t[s]),!o&&(a=v(i).root)&&a instanceof e.wrappers.ShadowRoot||(r[n++]=i);return n}function n(e){return String(e).replace(/\/deep\/|::shadow|>>>/g," ")}function r(e){return String(e).replace(/:host\(([^\s]+)\)/g,"$1").replace(/([^\s]):host/g,"$1").replace(":host","*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g," ")}function o(e,t){for(var n,r=e.firstElementChild;r;){if(r.matches(t))return r;if(n=o(r,t))return n;r=r.nextElementSibling}return null}function i(e,t){return e.matches(t)}function a(e,t,n){var r=e.localName;return r===t||r===n&&e.namespaceURI===j}function s(){return!0}function c(e,t,n){return e.localName===n}function l(e,t){return e.namespaceURI===t}function u(e,t,n){return e.namespaceURI===t&&e.localName===n}function d(e,t,n,r,o,i){for(var a=e.firstElementChild;a;)r(a,o,i)&&(n[t++]=a),t=d(a,t,n,r,o,i),a=a.nextElementSibling;return t}function p(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,null);if(c instanceof N)s=S.call(c,i);else{if(!(c instanceof C))return d(this,r,o,n,i,null);s=_.call(c,i)}return t(s,r,o,a)}function h(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=M.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=T.call(c,i,a)}return t(s,r,o,!1)}function f(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=L.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=O.call(c,i,a)}return t(s,r,o,!1)}var m=e.wrappers.HTMLCollection,w=e.wrappers.NodeList,v=e.getTreeScope,g=e.unsafeUnwrap,b=e.wrap,y=document.querySelector,E=document.documentElement.querySelector,_=document.querySelectorAll,S=document.documentElement.querySelectorAll,T=document.getElementsByTagName,M=document.documentElement.getElementsByTagName,O=document.getElementsByTagNameNS,L=document.documentElement.getElementsByTagNameNS,N=window.Element,C=window.HTMLDocument||window.Document,j="http://www.w3.org/1999/xhtml",D={
- querySelector:function(t){var r=n(t),i=r!==t;t=r;var a,s=g(this),c=v(this).root;if(c instanceof e.wrappers.ShadowRoot)return o(this,t);if(s instanceof N)a=b(E.call(s,t));else{if(!(s instanceof C))return o(this,t);a=b(y.call(s,t))}return a&&!i&&(c=v(a).root)&&c instanceof e.wrappers.ShadowRoot?o(this,t):a},querySelectorAll:function(e){var t=n(e),r=t!==e;e=t;var o=new w;return o.length=p.call(this,i,0,o,e,r),o}},H={matches:function(t){return t=r(t),e.originalMatches.call(g(this),t)}},x={getElementsByTagName:function(e){var t=new m,n="*"===e?s:a;return t.length=h.call(this,n,0,t,e,e.toLowerCase()),t},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){var n=new m,r=null;return r="*"===e?"*"===t?s:c:"*"===t?l:u,n.length=f.call(this,r,0,n,e||null,t),n}};e.GetElementsByInterface=x,e.SelectorsInterface=D,e.MatchesInterface=H}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,o={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e},remove:function(){var e=this.parentNode;e&&e.removeChild(this)}},i={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.previousSibling)}},a={getElementById:function(e){return/[ \t\n\r\f]/.test(e)?null:this.querySelector('[id="'+e+'"]')}};e.ChildNodeInterface=i,e.NonElementParentNodeInterface=a,e.ParentNodeInterface=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,o=e.enqueueMutation,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get nodeValue(){return this.data},set nodeValue(e){this.data=e},get textContent(){return this.data},set textContent(e){this.data=e},get data(){return s(this).data},set data(e){var t=s(this).data;o(this,"characterData",{oldValue:t}),s(this).data=e}}),i(t.prototype,n),a(c,t,document.createTextNode("")),e.wrappers.CharacterData=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e>>>0}function n(e){r.call(this,e)}var r=e.wrappers.CharacterData,o=(e.enqueueMutation,e.mixin),i=e.registerWrapper,a=window.Text;n.prototype=Object.create(r.prototype),o(n.prototype,{splitText:function(e){e=t(e);var n=this.data;if(e>n.length)throw new Error("IndexSizeError");var r=n.slice(0,e),o=n.slice(e);this.data=r;var i=this.ownerDocument.createTextNode(o);return this.parentNode&&this.parentNode.insertBefore(i,this.nextSibling),i}}),i(a,n,document.createTextNode("")),e.wrappers.Text=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return i(e).getAttribute("class")}function n(e,t){a(e,"attributes",{name:"class",namespace:null,oldValue:t})}function r(t){e.invalidateRendererBasedOnAttribute(t,"class")}function o(e,o,i){var a=e.ownerElement_;if(null==a)return o.apply(e,i);var s=t(a),c=o.apply(e,i);return t(a)!==s&&(n(a,s),r(a)),c}if(!window.DOMTokenList)return void console.warn("Missing DOMTokenList prototype, please include a compatible classList polyfill such as http://goo.gl/uTcepH.");var i=e.unsafeUnwrap,a=e.enqueueMutation,s=DOMTokenList.prototype.add;DOMTokenList.prototype.add=function(){o(this,s,arguments)};var c=DOMTokenList.prototype.remove;DOMTokenList.prototype.remove=function(){o(this,c,arguments)};var l=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(){return o(this,l,arguments)}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n){var r=t.parentNode;if(r&&r.shadowRoot){var o=e.getRendererForHost(r);o.dependsOnAttribute(n)&&o.invalidate()}}function n(e,t,n){u(e,"attributes",{name:t,namespace:null,oldValue:n})}function r(e){a.call(this,e)}var o=e.ChildNodeInterface,i=e.GetElementsByInterface,a=e.wrappers.Node,s=e.ParentNodeInterface,c=e.SelectorsInterface,l=e.MatchesInterface,u=(e.addWrapNodeListMethod,e.enqueueMutation),d=e.mixin,p=(e.oneOf,e.registerWrapper),h=e.unsafeUnwrap,f=e.wrappers,m=window.Element,w=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(e){return m.prototype[e]}),v=w[0],g=m.prototype[v],b=new WeakMap;r.prototype=Object.create(a.prototype),d(r.prototype,{createShadowRoot:function(){var t=new f.ShadowRoot(this);h(this).polymerShadowRoot_=t;var n=e.getRendererForHost(this);return n.invalidate(),t},get shadowRoot(){return h(this).polymerShadowRoot_||null},setAttribute:function(e,r){var o=h(this).getAttribute(e);h(this).setAttribute(e,r),n(this,e,o),t(this,e)},removeAttribute:function(e){var r=h(this).getAttribute(e);h(this).removeAttribute(e),n(this,e,r),t(this,e)},get classList(){var e=b.get(this);if(!e){if(e=h(this).classList,!e)return;e.ownerElement_=this,b.set(this,e)}return e},get className(){return h(this).className},set className(e){this.setAttribute("class",e)},get id(){return h(this).id},set id(e){this.setAttribute("id",e)}}),w.forEach(function(e){"matches"!==e&&(r.prototype[e]=function(e){return this.matches(e)})}),m.prototype.webkitCreateShadowRoot&&(r.prototype.webkitCreateShadowRoot=r.prototype.createShadowRoot),d(r.prototype,o),d(r.prototype,i),d(r.prototype,s),d(r.prototype,c),d(r.prototype,l),p(m,r,document.createElementNS(null,"x")),e.invalidateRendererBasedOnAttribute=t,e.matchesNames=w,e.originalMatches=g,e.wrappers.Element=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&";case"<":return"<";case">":return">";case'"':return""";case" ":return" "}}function n(e){return e.replace(L,t)}function r(e){return e.replace(N,t)}function o(e){for(var t={},n=0;n<e.length;n++)t[e[n]]=!0;return t}function i(e){if(e.namespaceURI!==D)return!0;var t=e.ownerDocument.doctype;return t&&t.publicId&&t.systemId}function a(e,t){switch(e.nodeType){case Node.ELEMENT_NODE:for(var o,a=e.tagName.toLowerCase(),c="<"+a,l=e.attributes,u=0;o=l[u];u++)c+=" "+o.name+'="'+n(o.value)+'"';return C[a]?(i(e)&&(c+="/"),c+">"):c+">"+s(e)+"</"+a+">";case Node.TEXT_NODE:var d=e.data;return t&&j[t.localName]?d:r(d);case Node.COMMENT_NODE:return"<!--"+e.data+"-->";default:throw console.error(e),new Error("not implemented")}}function s(e){e instanceof O.HTMLTemplateElement&&(e=e.content);for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=a(n,e);return t}function c(e,t,n){var r=n||"div";e.textContent="";var o=T(e.ownerDocument.createElement(r));o.innerHTML=t;for(var i;i=o.firstChild;)e.appendChild(M(i))}function l(e){m.call(this,e)}function u(e,t){var n=T(e.cloneNode(!1));n.innerHTML=t;for(var r,o=T(document.createDocumentFragment());r=n.firstChild;)o.appendChild(r);return M(o)}function d(t){return function(){return e.renderAllPending(),S(this)[t]}}function p(e){w(l,e,d(e))}function h(t){Object.defineProperty(l.prototype,t,{get:d(t),set:function(n){e.renderAllPending(),S(this)[t]=n},configurable:!0,enumerable:!0})}function f(t){Object.defineProperty(l.prototype,t,{value:function(){return e.renderAllPending(),S(this)[t].apply(S(this),arguments)},configurable:!0,enumerable:!0})}var m=e.wrappers.Element,w=e.defineGetter,v=e.enqueueMutation,g=e.mixin,b=e.nodesWereAdded,y=e.nodesWereRemoved,E=e.registerWrapper,_=e.snapshotNodeList,S=e.unsafeUnwrap,T=e.unwrap,M=e.wrap,O=e.wrappers,L=/[&\u00A0"]/g,N=/[&\u00A0<>]/g,C=o(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),j=o(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D="http://www.w3.org/1999/xhtml",H=/MSIE/.test(navigator.userAgent),x=window.HTMLElement,R=window.HTMLTemplateElement;l.prototype=Object.create(m.prototype),g(l.prototype,{get innerHTML(){return s(this)},set innerHTML(e){if(H&&j[this.localName])return void(this.textContent=e);var t=_(this.childNodes);this.invalidateShadowRenderer()?this instanceof O.HTMLTemplateElement?c(this.content,e):c(this,e,this.tagName):!R&&this instanceof O.HTMLTemplateElement?c(this.content,e):S(this).innerHTML=e;var n=_(this.childNodes);v(this,"childList",{addedNodes:n,removedNodes:t}),y(t),b(n,this)},get outerHTML(){return a(this,this.parentNode)},set outerHTML(e){var t=this.parentNode;if(t){t.invalidateShadowRenderer();var n=u(t,e);t.replaceChild(n,this)}},insertAdjacentHTML:function(e,t){var n,r;switch(String(e).toLowerCase()){case"beforebegin":n=this.parentNode,r=this;break;case"afterend":n=this.parentNode,r=this.nextSibling;break;case"afterbegin":n=this,r=this.firstChild;break;case"beforeend":n=this,r=null;break;default:return}var o=u(n,t);n.insertBefore(o,r)},get hidden(){return this.hasAttribute("hidden")},set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(p),["scrollLeft","scrollTop"].forEach(h),["focus","getBoundingClientRect","getClientRects","scrollIntoView"].forEach(f),E(x,l,document.createElement("b")),e.wrappers.HTMLElement=l,e.getInnerHTML=s,e.setInnerHTML=c}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.HTMLCanvasElement;t.prototype=Object.create(n.prototype),r(t.prototype,{getContext:function(){var e=i(this).getContext.apply(i(this),arguments);return e&&a(e)}}),o(s,t,document.createElement("canvas")),e.wrappers.HTMLCanvasElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),i&&o(i,t),e.wrappers.HTMLContentElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=window.HTMLFormElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get elements(){return i(a(this).elements)}}),o(s,t,document.createElement("form")),e.wrappers.HTMLFormElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e,t){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var o=i(document.createElement("img"));r.call(this,o),a(o,this),void 0!==e&&(o.width=e),void 0!==t&&(o.height=t)}var r=e.wrappers.HTMLElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLImageElement;t.prototype=Object.create(r.prototype),o(s,t,document.createElement("img")),n.prototype=t.prototype,e.wrappers.HTMLImageElement=t,e.wrappers.Image=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=(e.mixin,e.wrappers.NodeList,e.registerWrapper),o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o&&r(o,t),e.wrappers.HTMLShadowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=d.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);d.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),o=c(r.createDocumentFragment());n=e.firstChild;)o.appendChild(n);return o}function r(e){if(o.call(this,e),!p){var t=n(e);u.set(this,l(t))}}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.wrap,u=new WeakMap,d=new WeakMap,p=window.HTMLTemplateElement;r.prototype=Object.create(o.prototype),i(r.prototype,{constructor:r,get content(){return p?l(s(this).content):u.get(this)}}),p&&a(p,r),e.wrappers.HTMLTemplateElement=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.registerWrapper,o=window.HTMLMediaElement;o&&(t.prototype=Object.create(n.prototype),r(o,t,document.createElement("audio")),e.wrappers.HTMLMediaElement=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var t=i(document.createElement("audio"));r.call(this,t),a(t,this),t.setAttribute("preload","auto"),void 0!==e&&t.setAttribute("src",e)}var r=e.wrappers.HTMLMediaElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLAudioElement;s&&(t.prototype=Object.create(r.prototype),o(s,t,document.createElement("audio")),n.prototype=t.prototype,e.wrappers.HTMLAudioElement=t,e.wrappers.Audio=n)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e.replace(/\s+/g," ").trim()}function n(e){o.call(this,e)}function r(e,t,n,i){if(!(this instanceof r))throw new TypeError("DOM object constructor cannot be called as a function.");var a=c(document.createElement("option"));o.call(this,a),s(a,this),void 0!==e&&(a.text=e),void 0!==t&&a.setAttribute("value",t),n===!0&&a.setAttribute("selected",""),a.selected=i===!0}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.rewrap,c=e.unwrap,l=e.wrap,u=window.HTMLOptionElement;n.prototype=Object.create(o.prototype),i(n.prototype,{get text(){return t(this.textContent)},set text(e){this.textContent=t(String(e))},get form(){return l(c(this).form)}}),a(u,n,document.createElement("option")),r.prototype=n.prototype,e.wrappers.HTMLOptionElement=n,e.wrappers.Option=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=window.HTMLSelectElement;t.prototype=Object.create(n.prototype),r(t.prototype,{add:function(e,t){"object"==typeof t&&(t=i(t)),i(this).add(i(e),t)},remove:function(e){return void 0===e?void n.prototype.remove.call(this):("object"==typeof e&&(e=i(e)),void i(this).remove(e))},get form(){return a(i(this).form)}}),o(s,t,document.createElement("select")),e.wrappers.HTMLSelectElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=e.wrapHTMLCollection,c=window.HTMLTableElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get caption(){return a(i(this).caption)},createCaption:function(){return a(i(this).createCaption())},get tHead(){return a(i(this).tHead)},createTHead:function(){return a(i(this).createTHead())},createTFoot:function(){return a(i(this).createTFoot())},get tFoot(){return a(i(this).tFoot)},get tBodies(){return s(i(this).tBodies)},createTBody:function(){return a(i(this).createTBody())},get rows(){return s(i(this).rows)},insertRow:function(e){return a(i(this).insertRow(e))}}),o(c,t,document.createElement("table")),e.wrappers.HTMLTableElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableSectionElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get rows(){return i(a(this).rows)},insertRow:function(e){return s(a(this).insertRow(e))}}),o(c,t,document.createElement("thead")),e.wrappers.HTMLTableSectionElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableRowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get cells(){return i(a(this).cells)},insertCell:function(e){return s(a(this).insertCell(e))}}),o(c,t,document.createElement("tr")),e.wrappers.HTMLTableRowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new o(e);case"template":return new i(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,o=e.wrappers.HTMLShadowElement,i=e.wrappers.HTMLTemplateElement,a=(e.mixin,e.registerWrapper),s=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(s,t),e.wrappers.HTMLUnknownElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Element,r=e.wrappers.HTMLElement,o=e.registerWrapper,i=(e.defineWrapGetter,e.unsafeUnwrap),a=e.wrap,s=e.mixin,c="http://www.w3.org/2000/svg",l=window.SVGElement,u=document.createElementNS(c,"title");if(!("classList"in u)){var d=Object.getOwnPropertyDescriptor(n.prototype,"classList");Object.defineProperty(r.prototype,"classList",d),delete n.prototype.classList}t.prototype=Object.create(n.prototype),s(t.prototype,{get ownerSVGElement(){return a(i(this).ownerSVGElement)}}),o(l,t,document.createElementNS(c,"title")),e.wrappers.SVGElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){p.call(this,e)}var n=e.mixin,r=e.registerWrapper,o=e.unwrap,i=e.wrap,a=window.SVGUseElement,s="http://www.w3.org/2000/svg",c=i(document.createElementNS(s,"g")),l=document.createElementNS(s,"use"),u=c.constructor,d=Object.getPrototypeOf(u.prototype),p=d.constructor;t.prototype=Object.create(d),"instanceRoot"in l&&n(t.prototype,{get instanceRoot(){return i(o(this).instanceRoot)},get animatedInstanceRoot(){return i(o(this).animatedInstanceRoot)}}),r(a,t,l),e.wrappers.SVGUseElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.SVGElementInstance;s&&(t.prototype=Object.create(n.prototype),r(t.prototype,{get correspondingElement(){return a(i(this).correspondingElement)},get correspondingUseElement(){return a(i(this).correspondingUseElement)},get parentNode(){return a(i(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return a(i(this).firstChild)},get lastChild(){return a(i(this).lastChild)},get previousSibling(){return a(i(this).previousSibling)},get nextSibling(){return a(i(this).nextSibling)}}),o(s,t),e.wrappers.SVGElementInstance=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.CanvasRenderingContext2D;n(t.prototype,{get canvas(){return c(i(this).canvas)},drawImage:function(){arguments[0]=s(arguments[0]),i(this).drawImage.apply(i(this),arguments)},createPattern:function(){return arguments[0]=a(arguments[0]),i(this).createPattern.apply(i(this),arguments)}}),r(l,t,document.createElement("canvas").getContext("2d")),e.wrappers.CanvasRenderingContext2D=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){i(e,this)}var n=e.addForwardingProperties,r=e.mixin,o=e.registerWrapper,i=e.setWrapper,a=e.unsafeUnwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.WebGLRenderingContext;if(l){r(t.prototype,{get canvas(){return c(a(this).canvas)},texImage2D:function(){arguments[5]=s(arguments[5]),a(this).texImage2D.apply(a(this),arguments)},texSubImage2D:function(){arguments[6]=s(arguments[6]),a(this).texSubImage2D.apply(a(this),arguments)}});var u=Object.getPrototypeOf(l.prototype);u!==Object.prototype&&n(u,t.prototype);var d=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};o(l,t,d),e.wrappers.WebGLRenderingContext=t}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Node,r=e.GetElementsByInterface,o=e.NonElementParentNodeInterface,i=e.ParentNodeInterface,a=e.SelectorsInterface,s=e.mixin,c=e.registerObject,l=e.registerWrapper,u=window.DocumentFragment;t.prototype=Object.create(n.prototype),s(t.prototype,i),s(t.prototype,a),s(t.prototype,r),s(t.prototype,o),l(u,t,document.createDocumentFragment()),e.wrappers.DocumentFragment=t;var d=c(document.createComment(""));e.wrappers.Comment=d}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(u(e).ownerDocument.createDocumentFragment());n.call(this,t),c(t,this);var o=e.shadowRoot;f.set(this,o),this.treeScope_=new r(this,a(o||e)),h.set(this,e)}var n=e.wrappers.DocumentFragment,r=e.TreeScope,o=e.elementFromPoint,i=e.getInnerHTML,a=e.getTreeScope,s=e.mixin,c=e.rewrap,l=e.setInnerHTML,u=e.unsafeUnwrap,d=e.unwrap,p=e.wrap,h=new WeakMap,f=new WeakMap;t.prototype=Object.create(n.prototype),s(t.prototype,{constructor:t,get innerHTML(){return i(this)},set innerHTML(e){l(this,e),this.invalidateShadowRenderer()},get olderShadowRoot(){return f.get(this)||null},get host(){return h.get(this)||null},invalidateShadowRenderer:function(){return h.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return o(this,this.ownerDocument,e,t)},getSelection:function(){return document.getSelection()},get activeElement(){var e=d(this).ownerDocument.activeElement;if(!e||!e.nodeType)return null;var t=p(e);if(t===this.host)return null;for(;!this.contains(t)&&!this.host.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}}),e.wrappers.ShadowRoot=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(e).root;return t instanceof h?t.host:null}function n(t,n){if(t.shadowRoot){n=Math.min(t.childNodes.length-1,n);var r=t.childNodes[n];if(r){var o=e.getDestinationInsertionPoints(r);if(o.length>0){var i=o[0].parentNode;i.nodeType==Node.ELEMENT_NODE&&(t=i)}}}return t}function r(e){return e=u(e),t(e)||e}function o(e){a(e,this)}var i=e.registerWrapper,a=e.setWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.unwrapIfNeeded,u=e.wrap,d=e.getTreeScope,p=window.Range,h=e.wrappers.ShadowRoot;o.prototype={get startContainer(){return r(s(this).startContainer)},get endContainer(){return r(s(this).endContainer)},get commonAncestorContainer(){return r(s(this).commonAncestorContainer)},setStart:function(e,t){e=n(e,t),s(this).setStart(l(e),t)},setEnd:function(e,t){e=n(e,t),s(this).setEnd(l(e),t)},setStartBefore:function(e){s(this).setStartBefore(l(e))},setStartAfter:function(e){s(this).setStartAfter(l(e))},setEndBefore:function(e){s(this).setEndBefore(l(e))},setEndAfter:function(e){s(this).setEndAfter(l(e))},selectNode:function(e){s(this).selectNode(l(e))},selectNodeContents:function(e){s(this).selectNodeContents(l(e))},compareBoundaryPoints:function(e,t){return s(this).compareBoundaryPoints(e,c(t))},extractContents:function(){return u(s(this).extractContents())},cloneContents:function(){return u(s(this).cloneContents())},insertNode:function(e){s(this).insertNode(l(e))},surroundContents:function(e){s(this).surroundContents(l(e))},cloneRange:function(){return u(s(this).cloneRange())},isPointInRange:function(e,t){return s(this).isPointInRange(l(e),t)},comparePoint:function(e,t){return s(this).comparePoint(l(e),t)},intersectsNode:function(e){return s(this).intersectsNode(l(e))},toString:function(){return s(this).toString()}},p.prototype.createContextualFragment&&(o.prototype.createContextualFragment=function(e){return u(s(this).createContextualFragment(e))}),i(window.Range,o,document.createRange()),e.wrappers.Range=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(n,o,i){var a=x(n),s=x(o),c=i?x(i):null;if(r(o),t(o),i)n.firstChild===i&&(n.firstChild_=i),i.previousSibling_=i.previousSibling;else{n.lastChild_=n.lastChild,n.lastChild===n.firstChild&&(n.firstChild_=n.firstChild);var l=R(a.lastChild);l&&(l.nextSibling_=l.nextSibling)}e.originalInsertBefore.call(a,s,c)}function r(n){var r=x(n),o=r.parentNode;if(o){var i=R(o);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),i.lastChild===n&&(i.lastChild_=n),i.firstChild===n&&(i.firstChild_=n),e.originalRemoveChild.call(o,r)}}function o(e){P.set(e,[])}function i(e){var t=P.get(e);return t||P.set(e,t=[]),t}function a(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function s(){for(var e=0;e<F.length;e++){var t=F[e],n=t.parentRenderer;n&&n.dirty||t.render()}F=[]}function c(){T=null,s()}function l(e){var t=A.get(e);return t||(t=new h(e),A.set(e,t)),t}function u(e){var t=j(e).root;return t instanceof C?t:null}function d(e){return l(e.host)}function p(e){this.skip=!1,this.node=e,this.childNodes=[]}function h(e){this.host=e,this.dirty=!1,this.invalidateAttributes(),this.associateNode(e)}function f(e){for(var t=[],n=e.firstChild;n;n=n.nextSibling)E(n)?t.push.apply(t,i(n)):t.push(n);return t}function m(e){if(e instanceof L)return e;if(e instanceof O)return null;for(var t=e.firstChild;t;t=t.nextSibling){var n=m(t);if(n)return n}return null}function w(e,t){i(t).push(e);var n=k.get(e);n?n.push(t):k.set(e,[t])}function v(e){return k.get(e)}function g(e){k.set(e,void 0)}function b(e,t){var n=t.getAttribute("select");if(!n)return!0;if(n=n.trim(),!n)return!0;if(!(e instanceof M))return!1;if(!q.test(n))return!1;try{return e.matches(n)}catch(r){return!1}}function y(e,t){var n=v(t);return n&&n[n.length-1]===e}function E(e){return e instanceof O||e instanceof L}function _(e){return e.shadowRoot}function S(e){for(var t=[],n=e.shadowRoot;n;n=n.olderShadowRoot)t.push(n);return t}var T,M=e.wrappers.Element,O=e.wrappers.HTMLContentElement,L=e.wrappers.HTMLShadowElement,N=e.wrappers.Node,C=e.wrappers.ShadowRoot,j=(e.assert,e.getTreeScope),D=(e.mixin,e.oneOf),H=e.unsafeUnwrap,x=e.unwrap,R=e.wrap,I=e.ArraySplice,P=new WeakMap,k=new WeakMap,A=new WeakMap,W=D(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),F=[],U=new I;U.equals=function(e,t){return x(e.node)===t},p.prototype={append:function(e){var t=new p(e);return this.childNodes.push(t),t},sync:function(e){if(!this.skip){for(var t=this.node,o=this.childNodes,i=a(x(t)),s=e||new WeakMap,c=U.calculateSplices(o,i),l=0,u=0,d=0,p=0;p<c.length;p++){for(var h=c[p];d<h.index;d++)u++,o[l++].sync(s);for(var f=h.removed.length,m=0;f>m;m++){var w=R(i[u++]);s.get(w)||r(w)}for(var v=h.addedCount,g=i[u]&&R(i[u]),m=0;v>m;m++){var b=o[l++],y=b.node;n(t,y,g),s.set(y,!0),b.sync(s)}d+=v}for(var p=d;p<o.length;p++)o[p].sync(s)}}},h.prototype={render:function(e){if(this.dirty){this.invalidateAttributes();var t=this.host;this.distribution(t);var n=e||new p(t);this.buildRenderTree(n,t);var r=!e;r&&n.sync(),this.dirty=!1}},get parentRenderer(){return j(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var e=this.parentRenderer;if(e&&e.invalidate(),F.push(this),T)return;T=window[W](c,0)}},distribution:function(e){this.resetAllSubtrees(e),this.distributionResolution(e)},resetAll:function(e){E(e)?o(e):g(e),this.resetAllSubtrees(e)},resetAllSubtrees:function(e){for(var t=e.firstChild;t;t=t.nextSibling)this.resetAll(t);e.shadowRoot&&this.resetAll(e.shadowRoot),e.olderShadowRoot&&this.resetAll(e.olderShadowRoot)},distributionResolution:function(e){if(_(e)){for(var t=e,n=f(t),r=S(t),o=0;o<r.length;o++)this.poolDistribution(r[o],n);for(var o=r.length-1;o>=0;o--){var i=r[o],a=m(i);if(a){var s=i.olderShadowRoot;s&&(n=f(s));for(var c=0;c<n.length;c++)w(n[c],a)}this.distributionResolution(i)}}for(var l=e.firstChild;l;l=l.nextSibling)this.distributionResolution(l)},poolDistribution:function(e,t){if(!(e instanceof L))if(e instanceof O){var n=e;this.updateDependentAttributes(n.getAttribute("select"));for(var r=!1,o=0;o<t.length;o++){var e=t[o];e&&b(e,n)&&(w(e,n),t[o]=void 0,r=!0)}if(!r)for(var i=n.firstChild;i;i=i.nextSibling)w(i,n)}else for(var i=e.firstChild;i;i=i.nextSibling)this.poolDistribution(i,t)},buildRenderTree:function(e,t){for(var n=this.compose(t),r=0;r<n.length;r++){var o=n[r],i=e.append(o);this.buildRenderTree(i,o)}if(_(t)){var a=l(t);a.dirty=!1}},compose:function(e){for(var t=[],n=e.shadowRoot||e,r=n.firstChild;r;r=r.nextSibling)if(E(r)){this.associateNode(n);for(var o=i(r),a=0;a<o.length;a++){var s=o[a];y(r,s)&&t.push(s)}}else t.push(r);return t},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(e){if(e){var t=this.attributes;/\.\w+/.test(e)&&(t["class"]=!0),/#\w+/.test(e)&&(t.id=!0),e.replace(/\[\s*([^\s=\|~\]]+)/g,function(e,n){t[n]=!0})}},dependsOnAttribute:function(e){return this.attributes[e]},associateNode:function(e){H(e).polymerShadowRenderer_=this}};var q=/^(:not\()?[*.#[a-zA-Z_|]/;N.prototype.invalidateShadowRenderer=function(e){var t=H(this).polymerShadowRenderer_;return t?(t.invalidate(),!0):!1},O.prototype.getDistributedNodes=L.prototype.getDistributedNodes=function(){return s(),i(this)},M.prototype.getDestinationInsertionPoints=function(){return s(),v(this)||[]},O.prototype.nodeIsInserted_=L.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var e,t=u(this);t&&(e=d(t)),H(this).polymerShadowRenderer_=e,e&&e.invalidate()},e.getRendererForHost=l,e.getShadowTrees=S,e.renderAllPending=s,e.getDestinationInsertionPoints=v,e.visual={insertBefore:n,remove:r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t){if(window[t]){r(!e.wrappers[t]);var c=function(e){n.call(this,e)};c.prototype=Object.create(n.prototype),o(c.prototype,{get form(){return s(a(this).form)}}),i(window[t],c,document.createElement(t.slice(4,-7))),e.wrappers[t]=c}}var n=e.wrappers.HTMLElement,r=e.assert,o=e.mixin,i=e.registerWrapper,a=e.unwrap,s=e.wrap,c=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];c.forEach(t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrap,a=e.unwrapIfNeeded,s=e.wrap,c=window.Selection;t.prototype={get anchorNode(){return s(o(this).anchorNode)},get focusNode(){return s(o(this).focusNode)},addRange:function(e){o(this).addRange(a(e))},collapse:function(e,t){o(this).collapse(a(e),t)},containsNode:function(e,t){return o(this).containsNode(a(e),t)},getRangeAt:function(e){return s(o(this).getRangeAt(e))},removeRange:function(e){o(this).removeRange(i(e))},selectAllChildren:function(e){o(this).selectAllChildren(e instanceof ShadowRoot?o(e.host):a(e))},toString:function(){return o(this).toString()}},c.prototype.extend&&(t.prototype.extend=function(e,t){o(this).extend(a(e),t)}),n(window.Selection,t,window.getSelection()),e.wrappers.Selection=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrapIfNeeded,a=e.wrap,s=window.TreeWalker;t.prototype={get root(){return a(o(this).root)},get currentNode(){return a(o(this).currentNode)},set currentNode(e){o(this).currentNode=i(e)},get filter(){return o(this).filter},parentNode:function(){return a(o(this).parentNode())},firstChild:function(){return a(o(this).firstChild())},lastChild:function(){return a(o(this).lastChild())},previousSibling:function(){return a(o(this).previousSibling())},previousNode:function(){return a(o(this).previousNode())},nextNode:function(){return a(o(this).nextNode())}},n(s,t),e.wrappers.TreeWalker=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){u.call(this,e),this.treeScope_=new w(this,null)}function n(e){var n=document[e];t.prototype[e]=function(){return j(n.apply(N(this),arguments))}}function r(e,t){x.call(N(t),C(e)),o(e,t)}function o(e,t){e.shadowRoot&&t.adoptNode(e.shadowRoot),e instanceof m&&i(e,t);for(var n=e.firstChild;n;n=n.nextSibling)o(n,t)}function i(e,t){var n=e.olderShadowRoot;n&&t.adoptNode(n)}function a(e){L(e,this)}function s(e,t){
- var n=document.implementation[t];e.prototype[t]=function(){return j(n.apply(N(this),arguments))}}function c(e,t){var n=document.implementation[t];e.prototype[t]=function(){return n.apply(N(this),arguments)}}var l=e.GetElementsByInterface,u=e.wrappers.Node,d=e.ParentNodeInterface,p=e.NonElementParentNodeInterface,h=e.wrappers.Selection,f=e.SelectorsInterface,m=e.wrappers.ShadowRoot,w=e.TreeScope,v=e.cloneNode,g=e.defineGetter,b=e.defineWrapGetter,y=e.elementFromPoint,E=e.forwardMethodsToWrapper,_=e.matchesNames,S=e.mixin,T=e.registerWrapper,M=e.renderAllPending,O=e.rewrap,L=e.setWrapper,N=e.unsafeUnwrap,C=e.unwrap,j=e.wrap,D=e.wrapEventTargetMethods,H=(e.wrapNodeList,new WeakMap);t.prototype=Object.create(u.prototype),b(t,"documentElement"),b(t,"body"),b(t,"head"),g(t,"activeElement",function(){var e=C(this).activeElement;if(!e||!e.nodeType)return null;for(var t=j(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode"].forEach(n);var x=document.adoptNode,R=document.getSelection;S(t.prototype,{adoptNode:function(e){return e.parentNode&&e.parentNode.removeChild(e),r(e,this),e},elementFromPoint:function(e,t){return y(this,this,e,t)},importNode:function(e,t){return v(e,t,N(this))},getSelection:function(){return M(),new h(R.call(C(this)))},getElementsByName:function(e){return f.querySelectorAll.call(this,"[name="+JSON.stringify(String(e))+"]")}});var I=document.createTreeWalker,P=e.wrappers.TreeWalker;if(t.prototype.createTreeWalker=function(e,t,n,r){var o=null;return n&&(n.acceptNode&&"function"==typeof n.acceptNode?o={acceptNode:function(e){return n.acceptNode(j(e))}}:"function"==typeof n&&(o=function(e){return n(j(e))})),new P(I.call(C(this),C(e),t,o,r))},document.registerElement){var k=document.registerElement;t.prototype.registerElement=function(t,n){function r(e){return e?void L(e,this):i?document.createElement(i,t):document.createElement(t)}var o,i;if(void 0!==n&&(o=n.prototype,i=n["extends"]),o||(o=Object.create(HTMLElement.prototype)),e.nativePrototypeTable.get(o))throw new Error("NotSupportedError");for(var a,s=Object.getPrototypeOf(o),c=[];s&&!(a=e.nativePrototypeTable.get(s));)c.push(s),s=Object.getPrototypeOf(s);if(!a)throw new Error("NotSupportedError");for(var l=Object.create(a),u=c.length-1;u>=0;u--)l=Object.create(l);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(e){var t=o[e];t&&(l[e]=function(){j(this)instanceof r||O(this),t.apply(j(this),arguments)})});var d={prototype:l};i&&(d["extends"]=i),r.prototype=o,r.prototype.constructor=r,e.constructorTable.set(l,r),e.nativePrototypeTable.set(o,l);k.call(C(this),t,d);return r},E([window.HTMLDocument||window.Document],["registerElement"])}E([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),E([window.HTMLBodyElement,window.HTMLHeadElement,window.HTMLHtmlElement],_),E([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","createTreeWalker","elementFromPoint","getElementById","getElementsByName","getSelection"]),S(t.prototype,l),S(t.prototype,d),S(t.prototype,f),S(t.prototype,p),S(t.prototype,{get implementation(){var e=H.get(this);return e?e:(e=new a(C(this).implementation),H.set(this,e),e)},get defaultView(){return j(C(this).defaultView)}}),T(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&T(window.HTMLDocument,t),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]);var A=document.implementation.createDocument;a.prototype.createDocument=function(){return arguments[2]=C(arguments[2]),j(A.apply(N(this),arguments))},s(a,"createDocumentType"),s(a,"createHTMLDocument"),c(a,"hasFeature"),T(window.DOMImplementation,a),E([window.DOMImplementation],["createDocument","createDocumentType","createHTMLDocument","hasFeature"]),e.adoptNodeNoRemove=r,e.wrappers.DOMImplementation=a,e.wrappers.Document=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.wrappers.Selection,o=e.mixin,i=e.registerWrapper,a=e.renderAllPending,s=e.unwrap,c=e.unwrapIfNeeded,l=e.wrap,u=window.Window,d=window.getComputedStyle,p=window.getDefaultComputedStyle,h=window.getSelection;t.prototype=Object.create(n.prototype),u.prototype.getComputedStyle=function(e,t){return l(this||window).getComputedStyle(c(e),t)},p&&(u.prototype.getDefaultComputedStyle=function(e,t){return l(this||window).getDefaultComputedStyle(c(e),t)}),u.prototype.getSelection=function(){return l(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){u.prototype[e]=function(){var t=l(this||window);return t[e].apply(t,arguments)},delete window[e]}),o(t.prototype,{getComputedStyle:function(e,t){return a(),d.call(s(this),c(e),t)},getSelection:function(){return a(),new r(h.call(s(this)))},get document(){return l(s(this).document)}}),p&&(t.prototype.getDefaultComputedStyle=function(e,t){return a(),p.call(s(this),c(e),t)}),i(u,t,window),e.wrappers.Window=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrap,n=window.DataTransfer||window.Clipboard,r=n.prototype.setDragImage;r&&(n.prototype.setDragImage=function(e,n,o){r.call(this,t(e),n,o)})}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t;t=e instanceof i?e:new i(e&&o(e)),r(t,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unwrap,i=window.FormData;i&&(n(i,t,new i),e.wrappers.FormData=t)}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrapIfNeeded,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(e){return n.call(this,t(e))}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var o=document.createElement(e),i=o.constructor;window[t]=i}}var n=(e.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]})}(window.ShadowDOMPolyfill),function(e){function t(e,t){var n="";return Array.prototype.forEach.call(e,function(e){n+=e.textContent+"\n\n"}),t||(n=n.replace(d,"")),n}function n(e){var t=document.createElement("style");return t.textContent=e,t}function r(e){var t=n(e);document.head.appendChild(t);var r=[];if(t.sheet)try{r=t.sheet.cssRules}catch(o){}else console.warn("sheet not found",t);return t.parentNode.removeChild(t),r}function o(){C.initialized=!0,document.body.appendChild(C);var e=C.contentDocument,t=e.createElement("base");t.href=document.baseURI,e.head.appendChild(t)}function i(e){C.initialized||o(),document.body.appendChild(C),e(C.contentDocument),document.body.removeChild(C)}function a(e,t){if(t){var o;if(e.match("@import")&&D){var a=n(e);i(function(e){e.head.appendChild(a.impl),o=Array.prototype.slice.call(a.sheet.cssRules,0),t(o)})}else o=r(e),t(o)}}function s(e){e&&l().appendChild(document.createTextNode(e))}function c(e,t){var r=n(e);r.setAttribute(t,""),r.setAttribute(x,""),document.head.appendChild(r)}function l(){return j||(j=document.createElement("style"),j.setAttribute(x,""),j[x]=!0),j}var u={strictStyling:!1,registry:{},shimStyling:function(e,n,r){var o=this.prepareRoot(e,n,r),i=this.isTypeExtension(r),a=this.makeScopeSelector(n,i),s=t(o,!0);s=this.scopeCssText(s,a),e&&(e.shimmedStyle=s),this.addCssToDocument(s,n)},shimStyle:function(e,t){return this.shimCssText(e.textContent,t)},shimCssText:function(e,t){return e=this.insertDirectives(e),this.scopeCssText(e,t)},makeScopeSelector:function(e,t){return e?t?"[is="+e+"]":e:""},isTypeExtension:function(e){return e&&e.indexOf("-")<0},prepareRoot:function(e,t,n){var r=this.registerRoot(e,t,n);return this.replaceTextInStyles(r.rootStyles,this.insertDirectives),this.removeStyles(e,r.rootStyles),this.strictStyling&&this.applyScopeToContent(e,t),r.scopeStyles},removeStyles:function(e,t){for(var n,r=0,o=t.length;o>r&&(n=t[r]);r++)n.parentNode.removeChild(n)},registerRoot:function(e,t,n){var r=this.registry[t]={root:e,name:t,extendsName:n},o=this.findStyles(e);r.rootStyles=o,r.scopeStyles=r.rootStyles;var i=this.registry[r.extendsName];return i&&(r.scopeStyles=i.scopeStyles.concat(r.scopeStyles)),r},findStyles:function(e){if(!e)return[];var t=e.querySelectorAll("style");return Array.prototype.filter.call(t,function(e){return!e.hasAttribute(R)})},applyScopeToContent:function(e,t){e&&(Array.prototype.forEach.call(e.querySelectorAll("*"),function(e){e.setAttribute(t,"")}),Array.prototype.forEach.call(e.querySelectorAll("template"),function(e){this.applyScopeToContent(e.content,t)},this))},insertDirectives:function(e){return e=this.insertPolyfillDirectivesInCssText(e),this.insertPolyfillRulesInCssText(e)},insertPolyfillDirectivesInCssText:function(e){return e=e.replace(p,function(e,t){return t.slice(0,-2)+"{"}),e.replace(h,function(e,t){return t+" {"})},insertPolyfillRulesInCssText:function(e){return e=e.replace(f,function(e,t){return t.slice(0,-1)}),e.replace(m,function(e,t,n,r){var o=e.replace(t,"").replace(n,"");return r+o})},scopeCssText:function(e,t){var n=this.extractUnscopedRulesFromCssText(e);if(e=this.insertPolyfillHostInCssText(e),e=this.convertColonHost(e),e=this.convertColonHostContext(e),e=this.convertShadowDOMSelectors(e),t){var e,r=this;a(e,function(n){e=r.scopeRules(n,t)})}return e=e+"\n"+n,e.trim()},extractUnscopedRulesFromCssText:function(e){for(var t,n="";t=w.exec(e);)n+=t[1].slice(0,-1)+"\n\n";for(;t=v.exec(e);)n+=t[0].replace(t[2],"").replace(t[1],t[3])+"\n\n";return n},convertColonHost:function(e){return this.convertColonRule(e,E,this.colonHostPartReplacer)},convertColonHostContext:function(e){return this.convertColonRule(e,_,this.colonHostContextPartReplacer)},convertColonRule:function(e,t,n){return e.replace(t,function(e,t,r,o){if(t=O,r){for(var i,a=r.split(","),s=[],c=0,l=a.length;l>c&&(i=a[c]);c++)i=i.trim(),s.push(n(t,i,o));return s.join(",")}return t+o})},colonHostContextPartReplacer:function(e,t,n){return t.match(g)?this.colonHostPartReplacer(e,t,n):e+t+n+", "+t+" "+e+n},colonHostPartReplacer:function(e,t,n){return e+t.replace(g,"")+n},convertShadowDOMSelectors:function(e){for(var t=0;t<N.length;t++)e=e.replace(N[t]," ");return e},scopeRules:function(e,t){var n="";return e&&Array.prototype.forEach.call(e,function(e){if(e.selectorText&&e.style&&void 0!==e.style.cssText)n+=this.scopeSelector(e.selectorText,t,this.strictStyling)+" {\n ",n+=this.propertiesFromRule(e)+"\n}\n\n";else if(e.type===CSSRule.MEDIA_RULE)n+="@media "+e.media.mediaText+" {\n",n+=this.scopeRules(e.cssRules,t),n+="\n}\n\n";else try{e.cssText&&(n+=e.cssText+"\n\n")}catch(r){e.type===CSSRule.KEYFRAMES_RULE&&e.cssRules&&(n+=this.ieSafeCssTextFromKeyFrameRule(e))}},this),n},ieSafeCssTextFromKeyFrameRule:function(e){var t="@keyframes "+e.name+" {";return Array.prototype.forEach.call(e.cssRules,function(e){t+=" "+e.keyText+" {"+e.style.cssText+"}"}),t+=" }"},scopeSelector:function(e,t,n){var r=[],o=e.split(",");return o.forEach(function(e){e=e.trim(),this.selectorNeedsScoping(e,t)&&(e=n&&!e.match(O)?this.applyStrictSelectorScope(e,t):this.applySelectorScope(e,t)),r.push(e)},this),r.join(", ")},selectorNeedsScoping:function(e,t){if(Array.isArray(t))return!0;var n=this.makeScopeMatcher(t);return!e.match(n)},makeScopeMatcher:function(e){return e=e.replace(/\[/g,"\\[").replace(/\]/g,"\\]"),new RegExp("^("+e+")"+S,"m")},applySelectorScope:function(e,t){return Array.isArray(t)?this.applySelectorScopeList(e,t):this.applySimpleSelectorScope(e,t)},applySelectorScopeList:function(e,t){for(var n,r=[],o=0;n=t[o];o++)r.push(this.applySimpleSelectorScope(e,n));return r.join(", ")},applySimpleSelectorScope:function(e,t){return e.match(L)?(e=e.replace(O,t),e.replace(L,t+" ")):t+" "+e},applyStrictSelectorScope:function(e,t){t=t.replace(/\[is=([^\]]*)\]/g,"$1");var n=[" ",">","+","~"],r=e,o="["+t+"]";return n.forEach(function(e){var t=r.split(e);r=t.map(function(e){var t=e.trim().replace(L,"");return t&&n.indexOf(t)<0&&t.indexOf(o)<0&&(e=t.replace(/([^:]*)(:*)(.*)/,"$1"+o+"$2$3")),e}).join(e)}),r},insertPolyfillHostInCssText:function(e){return e.replace(M,b).replace(T,g)},propertiesFromRule:function(e){var t=e.style.cssText;e.style.content&&!e.style.content.match(/['"]+|attr/)&&(t=t.replace(/content:[^;]*;/g,"content: '"+e.style.content+"';"));var n=e.style;for(var r in n)"initial"===n[r]&&(t+=r+": initial; ");return t},replaceTextInStyles:function(e,t){e&&t&&(e instanceof Array||(e=[e]),Array.prototype.forEach.call(e,function(e){e.textContent=t.call(this,e.textContent)},this))},addCssToDocument:function(e,t){e.match("@import")?c(e,t):s(e)}},d=/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim,p=/\/\*\s*@polyfill ([^*]*\*+([^\/*][^*]*\*+)*\/)([^{]*?){/gim,h=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,f=/\/\*\s@polyfill-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,m=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,w=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,v=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,g="-shadowcsshost",b="-shadowcsscontext",y=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)",E=new RegExp("("+g+y,"gim"),_=new RegExp("("+b+y,"gim"),S="([>\\s~+[.,{:][\\s\\S]*)?$",T=/\:host/gim,M=/\:host-context/gim,O=g+"-no-combinator",L=new RegExp(g,"gim"),N=(new RegExp(b,"gim"),[/>>>/g,/::shadow/g,/::content/g,/\/deep\//g,/\/shadow\//g,/\/shadow-deep\//g,/\^\^/g,/\^/g]),C=document.createElement("iframe");C.style.display="none";var j,D=navigator.userAgent.match("Chrome"),H="shim-shadowdom",x="shim-shadowdom-css",R="no-shim";if(window.ShadowDOMPolyfill){s("style { display: none !important; }\n");var I=ShadowDOMPolyfill.wrap(document),P=I.querySelector("head");P.insertBefore(l(),P.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){e.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var t="link[rel=stylesheet]["+H+"]",n="style["+H+"]";HTMLImports.importer.documentPreloadSelectors+=","+t,HTMLImports.importer.importsPreloadSelectors+=","+t,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,t,n].join(",");var r=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(e){if(!e[x]){var t=e.__importElement||e;if(!t.hasAttribute(H))return void r.call(this,e);e.__resource&&(t=e.ownerDocument.createElement("style"),t.textContent=e.__resource),HTMLImports.path.resolveUrlsInStyle(t,e.href),t.textContent=u.shimStyle(t),t.removeAttribute(H,""),t.setAttribute(x,""),t[x]=!0,t.parentNode!==P&&(e.parentNode===P?P.replaceChild(t,e):this.addElementToDocument(t)),t.__importParsed=!0,this.markParsingComplete(e),this.parseNext()}};var o=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(e){return"link"===e.localName&&"stylesheet"===e.rel&&e.hasAttribute(H)?e.__resource:o.call(this,e)}}})}e.ShadowCSS=u}(window.WebComponents)),function(e){window.ShadowDOMPolyfill?(window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}}(window.WebComponents),function(e){"use strict";function t(e){return void 0!==p[e]}function n(){s.call(this),this._isInvalid=!0}function r(e){return""==e&&n.call(this),e.toLowerCase()}function o(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function a(e,a,s){function c(e){b.push(e)}var l=a||"scheme start",u=0,d="",v=!1,g=!1,b=[];e:for(;(e[u-1]!=f||0==u)&&!this._isInvalid;){var y=e[u];switch(l){case"scheme start":if(!y||!m.test(y)){if(a){c("Invalid scheme.");break e}d="",l="no scheme";continue}d+=y.toLowerCase(),l="scheme";break;case"scheme":if(y&&w.test(y))d+=y.toLowerCase();else{if(":"!=y){if(a){if(f==y)break e;c("Code point not allowed in scheme: "+y);break e}d="",u=0,l="no scheme";continue}if(this._scheme=d,d="",a)break e;t(this._scheme)&&(this._isRelative=!0),l="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==y?(this._query="?",l="query"):"#"==y?(this._fragment="#",l="fragment"):f!=y&&" "!=y&&"\n"!=y&&"\r"!=y&&(this._schemeData+=o(y));break;case"no scheme":if(s&&t(s._scheme)){l="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=y||"/"!=e[u+1]){c("Expected /, got: "+y),l="relative";continue}l="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),f==y){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==y||"\\"==y)"\\"==y&&c("\\ is an invalid code point."),l="relative slash";else if("?"==y)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,l="query";else{if("#"!=y){var E=e[u+1],_=e[u+2];("file"!=this._scheme||!m.test(y)||":"!=E&&"|"!=E||f!=_&&"/"!=_&&"\\"!=_&&"?"!=_&&"#"!=_)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),l="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,l="fragment"}break;case"relative slash":if("/"!=y&&"\\"!=y){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),l="relative path";continue}"\\"==y&&c("\\ is an invalid code point."),l="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=y){c("Expected '/', got: "+y),l="authority ignore slashes";continue}l="authority second slash";break;case"authority second slash":if(l="authority ignore slashes","/"!=y){c("Expected '/', got: "+y);continue}break;case"authority ignore slashes":if("/"!=y&&"\\"!=y){l="authority";continue}c("Expected authority, got: "+y);break;case"authority":if("@"==y){v&&(c("@ already seen."),d+="%40"),v=!0;for(var S=0;S<d.length;S++){var T=d[S];if(" "!=T&&"\n"!=T&&"\r"!=T)if(":"!=T||null!==this._password){var M=o(T);null!==this._password?this._password+=M:this._username+=M}else this._password="";else c("Invalid whitespace in authority.")}d=""}else{if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){u-=d.length,d="",l="host";continue}d+=y}break;case"file host":if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){2!=d.length||!m.test(d[0])||":"!=d[1]&&"|"!=d[1]?0==d.length?l="relative path start":(this._host=r.call(this,d),d="",l="relative path start"):l="relative path";continue}" "==y||"\n"==y||"\r"==y?c("Invalid whitespace in file host."):d+=y;break;case"host":case"hostname":if(":"!=y||g){if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){if(this._host=r.call(this,d),d="",l="relative path start",a)break e;continue}" "!=y&&"\n"!=y&&"\r"!=y?("["==y?g=!0:"]"==y&&(g=!1),d+=y):c("Invalid code point in host/hostname: "+y)}else if(this._host=r.call(this,d),d="",l="port","hostname"==a)break e;break;case"port":if(/[0-9]/.test(y))d+=y;else{if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y||a){if(""!=d){var O=parseInt(d,10);O!=p[this._scheme]&&(this._port=O+""),d=""}if(a)break e;l="relative path start";continue}" "==y||"\n"==y||"\r"==y?c("Invalid code point in port: "+y):n.call(this)}break;case"relative path start":if("\\"==y&&c("'\\' not allowed in path."),l="relative path","/"!=y&&"\\"!=y)continue;break;case"relative path":if(f!=y&&"/"!=y&&"\\"!=y&&(a||"?"!=y&&"#"!=y))" "!=y&&"\n"!=y&&"\r"!=y&&(d+=o(y));else{"\\"==y&&c("\\ not allowed in relative path.");var L;(L=h[d.toLowerCase()])&&(d=L),".."==d?(this._path.pop(),"/"!=y&&"\\"!=y&&this._path.push("")):"."==d&&"/"!=y&&"\\"!=y?this._path.push(""):"."!=d&&("file"==this._scheme&&0==this._path.length&&2==d.length&&m.test(d[0])&&"|"==d[1]&&(d=d[0]+":"),this._path.push(d)),d="","?"==y?(this._query="?",l="query"):"#"==y&&(this._fragment="#",l="fragment")}break;case"query":a||"#"!=y?f!=y&&" "!=y&&"\n"!=y&&"\r"!=y&&(this._query+=i(y)):(this._fragment="#",l="fragment");break;case"fragment":f!=y&&" "!=y&&"\n"!=y&&"\r"!=y&&(this._fragment+=y)}u++}}function s(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function c(e,t){void 0===t||t instanceof c||(t=new c(String(t))),this._url=e,s.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");a.call(this,n,null,t)}var l=!1;if(!e.forceJURL)try{var u=new URL("b","http://a");u.pathname="c%20d",l="http://a/c%20d"===u.href}catch(d){}if(!l){var p=Object.create(null);p.ftp=21,p.file=0,p.gopher=70,p.http=80,p.https=443,p.ws=80,p.wss=443;var h=Object.create(null);h["%2e"]=".",h[".%2e"]="..",h["%2e."]="..",h["%2e%2e"]="..";var f=void 0,m=/[a-zA-Z]/,w=/[a-zA-Z0-9\+\-\.]/;c.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return(""!=this._username||null!=this._password)&&(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){s.call(this),a.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||a.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],a.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),a.call(this,e,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),a.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return e=this.host,e?this._scheme+"://"+e:""}};var v=e.URL;v&&(c.createObjectURL=function(e){return v.createObjectURL.apply(v,arguments)},c.revokeObjectURL=function(e){v.revokeObjectURL(e)}),e.URL=c}}(self),function(e){function t(e){y.push(e),b||(b=!0,m(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){b=!1;var e=y;y=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=w.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=w.get(n);if(r)for(var o=0;o<r.length;o++){var i=r[o],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++E}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function c(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function l(e,t){return _=new s(e,t)}function u(e){return S?S:(S=c(_),S.oldValue=e,S)}function d(){_=S=void 0}function p(e){return e===S||e===_}function h(e,t){return e===t?e:S&&p(e)?S:null}function f(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var m,w=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var v=[],g=String(Math.random());window.addEventListener("message",function(e){if(e.data===g){var t=v;v=[],t.forEach(function(e){e()})}}),m=function(e){v.push(e),window.postMessage(g,"*")}}var b=!1,y=[],E=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var r=w.get(e);r||w.set(e,r=[]);for(var o,i=0;i<r.length;i++)if(r[i].observer===this){o=r[i],o.removeListeners(),o.options=t;break}o||(o=new f(this,e,t),r.push(o),this.nodes_.push(e)),o.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=w.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){r.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var _,S;f.prototype={enqueue:function(e){var n=this.observer.records_,r=n.length;if(n.length>0){var o=n[r-1],i=h(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=w.get(e);t||w.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=w.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,r=e.target,o=new l("attributes",r);o.attributeName=t,o.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(r,function(e){return!e.attributes||e.attributeFilter&&e.attributeFilter.length&&-1===e.attributeFilter.indexOf(t)&&-1===e.attributeFilter.indexOf(n)?void 0:e.attributeOldValue?u(a):o});break;case"DOMCharacterDataModified":var r=e.target,o=l("characterData",r),a=e.prevValue;i(r,function(e){return e.characterData?e.characterDataOldValue?u(a):o:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,c,p=e.target;"DOMNodeInserted"===e.type?(s=[p],c=[]):(s=[],c=[p]);var h=p.previousSibling,f=p.nextSibling,o=l("childList",e.target.parentNode);o.addedNodes=s,o.removedNodes=c,o.previousSibling=h,o.nextSibling=f,i(e.relatedNode,function(e){return e.childList?o:void 0})}d()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(e){"use strict";if(!window.performance){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var r=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(r.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var o=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||o&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||o&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||f,r(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===v}function r(e,t){if(n(t))e&&e();else{var o=function(){("complete"===t.readyState||t.readyState===v)&&(t.removeEventListener(g,o),r(e,t))};t.addEventListener(g,o)}}function o(e){e.target.__loaded=!0}function i(e,t){function n(){c==l&&e&&e({allImports:s,loadedImports:u,errorImports:d})}function r(e){o(e),u.push(this),
- c++,n()}function i(e){d.push(this),c++,n()}var s=t.querySelectorAll("link[rel=import]"),c=0,l=s.length,u=[],d=[];if(l)for(var p,h=0;l>h&&(p=s[h]);h++)a(p)?(u.push(this),c++,n()):(p.addEventListener("load",r),p.addEventListener("error",i));else n()}function a(e){return d?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)c(t)&&l(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function l(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",d=Boolean(u in document.createElement("link")),p=Boolean(window.ShadowDOMPolyfill),h=function(e){return p?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},f=h(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return h(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(f,"_currentScript",m);var w=/Trident/.test(navigator.userAgent),v=w?"complete":"interactive",g="readystatechange";d&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;r>n&&(e=t[n]);n++)l(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=f.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),f.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=d,e.rootDocument=f,e.whenReady=t,e.isIE=w}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}r.call(o,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,l=e.isIE,u=e.IMPORT_LINK_TYPE,d="link[rel="+u+"]",p={documentSelectors:d,importsSelectors:[d,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),l&&"style"===e.localName){var o=!1;if(-1==e.textContent.indexOf("@import"))o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;a>i&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return t(e)&&void 0===e.__doc?!1:!0}};e.parser=p,e.IMPORT_SELECTOR=d}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,l=e.Loader,u=e.Observer,d=e.parser,p={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){h.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);h.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:o(r,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}d.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),d.parseNext()},loadedAll:function(){d.parseNext()}},h=new l(p.loaded.bind(p),p.loadedAll.bind(p));if(p.observer=new u,!document.baseURI){var f={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",f),Object.defineProperty(c,"baseURI",f)}e.importer=p,e.importLoader=h}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,c=e.length;c>s&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(r)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var r=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],r=function(e){n.push(e)},o=function(){n.forEach(function(t){t(e)})};e.addModule=r,e.initializeModules=o,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void r(e,t)}),r(e,t)}function n(e,t,r){var o=e.firstElementChild;if(!o)for(o=e.firstChild;o&&o.nodeType!==Node.ELEMENT_NODE;)o=o.nextSibling;for(;o;)t(o,r)!==!0&&n(o,t,r),o=o.nextElementSibling;return null}function r(e,n){for(var r=e.shadowRoot;r;)t(r,n),r=r.olderShadowRoot}function o(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var r,o=e.querySelectorAll("link[rel="+a+"]"),s=0,c=o.length;c>s&&(r=o[s]);s++)r["import"]&&i(r["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=o,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||r(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function r(e,t){b(e,function(e){return n(e,t)?!0:void 0})}function o(e){S.push(e),_||(_=!0,setTimeout(i))}function i(){_=!1;for(var e,t=S,n=0,r=t.length;r>n&&(e=t[n]);n++)e();S=[]}function a(e){E?o(function(){s(e)}):s(e)}function s(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){l(e),b(e,function(e){l(e)})}function l(e){E?o(function(){u(e)}):u(e)}function u(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function d(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function p(e){if(e.shadowRoot&&!e.shadowRoot.__watched){g.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function h(e,n){if(g.dom){var r=n[0];if(r&&"childList"===r.type&&r.addedNodes&&r.addedNodes){for(var o=r.addedNodes[0];o&&o!==document&&!o.host;)o=o.parentNode;var i=o&&(o.URL||o._URL||o.host&&o.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=d(e);n.forEach(function(e){"childList"===e.type&&(T(e.addedNodes,function(e){e.localName&&t(e,a)}),T(e.removedNodes,function(e){e.localName&&c(e)}))}),g.dom&&console.groupEnd()}function f(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(h(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(h.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function w(e){e=window.wrap(e),g.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),g.dom&&console.groupEnd()}function v(e){y(e,w)}var g=e.flags,b=e.forSubtree,y=e.forDocumentTree,E=window.MutationObserver._isPolyfilled&&g["throttle-attached"];e.hasPolyfillMutations=E,e.hasThrottledAttached=E;var _=!1,S=[],T=Array.prototype.forEach.call.bind(Array.prototype.forEach),M=Element.prototype.createShadowRoot;M&&(Element.prototype.createShadowRoot=function(){var e=M.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=p,e.upgradeDocumentTree=v,e.upgradeDocument=w,e.upgradeSubtree=r,e.upgradeAll=t,e.attached=a,e.takeRecords=f}),window.CustomElements.addModule(function(e){function t(t,r){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var o=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(o);if(i&&(o&&i.tag==t.localName||!o&&!i["extends"]))return n(t,i,r)}}function n(t,n,o){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),r(t,n),t.__upgraded__=!0,i(t),o&&e.attached(t),e.upgradeSubtree(t,o),a.upgrade&&console.groupEnd(),t}function r(e,t){Object.__proto__?e.__proto__=t.prototype:(o(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function o(e,t,n){for(var r={},o=t;o!==n&&o!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(o),s=0;i=a[s];s++)r[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(o,i)),r[i]=1);o=Object.getPrototypeOf(o)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=r}),window.CustomElements.addModule(function(e){function t(t,r){var c=r||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(o(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(l(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),u(c.__name,c),c.ctor=d(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&v(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){r.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){r.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function r(e,t,n){e=e.toLowerCase();var r=this.getAttribute(e);n.apply(this,arguments);var o=this.getAttribute(e);this.attributeChangedCallback&&o!==r&&this.attributeChangedCallback(e,r,o)}function o(e){for(var t=0;t<_.length;t++)if(e===_[t])return!0}function i(e){var t=l(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],r=0;t=e.ancestry[r];r++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var r,o=e.prototype,i=!1;o;)o==t&&(i=!0),r=Object.getPrototypeOf(o),r&&(o.__proto__=r),o=r;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function c(e){return b(M(e.tag),e)}function l(e){return e?S[e.toLowerCase()]:void 0}function u(e,t){S[e]=t}function d(e){return function(){return c(e)}}function p(e,t,n){return e===T?h(t,n):O(e,t)}function h(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=l(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var r;return t?(r=h(e),r.setAttribute("is",t),r):(r=M(e),e.indexOf("-")>=0&&y(r,HTMLElement),r)}function f(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return g(e),e}}var m,w=e.isIE,v=e.upgradeDocumentTree,g=e.upgradeAll,b=e.upgradeWithDefinition,y=e.implementPrototype,E=e.useNative,_=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],S={},T="http://www.w3.org/1999/xhtml",M=document.createElement.bind(document),O=document.createElementNS.bind(document);m=Object.__proto__||E?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},f(Node.prototype,"cloneNode"),f(document,"importNode"),w&&!function(){var e=document.importNode;document.importNode=function(){var t=e.apply(document,arguments);if(t.nodeType==t.DOCUMENT_FRAGMENT_NODE){var n=document.createDocumentFragment();return n.appendChild(t),n}return t}}(),document.registerElement=t,document.createElement=h,document.createElementNS=p,e.registry=S,e["instanceof"]=m,e.reservedTagList=_,e.getRegisteredDefinition=l,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,r=e.initializeModules;e.isIE;if(n){var o=function(){};e.watchShadow=o,e.upgrade=o,e.upgradeAll=o,e.upgradeDocumentTree=o,e.upgradeSubtree=o,e.takeRecords=o,e["instanceof"]=function(e,t){return e instanceof t}}else r();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),function(e){Function.prototype.bind||(Function.prototype.bind=function(e){var t=this,n=Array.prototype.slice.call(arguments,1);return function(){var r=n.slice();return r.push.apply(r,arguments),t.apply(e,r)}})}(window.WebComponents),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents),function(e){window.Platform=e}(window.WebComponents);
- },{}],"xhr-proxy":[function(require,module,exports){
- // Copyright (c) Microsoft Corporation. All rights reserved.
- // Based in part on code from Apache Ripple, https://github.com/apache/incubator-ripple
-
- var utils = require('utils');
-
- var init = function () {
- var _XMLHttpRequest = XMLHttpRequest;
- window.XMLHttpRequest = function () {
- var xhr = new _XMLHttpRequest(),
- origMethods = {
- setRequestHeader: xhr.setRequestHeader,
- open: xhr.open
- };
-
- xhr.open = function (method, url) {
- var sameOrigin = utils.isSameOriginRequest(url);
-
- if (!sameOrigin) {
- url = '/xhr_proxy?rurl=' + escape(url);
- }
-
- origMethods.open.apply(xhr, Array.prototype.slice.call(arguments));
- };
-
- return xhr;
- };
-
- // Ensure that we retain all static properties, such as DONE
- window.XMLHttpRequest.__proto__ = _XMLHttpRequest;
- };
-
- module.exports = {
- init: init
- };
-
- },{"utils":"utils"}]},{},[9])
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL25vZGVfbW9kdWxlcy9xL3EuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL2RldmljZXMvb3MtdmVyc2lvbnMuanNvbiIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvcGx1Z2lucy9jb3Jkb3ZhLXBsdWdpbi1kZXZpY2UvZGV2aWNlLW1vZGVsLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9wbHVnaW5zL2NvcmRvdmEtcGx1Z2luLWdlb2xvY2F0aW9uL1Bvc2l0aW9uRXJyb3IuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL3BsdWdpbnMvY29yZG92YS1wbHVnaW4tZ2VvbG9jYXRpb24vZ2VvLW1vZGVsLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9wbHVnaW5zL2V4ZWMvc2F2ZWQtc2ltcy5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvc2ltLWhvc3QvcHJvdG9jb2wvc29ja2V0LmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9zaW0taG9zdC91aS9jdXN0b20tZWxlbWVudHMuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL3NpbS1ob3N0L3VpL3NpbS1ob3N0LmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL3BsYXRmb3Jtcy9hbmRyb2lkL3NpbS1ob3N0LWhhbmRsZXJzLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9tb2R1bGVzL2FyZ3NjaGVjay5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvcGx1Z2lucy9jb3Jkb3ZhLXBsdWdpbi1jYW1lcmEvc2ltLWhvc3QuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL3BsdWdpbnMvY29yZG92YS1wbHVnaW4tZGV2aWNlL3NpbS1ob3N0LWhhbmRsZXJzLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9wbHVnaW5zL2NvcmRvdmEtcGx1Z2luLWRldmljZS9zaW0taG9zdC5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvcGx1Z2lucy9jb3Jkb3ZhLXBsdWdpbi1nZW9sb2NhdGlvbi9zaW0taG9zdC1oYW5kbGVycy5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvcGx1Z2lucy9jb3Jkb3ZhLXBsdWdpbi1nZW9sb2NhdGlvbi9zaW0taG9zdC5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvcGx1Z2lucy9jb3Jkb3ZhLXBsdWdpbi1zdGF0dXNiYXIvc2ltLWhvc3QtaGFuZGxlcnMuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL21vZHVsZXMvZGIuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL21vZHVsZXMvc2ltLWhvc3QvZGlhbG9nLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9wbHVnaW5zL2V2ZW50cy9zaW0taG9zdC5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvbW9kdWxlcy9ldmVudC5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvbW9kdWxlcy9leGNlcHRpb24uanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL3BsdWdpbnMvZXhlYy9zaW0taG9zdC1oYW5kbGVycy5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvcGx1Z2lucy9leGVjL3NpbS1ob3N0LmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy90aGlyZC1wYXJ0eS9qcXVlcnkubWluLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9tb2R1bGVzL21lc3NhZ2VzLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9tb2R1bGVzL3BvbHlmaWxscy5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvbW9kdWxlcy9zaW0tY29uc3RhbnRzLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9tb2R1bGVzL3NpbS1ob3N0L3NpbS1zdGF0dXMuanMiLCJDOi9Qcm9ncmFtRGF0YS9NaWNyb3NvZnQvVmlzdWFsU3R1ZGlvL01EQS83NzRhZWQ2OS90YWNvLXRvb2xzZXQtNi4zLjEvbm9kZV9tb2R1bGVzL2NvcmRvdmEtc2ltdWxhdGUvc3JjL3RoaXJkLXBhcnR5L3NvY2tldC5pby5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvbW9kdWxlcy90ZWxlbWV0cnktaGVscGVyLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy9tb2R1bGVzL3V0aWxzLmpzIiwiQzovUHJvZ3JhbURhdGEvTWljcm9zb2Z0L1Zpc3VhbFN0dWRpby9NREEvNzc0YWVkNjkvdGFjby10b29sc2V0LTYuMy4xL25vZGVfbW9kdWxlcy9jb3Jkb3ZhLXNpbXVsYXRlL3NyYy90aGlyZC1wYXJ0eS93ZWJjb21wb25lbnRzLm1pbi5qcyIsIkM6L1Byb2dyYW1EYXRhL01pY3Jvc29mdC9WaXN1YWxTdHVkaW8vTURBLzc3NGFlZDY5L3RhY28tdG9vbHNldC02LjMuMS9ub2RlX21vZHVsZXMvY29yZG92YS1zaW11bGF0ZS9zcmMvbW9kdWxlcy94aHItcHJveHkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDaGdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMXVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIvLyB2aW06dHM9NDpzdHM9NDpzdz00OlxuLyohXG4gKlxuICogQ29weXJpZ2h0IDIwMDktMjAxMiBLcmlzIEtvd2FsIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTUlUXG4gKiBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9naXRodWIuY29tL2tyaXNrb3dhbC9xL3Jhdy9tYXN0ZXIvTElDRU5TRVxuICpcbiAqIFdpdGggcGFydHMgYnkgVHlsZXIgQ2xvc2VcbiAqIENvcHlyaWdodCAyMDA3LTIwMDkgVHlsZXIgQ2xvc2UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgWCBsaWNlbnNlIGZvdW5kXG4gKiBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLmh0bWxcbiAqIEZvcmtlZCBhdCByZWZfc2VuZC5qcyB2ZXJzaW9uOiAyMDA5LTA1LTExXG4gKlxuICogV2l0aCBwYXJ0cyBieSBNYXJrIE1pbGxlclxuICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICovXG5cbihmdW5jdGlvbiAoZGVmaW5pdGlvbikge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gVGhpcyBmaWxlIHdpbGwgZnVuY3Rpb24gcHJvcGVybHkgYXMgYSA8c2NyaXB0PiB0YWcsIG9yIGEgbW9kdWxlXG4gICAgLy8gdXNpbmcgQ29tbW9uSlMgYW5kIE5vZGVKUyBvciBSZXF1aXJlSlMgbW9kdWxlIGZvcm1hdHMuICBJblxuICAgIC8vIENvbW1vbi9Ob2RlL1JlcXVpcmVKUywgdGhlIG1vZHVsZSBleHBvcnRzIHRoZSBRIEFQSSBhbmQgd2hlblxuICAgIC8vIGV4ZWN1dGVkIGFzIGEgc2ltcGxlIDxzY3JpcHQ+LCBpdCBjcmVhdGVzIGEgUSBnbG9iYWwgaW5zdGVhZC5cblxuICAgIC8vIE1vbnRhZ2UgUmVxdWlyZVxuICAgIGlmICh0eXBlb2YgYm9vdHN0cmFwID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgYm9vdHN0cmFwKFwicHJvbWlzZVwiLCBkZWZpbml0aW9uKTtcblxuICAgIC8vIENvbW1vbkpTXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuXG4gICAgLy8gUmVxdWlyZUpTXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUoZGVmaW5pdGlvbik7XG5cbiAgICAvLyBTRVMgKFNlY3VyZSBFY21hU2NyaXB0KVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlcyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAoIXNlcy5vaygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXMubWFrZVEgPSBkZWZpbml0aW9uO1xuICAgICAgICB9XG5cbiAgICAvLyA8c2NyaXB0PlxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAvLyBQcmVmZXIgd2luZG93IG92ZXIgc2VsZiBmb3IgYWRkLW9uIHNjcmlwdHMuIFVzZSBzZWxmIGZvclxuICAgICAgICAvLyBub24td2luZG93ZWQgY29udGV4dHMuXG4gICAgICAgIHZhciBnbG9iYWwgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogc2VsZjtcblxuICAgICAgICAvLyBHZXQgdGhlIGB3aW5kb3dgIG9iamVjdCwgc2F2ZSB0aGUgcHJldmlvdXMgUSBnbG9iYWxcbiAgICAgICAgLy8gYW5kIGluaXRpYWxpemUgUSBhcyBhIGdsb2JhbC5cbiAgICAgICAgdmFyIHByZXZpb3VzUSA9IGdsb2JhbC5RO1xuICAgICAgICBnbG9iYWwuUSA9IGRlZmluaXRpb24oKTtcblxuICAgICAgICAvLyBBZGQgYSBub0NvbmZsaWN0IGZ1bmN0aW9uIHNvIFEgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGVcbiAgICAgICAgLy8gZ2xvYmFsIG5hbWVzcGFjZS5cbiAgICAgICAgZ2xvYmFsLlEubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGdsb2JhbC5RID0gcHJldmlvdXNRO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGVudmlyb25tZW50IHdhcyBub3QgYW50aWNpcGF0ZWQgYnkgUS4gUGxlYXNlIGZpbGUgYSBidWcuXCIpO1xuICAgIH1cblxufSkoZnVuY3Rpb24gKCkge1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBoYXNTdGFja3MgPSBmYWxzZTtcbnRyeSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCk7XG59IGNhdGNoIChlKSB7XG4gICAgaGFzU3RhY2tzID0gISFlLnN0YWNrO1xufVxuXG4vLyBBbGwgY29kZSBhZnRlciB0aGlzIHBvaW50IHdpbGwgYmUgZmlsdGVyZWQgZnJvbSBzdGFjayB0cmFjZXMgcmVwb3J0ZWRcbi8vIGJ5IFEuXG52YXIgcVN0YXJ0aW5nTGluZSA9IGNhcHR1cmVMaW5lKCk7XG52YXIgcUZpbGVOYW1lO1xuXG4vLyBzaGltc1xuXG4vLyB1c2VkIGZvciBmYWxsYmFjayBpbiBcImFsbFJlc29sdmVkXCJcbnZhciBub29wID0gZnVuY3Rpb24gKCkge307XG5cbi8vIFVzZSB0aGUgZmFzdGVzdCBwb3NzaWJsZSBtZWFucyB0byBleGVjdXRlIGEgdGFzayBpbiBhIGZ1dHVyZSB0dXJuXG4vLyBvZiB0aGUgZXZlbnQgbG9vcC5cbnZhciBuZXh0VGljayA9KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBsaW5rZWQgbGlzdCBvZiB0YXNrcyAoc2luZ2xlLCB3aXRoIGhlYWQgbm9kZSlcbiAgICB2YXIgaGVhZCA9IHt0YXNrOiB2b2lkIDAsIG5leHQ6IG51bGx9O1xuICAgIHZhciB0YWlsID0gaGVhZDtcbiAgICB2YXIgZmx1c2hpbmcgPSBmYWxzZTtcbiAgICB2YXIgcmVxdWVzdFRpY2sgPSB2b2lkIDA7XG4gICAgdmFyIGlzTm9kZUpTID0gZmFsc2U7XG4gICAgLy8gcXVldWUgZm9yIGxhdGUgdGFza3MsIHVzZWQgYnkgdW5oYW5kbGVkIHJlamVjdGlvbiB0cmFja2luZ1xuICAgIHZhciBsYXRlclF1ZXVlID0gW107XG5cbiAgICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgICAgLyoganNoaW50IGxvb3BmdW5jOiB0cnVlICovXG4gICAgICAgIHZhciB0YXNrLCBkb21haW47XG5cbiAgICAgICAgd2hpbGUgKGhlYWQubmV4dCkge1xuICAgICAgICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgICAgICAgIHRhc2sgPSBoZWFkLnRhc2s7XG4gICAgICAgICAgICBoZWFkLnRhc2sgPSB2b2lkIDA7XG4gICAgICAgICAgICBkb21haW4gPSBoZWFkLmRvbWFpbjtcblxuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICAgIGhlYWQuZG9tYWluID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcnVuU2luZ2xlKHRhc2ssIGRvbWFpbik7XG5cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobGF0ZXJRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRhc2sgPSBsYXRlclF1ZXVlLnBvcCgpO1xuICAgICAgICAgICAgcnVuU2luZ2xlKHRhc2spO1xuICAgICAgICB9XG4gICAgICAgIGZsdXNoaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIC8vIHJ1bnMgYSBzaW5nbGUgZnVuY3Rpb24gaW4gdGhlIGFzeW5jIHF1ZXVlXG4gICAgZnVuY3Rpb24gcnVuU2luZ2xlKHRhc2ssIGRvbWFpbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGFzaygpO1xuXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChpc05vZGVKUykge1xuICAgICAgICAgICAgICAgIC8vIEluIG5vZGUsIHVuY2F1Z2h0IGV4Y2VwdGlvbnMgYXJlIGNvbnNpZGVyZWQgZmF0YWwgZXJyb3JzLlxuICAgICAgICAgICAgICAgIC8vIFJlLXRocm93IHRoZW0gc3luY2hyb25vdXNseSB0byBpbnRlcnJ1cHQgZmx1c2hpbmchXG5cbiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgY29udGludWF0aW9uIGlmIHRoZSB1bmNhdWdodCBleGNlcHRpb24gaXMgc3VwcHJlc3NlZFxuICAgICAgICAgICAgICAgIC8vIGxpc3RlbmluZyBcInVuY2F1Z2h0RXhjZXB0aW9uXCIgZXZlbnRzIChhcyBkb21haW5zIGRvZXMpLlxuICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIGluIG5leHQgZXZlbnQgdG8gYXZvaWQgdGljayByZWN1cnNpb24uXG4gICAgICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZsdXNoLCAwKTtcbiAgICAgICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgICAgICAgIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRocm93IGU7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gYnJvd3NlcnMsIHVuY2F1Z2h0IGV4Y2VwdGlvbnMgYXJlIG5vdCBmYXRhbC5cbiAgICAgICAgICAgICAgICAvLyBSZS10aHJvdyB0aGVtIGFzeW5jaHJvbm91c2x5IHRvIGF2b2lkIHNsb3ctZG93bnMuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmV4dFRpY2sgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgICB0YWlsID0gdGFpbC5uZXh0ID0ge1xuICAgICAgICAgICAgdGFzazogdGFzayxcbiAgICAgICAgICAgIGRvbWFpbjogaXNOb2RlSlMgJiYgcHJvY2Vzcy5kb21haW4sXG4gICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCFmbHVzaGluZykge1xuICAgICAgICAgICAgZmx1c2hpbmcgPSB0cnVlO1xuICAgICAgICAgICAgcmVxdWVzdFRpY2soKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgcHJvY2Vzcy50b1N0cmluZygpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIiAmJiBwcm9jZXNzLm5leHRUaWNrKSB7XG4gICAgICAgIC8vIEVuc3VyZSBRIGlzIGluIGEgcmVhbCBOb2RlIGVudmlyb25tZW50LCB3aXRoIGEgYHByb2Nlc3MubmV4dFRpY2tgLlxuICAgICAgICAvLyBUbyBzZWUgdGhyb3VnaCBmYWtlIE5vZGUgZW52aXJvbm1lbnRzOlxuICAgICAgICAvLyAqIE1vY2hhIHRlc3QgcnVubmVyIC0gZXhwb3NlcyBhIGBwcm9jZXNzYCBnbG9iYWwgd2l0aG91dCBhIGBuZXh0VGlja2BcbiAgICAgICAgLy8gKiBCcm93c2VyaWZ5IC0gZXhwb3NlcyBhIGBwcm9jZXNzLm5leFRpY2tgIGZ1bmN0aW9uIHRoYXQgdXNlc1xuICAgICAgICAvLyAgIGBzZXRUaW1lb3V0YC4gSW4gdGhpcyBjYXNlIGBzZXRJbW1lZGlhdGVgIGlzIHByZWZlcnJlZCBiZWNhdXNlXG4gICAgICAgIC8vICAgIGl0IGlzIGZhc3Rlci4gQnJvd3NlcmlmeSdzIGBwcm9jZXNzLnRvU3RyaW5nKClgIHlpZWxkc1xuICAgICAgICAvLyAgIFwiW29iamVjdCBPYmplY3RdXCIsIHdoaWxlIGluIGEgcmVhbCBOb2RlIGVudmlyb25tZW50XG4gICAgICAgIC8vICAgYHByb2Nlc3MubmV4dFRpY2soKWAgeWllbGRzIFwiW29iamVjdCBwcm9jZXNzXVwiLlxuICAgICAgICBpc05vZGVKUyA9IHRydWU7XG5cbiAgICAgICAgcmVxdWVzdFRpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICAgICAgfTtcblxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIC8vIEluIElFMTAsIE5vZGUuanMgMC45Kywgb3IgaHR0cHM6Ly9naXRodWIuY29tL05vYmxlSlMvc2V0SW1tZWRpYXRlXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXF1ZXN0VGljayA9IHNldEltbWVkaWF0ZS5iaW5kKHdpbmRvdywgZmx1c2gpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVxdWVzdFRpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGZsdXNoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAodHlwZW9mIE1lc3NhZ2VDaGFubmVsICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIC8vIG1vZGVybiBicm93c2Vyc1xuICAgICAgICAvLyBodHRwOi8vd3d3Lm5vbmJsb2NraW5nLmlvLzIwMTEvMDYvd2luZG93bmV4dHRpY2suaHRtbFxuICAgICAgICB2YXIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICAvLyBBdCBsZWFzdCBTYWZhcmkgVmVyc2lvbiA2LjAuNSAoODUzNi4zMC4xKSBpbnRlcm1pdHRlbnRseSBjYW5ub3QgY3JlYXRlXG4gICAgICAgIC8vIHdvcmtpbmcgbWVzc2FnZSBwb3J0cyB0aGUgZmlyc3QgdGltZSBhIHBhZ2UgbG9hZHMuXG4gICAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVxdWVzdFRpY2sgPSByZXF1ZXN0UG9ydFRpY2s7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGZsdXNoO1xuICAgICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHJlcXVlc3RQb3J0VGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIE9wZXJhIHJlcXVpcmVzIHVzIHRvIHByb3ZpZGUgYSBtZXNzYWdlIHBheWxvYWQsIHJlZ2FyZGxlc3Mgb2ZcbiAgICAgICAgICAgIC8vIHdoZXRoZXIgd2UgdXNlIGl0LlxuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgwKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdFRpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZsdXNoLCAwKTtcbiAgICAgICAgICAgIHJlcXVlc3RQb3J0VGljaygpO1xuICAgICAgICB9O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb2xkIGJyb3dzZXJzXG4gICAgICAgIHJlcXVlc3RUaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2V0VGltZW91dChmbHVzaCwgMCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIHJ1bnMgYSB0YXNrIGFmdGVyIGFsbCBvdGhlciB0YXNrcyBoYXZlIGJlZW4gcnVuXG4gICAgLy8gdGhpcyBpcyB1c2VmdWwgZm9yIHVuaGFuZGxlZCByZWplY3Rpb24gdHJhY2tpbmcgdGhhdCBuZWVkcyB0byBoYXBwZW5cbiAgICAvLyBhZnRlciBhbGwgYHRoZW5gZCB0YXNrcyBoYXZlIGJlZW4gcnVuLlxuICAgIG5leHRUaWNrLnJ1bkFmdGVyID0gZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgICAgbGF0ZXJRdWV1ZS5wdXNoKHRhc2spO1xuICAgICAgICBpZiAoIWZsdXNoaW5nKSB7XG4gICAgICAgICAgICBmbHVzaGluZyA9IHRydWU7XG4gICAgICAgICAgICByZXF1ZXN0VGljaygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gbmV4dFRpY2s7XG59KSgpO1xuXG4vLyBBdHRlbXB0IHRvIG1ha2UgZ2VuZXJpY3Mgc2FmZSBpbiB0aGUgZmFjZSBvZiBkb3duc3RyZWFtXG4vLyBtb2RpZmljYXRpb25zLlxuLy8gVGhlcmUgaXMgbm8gc2l0dWF0aW9uIHdoZXJlIHRoaXMgaXMgbmVjZXNzYXJ5LlxuLy8gSWYgeW91IG5lZWQgYSBzZWN1cml0eSBndWFyYW50ZWUsIHRoZXNlIHByaW1vcmRpYWxzIG5lZWQgdG8gYmVcbi8vIGRlZXBseSBmcm96ZW4gYW55d2F5LCBhbmQgaWYgeW91IGRvbuKAmXQgbmVlZCBhIHNlY3VyaXR5IGd1YXJhbnRlZSxcbi8vIHRoaXMgaXMganVzdCBwbGFpbiBwYXJhbm9pZC5cbi8vIEhvd2V2ZXIsIHRoaXMgKiptaWdodCoqIGhhdmUgdGhlIG5pY2Ugc2lkZS1lZmZlY3Qgb2YgcmVkdWNpbmcgdGhlIHNpemUgb2Zcbi8vIHRoZSBtaW5pZmllZCBjb2RlIGJ5IHJlZHVjaW5nIHguY2FsbCgpIHRvIG1lcmVseSB4KClcbi8vIFNlZSBNYXJrIE1pbGxlcuKAmXMgZXhwbGFuYXRpb24gb2Ygd2hhdCB0aGlzIGRvZXMuXG4vLyBodHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1jb252ZW50aW9uczpzYWZlX21ldGFfcHJvZ3JhbW1pbmdcbnZhciBjYWxsID0gRnVuY3Rpb24uY2FsbDtcbmZ1bmN0aW9uIHVuY3VycnlUaGlzKGYpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gY2FsbC5hcHBseShmLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG4vLyBUaGlzIGlzIGVxdWl2YWxlbnQsIGJ1dCBzbG93ZXI6XG4vLyB1bmN1cnJ5VGhpcyA9IEZ1bmN0aW9uX2JpbmQuYmluZChGdW5jdGlvbl9iaW5kLmNhbGwpO1xuLy8gaHR0cDovL2pzcGVyZi5jb20vdW5jdXJyeXRoaXNcblxudmFyIGFycmF5X3NsaWNlID0gdW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLnNsaWNlKTtcblxudmFyIGFycmF5X3JlZHVjZSA9IHVuY3VycnlUaGlzKFxuICAgIEFycmF5LnByb3RvdHlwZS5yZWR1Y2UgfHwgZnVuY3Rpb24gKGNhbGxiYWNrLCBiYXNpcykge1xuICAgICAgICB2YXIgaW5kZXggPSAwLFxuICAgICAgICAgICAgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgICAgIC8vIGNvbmNlcm5pbmcgdGhlIGluaXRpYWwgdmFsdWUsIGlmIG9uZSBpcyBub3QgcHJvdmlkZWRcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIC8vIHNlZWsgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBhcnJheSwgYWNjb3VudGluZ1xuICAgICAgICAgICAgLy8gZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGlzIGlzIGEgc3BhcnNlIGFycmF5XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IGluIHRoaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYmFzaXMgPSB0aGlzW2luZGV4KytdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCsraW5kZXggPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlICgxKTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZWR1Y2VcbiAgICAgICAgZm9yICg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAvLyBhY2NvdW50IGZvciB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgYXJyYXkgaXMgc3BhcnNlXG4gICAgICAgICAgICBpZiAoaW5kZXggaW4gdGhpcykge1xuICAgICAgICAgICAgICAgIGJhc2lzID0gY2FsbGJhY2soYmFzaXMsIHRoaXNbaW5kZXhdLCBpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJhc2lzO1xuICAgIH1cbik7XG5cbnZhciBhcnJheV9pbmRleE9mID0gdW5jdXJyeVRoaXMoXG4gICAgQXJyYXkucHJvdG90eXBlLmluZGV4T2YgfHwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIC8vIG5vdCBhIHZlcnkgZ29vZCBzaGltLCBidXQgZ29vZCBlbm91Z2ggZm9yIG91ciBvbmUgdXNlIG9mIGl0XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXNbaV0gPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbik7XG5cbnZhciBhcnJheV9tYXAgPSB1bmN1cnJ5VGhpcyhcbiAgICBBcnJheS5wcm90b3R5cGUubWFwIHx8IGZ1bmN0aW9uIChjYWxsYmFjaywgdGhpc3ApIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB2YXIgY29sbGVjdCA9IFtdO1xuICAgICAgICBhcnJheV9yZWR1Y2Uoc2VsZiwgZnVuY3Rpb24gKHVuZGVmaW5lZCwgdmFsdWUsIGluZGV4KSB7XG4gICAgICAgICAgICBjb2xsZWN0LnB1c2goY2FsbGJhY2suY2FsbCh0aGlzcCwgdmFsdWUsIGluZGV4LCBzZWxmKSk7XG4gICAgICAgIH0sIHZvaWQgMCk7XG4gICAgICAgIHJldHVybiBjb2xsZWN0O1xuICAgIH1cbik7XG5cbnZhciBvYmplY3RfY3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiAocHJvdG90eXBlKSB7XG4gICAgZnVuY3Rpb24gVHlwZSgpIHsgfVxuICAgIFR5cGUucHJvdG90eXBlID0gcHJvdG90eXBlO1xuICAgIHJldHVybiBuZXcgVHlwZSgpO1xufTtcblxudmFyIG9iamVjdF9oYXNPd25Qcm9wZXJ0eSA9IHVuY3VycnlUaGlzKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO1xuXG52YXIgb2JqZWN0X2tleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3RfaGFzT3duUHJvcGVydHkob2JqZWN0LCBrZXkpKSB7XG4gICAgICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5cztcbn07XG5cbnZhciBvYmplY3RfdG9TdHJpbmcgPSB1bmN1cnJ5VGhpcyhPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKTtcblxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IE9iamVjdCh2YWx1ZSk7XG59XG5cbi8vIGdlbmVyYXRvciByZWxhdGVkIHNoaW1zXG5cbi8vIEZJWE1FOiBSZW1vdmUgdGhpcyBmdW5jdGlvbiBvbmNlIEVTNiBnZW5lcmF0b3JzIGFyZSBpbiBTcGlkZXJNb25rZXkuXG5mdW5jdGlvbiBpc1N0b3BJdGVyYXRpb24oZXhjZXB0aW9uKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgb2JqZWN0X3RvU3RyaW5nKGV4Y2VwdGlvbikgPT09IFwiW29iamVjdCBTdG9wSXRlcmF0aW9uXVwiIHx8XG4gICAgICAgIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFFSZXR1cm5WYWx1ZVxuICAgICk7XG59XG5cbi8vIEZJWE1FOiBSZW1vdmUgdGhpcyBoZWxwZXIgYW5kIFEucmV0dXJuIG9uY2UgRVM2IGdlbmVyYXRvcnMgYXJlIGluXG4vLyBTcGlkZXJNb25rZXkuXG52YXIgUVJldHVyblZhbHVlO1xuaWYgKHR5cGVvZiBSZXR1cm5WYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIFFSZXR1cm5WYWx1ZSA9IFJldHVyblZhbHVlO1xufSBlbHNlIHtcbiAgICBRUmV0dXJuVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH07XG59XG5cbi8vIGxvbmcgc3RhY2sgdHJhY2VzXG5cbnZhciBTVEFDS19KVU1QX1NFUEFSQVRPUiA9IFwiRnJvbSBwcmV2aW91cyBldmVudDpcIjtcblxuZnVuY3Rpb24gbWFrZVN0YWNrVHJhY2VMb25nKGVycm9yLCBwcm9taXNlKSB7XG4gICAgLy8gSWYgcG9zc2libGUsIHRyYW5zZm9ybSB0aGUgZXJyb3Igc3RhY2sgdHJhY2UgYnkgcmVtb3ZpbmcgTm9kZSBhbmQgUVxuICAgIC8vIGNydWZ0LCB0aGVuIGNvbmNhdGVuYXRpbmcgd2l0aCB0aGUgc3RhY2sgdHJhY2Ugb2YgYHByb21pc2VgLiBTZWUgIzU3LlxuICAgIGlmIChoYXNTdGFja3MgJiZcbiAgICAgICAgcHJvbWlzZS5zdGFjayAmJlxuICAgICAgICB0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgZXJyb3IgIT09IG51bGwgJiZcbiAgICAgICAgZXJyb3Iuc3RhY2sgJiZcbiAgICAgICAgZXJyb3Iuc3RhY2suaW5kZXhPZihTVEFDS19KVU1QX1NFUEFSQVRPUikgPT09IC0xXG4gICAgKSB7XG4gICAgICAgIHZhciBzdGFja3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgcCA9IHByb21pc2U7ICEhcDsgcCA9IHAuc291cmNlKSB7XG4gICAgICAgICAgICBpZiAocC5zdGFjaykge1xuICAgICAgICAgICAgICAgIHN0YWNrcy51bnNoaWZ0KHAuc3RhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YWNrcy51bnNoaWZ0KGVycm9yLnN0YWNrKTtcblxuICAgICAgICB2YXIgY29uY2F0ZWRTdGFja3MgPSBzdGFja3Muam9pbihcIlxcblwiICsgU1RBQ0tfSlVNUF9TRVBBUkFUT1IgKyBcIlxcblwiKTtcbiAgICAgICAgZXJyb3Iuc3RhY2sgPSBmaWx0ZXJTdGFja1N0cmluZyhjb25jYXRlZFN0YWNrcyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmaWx0ZXJTdGFja1N0cmluZyhzdGFja1N0cmluZykge1xuICAgIHZhciBsaW5lcyA9IHN0YWNrU3RyaW5nLnNwbGl0KFwiXFxuXCIpO1xuICAgIHZhciBkZXNpcmVkTGluZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBsaW5lID0gbGluZXNbaV07XG5cbiAgICAgICAgaWYgKCFpc0ludGVybmFsRnJhbWUobGluZSkgJiYgIWlzTm9kZUZyYW1lKGxpbmUpICYmIGxpbmUpIHtcbiAgICAgICAgICAgIGRlc2lyZWRMaW5lcy5wdXNoKGxpbmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZXNpcmVkTGluZXMuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gaXNOb2RlRnJhbWUoc3RhY2tMaW5lKSB7XG4gICAgcmV0dXJuIHN0YWNrTGluZS5pbmRleE9mKFwiKG1vZHVsZS5qczpcIikgIT09IC0xIHx8XG4gICAgICAgICAgIHN0YWNrTGluZS5pbmRleE9mKFwiKG5vZGUuanM6XCIpICE9PSAtMTtcbn1cblxuZnVuY3Rpb24gZ2V0RmlsZU5hbWVBbmRMaW5lTnVtYmVyKHN0YWNrTGluZSkge1xuICAgIC8vIE5hbWVkIGZ1bmN0aW9uczogXCJhdCBmdW5jdGlvbk5hbWUgKGZpbGVuYW1lOmxpbmVOdW1iZXI6Y29sdW1uTnVtYmVyKVwiXG4gICAgLy8gSW4gSUUxMCBmdW5jdGlvbiBuYW1lIGNhbiBoYXZlIHNwYWNlcyAoXCJBbm9ueW1vdXMgZnVuY3Rpb25cIikgT19vXG4gICAgdmFyIGF0dGVtcHQxID0gL2F0IC4rIFxcKCguKyk6KFxcZCspOig/OlxcZCspXFwpJC8uZXhlYyhzdGFja0xpbmUpO1xuICAgIGlmIChhdHRlbXB0MSkge1xuICAgICAgICByZXR1cm4gW2F0dGVtcHQxWzFdLCBOdW1iZXIoYXR0ZW1wdDFbMl0pXTtcbiAgICB9XG5cbiAgICAvLyBBbm9ueW1vdXMgZnVuY3Rpb25zOiBcImF0IGZpbGVuYW1lOmxpbmVOdW1iZXI6Y29sdW1uTnVtYmVyXCJcbiAgICB2YXIgYXR0ZW1wdDIgPSAvYXQgKFteIF0rKTooXFxkKyk6KD86XFxkKykkLy5leGVjKHN0YWNrTGluZSk7XG4gICAgaWYgKGF0dGVtcHQyKSB7XG4gICAgICAgIHJldHVybiBbYXR0ZW1wdDJbMV0sIE51bWJlcihhdHRlbXB0MlsyXSldO1xuICAgIH1cblxuICAgIC8vIEZpcmVmb3ggc3R5bGU6IFwiZnVuY3Rpb25AZmlsZW5hbWU6bGluZU51bWJlciBvciBAZmlsZW5hbWU6bGluZU51bWJlclwiXG4gICAgdmFyIGF0dGVtcHQzID0gLy4qQCguKyk6KFxcZCspJC8uZXhlYyhzdGFja0xpbmUpO1xuICAgIGlmIChhdHRlbXB0Mykge1xuICAgICAgICByZXR1cm4gW2F0dGVtcHQzWzFdLCBOdW1iZXIoYXR0ZW1wdDNbMl0pXTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzSW50ZXJuYWxGcmFtZShzdGFja0xpbmUpIHtcbiAgICB2YXIgZmlsZU5hbWVBbmRMaW5lTnVtYmVyID0gZ2V0RmlsZU5hbWVBbmRMaW5lTnVtYmVyKHN0YWNrTGluZSk7XG5cbiAgICBpZiAoIWZpbGVOYW1lQW5kTGluZU51bWJlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGZpbGVOYW1lID0gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzBdO1xuICAgIHZhciBsaW5lTnVtYmVyID0gZmlsZU5hbWVBbmRMaW5lTnVtYmVyWzFdO1xuXG4gICAgcmV0dXJuIGZpbGVOYW1lID09PSBxRmlsZU5hbWUgJiZcbiAgICAgICAgbGluZU51bWJlciA+PSBxU3RhcnRpbmdMaW5lICYmXG4gICAgICAgIGxpbmVOdW1iZXIgPD0gcUVuZGluZ0xpbmU7XG59XG5cbi8vIGRpc2NvdmVyIG93biBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIHJhbmdlIGZvciBmaWx0ZXJpbmcgc3RhY2tcbi8vIHRyYWNlc1xuZnVuY3Rpb24gY2FwdHVyZUxpbmUoKSB7XG4gICAgaWYgKCFoYXNTdGFja3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdmFyIGxpbmVzID0gZS5zdGFjay5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgdmFyIGZpcnN0TGluZSA9IGxpbmVzWzBdLmluZGV4T2YoXCJAXCIpID4gMCA/IGxpbmVzWzFdIDogbGluZXNbMl07XG4gICAgICAgIHZhciBmaWxlTmFtZUFuZExpbmVOdW1iZXIgPSBnZXRGaWxlTmFtZUFuZExpbmVOdW1iZXIoZmlyc3RMaW5lKTtcbiAgICAgICAgaWYgKCFmaWxlTmFtZUFuZExpbmVOdW1iZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHFGaWxlTmFtZSA9IGZpbGVOYW1lQW5kTGluZU51bWJlclswXTtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lQW5kTGluZU51bWJlclsxXTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZShjYWxsYmFjaywgbmFtZSwgYWx0ZXJuYXRpdmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IFwidW5kZWZpbmVkXCIgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlLndhcm4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKG5hbWUgKyBcIiBpcyBkZXByZWNhdGVkLCB1c2UgXCIgKyBhbHRlcm5hdGl2ZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgXCIgaW5zdGVhZC5cIiwgbmV3IEVycm9yKFwiXCIpLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkoY2FsbGJhY2ssIGFyZ3VtZW50cyk7XG4gICAgfTtcbn1cblxuLy8gZW5kIG9mIHNoaW1zXG4vLyBiZWdpbm5pbmcgb2YgcmVhbCB3b3JrXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIHByb21pc2UgZm9yIGFuIGltbWVkaWF0ZSByZWZlcmVuY2UsIHBhc3NlcyBwcm9taXNlcyB0aHJvdWdoLCBvclxuICogY29lcmNlcyBwcm9taXNlcyBmcm9tIGRpZmZlcmVudCBzeXN0ZW1zLlxuICogQHBhcmFtIHZhbHVlIGltbWVkaWF0ZSByZWZlcmVuY2Ugb3IgcHJvbWlzZVxuICovXG5mdW5jdGlvbiBRKHZhbHVlKSB7XG4gICAgLy8gSWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGEgUHJvbWlzZSwgcmV0dXJuIGl0IGRpcmVjdGx5LiAgVGhpcyBlbmFibGVzXG4gICAgLy8gdGhlIHJlc29sdmUgZnVuY3Rpb24gdG8gYm90aCBiZSB1c2VkIHRvIGNyZWF0ZWQgcmVmZXJlbmNlcyBmcm9tIG9iamVjdHMsXG4gICAgLy8gYnV0IHRvIHRvbGVyYWJseSBjb2VyY2Ugbm9uLXByb21pc2VzIHRvIHByb21pc2VzLlxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8vIGFzc2ltaWxhdGUgdGhlbmFibGVzXG4gICAgaWYgKGlzUHJvbWlzZUFsaWtlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gY29lcmNlKHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZnVsZmlsbCh2YWx1ZSk7XG4gICAgfVxufVxuUS5yZXNvbHZlID0gUTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIHRhc2sgaW4gYSBmdXR1cmUgdHVybiBvZiB0aGUgZXZlbnQgbG9vcC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHRhc2tcbiAqL1xuUS5uZXh0VGljayA9IG5leHRUaWNrO1xuXG4vKipcbiAqIENvbnRyb2xzIHdoZXRoZXIgb3Igbm90IGxvbmcgc3RhY2sgdHJhY2VzIHdpbGwgYmUgb25cbiAqL1xuUS5sb25nU3RhY2tTdXBwb3J0ID0gZmFsc2U7XG5cbi8vIGVuYWJsZSBsb25nIHN0YWNrcyBpZiBRX0RFQlVHIGlzIHNldFxuaWYgKHR5cGVvZiBwcm9jZXNzID09PSBcIm9iamVjdFwiICYmIHByb2Nlc3MgJiYgcHJvY2Vzcy5lbnYgJiYgcHJvY2Vzcy5lbnYuUV9ERUJVRykge1xuICAgIFEubG9uZ1N0YWNrU3VwcG9ydCA9IHRydWU7XG59XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIHtwcm9taXNlLCByZXNvbHZlLCByZWplY3R9IG9iamVjdC5cbiAqXG4gKiBgcmVzb2x2ZWAgaXMgYSBjYWxsYmFjayB0byBpbnZva2Ugd2l0aCBhIG1vcmUgcmVzb2x2ZWQgdmFsdWUgZm9yIHRoZVxuICogcHJvbWlzZS4gVG8gZnVsZmlsbCB0aGUgcHJvbWlzZSwgaW52b2tlIGByZXNvbHZlYCB3aXRoIGFueSB2YWx1ZSB0aGF0IGlzXG4gKiBub3QgYSB0aGVuYWJsZS4gVG8gcmVqZWN0IHRoZSBwcm9taXNlLCBpbnZva2UgYHJlc29sdmVgIHdpdGggYSByZWplY3RlZFxuICogdGhlbmFibGUsIG9yIGludm9rZSBgcmVqZWN0YCB3aXRoIHRoZSByZWFzb24gZGlyZWN0bHkuIFRvIHJlc29sdmUgdGhlXG4gKiBwcm9taXNlIHRvIGFub3RoZXIgdGhlbmFibGUsIHRodXMgcHV0dGluZyBpdCBpbiB0aGUgc2FtZSBzdGF0ZSwgaW52b2tlXG4gKiBgcmVzb2x2ZWAgd2l0aCB0aGF0IG90aGVyIHRoZW5hYmxlLlxuICovXG5RLmRlZmVyID0gZGVmZXI7XG5mdW5jdGlvbiBkZWZlcigpIHtcbiAgICAvLyBpZiBcIm1lc3NhZ2VzXCIgaXMgYW4gXCJBcnJheVwiLCB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBwcm9taXNlIGhhcyBub3QgeWV0XG4gICAgLy8gYmVlbiByZXNvbHZlZC4gIElmIGl0IGlzIFwidW5kZWZpbmVkXCIsIGl0IGhhcyBiZWVuIHJlc29sdmVkLiAgRWFjaFxuICAgIC8vIGVsZW1lbnQgb2YgdGhlIG1lc3NhZ2VzIGFycmF5IGlzIGl0c2VsZiBhbiBhcnJheSBvZiBjb21wbGV0ZSBhcmd1bWVudHMgdG9cbiAgICAvLyBmb3J3YXJkIHRvIHRoZSByZXNvbHZlZCBwcm9taXNlLiAgV2UgY29lcmNlIHRoZSByZXNvbHV0aW9uIHZhbHVlIHRvIGFcbiAgICAvLyBwcm9taXNlIHVzaW5nIHRoZSBgcmVzb2x2ZWAgZnVuY3Rpb24gYmVjYXVzZSBpdCBoYW5kbGVzIGJvdGggZnVsbHlcbiAgICAvLyBub24tdGhlbmFibGUgdmFsdWVzIGFuZCBvdGhlciB0aGVuYWJsZXMgZ3JhY2VmdWxseS5cbiAgICB2YXIgbWVzc2FnZXMgPSBbXSwgcHJvZ3Jlc3NMaXN0ZW5lcnMgPSBbXSwgcmVzb2x2ZWRQcm9taXNlO1xuXG4gICAgdmFyIGRlZmVycmVkID0gb2JqZWN0X2NyZWF0ZShkZWZlci5wcm90b3R5cGUpO1xuICAgIHZhciBwcm9taXNlID0gb2JqZWN0X2NyZWF0ZShQcm9taXNlLnByb3RvdHlwZSk7XG5cbiAgICBwcm9taXNlLnByb21pc2VEaXNwYXRjaCA9IGZ1bmN0aW9uIChyZXNvbHZlLCBvcCwgb3BlcmFuZHMpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcnJheV9zbGljZShhcmd1bWVudHMpO1xuICAgICAgICBpZiAobWVzc2FnZXMpIHtcbiAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2goYXJncyk7XG4gICAgICAgICAgICBpZiAob3AgPT09IFwid2hlblwiICYmIG9wZXJhbmRzWzFdKSB7IC8vIHByb2dyZXNzIG9wZXJhbmRcbiAgICAgICAgICAgICAgICBwcm9ncmVzc0xpc3RlbmVycy5wdXNoKG9wZXJhbmRzWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIFEubmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmVkUHJvbWlzZS5wcm9taXNlRGlzcGF0Y2guYXBwbHkocmVzb2x2ZWRQcm9taXNlLCBhcmdzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIFhYWCBkZXByZWNhdGVkXG4gICAgcHJvbWlzZS52YWx1ZU9mID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAobWVzc2FnZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuZWFyZXJWYWx1ZSA9IG5lYXJlcihyZXNvbHZlZFByb21pc2UpO1xuICAgICAgICBpZiAoaXNQcm9taXNlKG5lYXJlclZhbHVlKSkge1xuICAgICAgICAgICAgcmVzb2x2ZWRQcm9taXNlID0gbmVhcmVyVmFsdWU7IC8vIHNob3J0ZW4gY2hhaW5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmVhcmVyVmFsdWU7XG4gICAgfTtcblxuICAgIHByb21pc2UuaW5zcGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFyZXNvbHZlZFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXRlOiBcInBlbmRpbmdcIiB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlZFByb21pc2UuaW5zcGVjdCgpO1xuICAgIH07XG5cbiAgICBpZiAoUS5sb25nU3RhY2tTdXBwb3J0ICYmIGhhc1N0YWNrcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IGRvbid0IHRyeSB0byB1c2UgYEVycm9yLmNhcHR1cmVTdGFja1RyYWNlYCBvciB0cmFuc2ZlciB0aGVcbiAgICAgICAgICAgIC8vIGFjY2Vzc29yIGFyb3VuZDsgdGhhdCBjYXVzZXMgbWVtb3J5IGxlYWtzIGFzIHBlciBHSC0xMTEuIEp1c3RcbiAgICAgICAgICAgIC8vIHJlaWZ5IHRoZSBzdGFjayB0cmFjZSBhcyBhIHN0cmluZyBBU0FQLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEF0IHRoZSBzYW1lIHRpbWUsIGN1dCBvZmYgdGhlIGZpcnN0IGxpbmU7IGl0J3MgYWx3YXlzIGp1c3RcbiAgICAgICAgICAgIC8vIFwiW29iamVjdCBQcm9taXNlXVxcblwiLCBhcyBwZXIgdGhlIGB0b1N0cmluZ2AuXG4gICAgICAgICAgICBwcm9taXNlLnN0YWNrID0gZS5zdGFjay5zdWJzdHJpbmcoZS5zdGFjay5pbmRleE9mKFwiXFxuXCIpICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOT1RFOiB3ZSBkbyB0aGUgY2hlY2tzIGZvciBgcmVzb2x2ZWRQcm9taXNlYCBpbiBlYWNoIG1ldGhvZCwgaW5zdGVhZCBvZlxuICAgIC8vIGNvbnNvbGlkYXRpbmcgdGhlbSBpbnRvIGBiZWNvbWVgLCBzaW5jZSBvdGhlcndpc2Ugd2UnZCBjcmVhdGUgbmV3XG4gICAgLy8gcHJvbWlzZXMgd2l0aCB0aGUgbGluZXMgYGJlY29tZSh3aGF0ZXZlcih2YWx1ZSkpYC4gU2VlIGUuZy4gR0gtMjUyLlxuXG4gICAgZnVuY3Rpb24gYmVjb21lKG5ld1Byb21pc2UpIHtcbiAgICAgICAgcmVzb2x2ZWRQcm9taXNlID0gbmV3UHJvbWlzZTtcbiAgICAgICAgcHJvbWlzZS5zb3VyY2UgPSBuZXdQcm9taXNlO1xuXG4gICAgICAgIGFycmF5X3JlZHVjZShtZXNzYWdlcywgZnVuY3Rpb24gKHVuZGVmaW5lZCwgbWVzc2FnZSkge1xuICAgICAgICAgICAgUS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbmV3UHJvbWlzZS5wcm9taXNlRGlzcGF0Y2guYXBwbHkobmV3UHJvbWlzZSwgbWVzc2FnZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgdm9pZCAwKTtcblxuICAgICAgICBtZXNzYWdlcyA9IHZvaWQgMDtcbiAgICAgICAgcHJvZ3Jlc3NMaXN0ZW5lcnMgPSB2b2lkIDA7XG4gICAgfVxuXG4gICAgZGVmZXJyZWQucHJvbWlzZSA9IHByb21pc2U7XG4gICAgZGVmZXJyZWQucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICBpZiAocmVzb2x2ZWRQcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBiZWNvbWUoUSh2YWx1ZSkpO1xuICAgIH07XG5cbiAgICBkZWZlcnJlZC5mdWxmaWxsID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIGlmIChyZXNvbHZlZFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJlY29tZShmdWxmaWxsKHZhbHVlKSk7XG4gICAgfTtcbiAgICBkZWZlcnJlZC5yZWplY3QgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIGlmIChyZXNvbHZlZFByb21pc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGJlY29tZShyZWplY3QocmVhc29uKSk7XG4gICAgfTtcbiAgICBkZWZlcnJlZC5ub3RpZnkgPSBmdW5jdGlvbiAocHJvZ3Jlc3MpIHtcbiAgICAgICAgaWYgKHJlc29sdmVkUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJyYXlfcmVkdWNlKHByb2dyZXNzTGlzdGVuZXJzLCBmdW5jdGlvbiAodW5kZWZpbmVkLCBwcm9ncmVzc0xpc3RlbmVyKSB7XG4gICAgICAgICAgICBRLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBwcm9ncmVzc0xpc3RlbmVyKHByb2dyZXNzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCB2b2lkIDApO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVmZXJyZWQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIE5vZGUtc3R5bGUgY2FsbGJhY2sgdGhhdCB3aWxsIHJlc29sdmUgb3IgcmVqZWN0IHRoZSBkZWZlcnJlZFxuICogcHJvbWlzZS5cbiAqIEByZXR1cm5zIGEgbm9kZWJhY2tcbiAqL1xuZGVmZXIucHJvdG90eXBlLm1ha2VOb2RlUmVzb2x2ZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXJyb3IsIHZhbHVlKSB7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgc2VsZi5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICBzZWxmLnJlc29sdmUoYXJyYXlfc2xpY2UoYXJndW1lbnRzLCAxKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLnJlc29sdmUodmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHJlc29sdmVyIHtGdW5jdGlvbn0gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgbm90aGluZyBhbmQgYWNjZXB0c1xuICogdGhlIHJlc29sdmUsIHJlamVjdCwgYW5kIG5vdGlmeSBmdW5jdGlvbnMgZm9yIGEgZGVmZXJyZWQuXG4gKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCBtYXkgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgZ2l2ZW4gcmVzb2x2ZSBhbmQgcmVqZWN0XG4gKiBmdW5jdGlvbnMsIG9yIHJlamVjdGVkIGJ5IGEgdGhyb3duIGV4Y2VwdGlvbiBpbiByZXNvbHZlclxuICovXG5RLlByb21pc2UgPSBwcm9taXNlOyAvLyBFUzZcblEucHJvbWlzZSA9IHByb21pc2U7XG5mdW5jdGlvbiBwcm9taXNlKHJlc29sdmVyKSB7XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlciAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJyZXNvbHZlciBtdXN0IGJlIGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cbiAgICB2YXIgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgIHRyeSB7XG4gICAgICAgIHJlc29sdmVyKGRlZmVycmVkLnJlc29sdmUsIGRlZmVycmVkLnJlamVjdCwgZGVmZXJyZWQubm90aWZ5KTtcbiAgICB9IGNhdGNoIChyZWFzb24pIHtcbiAgICAgICAgZGVmZXJyZWQucmVqZWN0KHJlYXNvbik7XG4gICAgfVxuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xufVxuXG5wcm9taXNlLnJhY2UgPSByYWNlOyAvLyBFUzZcbnByb21pc2UuYWxsID0gYWxsOyAvLyBFUzZcbnByb21pc2UucmVqZWN0ID0gcmVqZWN0OyAvLyBFUzZcbnByb21pc2UucmVzb2x2ZSA9IFE7IC8vIEVTNlxuXG4vLyBYWFggZXhwZXJpbWVudGFsLiAgVGhpcyBtZXRob2QgaXMgYSB3YXkgdG8gZGVub3RlIHRoYXQgYSBsb2NhbCB2YWx1ZSBpc1xuLy8gc2VyaWFsaXphYmxlIGFuZCBzaG91bGQgYmUgaW1tZWRpYXRlbHkgZGlzcGF0Y2hlZCB0byBhIHJlbW90ZSB1cG9uIHJlcXVlc3QsXG4vLyBpbnN0ZWFkIG9mIHBhc3NpbmcgYSByZWZlcmVuY2UuXG5RLnBhc3NCeUNvcHkgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gICAgLy9mcmVlemUob2JqZWN0KTtcbiAgICAvL3Bhc3NCeUNvcGllcy5zZXQob2JqZWN0LCB0cnVlKTtcbiAgICByZXR1cm4gb2JqZWN0O1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUucGFzc0J5Q29weSA9IGZ1bmN0aW9uICgpIHtcbiAgICAvL2ZyZWV6ZShvYmplY3QpO1xuICAgIC8vcGFzc0J5Q29waWVzLnNldChvYmplY3QsIHRydWUpO1xuICAgIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBJZiB0d28gcHJvbWlzZXMgZXZlbnR1YWxseSBmdWxmaWxsIHRvIHRoZSBzYW1lIHZhbHVlLCBwcm9taXNlcyB0aGF0IHZhbHVlLFxuICogYnV0IG90aGVyd2lzZSByZWplY3RzLlxuICogQHBhcmFtIHgge0FueSp9XG4gKiBAcGFyYW0geSB7QW55Kn1cbiAqIEByZXR1cm5zIHtBbnkqfSBhIHByb21pc2UgZm9yIHggYW5kIHkgaWYgdGhleSBhcmUgdGhlIHNhbWUsIGJ1dCBhIHJlamVjdGlvblxuICogb3RoZXJ3aXNlLlxuICpcbiAqL1xuUS5qb2luID0gZnVuY3Rpb24gKHgsIHkpIHtcbiAgICByZXR1cm4gUSh4KS5qb2luKHkpO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUuam9pbiA9IGZ1bmN0aW9uICh0aGF0KSB7XG4gICAgcmV0dXJuIFEoW3RoaXMsIHRoYXRdKS5zcHJlYWQoZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgaWYgKHggPT09IHkpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFwiPT09XCIgc2hvdWxkIGJlIE9iamVjdC5pcyBvciBlcXVpdlxuICAgICAgICAgICAgcmV0dXJuIHg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBqb2luOiBub3QgdGhlIHNhbWU6IFwiICsgeCArIFwiIFwiICsgeSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSBmaXJzdCBvZiBhbiBhcnJheSBvZiBwcm9taXNlcyB0byBiZWNvbWUgc2V0dGxlZC5cbiAqIEBwYXJhbSBhbnN3ZXJzIHtBcnJheVtBbnkqXX0gcHJvbWlzZXMgdG8gcmFjZVxuICogQHJldHVybnMge0FueSp9IHRoZSBmaXJzdCBwcm9taXNlIHRvIGJlIHNldHRsZWRcbiAqL1xuUS5yYWNlID0gcmFjZTtcbmZ1bmN0aW9uIHJhY2UoYW5zd2VyUHMpIHtcbiAgICByZXR1cm4gcHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIC8vIFN3aXRjaCB0byB0aGlzIG9uY2Ugd2UgY2FuIGFzc3VtZSBhdCBsZWFzdCBFUzVcbiAgICAgICAgLy8gYW5zd2VyUHMuZm9yRWFjaChmdW5jdGlvbiAoYW5zd2VyUCkge1xuICAgICAgICAvLyAgICAgUShhbnN3ZXJQKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIC8vIH0pO1xuICAgICAgICAvLyBVc2UgdGhpcyBpbiB0aGUgbWVhbnRpbWVcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFuc3dlclBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBRKGFuc3dlclBzW2ldKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuUHJvbWlzZS5wcm90b3R5cGUucmFjZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKFEucmFjZSk7XG59O1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBQcm9taXNlIHdpdGggYSBwcm9taXNlIGRlc2NyaXB0b3Igb2JqZWN0IGFuZCBvcHRpb25hbCBmYWxsYmFja1xuICogZnVuY3Rpb24uICBUaGUgZGVzY3JpcHRvciBjb250YWlucyBtZXRob2RzIGxpa2Ugd2hlbihyZWplY3RlZCksIGdldChuYW1lKSxcbiAqIHNldChuYW1lLCB2YWx1ZSksIHBvc3QobmFtZSwgYXJncyksIGFuZCBkZWxldGUobmFtZSksIHdoaWNoIGFsbFxuICogcmV0dXJuIGVpdGhlciBhIHZhbHVlLCBhIHByb21pc2UgZm9yIGEgdmFsdWUsIG9yIGEgcmVqZWN0aW9uLiAgVGhlIGZhbGxiYWNrXG4gKiBhY2NlcHRzIHRoZSBvcGVyYXRpb24gbmFtZSwgYSByZXNvbHZlciwgYW5kIGFueSBmdXJ0aGVyIGFyZ3VtZW50cyB0aGF0IHdvdWxkXG4gKiBoYXZlIGJlZW4gZm9yd2FyZGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QgYWJvdmUgaGFkIGEgbWV0aG9kIGJlZW5cbiAqIHByb3ZpZGVkIHdpdGggdGhlIHByb3BlciBuYW1lLiAgVGhlIEFQSSBtYWtlcyBubyBndWFyYW50ZWVzIGFib3V0IHRoZSBuYXR1cmVcbiAqIG9mIHRoZSByZXR1cm5lZCBvYmplY3QsIGFwYXJ0IGZyb20gdGhhdCBpdCBpcyB1c2FibGUgd2hlcmVldmVyIHByb21pc2VzIGFyZVxuICogYm91Z2h0IGFuZCBzb2xkLlxuICovXG5RLm1ha2VQcm9taXNlID0gUHJvbWlzZTtcbmZ1bmN0aW9uIFByb21pc2UoZGVzY3JpcHRvciwgZmFsbGJhY2ssIGluc3BlY3QpIHtcbiAgICBpZiAoZmFsbGJhY2sgPT09IHZvaWQgMCkge1xuICAgICAgICBmYWxsYmFjayA9IGZ1bmN0aW9uIChvcCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJQcm9taXNlIGRvZXMgbm90IHN1cHBvcnQgb3BlcmF0aW9uOiBcIiArIG9wXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGluc3BlY3QgPT09IHZvaWQgMCkge1xuICAgICAgICBpbnNwZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtzdGF0ZTogXCJ1bmtub3duXCJ9O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBwcm9taXNlID0gb2JqZWN0X2NyZWF0ZShQcm9taXNlLnByb3RvdHlwZSk7XG5cbiAgICBwcm9taXNlLnByb21pc2VEaXNwYXRjaCA9IGZ1bmN0aW9uIChyZXNvbHZlLCBvcCwgYXJncykge1xuICAgICAgICB2YXIgcmVzdWx0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3Jbb3BdKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZGVzY3JpcHRvcltvcF0uYXBwbHkocHJvbWlzZSwgYXJncyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbGxiYWNrLmNhbGwocHJvbWlzZSwgb3AsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlamVjdChleGNlcHRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlKSB7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvbWlzZS5pbnNwZWN0ID0gaW5zcGVjdDtcblxuICAgIC8vIFhYWCBkZXByZWNhdGVkIGB2YWx1ZU9mYCBhbmQgYGV4Y2VwdGlvbmAgc3VwcG9ydFxuICAgIGlmIChpbnNwZWN0KSB7XG4gICAgICAgIHZhciBpbnNwZWN0ZWQgPSBpbnNwZWN0KCk7XG4gICAgICAgIGlmIChpbnNwZWN0ZWQuc3RhdGUgPT09IFwicmVqZWN0ZWRcIikge1xuICAgICAgICAgICAgcHJvbWlzZS5leGNlcHRpb24gPSBpbnNwZWN0ZWQucmVhc29uO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvbWlzZS52YWx1ZU9mID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGluc3BlY3RlZCA9IGluc3BlY3QoKTtcbiAgICAgICAgICAgIGlmIChpbnNwZWN0ZWQuc3RhdGUgPT09IFwicGVuZGluZ1wiIHx8XG4gICAgICAgICAgICAgICAgaW5zcGVjdGVkLnN0YXRlID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpbnNwZWN0ZWQudmFsdWU7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cblByb21pc2UucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgUHJvbWlzZV1cIjtcbn07XG5cblByb21pc2UucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiAoZnVsZmlsbGVkLCByZWplY3RlZCwgcHJvZ3Jlc3NlZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgIHZhciBkb25lID0gZmFsc2U7ICAgLy8gZW5zdXJlIHRoZSB1bnRydXN0ZWQgcHJvbWlzZSBtYWtlcyBhdCBtb3N0IGFcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZSBjYWxsIHRvIG9uZSBvZiB0aGUgY2FsbGJhY2tzXG5cbiAgICBmdW5jdGlvbiBfZnVsZmlsbGVkKHZhbHVlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGZ1bGZpbGxlZCA9PT0gXCJmdW5jdGlvblwiID8gZnVsZmlsbGVkKHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoZXhjZXB0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIF9yZWplY3RlZChleGNlcHRpb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiByZWplY3RlZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBtYWtlU3RhY2tUcmFjZUxvbmcoZXhjZXB0aW9uLCBzZWxmKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdGVkKGV4Y2VwdGlvbik7XG4gICAgICAgICAgICB9IGNhdGNoIChuZXdFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ld0V4Y2VwdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlamVjdChleGNlcHRpb24pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIF9wcm9ncmVzc2VkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcHJvZ3Jlc3NlZCA9PT0gXCJmdW5jdGlvblwiID8gcHJvZ3Jlc3NlZCh2YWx1ZSkgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICBRLm5leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5wcm9taXNlRGlzcGF0Y2goZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKF9mdWxmaWxsZWQodmFsdWUpKTtcbiAgICAgICAgfSwgXCJ3aGVuXCIsIFtmdW5jdGlvbiAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKF9yZWplY3RlZChleGNlcHRpb24pKTtcbiAgICAgICAgfV0pO1xuICAgIH0pO1xuXG4gICAgLy8gUHJvZ3Jlc3MgcHJvcGFnYXRvciBuZWVkIHRvIGJlIGF0dGFjaGVkIGluIHRoZSBjdXJyZW50IHRpY2suXG4gICAgc2VsZi5wcm9taXNlRGlzcGF0Y2godm9pZCAwLCBcIndoZW5cIiwgW3ZvaWQgMCwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBuZXdWYWx1ZTtcbiAgICAgICAgdmFyIHRocmV3ID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IF9wcm9ncmVzc2VkKHZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyZXcgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKFEub25lcnJvcikge1xuICAgICAgICAgICAgICAgIFEub25lcnJvcihlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhyZXcpIHtcbiAgICAgICAgICAgIGRlZmVycmVkLm5vdGlmeShuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbn07XG5cblEudGFwID0gZnVuY3Rpb24gKHByb21pc2UsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIFEocHJvbWlzZSkudGFwKGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogV29ya3MgYWxtb3N0IGxpa2UgXCJmaW5hbGx5XCIsIGJ1dCBub3QgY2FsbGVkIGZvciByZWplY3Rpb25zLlxuICogT3JpZ2luYWwgcmVzb2x1dGlvbiB2YWx1ZSBpcyBwYXNzZWQgdGhyb3VnaCBjYWxsYmFjayB1bmFmZmVjdGVkLlxuICogQ2FsbGJhY2sgbWF5IHJldHVybiBhIHByb21pc2UgdGhhdCB3aWxsIGJlIGF3YWl0ZWQgZm9yLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtRLlByb21pc2V9XG4gKiBAZXhhbXBsZVxuICogZG9Tb21ldGhpbmcoKVxuICogICAudGhlbiguLi4pXG4gKiAgIC50YXAoY29uc29sZS5sb2cpXG4gKiAgIC50aGVuKC4uLik7XG4gKi9cblByb21pc2UucHJvdG90eXBlLnRhcCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gUShjYWxsYmFjayk7XG5cbiAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2suZmNhbGwodmFsdWUpLnRoZW5SZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogUmVnaXN0ZXJzIGFuIG9ic2VydmVyIG9uIGEgcHJvbWlzZS5cbiAqXG4gKiBHdWFyYW50ZWVzOlxuICpcbiAqIDEuIHRoYXQgZnVsZmlsbGVkIGFuZCByZWplY3RlZCB3aWxsIGJlIGNhbGxlZCBvbmx5IG9uY2UuXG4gKiAyLiB0aGF0IGVpdGhlciB0aGUgZnVsZmlsbGVkIGNhbGxiYWNrIG9yIHRoZSByZWplY3RlZCBjYWxsYmFjayB3aWxsIGJlXG4gKiAgICBjYWxsZWQsIGJ1dCBub3QgYm90aC5cbiAqIDMuIHRoYXQgZnVsZmlsbGVkIGFuZCByZWplY3RlZCB3aWxsIG5vdCBiZSBjYWxsZWQgaW4gdGhpcyB0dXJuLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAgICAgIHByb21pc2Ugb3IgaW1tZWRpYXRlIHJlZmVyZW5jZSB0byBvYnNlcnZlXG4gKiBAcGFyYW0gZnVsZmlsbGVkICBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2l0aCB0aGUgZnVsZmlsbGVkIHZhbHVlXG4gKiBAcGFyYW0gcmVqZWN0ZWQgICBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2l0aCB0aGUgcmVqZWN0aW9uIGV4Y2VwdGlvblxuICogQHBhcmFtIHByb2dyZXNzZWQgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGFueSBwcm9ncmVzcyBub3RpZmljYXRpb25zXG4gKiBAcmV0dXJuIHByb21pc2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgaW52b2tlZCBjYWxsYmFja1xuICovXG5RLndoZW4gPSB3aGVuO1xuZnVuY3Rpb24gd2hlbih2YWx1ZSwgZnVsZmlsbGVkLCByZWplY3RlZCwgcHJvZ3Jlc3NlZCkge1xuICAgIHJldHVybiBRKHZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIHByb2dyZXNzZWQpO1xufVxuXG5Qcm9taXNlLnByb3RvdHlwZS50aGVuUmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWU7IH0pO1xufTtcblxuUS50aGVuUmVzb2x2ZSA9IGZ1bmN0aW9uIChwcm9taXNlLCB2YWx1ZSkge1xuICAgIHJldHVybiBRKHByb21pc2UpLnRoZW5SZXNvbHZlKHZhbHVlKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLnRoZW5SZWplY3QgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IHJlYXNvbjsgfSk7XG59O1xuXG5RLnRoZW5SZWplY3QgPSBmdW5jdGlvbiAocHJvbWlzZSwgcmVhc29uKSB7XG4gICAgcmV0dXJuIFEocHJvbWlzZSkudGhlblJlamVjdChyZWFzb24pO1xufTtcblxuLyoqXG4gKiBJZiBhbiBvYmplY3QgaXMgbm90IGEgcHJvbWlzZSwgaXQgaXMgYXMgXCJuZWFyXCIgYXMgcG9zc2libGUuXG4gKiBJZiBhIHByb21pc2UgaXMgcmVqZWN0ZWQsIGl0IGlzIGFzIFwibmVhclwiIGFzIHBvc3NpYmxlIHRvby5cbiAqIElmIGl04oCZcyBhIGZ1bGZpbGxlZCBwcm9taXNlLCB0aGUgZnVsZmlsbG1lbnQgdmFsdWUgaXMgbmVhcmVyLlxuICogSWYgaXTigJlzIGEgZGVmZXJyZWQgcHJvbWlzZSBhbmQgdGhlIGRlZmVycmVkIGhhcyBiZWVuIHJlc29sdmVkLCB0aGVcbiAqIHJlc29sdXRpb24gaXMgXCJuZWFyZXJcIi5cbiAqIEBwYXJhbSBvYmplY3RcbiAqIEByZXR1cm5zIG1vc3QgcmVzb2x2ZWQgKG5lYXJlc3QpIGZvcm0gb2YgdGhlIG9iamVjdFxuICovXG5cbi8vIFhYWCBzaG91bGQgd2UgcmUtZG8gdGhpcz9cblEubmVhcmVyID0gbmVhcmVyO1xuZnVuY3Rpb24gbmVhcmVyKHZhbHVlKSB7XG4gICAgaWYgKGlzUHJvbWlzZSh2YWx1ZSkpIHtcbiAgICAgICAgdmFyIGluc3BlY3RlZCA9IHZhbHVlLmluc3BlY3QoKTtcbiAgICAgICAgaWYgKGluc3BlY3RlZC5zdGF0ZSA9PT0gXCJmdWxmaWxsZWRcIikge1xuICAgICAgICAgICAgcmV0dXJuIGluc3BlY3RlZC52YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogQHJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgcHJvbWlzZS5cbiAqIE90aGVyd2lzZSBpdCBpcyBhIGZ1bGZpbGxlZCB2YWx1ZS5cbiAqL1xuUS5pc1Byb21pc2UgPSBpc1Byb21pc2U7XG5mdW5jdGlvbiBpc1Byb21pc2Uob2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIFByb21pc2U7XG59XG5cblEuaXNQcm9taXNlQWxpa2UgPSBpc1Byb21pc2VBbGlrZTtcbmZ1bmN0aW9uIGlzUHJvbWlzZUFsaWtlKG9iamVjdCkge1xuICAgIHJldHVybiBpc09iamVjdChvYmplY3QpICYmIHR5cGVvZiBvYmplY3QudGhlbiA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIHBlbmRpbmcgcHJvbWlzZSwgbWVhbmluZyBub3RcbiAqIGZ1bGZpbGxlZCBvciByZWplY3RlZC5cbiAqL1xuUS5pc1BlbmRpbmcgPSBpc1BlbmRpbmc7XG5mdW5jdGlvbiBpc1BlbmRpbmcob2JqZWN0KSB7XG4gICAgcmV0dXJuIGlzUHJvbWlzZShvYmplY3QpICYmIG9iamVjdC5pbnNwZWN0KCkuc3RhdGUgPT09IFwicGVuZGluZ1wiO1xufVxuXG5Qcm9taXNlLnByb3RvdHlwZS5pc1BlbmRpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5zcGVjdCgpLnN0YXRlID09PSBcInBlbmRpbmdcIjtcbn07XG5cbi8qKlxuICogQHJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgdmFsdWUgb3IgZnVsZmlsbGVkXG4gKiBwcm9taXNlLlxuICovXG5RLmlzRnVsZmlsbGVkID0gaXNGdWxmaWxsZWQ7XG5mdW5jdGlvbiBpc0Z1bGZpbGxlZChvYmplY3QpIHtcbiAgICByZXR1cm4gIWlzUHJvbWlzZShvYmplY3QpIHx8IG9iamVjdC5pbnNwZWN0KCkuc3RhdGUgPT09IFwiZnVsZmlsbGVkXCI7XG59XG5cblByb21pc2UucHJvdG90eXBlLmlzRnVsZmlsbGVkID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmluc3BlY3QoKS5zdGF0ZSA9PT0gXCJmdWxmaWxsZWRcIjtcbn07XG5cbi8qKlxuICogQHJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgcmVqZWN0ZWQgcHJvbWlzZS5cbiAqL1xuUS5pc1JlamVjdGVkID0gaXNSZWplY3RlZDtcbmZ1bmN0aW9uIGlzUmVqZWN0ZWQob2JqZWN0KSB7XG4gICAgcmV0dXJuIGlzUHJvbWlzZShvYmplY3QpICYmIG9iamVjdC5pbnNwZWN0KCkuc3RhdGUgPT09IFwicmVqZWN0ZWRcIjtcbn1cblxuUHJvbWlzZS5wcm90b3R5cGUuaXNSZWplY3RlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnNwZWN0KCkuc3RhdGUgPT09IFwicmVqZWN0ZWRcIjtcbn07XG5cbi8vLy8gQkVHSU4gVU5IQU5ETEVEIFJFSkVDVElPTiBUUkFDS0lOR1xuXG4vLyBUaGlzIHByb21pc2UgbGlicmFyeSBjb25zdW1lcyBleGNlcHRpb25zIHRocm93biBpbiBoYW5kbGVycyBzbyB0aGV5IGNhbiBiZVxuLy8gaGFuZGxlZCBieSBhIHN1YnNlcXVlbnQgcHJvbWlzZS4gIFRoZSBleGNlcHRpb25zIGdldCBhZGRlZCB0byB0aGlzIGFycmF5IHdoZW5cbi8vIHRoZXkgYXJlIGNyZWF0ZWQsIGFuZCByZW1vdmVkIHdoZW4gdGhleSBhcmUgaGFuZGxlZC4gIE5vdGUgdGhhdCBpbiBFUzYgb3Jcbi8vIHNoaW1tZWQgZW52aXJvbm1lbnRzLCB0aGlzIHdvdWxkIG5hdHVyYWxseSBiZSBhIGBTZXRgLlxudmFyIHVuaGFuZGxlZFJlYXNvbnMgPSBbXTtcbnZhciB1bmhhbmRsZWRSZWplY3Rpb25zID0gW107XG52YXIgcmVwb3J0ZWRVbmhhbmRsZWRSZWplY3Rpb25zID0gW107XG52YXIgdHJhY2tVbmhhbmRsZWRSZWplY3Rpb25zID0gdHJ1ZTtcblxuZnVuY3Rpb24gcmVzZXRVbmhhbmRsZWRSZWplY3Rpb25zKCkge1xuICAgIHVuaGFuZGxlZFJlYXNvbnMubGVuZ3RoID0gMDtcbiAgICB1bmhhbmRsZWRSZWplY3Rpb25zLmxlbmd0aCA9IDA7XG5cbiAgICBpZiAoIXRyYWNrVW5oYW5kbGVkUmVqZWN0aW9ucykge1xuICAgICAgICB0cmFja1VuaGFuZGxlZFJlamVjdGlvbnMgPSB0cnVlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdHJhY2tSZWplY3Rpb24ocHJvbWlzZSwgcmVhc29uKSB7XG4gICAgaWYgKCF0cmFja1VuaGFuZGxlZFJlamVjdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHByb2Nlc3MuZW1pdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIFEubmV4dFRpY2sucnVuQWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGFycmF5X2luZGV4T2YodW5oYW5kbGVkUmVqZWN0aW9ucywgcHJvbWlzZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5lbWl0KFwidW5oYW5kbGVkUmVqZWN0aW9uXCIsIHJlYXNvbiwgcHJvbWlzZSk7XG4gICAgICAgICAgICAgICAgcmVwb3J0ZWRVbmhhbmRsZWRSZWplY3Rpb25zLnB1c2gocHJvbWlzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVuaGFuZGxlZFJlamVjdGlvbnMucHVzaChwcm9taXNlKTtcbiAgICBpZiAocmVhc29uICYmIHR5cGVvZiByZWFzb24uc3RhY2sgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdW5oYW5kbGVkUmVhc29ucy5wdXNoKHJlYXNvbi5zdGFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdW5oYW5kbGVkUmVhc29ucy5wdXNoKFwiKG5vIHN0YWNrKSBcIiArIHJlYXNvbik7XG4gICAgfVxufVxuXG5mdW5jdGlvbiB1bnRyYWNrUmVqZWN0aW9uKHByb21pc2UpIHtcbiAgICBpZiAoIXRyYWNrVW5oYW5kbGVkUmVqZWN0aW9ucykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGF0ID0gYXJyYXlfaW5kZXhPZih1bmhhbmRsZWRSZWplY3Rpb25zLCBwcm9taXNlKTtcbiAgICBpZiAoYXQgIT09IC0xKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcHJvY2Vzcy5lbWl0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIFEubmV4dFRpY2sucnVuQWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBhdFJlcG9ydCA9IGFycmF5X2luZGV4T2YocmVwb3J0ZWRVbmhhbmRsZWRSZWplY3Rpb25zLCBwcm9taXNlKTtcbiAgICAgICAgICAgICAgICBpZiAoYXRSZXBvcnQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZW1pdChcInJlamVjdGlvbkhhbmRsZWRcIiwgdW5oYW5kbGVkUmVhc29uc1thdF0sIHByb21pc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXBvcnRlZFVuaGFuZGxlZFJlamVjdGlvbnMuc3BsaWNlKGF0UmVwb3J0LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB1bmhhbmRsZWRSZWplY3Rpb25zLnNwbGljZShhdCwgMSk7XG4gICAgICAgIHVuaGFuZGxlZFJlYXNvbnMuc3BsaWNlKGF0LCAxKTtcbiAgICB9XG59XG5cblEucmVzZXRVbmhhbmRsZWRSZWplY3Rpb25zID0gcmVzZXRVbmhhbmRsZWRSZWplY3Rpb25zO1xuXG5RLmdldFVuaGFuZGxlZFJlYXNvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gTWFrZSBhIGNvcHkgc28gdGhhdCBjb25zdW1lcnMgY2FuJ3QgaW50ZXJmZXJlIHdpdGggb3VyIGludGVybmFsIHN0YXRlLlxuICAgIHJldHVybiB1bmhhbmRsZWRSZWFzb25zLnNsaWNlKCk7XG59O1xuXG5RLnN0b3BVbmhhbmRsZWRSZWplY3Rpb25UcmFja2luZyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXNldFVuaGFuZGxlZFJlamVjdGlvbnMoKTtcbiAgICB0cmFja1VuaGFuZGxlZFJlamVjdGlvbnMgPSBmYWxzZTtcbn07XG5cbnJlc2V0VW5oYW5kbGVkUmVqZWN0aW9ucygpO1xuXG4vLy8vIEVORCBVTkhBTkRMRUQgUkVKRUNUSU9OIFRSQUNLSU5HXG5cbi8qKlxuICogQ29uc3RydWN0cyBhIHJlamVjdGVkIHByb21pc2UuXG4gKiBAcGFyYW0gcmVhc29uIHZhbHVlIGRlc2NyaWJpbmcgdGhlIGZhaWx1cmVcbiAqL1xuUS5yZWplY3QgPSByZWplY3Q7XG5mdW5jdGlvbiByZWplY3QocmVhc29uKSB7XG4gICAgdmFyIHJlamVjdGlvbiA9IFByb21pc2Uoe1xuICAgICAgICBcIndoZW5cIjogZnVuY3Rpb24gKHJlamVjdGVkKSB7XG4gICAgICAgICAgICAvLyBub3RlIHRoYXQgdGhlIGVycm9yIGhhcyBiZWVuIGhhbmRsZWRcbiAgICAgICAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICAgICAgICAgIHVudHJhY2tSZWplY3Rpb24odGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0ZWQgPyByZWplY3RlZChyZWFzb24pIDogdGhpcztcbiAgICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uIGZhbGxiYWNrKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICAgICAgICByZXR1cm4geyBzdGF0ZTogXCJyZWplY3RlZFwiLCByZWFzb246IHJlYXNvbiB9O1xuICAgIH0pO1xuXG4gICAgLy8gTm90ZSB0aGF0IHRoZSByZWFzb24gaGFzIG5vdCBiZWVuIGhhbmRsZWQuXG4gICAgdHJhY2tSZWplY3Rpb24ocmVqZWN0aW9uLCByZWFzb24pO1xuXG4gICAgcmV0dXJuIHJlamVjdGlvbjtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGEgZnVsZmlsbGVkIHByb21pc2UgZm9yIGFuIGltbWVkaWF0ZSByZWZlcmVuY2UuXG4gKiBAcGFyYW0gdmFsdWUgaW1tZWRpYXRlIHJlZmVyZW5jZVxuICovXG5RLmZ1bGZpbGwgPSBmdWxmaWxsO1xuZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkge1xuICAgIHJldHVybiBQcm9taXNlKHtcbiAgICAgICAgXCJ3aGVuXCI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRcIjogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVtuYW1lXTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRcIjogZnVuY3Rpb24gKG5hbWUsIHJocykge1xuICAgICAgICAgICAgdmFsdWVbbmFtZV0gPSByaHM7XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGVsZXRlXCI6IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgICAgICBkZWxldGUgdmFsdWVbbmFtZV07XG4gICAgICAgIH0sXG4gICAgICAgIFwicG9zdFwiOiBmdW5jdGlvbiAobmFtZSwgYXJncykge1xuICAgICAgICAgICAgLy8gTWFyayBNaWxsZXIgcHJvcG9zZXMgdGhhdCBwb3N0IHdpdGggbm8gbmFtZSBzaG91bGQgYXBwbHkgYVxuICAgICAgICAgICAgLy8gcHJvbWlzZWQgZnVuY3Rpb24uXG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gbnVsbCB8fCBuYW1lID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUuYXBwbHkodm9pZCAwLCBhcmdzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlW25hbWVdLmFwcGx5KHZhbHVlLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcHBseVwiOiBmdW5jdGlvbiAodGhpc3AsIGFyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5hcHBseSh0aGlzcCwgYXJncyk7XG4gICAgICAgIH0sXG4gICAgICAgIFwia2V5c1wiOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0X2tleXModmFsdWUpO1xuICAgICAgICB9XG4gICAgfSwgdm9pZCAwLCBmdW5jdGlvbiBpbnNwZWN0KCkge1xuICAgICAgICByZXR1cm4geyBzdGF0ZTogXCJmdWxmaWxsZWRcIiwgdmFsdWU6IHZhbHVlIH07XG4gICAgfSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgdGhlbmFibGVzIHRvIFEgcHJvbWlzZXMuXG4gKiBAcGFyYW0gcHJvbWlzZSB0aGVuYWJsZSBwcm9taXNlXG4gKiBAcmV0dXJucyBhIFEgcHJvbWlzZVxuICovXG5mdW5jdGlvbiBjb2VyY2UocHJvbWlzZSkge1xuICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgUS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oZGVmZXJyZWQucmVzb2x2ZSwgZGVmZXJyZWQucmVqZWN0LCBkZWZlcnJlZC5ub3RpZnkpO1xuICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdChleGNlcHRpb24pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG59XG5cbi8qKlxuICogQW5ub3RhdGVzIGFuIG9iamVjdCBzdWNoIHRoYXQgaXQgd2lsbCBuZXZlciBiZVxuICogdHJhbnNmZXJyZWQgYXdheSBmcm9tIHRoaXMgcHJvY2VzcyBvdmVyIGFueSBwcm9taXNlXG4gKiBjb21tdW5pY2F0aW9uIGNoYW5uZWwuXG4gKiBAcGFyYW0gb2JqZWN0XG4gKiBAcmV0dXJucyBwcm9taXNlIGEgd3JhcHBpbmcgb2YgdGhhdCBvYmplY3QgdGhhdFxuICogYWRkaXRpb25hbGx5IHJlc3BvbmRzIHRvIHRoZSBcImlzRGVmXCIgbWVzc2FnZVxuICogd2l0aG91dCBhIHJlamVjdGlvbi5cbiAqL1xuUS5tYXN0ZXIgPSBtYXN0ZXI7XG5mdW5jdGlvbiBtYXN0ZXIob2JqZWN0KSB7XG4gICAgcmV0dXJuIFByb21pc2Uoe1xuICAgICAgICBcImlzRGVmXCI6IGZ1bmN0aW9uICgpIHt9XG4gICAgfSwgZnVuY3Rpb24gZmFsbGJhY2sob3AsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoKG9iamVjdCwgb3AsIGFyZ3MpO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFEob2JqZWN0KS5pbnNwZWN0KCk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogU3ByZWFkcyB0aGUgdmFsdWVzIG9mIGEgcHJvbWlzZWQgYXJyYXkgb2YgYXJndW1lbnRzIGludG8gdGhlXG4gKiBmdWxmaWxsbWVudCBjYWxsYmFjay5cbiAqIEBwYXJhbSBmdWxmaWxsZWQgY2FsbGJhY2sgdGhhdCByZWNlaXZlcyB2YXJpYWRpYyBhcmd1bWVudHMgZnJvbSB0aGVcbiAqIHByb21pc2VkIGFycmF5XG4gKiBAcGFyYW0gcmVqZWN0ZWQgY2FsbGJhY2sgdGhhdCByZWNlaXZlcyB0aGUgZXhjZXB0aW9uIGlmIHRoZSBwcm9taXNlXG4gKiBpcyByZWplY3RlZC5cbiAqIEByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIHJldHVybiB2YWx1ZSBvciB0aHJvd24gZXhjZXB0aW9uIG9mXG4gKiBlaXRoZXIgY2FsbGJhY2suXG4gKi9cblEuc3ByZWFkID0gc3ByZWFkO1xuZnVuY3Rpb24gc3ByZWFkKHZhbHVlLCBmdWxmaWxsZWQsIHJlamVjdGVkKSB7XG4gICAgcmV0dXJuIFEodmFsdWUpLnNwcmVhZChmdWxmaWxsZWQsIHJlamVjdGVkKTtcbn1cblxuUHJvbWlzZS5wcm90b3R5cGUuc3ByZWFkID0gZnVuY3Rpb24gKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy5hbGwoKS50aGVuKGZ1bmN0aW9uIChhcnJheSkge1xuICAgICAgICByZXR1cm4gZnVsZmlsbGVkLmFwcGx5KHZvaWQgMCwgYXJyYXkpO1xuICAgIH0sIHJlamVjdGVkKTtcbn07XG5cbi8qKlxuICogVGhlIGFzeW5jIGZ1bmN0aW9uIGlzIGEgZGVjb3JhdG9yIGZvciBnZW5lcmF0b3IgZnVuY3Rpb25zLCB0dXJuaW5nXG4gKiB0aGVtIGludG8gYXN5bmNocm9ub3VzIGdlbmVyYXRvcnMuICBBbHRob3VnaCBnZW5lcmF0b3JzIGFyZSBvbmx5IHBhcnRcbiAqIG9mIHRoZSBuZXdlc3QgRUNNQVNjcmlwdCA2IGRyYWZ0cywgdGhpcyBjb2RlIGRvZXMgbm90IGNhdXNlIHN5bnRheFxuICogZXJyb3JzIGluIG9sZGVyIGVuZ2luZXMuICBUaGlzIGNvZGUgc2hvdWxkIGNvbnRpbnVlIHRvIHdvcmsgYW5kIHdpbGxcbiAqIGluIGZhY3QgaW1wcm92ZSBvdmVyIHRpbWUgYXMgdGhlIGxhbmd1YWdlIGltcHJvdmVzLlxuICpcbiAqIEVTNiBnZW5lcmF0b3JzIGFyZSBjdXJyZW50bHkgcGFydCBvZiBWOCB2ZXJzaW9uIDMuMTkgd2l0aCB0aGVcbiAqIC0taGFybW9ueS1nZW5lcmF0b3JzIHJ1bnRpbWUgZmxhZyBlbmFibGVkLiAgU3BpZGVyTW9ua2V5IGhhcyBoYWQgdGhlbVxuICogZm9yIGxvbmdlciwgYnV0IHVuZGVyIGFuIG9sZGVyIFB5dGhvbi1pbnNwaXJlZCBmb3JtLiAgVGhpcyBmdW5jdGlvblxuICogd29ya3Mgb24gYm90aCBraW5kcyBvZiBnZW5lcmF0b3JzLlxuICpcbiAqIERlY29yYXRlcyBhIGdlbmVyYXRvciBmdW5jdGlvbiBzdWNoIHRoYXQ6XG4gKiAgLSBpdCBtYXkgeWllbGQgcHJvbWlzZXNcbiAqICAtIGV4ZWN1dGlvbiB3aWxsIGNvbnRpbnVlIHdoZW4gdGhhdCBwcm9taXNlIGlzIGZ1bGZpbGxlZFxuICogIC0gdGhlIHZhbHVlIG9mIHRoZSB5aWVsZCBleHByZXNzaW9uIHdpbGwgYmUgdGhlIGZ1bGZpbGxlZCB2YWx1ZVxuICogIC0gaXQgcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgKHdoZW4gdGhlIGdlbmVyYXRvclxuICogICAgc3RvcHMgaXRlcmF0aW5nKVxuICogIC0gdGhlIGRlY29yYXRlZCBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIHJldHVybiB2YWx1ZVxuICogICAgb2YgdGhlIGdlbmVyYXRvciBvciB0aGUgZmlyc3QgcmVqZWN0ZWQgcHJvbWlzZSBhbW9uZyB0aG9zZVxuICogICAgeWllbGRlZC5cbiAqICAtIGlmIGFuIGVycm9yIGlzIHRocm93biBpbiB0aGUgZ2VuZXJhdG9yLCBpdCBwcm9wYWdhdGVzIHRocm91Z2hcbiAqICAgIGV2ZXJ5IGZvbGxvd2luZyB5aWVsZCB1bnRpbCBpdCBpcyBjYXVnaHQsIG9yIHVudGlsIGl0IGVzY2FwZXNcbiAqICAgIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gYWx0b2dldGhlciwgYW5kIGlzIHRyYW5zbGF0ZWQgaW50byBhXG4gKiAgICByZWplY3Rpb24gZm9yIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IHRoZSBkZWNvcmF0ZWQgZ2VuZXJhdG9yLlxuICovXG5RLmFzeW5jID0gYXN5bmM7XG5mdW5jdGlvbiBhc3luYyhtYWtlR2VuZXJhdG9yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gd2hlbiB2ZXJiIGlzIFwic2VuZFwiLCBhcmcgaXMgYSB2YWx1ZVxuICAgICAgICAvLyB3aGVuIHZlcmIgaXMgXCJ0aHJvd1wiLCBhcmcgaXMgYW4gZXhjZXB0aW9uXG4gICAgICAgIGZ1bmN0aW9uIGNvbnRpbnVlcih2ZXJiLCBhcmcpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG5cbiAgICAgICAgICAgIC8vIFVudGlsIFY4IDMuMTkgLyBDaHJvbWl1bSAyOSBpcyByZWxlYXNlZCwgU3BpZGVyTW9ua2V5IGlzIHRoZSBvbmx5XG4gICAgICAgICAgICAvLyBlbmdpbmUgdGhhdCBoYXMgYSBkZXBsb3llZCBiYXNlIG9mIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBnZW5lcmF0b3JzLlxuICAgICAgICAgICAgLy8gSG93ZXZlciwgU00ncyBnZW5lcmF0b3JzIHVzZSB0aGUgUHl0aG9uLWluc3BpcmVkIHNlbWFudGljcyBvZlxuICAgICAgICAgICAgLy8gb3V0ZGF0ZWQgRVM2IGRyYWZ0cy4gIFdlIHdvdWxkIGxpa2UgdG8gc3VwcG9ydCBFUzYsIGJ1dCB3ZSdkIGFsc29cbiAgICAgICAgICAgIC8vIGxpa2UgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgZ2VuZXJhdG9ycyBpbiBkZXBsb3llZCBicm93c2Vycywgc29cbiAgICAgICAgICAgIC8vIHdlIGFsc28gc3VwcG9ydCBQeXRob24tc3R5bGUgZ2VuZXJhdG9ycy4gIEF0IHNvbWUgcG9pbnQgd2UgY2FuIHJlbW92ZVxuICAgICAgICAgICAgLy8gdGhpcyBibG9jay5cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBTdG9wSXRlcmF0aW9uID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgLy8gRVM2IEdlbmVyYXRvcnNcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBnZW5lcmF0b3JbdmVyYl0oYXJnKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChleGNlcHRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFEocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2hlbihyZXN1bHQudmFsdWUsIGNhbGxiYWNrLCBlcnJiYWNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNwaWRlck1vbmtleSBHZW5lcmF0b3JzXG4gICAgICAgICAgICAgICAgLy8gRklYTUU6IFJlbW92ZSB0aGlzIGNhc2Ugd2hlbiBTTSBkb2VzIEVTNiBnZW5lcmF0b3JzLlxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGdlbmVyYXRvclt2ZXJiXShhcmcpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNTdG9wSXRlcmF0aW9uKGV4Y2VwdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBRKGV4Y2VwdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGV4Y2VwdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdoZW4ocmVzdWx0LCBjYWxsYmFjaywgZXJyYmFjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGdlbmVyYXRvciA9IG1ha2VHZW5lcmF0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gY29udGludWVyLmJpbmQoY29udGludWVyLCBcIm5leHRcIik7XG4gICAgICAgIHZhciBlcnJiYWNrID0gY29udGludWVyLmJpbmQoY29udGludWVyLCBcInRocm93XCIpO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIFRoZSBzcGF3biBmdW5jdGlvbiBpcyBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kIGFzeW5jIHRoYXQgaW1tZWRpYXRlbHlcbiAqIGNhbGxzIHRoZSBnZW5lcmF0b3IgYW5kIGFsc28gZW5kcyB0aGUgcHJvbWlzZSBjaGFpbiwgc28gdGhhdCBhbnlcbiAqIHVuaGFuZGxlZCBlcnJvcnMgYXJlIHRocm93biBpbnN0ZWFkIG9mIGZvcndhcmRlZCB0byB0aGUgZXJyb3JcbiAqIGhhbmRsZXIuIFRoaXMgaXMgdXNlZnVsIGJlY2F1c2UgaXQncyBleHRyZW1lbHkgY29tbW9uIHRvIHJ1blxuICogZ2VuZXJhdG9ycyBhdCB0aGUgdG9wLWxldmVsIHRvIHdvcmsgd2l0aCBsaWJyYXJpZXMuXG4gKi9cblEuc3Bhd24gPSBzcGF3bjtcbmZ1bmN0aW9uIHNwYXduKG1ha2VHZW5lcmF0b3IpIHtcbiAgICBRLmRvbmUoUS5hc3luYyhtYWtlR2VuZXJhdG9yKSgpKTtcbn1cblxuLy8gRklYTUU6IFJlbW92ZSB0aGlzIGludGVyZmFjZSBvbmNlIEVTNiBnZW5lcmF0b3JzIGFyZSBpbiBTcGlkZXJNb25rZXkuXG4vKipcbiAqIFRocm93cyBhIFJldHVyblZhbHVlIGV4Y2VwdGlvbiB0byBzdG9wIGFuIGFzeW5jaHJvbm91cyBnZW5lcmF0b3IuXG4gKlxuICogVGhpcyBpbnRlcmZhY2UgaXMgYSBzdG9wLWdhcCBtZWFzdXJlIHRvIHN1cHBvcnQgZ2VuZXJhdG9yIHJldHVyblxuICogdmFsdWVzIGluIG9sZGVyIEZpcmVmb3gvU3BpZGVyTW9ua2V5LiAgSW4gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IEVTNlxuICogZ2VuZXJhdG9ycyBsaWtlIENocm9taXVtIDI5LCBqdXN0IHVzZSBcInJldHVyblwiIGluIHlvdXIgZ2VuZXJhdG9yXG4gKiBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHZhbHVlIHRoZSByZXR1cm4gdmFsdWUgZm9yIHRoZSBzdXJyb3VuZGluZyBnZW5lcmF0b3JcbiAqIEB0aHJvd3MgUmV0dXJuVmFsdWUgZXhjZXB0aW9uIHdpdGggdGhlIHZhbHVlLlxuICogQGV4YW1wbGVcbiAqIC8vIEVTNiBzdHlsZVxuICogUS5hc3luYyhmdW5jdGlvbiogKCkge1xuICogICAgICB2YXIgZm9vID0geWllbGQgZ2V0Rm9vUHJvbWlzZSgpO1xuICogICAgICB2YXIgYmFyID0geWllbGQgZ2V0QmFyUHJvbWlzZSgpO1xuICogICAgICByZXR1cm4gZm9vICsgYmFyO1xuICogfSlcbiAqIC8vIE9sZGVyIFNwaWRlck1vbmtleSBzdHlsZVxuICogUS5hc3luYyhmdW5jdGlvbiAoKSB7XG4gKiAgICAgIHZhciBmb28gPSB5aWVsZCBnZXRGb29Qcm9taXNlKCk7XG4gKiAgICAgIHZhciBiYXIgPSB5aWVsZCBnZXRCYXJQcm9taXNlKCk7XG4gKiAgICAgIFEucmV0dXJuKGZvbyArIGJhcik7XG4gKiB9KVxuICovXG5RW1wicmV0dXJuXCJdID0gX3JldHVybjtcbmZ1bmN0aW9uIF9yZXR1cm4odmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgUVJldHVyblZhbHVlKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGUgcHJvbWlzZWQgZnVuY3Rpb24gZGVjb3JhdG9yIGVuc3VyZXMgdGhhdCBhbnkgcHJvbWlzZSBhcmd1bWVudHNcbiAqIGFyZSBzZXR0bGVkIGFuZCBwYXNzZWQgYXMgdmFsdWVzIChgdGhpc2AgaXMgYWxzbyBzZXR0bGVkIGFuZCBwYXNzZWRcbiAqIGFzIGEgdmFsdWUpLiAgSXQgd2lsbCBhbHNvIGVuc3VyZSB0aGF0IHRoZSByZXN1bHQgb2YgYSBmdW5jdGlvbiBpc1xuICogYWx3YXlzIGEgcHJvbWlzZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogdmFyIGFkZCA9IFEucHJvbWlzZWQoZnVuY3Rpb24gKGEsIGIpIHtcbiAqICAgICByZXR1cm4gYSArIGI7XG4gKiB9KTtcbiAqIGFkZChRKGEpLCBRKEIpKTtcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gZGVjb3JhdGVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbn0gYSBmdW5jdGlvbiB0aGF0IGhhcyBiZWVuIGRlY29yYXRlZC5cbiAqL1xuUS5wcm9taXNlZCA9IHByb21pc2VkO1xuZnVuY3Rpb24gcHJvbWlzZWQoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gc3ByZWFkKFt0aGlzLCBhbGwoYXJndW1lbnRzKV0sIGZ1bmN0aW9uIChzZWxmLCBhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbi8qKlxuICogc2VuZHMgYSBtZXNzYWdlIHRvIGEgdmFsdWUgaW4gYSBmdXR1cmUgdHVyblxuICogQHBhcmFtIG9iamVjdCogdGhlIHJlY2lwaWVudFxuICogQHBhcmFtIG9wIHRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIG9wZXJhdGlvbiwgZS5nLiwgXCJ3aGVuXCIsXG4gKiBAcGFyYW0gYXJncyBmdXJ0aGVyIGFyZ3VtZW50cyB0byBiZSBmb3J3YXJkZWQgdG8gdGhlIG9wZXJhdGlvblxuICogQHJldHVybnMgcmVzdWx0IHtQcm9taXNlfSBhIHByb21pc2UgZm9yIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvblxuICovXG5RLmRpc3BhdGNoID0gZGlzcGF0Y2g7XG5mdW5jdGlvbiBkaXNwYXRjaChvYmplY3QsIG9wLCBhcmdzKSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KS5kaXNwYXRjaChvcCwgYXJncyk7XG59XG5cblByb21pc2UucHJvdG90eXBlLmRpc3BhdGNoID0gZnVuY3Rpb24gKG9wLCBhcmdzKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgUS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYucHJvbWlzZURpc3BhdGNoKGRlZmVycmVkLnJlc29sdmUsIG9wLCBhcmdzKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSBpbiBhIGZ1dHVyZSB0dXJuLlxuICogQHBhcmFtIG9iamVjdCAgICBwcm9taXNlIG9yIGltbWVkaWF0ZSByZWZlcmVuY2UgZm9yIHRhcmdldCBvYmplY3RcbiAqIEBwYXJhbSBuYW1lICAgICAgbmFtZSBvZiBwcm9wZXJ0eSB0byBnZXRcbiAqIEByZXR1cm4gcHJvbWlzZSBmb3IgdGhlIHByb3BlcnR5IHZhbHVlXG4gKi9cblEuZ2V0ID0gZnVuY3Rpb24gKG9iamVjdCwga2V5KSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KS5kaXNwYXRjaChcImdldFwiLCBba2V5XSk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goXCJnZXRcIiwgW2tleV0pO1xufTtcblxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IGluIGEgZnV0dXJlIHR1cm4uXG4gKiBAcGFyYW0gb2JqZWN0ICAgIHByb21pc2Ugb3IgaW1tZWRpYXRlIHJlZmVyZW5jZSBmb3Igb2JqZWN0IG9iamVjdFxuICogQHBhcmFtIG5hbWUgICAgICBuYW1lIG9mIHByb3BlcnR5IHRvIHNldFxuICogQHBhcmFtIHZhbHVlICAgICBuZXcgdmFsdWUgb2YgcHJvcGVydHlcbiAqIEByZXR1cm4gcHJvbWlzZSBmb3IgdGhlIHJldHVybiB2YWx1ZVxuICovXG5RLnNldCA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gUShvYmplY3QpLmRpc3BhdGNoKFwic2V0XCIsIFtrZXksIHZhbHVlXSk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKFwic2V0XCIsIFtrZXksIHZhbHVlXSk7XG59O1xuXG4vKipcbiAqIERlbGV0ZXMgYSBwcm9wZXJ0eSBpbiBhIGZ1dHVyZSB0dXJuLlxuICogQHBhcmFtIG9iamVjdCAgICBwcm9taXNlIG9yIGltbWVkaWF0ZSByZWZlcmVuY2UgZm9yIHRhcmdldCBvYmplY3RcbiAqIEBwYXJhbSBuYW1lICAgICAgbmFtZSBvZiBwcm9wZXJ0eSB0byBkZWxldGVcbiAqIEByZXR1cm4gcHJvbWlzZSBmb3IgdGhlIHJldHVybiB2YWx1ZVxuICovXG5RLmRlbCA9IC8vIFhYWCBsZWdhY3lcblFbXCJkZWxldGVcIl0gPSBmdW5jdGlvbiAob2JqZWN0LCBrZXkpIHtcbiAgICByZXR1cm4gUShvYmplY3QpLmRpc3BhdGNoKFwiZGVsZXRlXCIsIFtrZXldKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLmRlbCA9IC8vIFhYWCBsZWdhY3lcblByb21pc2UucHJvdG90eXBlW1wiZGVsZXRlXCJdID0gZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKFwiZGVsZXRlXCIsIFtrZXldKTtcbn07XG5cbi8qKlxuICogSW52b2tlcyBhIG1ldGhvZCBpbiBhIGZ1dHVyZSB0dXJuLlxuICogQHBhcmFtIG9iamVjdCAgICBwcm9taXNlIG9yIGltbWVkaWF0ZSByZWZlcmVuY2UgZm9yIHRhcmdldCBvYmplY3RcbiAqIEBwYXJhbSBuYW1lICAgICAgbmFtZSBvZiBtZXRob2QgdG8gaW52b2tlXG4gKiBAcGFyYW0gdmFsdWUgICAgIGEgdmFsdWUgdG8gcG9zdCwgdHlwaWNhbGx5IGFuIGFycmF5IG9mXG4gKiAgICAgICAgICAgICAgICAgIGludm9jYXRpb24gYXJndW1lbnRzIGZvciBwcm9taXNlcyB0aGF0XG4gKiAgICAgICAgICAgICAgICAgIGFyZSB1bHRpbWF0ZWx5IGJhY2tlZCB3aXRoIGByZXNvbHZlYCB2YWx1ZXMsXG4gKiAgICAgICAgICAgICAgICAgIGFzIG9wcG9zZWQgdG8gdGhvc2UgYmFja2VkIHdpdGggVVJMc1xuICogICAgICAgICAgICAgICAgICB3aGVyZWluIHRoZSBwb3N0ZWQgdmFsdWUgY2FuIGJlIGFueVxuICogICAgICAgICAgICAgICAgICBKU09OIHNlcmlhbGl6YWJsZSBvYmplY3QuXG4gKiBAcmV0dXJuIHByb21pc2UgZm9yIHRoZSByZXR1cm4gdmFsdWVcbiAqL1xuLy8gYm91bmQgbG9jYWxseSBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgb3RoZXIgbWV0aG9kc1xuUS5tYXBwbHkgPSAvLyBYWFggQXMgcHJvcG9zZWQgYnkgXCJSZWRzYW5kcm9cIlxuUS5wb3N0ID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZSwgYXJncykge1xuICAgIHJldHVybiBRKG9iamVjdCkuZGlzcGF0Y2goXCJwb3N0XCIsIFtuYW1lLCBhcmdzXSk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5tYXBwbHkgPSAvLyBYWFggQXMgcHJvcG9zZWQgYnkgXCJSZWRzYW5kcm9cIlxuUHJvbWlzZS5wcm90b3R5cGUucG9zdCA9IGZ1bmN0aW9uIChuYW1lLCBhcmdzKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goXCJwb3N0XCIsIFtuYW1lLCBhcmdzXSk7XG59O1xuXG4vKipcbiAqIEludm9rZXMgYSBtZXRob2QgaW4gYSBmdXR1cmUgdHVybi5cbiAqIEBwYXJhbSBvYmplY3QgICAgcHJvbWlzZSBvciBpbW1lZGlhdGUgcmVmZXJlbmNlIGZvciB0YXJnZXQgb2JqZWN0XG4gKiBAcGFyYW0gbmFtZSAgICAgIG5hbWUgb2YgbWV0aG9kIHRvIGludm9rZVxuICogQHBhcmFtIC4uLmFyZ3MgICBhcnJheSBvZiBpbnZvY2F0aW9uIGFyZ3VtZW50c1xuICogQHJldHVybiBwcm9taXNlIGZvciB0aGUgcmV0dXJuIHZhbHVlXG4gKi9cblEuc2VuZCA9IC8vIFhYWCBNYXJrIE1pbGxlcidzIHByb3Bvc2VkIHBhcmxhbmNlXG5RLm1jYWxsID0gLy8gWFhYIEFzIHByb3Bvc2VkIGJ5IFwiUmVkc2FuZHJvXCJcblEuaW52b2tlID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZSAvKi4uLmFyZ3MqLykge1xuICAgIHJldHVybiBRKG9iamVjdCkuZGlzcGF0Y2goXCJwb3N0XCIsIFtuYW1lLCBhcnJheV9zbGljZShhcmd1bWVudHMsIDIpXSk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5zZW5kID0gLy8gWFhYIE1hcmsgTWlsbGVyJ3MgcHJvcG9zZWQgcGFybGFuY2VcblByb21pc2UucHJvdG90eXBlLm1jYWxsID0gLy8gWFhYIEFzIHByb3Bvc2VkIGJ5IFwiUmVkc2FuZHJvXCJcblByb21pc2UucHJvdG90eXBlLmludm9rZSA9IGZ1bmN0aW9uIChuYW1lIC8qLi4uYXJncyovKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcGF0Y2goXCJwb3N0XCIsIFtuYW1lLCBhcnJheV9zbGljZShhcmd1bWVudHMsIDEpXSk7XG59O1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIHByb21pc2VkIGZ1bmN0aW9uIGluIGEgZnV0dXJlIHR1cm4uXG4gKiBAcGFyYW0gb2JqZWN0ICAgIHByb21pc2Ugb3IgaW1tZWRpYXRlIHJlZmVyZW5jZSBmb3IgdGFyZ2V0IGZ1bmN0aW9uXG4gKiBAcGFyYW0gYXJncyAgICAgIGFycmF5IG9mIGFwcGxpY2F0aW9uIGFyZ3VtZW50c1xuICovXG5RLmZhcHBseSA9IGZ1bmN0aW9uIChvYmplY3QsIGFyZ3MpIHtcbiAgICByZXR1cm4gUShvYmplY3QpLmRpc3BhdGNoKFwiYXBwbHlcIiwgW3ZvaWQgMCwgYXJnc10pO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUuZmFwcGx5ID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwYXRjaChcImFwcGx5XCIsIFt2b2lkIDAsIGFyZ3NdKTtcbn07XG5cbi8qKlxuICogQ2FsbHMgdGhlIHByb21pc2VkIGZ1bmN0aW9uIGluIGEgZnV0dXJlIHR1cm4uXG4gKiBAcGFyYW0gb2JqZWN0ICAgIHByb21pc2Ugb3IgaW1tZWRpYXRlIHJlZmVyZW5jZSBmb3IgdGFyZ2V0IGZ1bmN0aW9uXG4gKiBAcGFyYW0gLi4uYXJncyAgIGFycmF5IG9mIGFwcGxpY2F0aW9uIGFyZ3VtZW50c1xuICovXG5RW1widHJ5XCJdID1cblEuZmNhbGwgPSBmdW5jdGlvbiAob2JqZWN0IC8qIC4uLmFyZ3MqLykge1xuICAgIHJldHVybiBRKG9iamVjdCkuZGlzcGF0Y2goXCJhcHBseVwiLCBbdm9pZCAwLCBhcnJheV9zbGljZShhcmd1bWVudHMsIDEpXSk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5mY2FsbCA9IGZ1bmN0aW9uICgvKi4uLmFyZ3MqLykge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKFwiYXBwbHlcIiwgW3ZvaWQgMCwgYXJyYXlfc2xpY2UoYXJndW1lbnRzKV0pO1xufTtcblxuLyoqXG4gKiBCaW5kcyB0aGUgcHJvbWlzZWQgZnVuY3Rpb24sIHRyYW5zZm9ybWluZyByZXR1cm4gdmFsdWVzIGludG8gYSBmdWxmaWxsZWRcbiAqIHByb21pc2UgYW5kIHRocm93biBlcnJvcnMgaW50byBhIHJlamVjdGVkIG9uZS5cbiAqIEBwYXJhbSBvYmplY3QgICAgcHJvbWlzZSBvciBpbW1lZGlhdGUgcmVmZXJlbmNlIGZvciB0YXJnZXQgZnVuY3Rpb25cbiAqIEBwYXJhbSAuLi5hcmdzICAgYXJyYXkgb2YgYXBwbGljYXRpb24gYXJndW1lbnRzXG4gKi9cblEuZmJpbmQgPSBmdW5jdGlvbiAob2JqZWN0IC8qLi4uYXJncyovKSB7XG4gICAgdmFyIHByb21pc2UgPSBRKG9iamVjdCk7XG4gICAgdmFyIGFyZ3MgPSBhcnJheV9zbGljZShhcmd1bWVudHMsIDEpO1xuICAgIHJldHVybiBmdW5jdGlvbiBmYm91bmQoKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlLmRpc3BhdGNoKFwiYXBwbHlcIiwgW1xuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGFyZ3MuY29uY2F0KGFycmF5X3NsaWNlKGFyZ3VtZW50cykpXG4gICAgICAgIF0pO1xuICAgIH07XG59O1xuUHJvbWlzZS5wcm90b3R5cGUuZmJpbmQgPSBmdW5jdGlvbiAoLyouLi5hcmdzKi8pIHtcbiAgICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gICAgdmFyIGFyZ3MgPSBhcnJheV9zbGljZShhcmd1bWVudHMpO1xuICAgIHJldHVybiBmdW5jdGlvbiBmYm91bmQoKSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlLmRpc3BhdGNoKFwiYXBwbHlcIiwgW1xuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIGFyZ3MuY29uY2F0KGFycmF5X3NsaWNlKGFyZ3VtZW50cykpXG4gICAgICAgIF0pO1xuICAgIH07XG59O1xuXG4vKipcbiAqIFJlcXVlc3RzIHRoZSBuYW1lcyBvZiB0aGUgb3duZWQgcHJvcGVydGllcyBvZiBhIHByb21pc2VkXG4gKiBvYmplY3QgaW4gYSBmdXR1cmUgdHVybi5cbiAqIEBwYXJhbSBvYmplY3QgICAgcHJvbWlzZSBvciBpbW1lZGlhdGUgcmVmZXJlbmNlIGZvciB0YXJnZXQgb2JqZWN0XG4gKiBAcmV0dXJuIHByb21pc2UgZm9yIHRoZSBrZXlzIG9mIHRoZSBldmVudHVhbGx5IHNldHRsZWQgb2JqZWN0XG4gKi9cblEua2V5cyA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICByZXR1cm4gUShvYmplY3QpLmRpc3BhdGNoKFwia2V5c1wiLCBbXSk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLmRpc3BhdGNoKFwia2V5c1wiLCBbXSk7XG59O1xuXG4vKipcbiAqIFR1cm5zIGFuIGFycmF5IG9mIHByb21pc2VzIGludG8gYSBwcm9taXNlIGZvciBhbiBhcnJheS4gIElmIGFueSBvZlxuICogdGhlIHByb21pc2VzIGdldHMgcmVqZWN0ZWQsIHRoZSB3aG9sZSBhcnJheSBpcyByZWplY3RlZCBpbW1lZGlhdGVseS5cbiAqIEBwYXJhbSB7QXJyYXkqfSBhbiBhcnJheSAob3IgcHJvbWlzZSBmb3IgYW4gYXJyYXkpIG9mIHZhbHVlcyAob3JcbiAqIHByb21pc2VzIGZvciB2YWx1ZXMpXG4gKiBAcmV0dXJucyBhIHByb21pc2UgZm9yIGFuIGFycmF5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlc1xuICovXG4vLyBCeSBNYXJrIE1pbGxlclxuLy8gaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9c3RyYXdtYW46Y29uY3VycmVuY3kmcmV2PTEzMDg3NzY1MjEjYWxsZnVsZmlsbGVkXG5RLmFsbCA9IGFsbDtcbmZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuICAgIHJldHVybiB3aGVuKHByb21pc2VzLCBmdW5jdGlvbiAocHJvbWlzZXMpIHtcbiAgICAgICAgdmFyIHBlbmRpbmdDb3VudCA9IDA7XG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgICAgIGFycmF5X3JlZHVjZShwcm9taXNlcywgZnVuY3Rpb24gKHVuZGVmaW5lZCwgcHJvbWlzZSwgaW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBzbmFwc2hvdDtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpc1Byb21pc2UocHJvbWlzZSkgJiZcbiAgICAgICAgICAgICAgICAoc25hcHNob3QgPSBwcm9taXNlLmluc3BlY3QoKSkuc3RhdGUgPT09IFwiZnVsZmlsbGVkXCJcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHByb21pc2VzW2luZGV4XSA9IHNuYXBzaG90LnZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICArK3BlbmRpbmdDb3VudDtcbiAgICAgICAgICAgICAgICB3aGVuKFxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlLFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tcGVuZGluZ0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwcm9taXNlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlamVjdCxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5ub3RpZnkoeyBpbmRleDogaW5kZXgsIHZhbHVlOiBwcm9ncmVzcyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHZvaWQgMCk7XG4gICAgICAgIGlmIChwZW5kaW5nQ291bnQgPT09IDApIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocHJvbWlzZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgIH0pO1xufVxuXG5Qcm9taXNlLnByb3RvdHlwZS5hbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGFsbCh0aGlzKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgcmVzb2x2ZWQgcHJvbWlzZSBvZiBhbiBhcnJheS4gUHJpb3IgcmVqZWN0ZWQgcHJvbWlzZXMgYXJlXG4gKiBpZ25vcmVkLiAgUmVqZWN0cyBvbmx5IGlmIGFsbCBwcm9taXNlcyBhcmUgcmVqZWN0ZWQuXG4gKiBAcGFyYW0ge0FycmF5Kn0gYW4gYXJyYXkgY29udGFpbmluZyB2YWx1ZXMgb3IgcHJvbWlzZXMgZm9yIHZhbHVlc1xuICogQHJldHVybnMgYSBwcm9taXNlIGZ1bGZpbGxlZCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgcmVzb2x2ZWQgcHJvbWlzZSxcbiAqIG9yIGEgcmVqZWN0ZWQgcHJvbWlzZSBpZiBhbGwgcHJvbWlzZXMgYXJlIHJlamVjdGVkLlxuICovXG5RLmFueSA9IGFueTtcblxuZnVuY3Rpb24gYW55KHByb21pc2VzKSB7XG4gICAgaWYgKHByb21pc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gUS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgdmFyIGRlZmVycmVkID0gUS5kZWZlcigpO1xuICAgIHZhciBwZW5kaW5nQ291bnQgPSAwO1xuICAgIGFycmF5X3JlZHVjZShwcm9taXNlcywgZnVuY3Rpb24gKHByZXYsIGN1cnJlbnQsIGluZGV4KSB7XG4gICAgICAgIHZhciBwcm9taXNlID0gcHJvbWlzZXNbaW5kZXhdO1xuXG4gICAgICAgIHBlbmRpbmdDb3VudCsrO1xuXG4gICAgICAgIHdoZW4ocHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MpO1xuICAgICAgICBmdW5jdGlvbiBvbkZ1bGZpbGxlZChyZXN1bHQpIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBvblJlamVjdGVkKCkge1xuICAgICAgICAgICAgcGVuZGluZ0NvdW50LS07XG4gICAgICAgICAgICBpZiAocGVuZGluZ0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJDYW4ndCBnZXQgZnVsZmlsbG1lbnQgdmFsdWUgZnJvbSBhbnkgcHJvbWlzZSwgYWxsIFwiICtcbiAgICAgICAgICAgICAgICAgICAgXCJwcm9taXNlcyB3ZXJlIHJlamVjdGVkLlwiXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gb25Qcm9ncmVzcyhwcm9ncmVzcykge1xuICAgICAgICAgICAgZGVmZXJyZWQubm90aWZ5KHtcbiAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHByb2dyZXNzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0sIHVuZGVmaW5lZCk7XG5cbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbn1cblxuUHJvbWlzZS5wcm90b3R5cGUuYW55ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBhbnkodGhpcyk7XG59O1xuXG4vKipcbiAqIFdhaXRzIGZvciBhbGwgcHJvbWlzZXMgdG8gYmUgc2V0dGxlZCwgZWl0aGVyIGZ1bGZpbGxlZCBvclxuICogcmVqZWN0ZWQuICBUaGlzIGlzIGRpc3RpbmN0IGZyb20gYGFsbGAgc2luY2UgdGhhdCB3b3VsZCBzdG9wXG4gKiB3YWl0aW5nIGF0IHRoZSBmaXJzdCByZWplY3Rpb24uICBUaGUgcHJvbWlzZSByZXR1cm5lZCBieVxuICogYGFsbFJlc29sdmVkYCB3aWxsIG5ldmVyIGJlIHJlamVjdGVkLlxuICogQHBhcmFtIHByb21pc2VzIGEgcHJvbWlzZSBmb3IgYW4gYXJyYXkgKG9yIGFuIGFycmF5KSBvZiBwcm9taXNlc1xuICogKG9yIHZhbHVlcylcbiAqIEByZXR1cm4gYSBwcm9taXNlIGZvciBhbiBhcnJheSBvZiBwcm9taXNlc1xuICovXG5RLmFsbFJlc29sdmVkID0gZGVwcmVjYXRlKGFsbFJlc29sdmVkLCBcImFsbFJlc29sdmVkXCIsIFwiYWxsU2V0dGxlZFwiKTtcbmZ1bmN0aW9uIGFsbFJlc29sdmVkKHByb21pc2VzKSB7XG4gICAgcmV0dXJuIHdoZW4ocHJvbWlzZXMsIGZ1bmN0aW9uIChwcm9taXNlcykge1xuICAgICAgICBwcm9taXNlcyA9IGFycmF5X21hcChwcm9taXNlcywgUSk7XG4gICAgICAgIHJldHVybiB3aGVuKGFsbChhcnJheV9tYXAocHJvbWlzZXMsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gd2hlbihwcm9taXNlLCBub29wLCBub29wKTtcbiAgICAgICAgfSkpLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZXM7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG5Qcm9taXNlLnByb3RvdHlwZS5hbGxSZXNvbHZlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYWxsUmVzb2x2ZWQodGhpcyk7XG59O1xuXG4vKipcbiAqIEBzZWUgUHJvbWlzZSNhbGxTZXR0bGVkXG4gKi9cblEuYWxsU2V0dGxlZCA9IGFsbFNldHRsZWQ7XG5mdW5jdGlvbiBhbGxTZXR0bGVkKHByb21pc2VzKSB7XG4gICAgcmV0dXJuIFEocHJvbWlzZXMpLmFsbFNldHRsZWQoKTtcbn1cblxuLyoqXG4gKiBUdXJucyBhbiBhcnJheSBvZiBwcm9taXNlcyBpbnRvIGEgcHJvbWlzZSBmb3IgYW4gYXJyYXkgb2YgdGhlaXIgc3RhdGVzIChhc1xuICogcmV0dXJuZWQgYnkgYGluc3BlY3RgKSB3aGVuIHRoZXkgaGF2ZSBhbGwgc2V0dGxlZC5cbiAqIEBwYXJhbSB7QXJyYXlbQW55Kl19IHZhbHVlcyBhbiBhcnJheSAob3IgcHJvbWlzZSBmb3IgYW4gYXJyYXkpIG9mIHZhbHVlcyAob3JcbiAqIHByb21pc2VzIGZvciB2YWx1ZXMpXG4gKiBAcmV0dXJucyB7QXJyYXlbU3RhdGVdfSBhbiBhcnJheSBvZiBzdGF0ZXMgZm9yIHRoZSByZXNwZWN0aXZlIHZhbHVlcy5cbiAqL1xuUHJvbWlzZS5wcm90b3R5cGUuYWxsU2V0dGxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uIChwcm9taXNlcykge1xuICAgICAgICByZXR1cm4gYWxsKGFycmF5X21hcChwcm9taXNlcywgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgICAgIHByb21pc2UgPSBRKHByb21pc2UpO1xuICAgICAgICAgICAgZnVuY3Rpb24gcmVnYXJkbGVzcygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZS5pbnNwZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKHJlZ2FyZGxlc3MsIHJlZ2FyZGxlc3MpO1xuICAgICAgICB9KSk7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIENhcHR1cmVzIHRoZSBmYWlsdXJlIG9mIGEgcHJvbWlzZSwgZ2l2aW5nIGFuIG9wb3J0dW5pdHkgdG8gcmVjb3ZlclxuICogd2l0aCBhIGNhbGxiYWNrLiAgSWYgdGhlIGdpdmVuIHByb21pc2UgaXMgZnVsZmlsbGVkLCB0aGUgcmV0dXJuZWRcbiAqIHByb21pc2UgaXMgZnVsZmlsbGVkLlxuICogQHBhcmFtIHtBbnkqfSBwcm9taXNlIGZvciBzb21ldGhpbmdcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHRvIGZ1bGZpbGwgdGhlIHJldHVybmVkIHByb21pc2UgaWYgdGhlXG4gKiBnaXZlbiBwcm9taXNlIGlzIHJlamVjdGVkXG4gKiBAcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGNhbGxiYWNrXG4gKi9cblEuZmFpbCA9IC8vIFhYWCBsZWdhY3lcblFbXCJjYXRjaFwiXSA9IGZ1bmN0aW9uIChvYmplY3QsIHJlamVjdGVkKSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KS50aGVuKHZvaWQgMCwgcmVqZWN0ZWQpO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUuZmFpbCA9IC8vIFhYWCBsZWdhY3lcblByb21pc2UucHJvdG90eXBlW1wiY2F0Y2hcIl0gPSBmdW5jdGlvbiAocmVqZWN0ZWQpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKHZvaWQgMCwgcmVqZWN0ZWQpO1xufTtcblxuLyoqXG4gKiBBdHRhY2hlcyBhIGxpc3RlbmVyIHRoYXQgY2FuIHJlc3BvbmQgdG8gcHJvZ3Jlc3Mgbm90aWZpY2F0aW9ucyBmcm9tIGFcbiAqIHByb21pc2UncyBvcmlnaW5hdGluZyBkZWZlcnJlZC4gVGhpcyBsaXN0ZW5lciByZWNlaXZlcyB0aGUgZXhhY3QgYXJndW1lbnRzXG4gKiBwYXNzZWQgdG8gYGBkZWZlcnJlZC5ub3RpZnlgYC5cbiAqIEBwYXJhbSB7QW55Kn0gcHJvbWlzZSBmb3Igc29tZXRoaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0byByZWNlaXZlIGFueSBwcm9ncmVzcyBub3RpZmljYXRpb25zXG4gKiBAcmV0dXJucyB0aGUgZ2l2ZW4gcHJvbWlzZSwgdW5jaGFuZ2VkXG4gKi9cblEucHJvZ3Jlc3MgPSBwcm9ncmVzcztcbmZ1bmN0aW9uIHByb2dyZXNzKG9iamVjdCwgcHJvZ3Jlc3NlZCkge1xuICAgIHJldHVybiBRKG9iamVjdCkudGhlbih2b2lkIDAsIHZvaWQgMCwgcHJvZ3Jlc3NlZCk7XG59XG5cblByb21pc2UucHJvdG90eXBlLnByb2dyZXNzID0gZnVuY3Rpb24gKHByb2dyZXNzZWQpIHtcbiAgICByZXR1cm4gdGhpcy50aGVuKHZvaWQgMCwgdm9pZCAwLCBwcm9ncmVzc2VkKTtcbn07XG5cbi8qKlxuICogUHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgdG8gb2JzZXJ2ZSB0aGUgc2V0dGxpbmcgb2YgYSBwcm9taXNlLFxuICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBwcm9taXNlIGlzIGZ1bGZpbGxlZCBvciByZWplY3RlZC4gIEZvcndhcmRzXG4gKiB0aGUgcmVzb2x1dGlvbiB0byB0aGUgcmV0dXJuZWQgcHJvbWlzZSB3aGVuIHRoZSBjYWxsYmFjayBpcyBkb25lLlxuICogVGhlIGNhbGxiYWNrIGNhbiByZXR1cm4gYSBwcm9taXNlIHRvIGRlZmVyIGNvbXBsZXRpb24uXG4gKiBAcGFyYW0ge0FueSp9IHByb21pc2VcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIHRvIG9ic2VydmUgdGhlIHJlc29sdXRpb24gb2YgdGhlIGdpdmVuXG4gKiBwcm9taXNlLCB0YWtlcyBubyBhcmd1bWVudHMuXG4gKiBAcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBnaXZlbiBwcm9taXNlIHdoZW5cbiAqIGBgZmluYGAgaXMgZG9uZS5cbiAqL1xuUS5maW4gPSAvLyBYWFggbGVnYWN5XG5RW1wiZmluYWxseVwiXSA9IGZ1bmN0aW9uIChvYmplY3QsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KVtcImZpbmFsbHlcIl0oY2FsbGJhY2spO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUuZmluID0gLy8gWFhYIGxlZ2FjeVxuUHJvbWlzZS5wcm90b3R5cGVbXCJmaW5hbGx5XCJdID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBRKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcy50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2suZmNhbGwoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgfSwgZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAvLyBUT0RPIGF0dGVtcHQgdG8gcmVjeWNsZSB0aGUgcmVqZWN0aW9uIHdpdGggXCJ0aGlzXCIuXG4gICAgICAgIHJldHVybiBjYWxsYmFjay5mY2FsbCgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogVGVybWluYXRlcyBhIGNoYWluIG9mIHByb21pc2VzLCBmb3JjaW5nIHJlamVjdGlvbnMgdG8gYmVcbiAqIHRocm93biBhcyBleGNlcHRpb25zLlxuICogQHBhcmFtIHtBbnkqfSBwcm9taXNlIGF0IHRoZSBlbmQgb2YgYSBjaGFpbiBvZiBwcm9taXNlc1xuICogQHJldHVybnMgbm90aGluZ1xuICovXG5RLmRvbmUgPSBmdW5jdGlvbiAob2JqZWN0LCBmdWxmaWxsZWQsIHJlamVjdGVkLCBwcm9ncmVzcykge1xuICAgIHJldHVybiBRKG9iamVjdCkuZG9uZShmdWxmaWxsZWQsIHJlamVjdGVkLCBwcm9ncmVzcyk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5kb25lID0gZnVuY3Rpb24gKGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIHByb2dyZXNzKSB7XG4gICAgdmFyIG9uVW5oYW5kbGVkRXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgLy8gZm9yd2FyZCB0byBhIGZ1dHVyZSB0dXJuIHNvIHRoYXQgYGB3aGVuYGBcbiAgICAgICAgLy8gZG9lcyBub3QgY2F0Y2ggaXQgYW5kIHR1cm4gaXQgaW50byBhIHJlamVjdGlvbi5cbiAgICAgICAgUS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBtYWtlU3RhY2tUcmFjZUxvbmcoZXJyb3IsIHByb21pc2UpO1xuICAgICAgICAgICAgaWYgKFEub25lcnJvcikge1xuICAgICAgICAgICAgICAgIFEub25lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gQXZvaWQgdW5uZWNlc3NhcnkgYG5leHRUaWNrYGluZyB2aWEgYW4gdW5uZWNlc3NhcnkgYHdoZW5gLlxuICAgIHZhciBwcm9taXNlID0gZnVsZmlsbGVkIHx8IHJlamVjdGVkIHx8IHByb2dyZXNzID9cbiAgICAgICAgdGhpcy50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIHByb2dyZXNzKSA6XG4gICAgICAgIHRoaXM7XG5cbiAgICBpZiAodHlwZW9mIHByb2Nlc3MgPT09IFwib2JqZWN0XCIgJiYgcHJvY2VzcyAmJiBwcm9jZXNzLmRvbWFpbikge1xuICAgICAgICBvblVuaGFuZGxlZEVycm9yID0gcHJvY2Vzcy5kb21haW4uYmluZChvblVuaGFuZGxlZEVycm9yKTtcbiAgICB9XG5cbiAgICBwcm9taXNlLnRoZW4odm9pZCAwLCBvblVuaGFuZGxlZEVycm9yKTtcbn07XG5cbi8qKlxuICogQ2F1c2VzIGEgcHJvbWlzZSB0byBiZSByZWplY3RlZCBpZiBpdCBkb2VzIG5vdCBnZXQgZnVsZmlsbGVkIGJlZm9yZVxuICogc29tZSBtaWxsaXNlY29uZHMgdGltZSBvdXQuXG4gKiBAcGFyYW0ge0FueSp9IHByb21pc2VcbiAqIEBwYXJhbSB7TnVtYmVyfSBtaWxsaXNlY29uZHMgdGltZW91dFxuICogQHBhcmFtIHtBbnkqfSBjdXN0b20gZXJyb3IgbWVzc2FnZSBvciBFcnJvciBvYmplY3QgKG9wdGlvbmFsKVxuICogQHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgZ2l2ZW4gcHJvbWlzZSBpZiBpdCBpc1xuICogZnVsZmlsbGVkIGJlZm9yZSB0aGUgdGltZW91dCwgb3RoZXJ3aXNlIHJlamVjdGVkLlxuICovXG5RLnRpbWVvdXQgPSBmdW5jdGlvbiAob2JqZWN0LCBtcywgZXJyb3IpIHtcbiAgICByZXR1cm4gUShvYmplY3QpLnRpbWVvdXQobXMsIGVycm9yKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLnRpbWVvdXQgPSBmdW5jdGlvbiAobXMsIGVycm9yKSB7XG4gICAgdmFyIGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICB2YXIgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghZXJyb3IgfHwgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGVycm9yKSB7XG4gICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihlcnJvciB8fCBcIlRpbWVkIG91dCBhZnRlciBcIiArIG1zICsgXCIgbXNcIik7XG4gICAgICAgICAgICBlcnJvci5jb2RlID0gXCJFVElNRURPVVRcIjtcbiAgICAgICAgfVxuICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xuICAgIH0sIG1zKTtcblxuICAgIHRoaXMudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIGRlZmVycmVkLnJlc29sdmUodmFsdWUpO1xuICAgIH0sIGZ1bmN0aW9uIChleGNlcHRpb24pIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIGRlZmVycmVkLnJlamVjdChleGNlcHRpb24pO1xuICAgIH0sIGRlZmVycmVkLm5vdGlmeSk7XG5cbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSBnaXZlbiB2YWx1ZSAob3IgcHJvbWlzZWQgdmFsdWUpLCBzb21lXG4gKiBtaWxsaXNlY29uZHMgYWZ0ZXIgaXQgcmVzb2x2ZWQuIFBhc3NlcyByZWplY3Rpb25zIGltbWVkaWF0ZWx5LlxuICogQHBhcmFtIHtBbnkqfSBwcm9taXNlXG4gKiBAcGFyYW0ge051bWJlcn0gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBnaXZlbiBwcm9taXNlIGFmdGVyIG1pbGxpc2Vjb25kc1xuICogdGltZSBoYXMgZWxhcHNlZCBzaW5jZSB0aGUgcmVzb2x1dGlvbiBvZiB0aGUgZ2l2ZW4gcHJvbWlzZS5cbiAqIElmIHRoZSBnaXZlbiBwcm9taXNlIHJlamVjdHMsIHRoYXQgaXMgcGFzc2VkIGltbWVkaWF0ZWx5LlxuICovXG5RLmRlbGF5ID0gZnVuY3Rpb24gKG9iamVjdCwgdGltZW91dCkge1xuICAgIGlmICh0aW1lb3V0ID09PSB2b2lkIDApIHtcbiAgICAgICAgdGltZW91dCA9IG9iamVjdDtcbiAgICAgICAgb2JqZWN0ID0gdm9pZCAwO1xuICAgIH1cbiAgICByZXR1cm4gUShvYmplY3QpLmRlbGF5KHRpbWVvdXQpO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUuZGVsYXkgPSBmdW5jdGlvbiAodGltZW91dCkge1xuICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbiAgICB9KTtcbn07XG5cbi8qKlxuICogUGFzc2VzIGEgY29udGludWF0aW9uIHRvIGEgTm9kZSBmdW5jdGlvbiwgd2hpY2ggaXMgY2FsbGVkIHdpdGggdGhlIGdpdmVuXG4gKiBhcmd1bWVudHMgcHJvdmlkZWQgYXMgYW4gYXJyYXksIGFuZCByZXR1cm5zIGEgcHJvbWlzZS5cbiAqXG4gKiAgICAgIFEubmZhcHBseShGUy5yZWFkRmlsZSwgW19fZmlsZW5hbWVdKVxuICogICAgICAudGhlbihmdW5jdGlvbiAoY29udGVudCkge1xuICogICAgICB9KVxuICpcbiAqL1xuUS5uZmFwcGx5ID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBhcmdzKSB7XG4gICAgcmV0dXJuIFEoY2FsbGJhY2spLm5mYXBwbHkoYXJncyk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5uZmFwcGx5ID0gZnVuY3Rpb24gKGFyZ3MpIHtcbiAgICB2YXIgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgIHZhciBub2RlQXJncyA9IGFycmF5X3NsaWNlKGFyZ3MpO1xuICAgIG5vZGVBcmdzLnB1c2goZGVmZXJyZWQubWFrZU5vZGVSZXNvbHZlcigpKTtcbiAgICB0aGlzLmZhcHBseShub2RlQXJncykuZmFpbChkZWZlcnJlZC5yZWplY3QpO1xuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xufTtcblxuLyoqXG4gKiBQYXNzZXMgYSBjb250aW51YXRpb24gdG8gYSBOb2RlIGZ1bmN0aW9uLCB3aGljaCBpcyBjYWxsZWQgd2l0aCB0aGUgZ2l2ZW5cbiAqIGFyZ3VtZW50cyBwcm92aWRlZCBpbmRpdmlkdWFsbHksIGFuZCByZXR1cm5zIGEgcHJvbWlzZS5cbiAqIEBleGFtcGxlXG4gKiBRLm5mY2FsbChGUy5yZWFkRmlsZSwgX19maWxlbmFtZSlcbiAqIC50aGVuKGZ1bmN0aW9uIChjb250ZW50KSB7XG4gKiB9KVxuICpcbiAqL1xuUS5uZmNhbGwgPSBmdW5jdGlvbiAoY2FsbGJhY2sgLyouLi5hcmdzKi8pIHtcbiAgICB2YXIgYXJncyA9IGFycmF5X3NsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgcmV0dXJuIFEoY2FsbGJhY2spLm5mYXBwbHkoYXJncyk7XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5uZmNhbGwgPSBmdW5jdGlvbiAoLyouLi5hcmdzKi8pIHtcbiAgICB2YXIgbm9kZUFyZ3MgPSBhcnJheV9zbGljZShhcmd1bWVudHMpO1xuICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgbm9kZUFyZ3MucHVzaChkZWZlcnJlZC5tYWtlTm9kZVJlc29sdmVyKCkpO1xuICAgIHRoaXMuZmFwcGx5KG5vZGVBcmdzKS5mYWlsKGRlZmVycmVkLnJlamVjdCk7XG4gICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2U7XG59O1xuXG4vKipcbiAqIFdyYXBzIGEgTm9kZUpTIGNvbnRpbnVhdGlvbiBwYXNzaW5nIGZ1bmN0aW9uIGFuZCByZXR1cm5zIGFuIGVxdWl2YWxlbnRcbiAqIHZlcnNpb24gdGhhdCByZXR1cm5zIGEgcHJvbWlzZS5cbiAqIEBleGFtcGxlXG4gKiBRLm5mYmluZChGUy5yZWFkRmlsZSwgX19maWxlbmFtZSkoXCJ1dGYtOFwiKVxuICogLnRoZW4oY29uc29sZS5sb2cpXG4gKiAuZG9uZSgpXG4gKi9cblEubmZiaW5kID1cblEuZGVub2RlaWZ5ID0gZnVuY3Rpb24gKGNhbGxiYWNrIC8qLi4uYXJncyovKSB7XG4gICAgdmFyIGJhc2VBcmdzID0gYXJyYXlfc2xpY2UoYXJndW1lbnRzLCAxKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbm9kZUFyZ3MgPSBiYXNlQXJncy5jb25jYXQoYXJyYXlfc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgICAgIG5vZGVBcmdzLnB1c2goZGVmZXJyZWQubWFrZU5vZGVSZXNvbHZlcigpKTtcbiAgICAgICAgUShjYWxsYmFjaykuZmFwcGx5KG5vZGVBcmdzKS5mYWlsKGRlZmVycmVkLnJlamVjdCk7XG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgIH07XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5uZmJpbmQgPVxuUHJvbWlzZS5wcm90b3R5cGUuZGVub2RlaWZ5ID0gZnVuY3Rpb24gKC8qLi4uYXJncyovKSB7XG4gICAgdmFyIGFyZ3MgPSBhcnJheV9zbGljZShhcmd1bWVudHMpO1xuICAgIGFyZ3MudW5zaGlmdCh0aGlzKTtcbiAgICByZXR1cm4gUS5kZW5vZGVpZnkuYXBwbHkodm9pZCAwLCBhcmdzKTtcbn07XG5cblEubmJpbmQgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHRoaXNwIC8qLi4uYXJncyovKSB7XG4gICAgdmFyIGJhc2VBcmdzID0gYXJyYXlfc2xpY2UoYXJndW1lbnRzLCAyKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbm9kZUFyZ3MgPSBiYXNlQXJncy5jb25jYXQoYXJyYXlfc2xpY2UoYXJndW1lbnRzKSk7XG4gICAgICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgICAgIG5vZGVBcmdzLnB1c2goZGVmZXJyZWQubWFrZU5vZGVSZXNvbHZlcigpKTtcbiAgICAgICAgZnVuY3Rpb24gYm91bmQoKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpc3AsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgUShib3VuZCkuZmFwcGx5KG5vZGVBcmdzKS5mYWlsKGRlZmVycmVkLnJlamVjdCk7XG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xuICAgIH07XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZS5uYmluZCA9IGZ1bmN0aW9uICgvKnRoaXNwLCAuLi5hcmdzKi8pIHtcbiAgICB2YXIgYXJncyA9IGFycmF5X3NsaWNlKGFyZ3VtZW50cywgMCk7XG4gICAgYXJncy51bnNoaWZ0KHRoaXMpO1xuICAgIHJldHVybiBRLm5iaW5kLmFwcGx5KHZvaWQgMCwgYXJncyk7XG59O1xuXG4vKipcbiAqIENhbGxzIGEgbWV0aG9kIG9mIGEgTm9kZS1zdHlsZSBvYmplY3QgdGhhdCBhY2NlcHRzIGEgTm9kZS1zdHlsZVxuICogY2FsbGJhY2sgd2l0aCBhIGdpdmVuIGFycmF5IG9mIGFyZ3VtZW50cywgcGx1cyBhIHByb3ZpZGVkIGNhbGxiYWNrLlxuICogQHBhcmFtIG9iamVjdCBhbiBvYmplY3QgdGhhdCBoYXMgdGhlIG5hbWVkIG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgbWV0aG9kIG9mIG9iamVjdFxuICogQHBhcmFtIHtBcnJheX0gYXJncyBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgbWV0aG9kOyB0aGUgY2FsbGJhY2tcbiAqIHdpbGwgYmUgcHJvdmlkZWQgYnkgUSBhbmQgYXBwZW5kZWQgdG8gdGhlc2UgYXJndW1lbnRzLlxuICogQHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgdmFsdWUgb3IgZXJyb3JcbiAqL1xuUS5ubWFwcGx5ID0gLy8gWFhYIEFzIHByb3Bvc2VkIGJ5IFwiUmVkc2FuZHJvXCJcblEubnBvc3QgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lLCBhcmdzKSB7XG4gICAgcmV0dXJuIFEob2JqZWN0KS5ucG9zdChuYW1lLCBhcmdzKTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLm5tYXBwbHkgPSAvLyBYWFggQXMgcHJvcG9zZWQgYnkgXCJSZWRzYW5kcm9cIlxuUHJvbWlzZS5wcm90b3R5cGUubnBvc3QgPSBmdW5jdGlvbiAobmFtZSwgYXJncykge1xuICAgIHZhciBub2RlQXJncyA9IGFycmF5X3NsaWNlKGFyZ3MgfHwgW10pO1xuICAgIHZhciBkZWZlcnJlZCA9IGRlZmVyKCk7XG4gICAgbm9kZUFyZ3MucHVzaChkZWZlcnJlZC5tYWtlTm9kZVJlc29sdmVyKCkpO1xuICAgIHRoaXMuZGlzcGF0Y2goXCJwb3N0XCIsIFtuYW1lLCBub2RlQXJnc10pLmZhaWwoZGVmZXJyZWQucmVqZWN0KTtcbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbn07XG5cbi8qKlxuICogQ2FsbHMgYSBtZXRob2Qgb2YgYSBOb2RlLXN0eWxlIG9iamVjdCB0aGF0IGFjY2VwdHMgYSBOb2RlLXN0eWxlXG4gKiBjYWxsYmFjaywgZm9yd2FyZGluZyB0aGUgZ2l2ZW4gdmFyaWFkaWMgYXJndW1lbnRzLCBwbHVzIGEgcHJvdmlkZWRcbiAqIGNhbGxiYWNrIGFyZ3VtZW50LlxuICogQHBhcmFtIG9iamVjdCBhbiBvYmplY3QgdGhhdCBoYXMgdGhlIG5hbWVkIG1ldGhvZFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgbWV0aG9kIG9mIG9iamVjdFxuICogQHBhcmFtIC4uLmFyZ3MgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG1ldGhvZDsgdGhlIGNhbGxiYWNrIHdpbGxcbiAqIGJlIHByb3ZpZGVkIGJ5IFEgYW5kIGFwcGVuZGVkIHRvIHRoZXNlIGFyZ3VtZW50cy5cbiAqIEByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9yIGVycm9yXG4gKi9cblEubnNlbmQgPSAvLyBYWFggQmFzZWQgb24gTWFyayBNaWxsZXIncyBwcm9wb3NlZCBcInNlbmRcIlxuUS5ubWNhbGwgPSAvLyBYWFggQmFzZWQgb24gXCJSZWRzYW5kcm8nc1wiIHByb3Bvc2FsXG5RLm5pbnZva2UgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lIC8qLi4uYXJncyovKSB7XG4gICAgdmFyIG5vZGVBcmdzID0gYXJyYXlfc2xpY2UoYXJndW1lbnRzLCAyKTtcbiAgICB2YXIgZGVmZXJyZWQgPSBkZWZlcigpO1xuICAgIG5vZGVBcmdzLnB1c2goZGVmZXJyZWQubWFrZU5vZGVSZXNvbHZlcigpKTtcbiAgICBRKG9iamVjdCkuZGlzcGF0Y2goXCJwb3N0XCIsIFtuYW1lLCBub2RlQXJnc10pLmZhaWwoZGVmZXJyZWQucmVqZWN0KTtcbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbn07XG5cblByb21pc2UucHJvdG90eXBlLm5zZW5kID0gLy8gWFhYIEJhc2VkIG9uIE1hcmsgTWlsbGVyJ3MgcHJvcG9zZWQgXCJzZW5kXCJcblByb21pc2UucHJvdG90eXBlLm5tY2FsbCA9IC8vIFhYWCBCYXNlZCBvbiBcIlJlZHNhbmRybydzXCIgcHJvcG9zYWxcblByb21pc2UucHJvdG90eXBlLm5pbnZva2UgPSBmdW5jdGlvbiAobmFtZSAvKi4uLmFyZ3MqLykge1xuICAgIHZhciBub2RlQXJncyA9IGFycmF5X3NsaWNlKGFyZ3VtZW50cywgMSk7XG4gICAgdmFyIGRlZmVycmVkID0gZGVmZXIoKTtcbiAgICBub2RlQXJncy5wdXNoKGRlZmVycmVkLm1ha2VOb2RlUmVzb2x2ZXIoKSk7XG4gICAgdGhpcy5kaXNwYXRjaChcInBvc3RcIiwgW25hbWUsIG5vZGVBcmdzXSkuZmFpbChkZWZlcnJlZC5yZWplY3QpO1xuICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlO1xufTtcblxuLyoqXG4gKiBJZiBhIGZ1bmN0aW9uIHdvdWxkIGxpa2UgdG8gc3VwcG9ydCBib3RoIE5vZGUgY29udGludWF0aW9uLXBhc3Npbmctc3R5bGUgYW5kXG4gKiBwcm9taXNlLXJldHVybmluZy1zdHlsZSwgaXQgY2FuIGVuZCBpdHMgaW50ZXJuYWwgcHJvbWlzZSBjaGFpbiB3aXRoXG4gKiBgbm9kZWlmeShub2RlYmFjaylgLCBmb3J3YXJkaW5nIHRoZSBvcHRpb25hbCBub2RlYmFjayBhcmd1bWVudC4gIElmIHRoZSB1c2VyXG4gKiBlbGVjdHMgdG8gdXNlIGEgbm9kZWJhY2ssIHRoZSByZXN1bHQgd2lsbCBiZSBzZW50IHRoZXJlLiAgSWYgdGhleSBkbyBub3RcbiAqIHBhc3MgYSBub2RlYmFjaywgdGhleSB3aWxsIHJlY2VpdmUgdGhlIHJlc3VsdCBwcm9taXNlLlxuICogQHBhcmFtIG9iamVjdCBhIHJlc3VsdCAob3IgYSBwcm9taXNlIGZvciBhIHJlc3VsdClcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG5vZGViYWNrIGEgTm9kZS5qcy1zdHlsZSBjYWxsYmFja1xuICogQHJldHVybnMgZWl0aGVyIHRoZSBwcm9taXNlIG9yIG5vdGhpbmdcbiAqL1xuUS5ub2RlaWZ5ID0gbm9kZWlmeTtcbmZ1bmN0aW9uIG5vZGVpZnkob2JqZWN0LCBub2RlYmFjaykge1xuICAgIHJldHVybiBRKG9iamVjdCkubm9kZWlmeShub2RlYmFjayk7XG59XG5cblByb21pc2UucHJvdG90eXBlLm5vZGVpZnkgPSBmdW5jdGlvbiAobm9kZWJhY2spIHtcbiAgICBpZiAobm9kZWJhY2spIHtcbiAgICAgICAgdGhpcy50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgUS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbm9kZWJhY2sobnVsbCwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgUS5uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbm9kZWJhY2soZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn07XG5cblEubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlEubm9Db25mbGljdCBvbmx5IHdvcmtzIHdoZW4gUSBpcyB1c2VkIGFzIGEgZ2xvYmFsXCIpO1xufTtcblxuLy8gQWxsIGNvZGUgYmVmb3JlIHRoaXMgcG9pbnQgd2lsbCBiZSBmaWx0ZXJlZCBmcm9tIHN0YWNrIHRyYWNlcy5cbnZhciBxRW5kaW5nTGluZSA9IGNhcHR1cmVMaW5lKCk7XG5cbnJldHVybiBRO1xuXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJhbmRyb2lkXCI6IFtcIjQuMC40XCIsIFwiNC4yLjJcIiwgXCI0LjQuMlwiLCBcIjUuMFwiLCBcIjUuMVwiLCBcIjYuMFwiLCBcIjcuMFwiXSxcbiAgXCJpb3NcIjogW1wiNFwiLCBcIjVcIiwgXCI2XCIsIFwiN1wiLCBcIjhcIiwgXCI5XCIsIFwiMTBcIl0sXG4gIFwid2luZG93c1wiOiBbXCI4LjFcIiwgXCIxMFwiXVxufSIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG52YXIgdGVsZW1ldHJ5ID0gcmVxdWlyZSgndGVsZW1ldHJ5LWhlbHBlcicpO1xuXG52YXIgb3NWZXJzaW9ucztcblxudmFyIGN1cnJlbnREZXZpY2VJZDtcbnZhciBkZXZpY2VzQnlJZDtcbnZhciBpc1ZpcnR1YWwgPSB0cnVlO1xudmFyIGJhc2VQcm9wcztcblxudmFyIHZlcnNpb25NYXAgPSB7XG4gICAgJ3dpbmRvd3MnOiB7XG4gICAgICAgICc4LjEnOiAnNi4zLjk2MDAuMCcsXG4gICAgICAgICcxMCc6ICcxMC4wLjE0MzkzOS4wJ1xuICAgIH1cbn07XG5cbnZhciBkaXNwbGF5ZWRQbGF0Zm9ybXMgPSB7XG4gICAgJ2FuZHJvaWQnOiAnQW5kcm9pZCcsXG4gICAgJ2lvcyc6ICdpT1MnLFxuICAgICd3aW5kb3dzJzogJ1dpbmRvd3MnXG59O1xuXG52YXIgZGV2aWNlUGx1Z2luUGxhdGZvcm1NYXAgPSB7XG4gICAgJ2FuZHJvaWQnOiAnQW5kcm9pZCcsXG4gICAgJ2lvcyc6ICdpT1MnLFxuICAgICdvc3gnOiAnTWFjIE9TIFgnLFxuICAgICd1YnVudHUnOiAnTGludXgnXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpbml0OiBmdW5jdGlvbiAoZGV2aWNlSW5mbywgcHJvcHMpIHtcbiAgICAgICAgY3VycmVudERldmljZUlkID0gZGV2aWNlSW5mby5kZXZpY2VJZDtcbiAgICAgICAgZGV2aWNlc0J5SWQgPSBkZXZpY2VJbmZvLnBsYXRmb3JtRGV2aWNlcztcbiAgICAgICAgYmFzZVByb3BzID0gcHJvcHM7XG4gICAgfSxcblxuICAgIHNlbGVjdERldmljZTogZnVuY3Rpb24gKGRldmljZUlkKSB7XG4gICAgICAgIGN1cnJlbnREZXZpY2VJZCA9IGRldmljZUlkO1xuICAgICAgICByZXR1cm4gZ2V0Q3VycmVudERldmljZSgpO1xuICAgIH1cbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG1vZHVsZS5leHBvcnRzLCB7XG4gICAgb3NWZXJzaW9uczoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG9zVmVyc2lvbnMgPSBvc1ZlcnNpb25zIHx8IHJlcXVpcmUoJy4uLy4uL2RldmljZXMvb3MtdmVyc2lvbnMuanNvbicpO1xuICAgICAgICAgICAgcmV0dXJuIG9zVmVyc2lvbnNbZ2V0Q3VycmVudERldmljZSgpLnBsYXRmb3JtXTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjdXJyZW50RGV2aWNlOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGdldEN1cnJlbnREZXZpY2UoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkZXZpY2VzQnlJZDoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBkZXZpY2VzQnlJZDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBpc1ZpcnR1YWw6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNWaXJ0dWFsO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IGlzVmlydHVhbCkge1xuICAgICAgICAgICAgICAgIGlzVmlydHVhbCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHRlbGVtZXRyeS5zZW5kVUlUZWxlbWV0cnkoT2JqZWN0LmFzc2lnbih7fSwgYmFzZVByb3BzLCB7Y29udHJvbDogJ2lzLXZpcnR1YWwtZGV2aWNlJ30pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgXCJwcmV0dHlcIiBwbGF0Zm9ybSB2YWx1ZSB3ZSBkaXNwbGF5XG4gICAgICovXG4gICAgZGlzcGxheWVkUGxhdGZvcm06IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBUaGUgXCJwcmV0dHlcIiBwbGF0Zm9ybSBzdHJpbmcgd2UgZGlzcG9seVxuICAgICAgICAgICAgdmFyIHBsYXRmb3JtID0gZ2V0Q3VycmVudERldmljZSgpLnBsYXRmb3JtO1xuICAgICAgICAgICAgdmFyIGRpc3BsYXllZFBsYXRmb3JtID0gZGlzcGxheWVkUGxhdGZvcm1zW3BsYXRmb3JtXTtcbiAgICAgICAgICAgIGlmICghZGlzcGxheWVkUGxhdGZvcm0pIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5ZWRQbGF0Zm9ybSA9IHBsYXRmb3JtLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcGxhdGZvcm0uc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgZGlzcGxheWVkUGxhdGZvcm1zW3BsYXRmb3JtXSA9IGRpc3BsYXllZFBsYXRmb3JtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRpc3BsYXllZFBsYXRmb3JtO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBcInBsYXRmb3JtXCIgdmFsdWUgd2UgcHJvdmlkZSB0aGUgZGV2aWNlIHBsdWdpblxuICAgICAqL1xuICAgIGN1cnJlbnREZXZpY2VQbGF0Zm9ybToge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBwbGF0Zm9ybSA9IGdldEN1cnJlbnREZXZpY2UoKS5wbGF0Zm9ybTtcbiAgICAgICAgICAgIHJldHVybiBkZXZpY2VQbHVnaW5QbGF0Zm9ybU1hcFtwbGF0Zm9ybV0gfHwgcGxhdGZvcm07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY3VycmVudERldmljZVZlcnNpb246IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGV2aWNlID0gZ2V0Q3VycmVudERldmljZSgpO1xuICAgICAgICAgICAgdmFyIG9zVmVyc2lvbiA9IGRldmljZVsnb3MtdmVyc2lvbiddO1xuICAgICAgICAgICAgdmFyIHZlcnNpb25UZW1wbGF0ZSA9IGRldmljZVsnZGV2aWNlLXZlcnNpb24tdGVtcGxhdGUnXTtcbiAgICAgICAgICAgIGlmICh2ZXJzaW9uVGVtcGxhdGUgPT09ICc8b3MtdmVyc2lvbj4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9zVmVyc2lvbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZlcnNpb25UZW1wbGF0ZSA9PT0gJzxtYXAtb3MtdmVyc2lvbj4nKSB7XG4gICAgICAgICAgICAgICAgdmFyIHBsYXRmb3JtID0gZGV2aWNlLnBsYXRmb3JtO1xuICAgICAgICAgICAgICAgIHZhciBtYXBwZWRWZXJzaW9uID0gdmVyc2lvbk1hcFtwbGF0Zm9ybV0gJiYgdmVyc2lvbk1hcFtwbGF0Zm9ybV1bb3NWZXJzaW9uXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGVkVmVyc2lvbiB8fCAnKHVua25vd24pJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uVGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuZnVuY3Rpb24gZ2V0Q3VycmVudERldmljZSgpIHtcbiAgICByZXR1cm4gZGV2aWNlc0J5SWRbY3VycmVudERldmljZUlkXTtcbn1cbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gQmFzZWQgb24gQXBhY2hlIENvcmRvdmEgZ2VvbG9jYXRpb24gcGx1Z2luJ3MgUG9zaXRpb25FcnJvciBpbXBsZW1lbnRhdGlvbi5cbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2NvcmRvdmEtcGx1Z2luLWdlb2xvY2F0aW9uL2Jsb2IvbWFzdGVyL3d3dy9Qb3NpdGlvbkVycm9yLmpzXG5cbi8qKlxuICogUG9zaXRpb24gZXJyb3Igb2JqZWN0XG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0gY29kZVxuICogQHBhcmFtIG1lc3NhZ2VcbiAqL1xudmFyIFBvc2l0aW9uRXJyb3IgPSBmdW5jdGlvbihjb2RlLCBtZXNzYWdlKSB7XG4gICAgdGhpcy5jb2RlID0gY29kZSB8fCBudWxsO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2UgfHwgJyc7XG59O1xuXG5Qb3NpdGlvbkVycm9yLnByb3RvdHlwZS5QRVJNSVNTSU9OX0RFTklFRCA9IFBvc2l0aW9uRXJyb3IuUEVSTUlTU0lPTl9ERU5JRUQgPSAxO1xuUG9zaXRpb25FcnJvci5wcm90b3R5cGUuUE9TSVRJT05fVU5BVkFJTEFCTEUgPSBQb3NpdGlvbkVycm9yLlBPU0lUSU9OX1VOQVZBSUxBQkxFID0gMjtcblBvc2l0aW9uRXJyb3IucHJvdG90eXBlLlRJTUVPVVQgPSBQb3NpdGlvbkVycm9yLlRJTUVPVVQgPSAzO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvc2l0aW9uRXJyb3I7XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIEJhc2VkIGluIHBhcnQgb24gY29kZSBmcm9tIEFwYWNoZSBSaXBwbGUsIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLXJpcHBsZVxuXG52YXIgZGIgPSByZXF1aXJlKCdkYicpLFxuICAgIGV4Y2VwdGlvbiA9IHJlcXVpcmUoJ2V4Y2VwdGlvbicpLFxuICAgIHV0aWxzID0gcmVxdWlyZSgndXRpbHMnKSxcbiAgICBfcG9zaXRpb25JbmZvID0ge1xuICAgICAgICAnbGF0aXR1ZGUnOiA0My40NjUxODcsXG4gICAgICAgICdsb25naXR1ZGUnOiAtODAuNTIyMzcyLFxuICAgICAgICAnYWx0aXR1ZGUnOiAxMDAsXG4gICAgICAgICdhY2N1cmFjeSc6IDE1MCxcbiAgICAgICAgJ2FsdGl0dWRlQWNjdXJhY3knOiA4MCxcbiAgICAgICAgJ2hlYWRpbmcnOiAwLFxuICAgICAgICAnc3BlZWQnOiAwXG4gICAgfTtcblxudmFyIG1lc3NhZ2VzO1xuXG5mdW5jdGlvbiBfc2VyaWFsaXplKHNldHRpbmdzKSB7XG4gICAgdmFyIHRlbXBTZXR0aW5ncyA9IHV0aWxzLmNvcHkoc2V0dGluZ3MpO1xuICAgIHRlbXBTZXR0aW5ncy5wb3NpdGlvbi50aW1lU3RhbXAgPSAnbmV3IERhdGUoJyArIHRlbXBTZXR0aW5ncy5wb3NpdGlvbi50aW1lU3RhbXAuZ2V0VGltZSgpICsgJyknO1xuICAgIHJldHVybiB0ZW1wU2V0dGluZ3M7XG59XG5cbmZ1bmN0aW9uIF92YWxpZGF0ZVBvc2l0aW9uSW5mbyhwSW5mbykge1xuICAgIHJldHVybiAocEluZm8gJiYgIShpc05hTihwSW5mby5sYXRpdHVkZSkgfHxcbiAgICBpc05hTihwSW5mby5sb25naXR1ZGUpIHx8XG4gICAgaXNOYU4ocEluZm8uYWx0aXR1ZGUpIHx8XG4gICAgaXNOYU4ocEluZm8uYWNjdXJhY3kpIHx8XG4gICAgaXNOYU4ocEluZm8uYWx0aXR1ZGVBY2N1cmFjeSkgfHxcbiAgICBpc05hTihwSW5mby5oZWFkaW5nKSB8fFxuICAgIGlzTmFOKHBJbmZvLnNwZWVkKSkpID8gdHJ1ZSA6IGZhbHNlO1xufVxuXG52YXIgc2VsZiA9IHtcbiAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAobXNncykge1xuICAgICAgICBtZXNzYWdlcyA9IG1zZ3M7XG5cbiAgICAgICAgdmFyIHNldHRpbmdzID0gZGIucmV0cmlldmVPYmplY3QoJ2dlb3NldHRpbmdzJyk7XG4gICAgICAgIGlmIChzZXR0aW5ncykge1xuICAgICAgICAgICAgdXRpbHMuZm9yRWFjaChfcG9zaXRpb25JbmZvLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICAgICAgICAgIF9wb3NpdGlvbkluZm9ba2V5XSA9IHBhcnNlRmxvYXQoc2V0dGluZ3MucG9zaXRpb25ba2V5XSB8fCB2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc2VsZi50aW1lb3V0ID0gc2V0dGluZ3MudGltZW91dDtcbiAgICAgICAgICAgIHNlbGYuZGVsYXkgPSBzZXR0aW5ncy5kZWxheSB8fCAwO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGdldFBvc2l0aW9uSW5mbzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcGkgPSB1dGlscy5jb3B5KF9wb3NpdGlvbkluZm8pO1xuICAgICAgICBwaS50aW1lU3RhbXAgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIHJldHVybiBwaTtcbiAgICB9LFxuXG4gICAgdXBkYXRlUG9zaXRpb25JbmZvOiBmdW5jdGlvbiAobmV3UG9zaXRpb25JbmZvLCBkZWxheSwgdGltZW91dCkge1xuICAgICAgICBpZiAoIV92YWxpZGF0ZVBvc2l0aW9uSW5mbyhuZXdQb3NpdGlvbkluZm8pKSB7XG4gICAgICAgICAgICBleGNlcHRpb24ucmFpc2UoZXhjZXB0aW9uLnR5cGVzLkdlbywgJ2ludmFsaWQgcG9zaXRpb25JbmZvIG9iamVjdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3Bvc2l0aW9uSW5mbyA9IHV0aWxzLmNvcHkobmV3UG9zaXRpb25JbmZvKTtcbiAgICAgICAgX3Bvc2l0aW9uSW5mby50aW1lU3RhbXAgPSBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIHNlbGYuZGVsYXkgPSBkZWxheSB8fCAwO1xuICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0O1xuXG4gICAgICAgIGRiLnNhdmVPYmplY3QoJ2dlb3NldHRpbmdzJywgX3NlcmlhbGl6ZSh7XG4gICAgICAgICAgICBwb3NpdGlvbjogX3Bvc2l0aW9uSW5mbyxcbiAgICAgICAgICAgIGRlbGF5OiBzZWxmLmRlbGF5LFxuICAgICAgICAgICAgdGltZW91dDogc2VsZi50aW1lb3V0XG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAoIW1lc3NhZ2VzKSB7XG4gICAgICAgICAgICB0aHJvdyAnZ2VvLW1vZGVsIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCc7XG4gICAgICAgIH1cblxuICAgICAgICBtZXNzYWdlcy5lbWl0KCdwb3NpdGlvbi1pbmZvLXVwZGF0ZWQnLCBfcG9zaXRpb25JbmZvKTtcbiAgICB9LFxuXG4gICAgdGltZW91dDogZmFsc2UsXG4gICAgZGVsYXk6IDAsXG4gICAgbWFwOiB7fVxufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbGY7XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxudmFyIGRiID0gcmVxdWlyZSgnZGInKSxcbiAgICBldmVudCA9IHJlcXVpcmUoJ2V2ZW50Jyk7XG5cbnZhciBfc2ltcyA9IG51bGw7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGdldCBzaW1zKCkge1xuICAgICAgICBpZiAoIV9zaW1zKSB7XG4gICAgICAgICAgICBfc2ltcyA9IGRiLnJldHJpZXZlT2JqZWN0KCdzYXZlZC1zaW1zJykgfHwgW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9zaW1zO1xuICAgIH0sXG5cbiAgICBhZGRTaW06IGZ1bmN0aW9uIChzaW0pIHtcbiAgICAgICAgdmFyIHNpbXMgPSB0aGlzLnNpbXM7XG4gICAgICAgIHNpbXMucHVzaChzaW0pO1xuICAgICAgICBkYi5zYXZlT2JqZWN0KCdzYXZlZC1zaW1zJywgc2ltcyk7XG4gICAgICAgIGV2ZW50LnRyaWdnZXIoJ3NhdmVkLXNpbS1hZGRlZCcsIFtzaW1dKTtcbiAgICB9LFxuXG4gICAgcmVtb3ZlU2ltOiBmdW5jdGlvbiAoc2ltKSB7XG4gICAgICAgIHZhciBzaW1zID0gdGhpcy5zaW1zO1xuICAgICAgICB2YXIgc2ltSW5kZXggPSBzaW07XG4gICAgICAgIGlmICh0eXBlb2Ygc2ltSW5kZXggPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBzaW1JbmRleCA9IHNpbXMuaW5kZXhPZihzaW1JbmRleCk7XG4gICAgICAgICAgICBpZiAoc2ltSW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgJ1RyaWVkIHRvIHJlbW92ZSBzaW0gb2JqZWN0IHRoYXQgZGlkblxcJ3QgZXhpc3QnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzaW1JbmRleCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGlmIChzaW1JbmRleCA8IDAgfHwgc2ltSW5kZXggPj0gc2ltcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyAnSW52YWxpZCBzYXZlZCBzaW0gaW5kZXggJyArIHNpbUluZGV4ICsgJyAoc2hvdWxkIGJlIGZyb20gMCB0byAnICsgc2ltcy5sZW5ndGggLSAxICsgJyknO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2ltID0gc2ltc1tzaW1JbmRleF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyAnSW52YWxpZCB2YWx1ZSBwYXNzZWQgdG8gcmVtb3ZlU2ltKCk6ICcgKyBzaW07XG4gICAgICAgIH1cblxuICAgICAgICBzaW1zLnNwbGljZShzaW1JbmRleCwgMSk7XG4gICAgICAgIGRiLnNhdmVPYmplY3QoJ3NhdmVkLXNpbXMnLCBzaW1zKTtcbiAgICAgICAgZXZlbnQudHJpZ2dlcignc2F2ZWQtc2ltLXJlbW92ZWQnLCBbc2ltLCBzaW1JbmRleF0pO1xuICAgIH0sXG5cbiAgICBmaW5kU2F2ZWRTaW06IGZ1bmN0aW9uKHNlcnZpY2UsIGFjdGlvbikge1xuICAgICAgICB2YXIgc2ltcyA9IHRoaXMuc2ltcztcblxuICAgICAgICB2YXIgc2F2ZWRTaW0gPSBudWxsO1xuXG4gICAgICAgIHNpbXMuc29tZShmdW5jdGlvbiAoc2ltKSB7XG4gICAgICAgICAgICBpZiAoc2ltLnNlcnZpY2UgPT09IHNlcnZpY2UgJiYgc2ltLmFjdGlvbiA9PT0gYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgc2F2ZWRTaW0gPSBzaW07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzYXZlZFNpbTtcbiAgICB9XG59O1xuXG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuLypnbG9iYWwgaW86IGZhbHNlICovXG5cbnZhciBRID0gcmVxdWlyZSgncScpLFxuICAgIHNpbVN0YXR1cyA9IHJlcXVpcmUoJ3NpbS1zdGF0dXMnKSxcbiAgICB0ZWxlbWV0cnkgPSByZXF1aXJlKCd0ZWxlbWV0cnktaGVscGVyJyk7XG5cbnZhciBzb2NrZXQ7XG52YXIgc2VydmljZVRvUGx1Z2luTWFwO1xuXG5mdW5jdGlvbiBnZXRTdWNjZXNzKGluZGV4KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1N1Y2Nlc3MgY2FsbGJhY2sgZm9yIGluZGV4OiAnICsgaW5kZXggKyAnOyByZXN1bHQ6ICcgKyByZXN1bHQpO1xuICAgICAgICB2YXIgZGF0YSA9IHsgaW5kZXg6IGluZGV4LCByZXN1bHQ6IHJlc3VsdCB9O1xuICAgICAgICBzb2NrZXQuZW1pdCgnZXhlYy1zdWNjZXNzJywgZGF0YSk7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RmFpbHVyZShpbmRleCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0ZhaWx1cmUgY2FsbGJhY2sgZm9yIGluZGV4OiAnICsgaW5kZXggKyAnOyBlcnJvcjogJyArIGVycm9yKTtcbiAgICAgICAgdmFyIGRhdGEgPSB7IGluZGV4OiBpbmRleCwgZXJyb3I6IGVycm9yIH07XG4gICAgICAgIHNvY2tldC5lbWl0KCdleGVjLWZhaWx1cmUnLCBkYXRhKTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclNpbUhvc3QoKSB7XG4gICAgc29ja2V0LmVtaXQoJ3JlZ2lzdGVyLXNpbXVsYXRpb24taG9zdCcpO1xufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLmV4cG9ydHMsICdzb2NrZXQnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzb2NrZXQ7IC8vIFdpbGwgYmUgdW5kZWZpbmVkIGlmIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6ZSgpLlxuICAgIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cy5pbml0aWFsaXplID0gZnVuY3Rpb24gKHBsdWdpbkhhbmRsZXJzLCBzZXJ2aWNlcykge1xuICAgIHZhciBkZWZlcnJlZCA9IFEuZGVmZXIoKTtcblxuICAgIHNlcnZpY2VUb1BsdWdpbk1hcCA9IHNlcnZpY2VzO1xuICAgIHNvY2tldCA9IGlvKCk7XG5cbiAgICBzb2NrZXQub24oJ2luaXQtdGVsZW1ldHJ5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICB0ZWxlbWV0cnkuaW5pdChzb2NrZXQpO1xuICAgIH0pO1xuXG4gICAgc29ja2V0Lm9uKCdyZWZyZXNoJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkb2N1bWVudC5sb2NhdGlvbi5yZWxvYWQodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBzb2NrZXQub24oJ3JldGhlbWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0aGVtZUxpbmsgPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj1cInNpbS1ob3N0LXRoZW1lLmNzc1wiXScpO1xuICAgICAgICBpZiAodGhlbWVMaW5rKSB7XG4gICAgICAgICAgICAvLyBUcmlnZ2VyIHRoZSBzY3JpcHQgdG8gcmVsb2FkXG4gICAgICAgICAgICB0aGVtZUxpbmsuaHJlZiA9ICdzaW0taG9zdC10aGVtZS5jc3MnO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBzb2NrZXQub24oJ2Nvbm5lY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJlZ2lzdGVyU2ltSG9zdCgpO1xuICAgIH0pO1xuXG4gICAgc29ja2V0Lm9uKCdjb25uZWN0X2Vycm9yJywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTtcbiAgICB9KTtcblxuICAgIHNvY2tldC5vbignY29ubmVjdF90aW1lb3V0JywgZnVuY3Rpb24gKGVycikge1xuICAgICAgICBkZWZlcnJlZC5yZWplY3QoZXJyKTtcbiAgICB9KTtcblxuICAgIHNvY2tldC5vbignYXBwLXBsdWdpbi1saXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBUT0RPOiBwcm9jZXNzIHRoZSBsaXN0IG9mIHBsdWdpbnMgKGlzc3VlICM4NylcbiAgICAgICAgc29ja2V0LmVtaXQoJ3N0YXJ0Jyk7XG4gICAgICAgIHNpbVN0YXR1cy5fZmlyZUFwcEhvc3RSZWFkeSgpO1xuICAgIH0pO1xuXG4gICAgc29ja2V0Lm9uY2UoJ2luaXQnLCBmdW5jdGlvbiAoZGV2aWNlKSB7XG4gICAgICAgIGRlZmVycmVkLnJlc29sdmUoZGV2aWNlKTtcblxuICAgICAgICBzb2NrZXQub24oJ2V4ZWMnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgdmFyIGluZGV4O1xuXG4gICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyAnRXhlYyBjYWxsZWQgb24gc2ltdWxhdGlvbiBob3N0IHdpdGhvdXQgZXhlYyBpbmZvJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5kZXggPSBkYXRhLmluZGV4O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbmRleCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyAnRXhlYyBjYWxsZWQgb24gc2ltdWxhdGlvbiBob3N0IHdpdGhvdXQgYW4gaW5kZXggc3BlY2lmaWVkJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHN1Y2Nlc3MgPSBkYXRhLmhhc1N1Y2Nlc3MgPyBnZXRTdWNjZXNzKGluZGV4KSA6IG51bGw7XG4gICAgICAgICAgICB2YXIgZmFpbHVyZSA9IGRhdGEuaGFzRmFpbCA/IGdldEZhaWx1cmUoaW5kZXgpIDogbnVsbDtcbiAgICAgICAgICAgIHZhciBzZXJ2aWNlID0gZGF0YS5zZXJ2aWNlO1xuICAgICAgICAgICAgaWYgKCFzZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgJ0V4ZWMgY2FsbGVkIG9uIHNpbXVsYXRpb24gaG9zdCB3aXRob3V0IGEgc2VydmljZSBzcGVjaWZpZWQnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYWN0aW9uID0gZGF0YS5hY3Rpb247XG4gICAgICAgICAgICBpZiAoIWFjdGlvbikge1xuICAgICAgICAgICAgICAgIHRocm93ICdFeGVjIGNhbGxlZCBvbiBzaW11bGF0aW9uIGhvc3Qgd2l0aG91dCBhbiBhY3Rpb24gc3BlY2lmaWVkJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0V4ZWMgJyArIHNlcnZpY2UgKyAnLicgKyBhY3Rpb24gKyAnIChpbmRleDogJyArIGluZGV4ICsgJyknKTtcblxuICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBwbHVnaW5IYW5kbGVyc1tzZXJ2aWNlXSAmJiBwbHVnaW5IYW5kbGVyc1tzZXJ2aWNlXVthY3Rpb25dO1xuICAgICAgICAgICAgdmFyIHRlbGVtZXRyeVByb3BzID0geyBzZXJ2aWNlOiBzZXJ2aWNlLCBhY3Rpb246IGFjdGlvbiB9O1xuICAgICAgICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgdGVsZW1ldHJ5UHJvcHMuaGFuZGxlZCA9ICdub25lJztcbiAgICAgICAgICAgICAgICBoYW5kbGVyID0gcGx1Z2luSGFuZGxlcnNbJyonXVsnKiddO1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoc3VjY2VzcywgZmFpbHVyZSwgc2VydmljZSwgYWN0aW9uLCBkYXRhLmFyZ3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0ZWxlbWV0cnlQcm9wcy5oYW5kbGVkID0gJ3NpbS1ob3N0JztcbiAgICAgICAgICAgICAgICBoYW5kbGVyKHN1Y2Nlc3MsIGZhaWx1cmUsIGRhdGEuYXJncyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRlbGVtZXRyeS5zZW5kQ2xpZW50VGVsZW1ldHJ5KCdleGVjJywgdGVsZW1ldHJ5UHJvcHMpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHNvY2tldC5vbignaW5pdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc29ja2V0LmVtaXQoJ3JlYWR5Jyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLm5vdGlmeVBsdWdpbnNSZWFkeSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0ZWxlbWV0cnkucmVnaXN0ZXJQbHVnaW5TZXJ2aWNlcyhzZXJ2aWNlVG9QbHVnaW5NYXApO1xufTtcbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG52YXIgZGlhbG9nID0gcmVxdWlyZSgnZGlhbG9nJyksXG4gICAgdXRpbHMgPSByZXF1aXJlKCd1dGlscycpO1xuXG52YXIgdW5pcXVlSWRTdWZmaXggPSAwO1xudmFyIGludGVyYWN0aXZlRWxlbWVudFNlbGVjdG9yID0gJyogL2RlZXAvIGlucHV0LCAqIC9kZWVwLyBzZWxlY3QsICogL2RlZXAvIGJ1dHRvbiwgKiAvZGVlcC8gdGV4dGFyZWEnO1xuXG5mdW5jdGlvbiBpbml0aWFsaXplKGNoYW5nZVBhbmVsVmlzaWJpbGl0eUNhbGxiYWNrKSB7XG4gICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50KCdjb3Jkb3ZhLXBhbmVsJywge1xuICAgICAgICBwcm90bzoge1xuICAgICAgICAgICAgY29yZG92YUNvbGxhcHNlZDoge1xuICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpY29uID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5jb3Jkb3ZhLWNvbGxhcHNlLWljb24nKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNvcmRvdmEtY29udGVudCcpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXNDdXJyZW50bHlDb2xsYXBzZWQgPSBpY29uLmNsYXNzTGlzdC5jb250YWlucygnY29yZG92YS1jb2xsYXBzZWQnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgIWlzQ3VycmVudGx5Q29sbGFwc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZVBhbmVsKGljb24sIGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF2YWx1ZSAmJiBpc0N1cnJlbnRseUNvbGxhcHNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kUGFuZWwoaWNvbiwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5hYmxlZDoge1xuICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudEVuYWJsZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudEVuYWJsZWRTdGF0ZS5mb3JFYWNoKGZ1bmN0aW9uIChlbmFibGVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZFN0YXRlLmVsZW1lbnQuZGlzYWJsZWQgPSBlbmFibGVkU3RhdGUuZGlzYWJsZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZWxlbWVudEVuYWJsZWRTdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNvcmRvdmEtcGFuZWwtaW5uZXInKS5zZXRBdHRyaWJ1dGUoJ3RhYkluZGV4JywgJzAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudEVuYWJsZWRTdGF0ZSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbCh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoaW50ZXJhY3RpdmVFbGVtZW50U2VsZWN0b3IpLCBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudEVuYWJsZWRTdGF0ZS5wdXNoKHtlbGVtZW50OiBlbGVtZW50LCBkaXNhYmxlZDogZWxlbWVudC5kaXNhYmxlZH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNvcmRvdmEtcGFuZWwtaW5uZXInKS5zZXRBdHRyaWJ1dGUoJ3RhYkluZGV4JywgJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvY3VzOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5jb3Jkb3ZhLXBhbmVsLWlubmVyJykuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5jb3Jkb3ZhLWNvbnRlbnQnKTtcbiAgICAgICAgICAgIHZhciBwYW5lbElkID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2lkJyk7XG4gICAgICAgICAgICB2YXIgY29sbGFwc2VJY29uID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5jb3Jkb3ZhLWNvbGxhcHNlLWljb24nKTtcblxuICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5jb3Jkb3ZhLWhlYWRlciAuc3Bva2VuLXRleHQgc3BhbicpLnRleHRDb250ZW50ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2NhcHRpb24nKTtcbiAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcuY29yZG92YS1oZWFkZXIgLnNwb2tlbi10ZXh0IHNwYW4nKS5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5nZXRBdHRyaWJ1dGUoJ2NhcHRpb24nKSk7XG4gICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNvcmRvdmEtaGVhZGVyIC5zcG9rZW4tdGV4dCcpLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHRoaXMuZ2V0QXR0cmlidXRlKCdzcG9rZW4tdGV4dCcpIHx8IHRoaXMuZ2V0QXR0cmlidXRlKCdjYXB0aW9uJykpO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBleHBhbmRDb2xsYXBzZSgpIHtcbiAgICAgICAgICAgICAgICB2YXIgY29sbGFwc2VkID0gY29sbGFwc2VJY29uLmNsYXNzTGlzdC5jb250YWlucygnY29yZG92YS1jb2xsYXBzZWQnKTtcblxuICAgICAgICAgICAgICAgIGlmIChjb2xsYXBzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kUGFuZWwoY29sbGFwc2VJY29uLCBjb250ZW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZVBhbmVsKGNvbGxhcHNlSWNvbiwgY29udGVudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZVBhbmVsVmlzaWJpbGl0eUNhbGxiYWNrICYmIHR5cGVvZiBjaGFuZ2VQYW5lbFZpc2liaWxpdHlDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VQYW5lbFZpc2liaWxpdHlDYWxsYmFjayhwYW5lbElkLCAhY29sbGFwc2VkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcuY29yZG92YS1oZWFkZXInKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV4cGFuZENvbGxhcHNlKTtcbiAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcuY29yZG92YS1wYW5lbC1pbm5lcicpLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlLnRhcmdldCA9PT0gdGhpcyAmJiBlLmtleUNvZGUgPT09IDMyICYmICFpc01vZGlmeUtleVByZXNzZWQoZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kQ29sbGFwc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50KCdjb3Jkb3ZhLWRpYWxvZycsIHtcbiAgICAgICAgcHJvdG86IHtcbiAgICAgICAgICAgIHNob3c6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9wdXAtd2luZG93Jykuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVyeVNlbGVjdG9yKCcuY29yZG92YS1wYW5lbC1pbm5lcicpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGhpZGU6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9wdXAtd2luZG93Jykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5jb3Jkb3ZhLWhlYWRlciAuc3Bva2VuLXRleHQgc3BhbicpLnRleHRDb250ZW50ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2NhcHRpb24nKTtcbiAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcuY29yZG92YS1oZWFkZXIgLnNwb2tlbi10ZXh0IHNwYW4nKS5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5nZXRBdHRyaWJ1dGUoJ2NhcHRpb24nKSk7XG4gICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNvcmRvdmEtaGVhZGVyIC5zcG9rZW4tdGV4dCcpLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHRoaXMuZ2V0QXR0cmlidXRlKCdzcG9rZW4tdGV4dCcpIHx8IHRoaXMuZ2V0QXR0cmlidXRlKCdjYXB0aW9uJykpO1xuXG4gICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNvcmRvdmEtY2xvc2UtaWNvbicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGRpYWxvZy5oaWRlRGlhbG9nKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMjcgJiYgIWlzTW9kaWZ5S2V5UHJlc3NlZChlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBFc2NhcGUga2V5IHByZXNzZWRcbiAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmhpZGVEaWFsb2coKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50KCdjb3Jkb3ZhLWl0ZW0tbGlzdCcsIHtcbiAgICAgICAgcHJvdG86IHtcbiAgICAgICAgICAgIGFkZEl0ZW06IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVtb3ZlSXRlbToge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUNoaWxkKHRoaXMuY2hpbGRyZW5baXRlbV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdjb3Jkb3ZhLWdyb3VwJyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCgnY29yZG92YS1pdGVtJywge1xuICAgICAgICBwcm90bzoge1xuICAgICAgICAgICAgZm9jdXM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmNvcmRvdmEtaXRlbS13cmFwcGVyJykuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnY29yZG92YS1ncm91cCcpO1xuXG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gdGhhdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5jbG9zZS1idXR0b24nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVJdGVtKHRoYXQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTW9kaWZ5S2V5UHJlc3NlZChlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGxpc3QsIGNoaWxkSW5kZXg7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGUua2V5Q29kZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVsZXRlIGtleVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSXRlbSh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcCBhcnJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkSW5kZXggPSBnZXRJdGVtSW5kZXgodGhpcywgbGlzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmNoaWxkcmVuW2NoaWxkSW5kZXggLSAxXS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvd24gYXJyb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgPSB0aGlzLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEluZGV4ID0gZ2V0SXRlbUluZGV4KHRoaXMsIGxpc3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkSW5kZXggPCBsaXN0LmNoaWxkcmVuLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmNoaWxkcmVuW2NoaWxkSW5kZXggKyAxXS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldEl0ZW1JbmRleChpdGVtLCBsaXN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpc3QgJiYgbGlzdC50YWdOYW1lID09PSAnQ09SRE9WQS1JVEVNLUxJU1QnID8gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChsaXN0LmNoaWxkcmVuLCBpdGVtKSA6IC0xO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiByZW1vdmVJdGVtKGl0ZW0sIHNldEZvY3VzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxpc3QgPSBpdGVtLnBhcmVudE5vZGU7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSB3aXRoaW4gYSBsaXN0LCBjYWxjdWxhdGUgaW5kZXggaW4gdGhlIGxpc3RcbiAgICAgICAgICAgICAgICB2YXIgY2hpbGRJbmRleCA9IGdldEl0ZW1JbmRleChpdGVtLCBsaXN0KTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJhaXNlIGFuIGV2ZW50IG9uIG91cnNlbHZlc1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbVJlbW92ZWRFdmVudCA9IG5ldyBDdXN0b21FdmVudCgnaXRlbXJlbW92ZWQnLCB7IGRldGFpbDogeyBpdGVtSW5kZXg6IGNoaWxkSW5kZXggfSwgYnViYmxlczogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5kaXNwYXRjaEV2ZW50KGl0ZW1SZW1vdmVkRXZlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxpc3QucmVtb3ZlQ2hpbGQoaXRlbSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNldEZvY3VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbUNvdW50ID0gbGlzdC5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUNvdW50ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ID49IGl0ZW1Db3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEluZGV4ID0gaXRlbUNvdW50IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5jaGlsZHJlbltjaGlsZEluZGV4XS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBubyBpdGVtcyBsZWZ0LCBzZXQgZm9jdXMgdG8gY29udGFpbmluZyBwYW5lbCBpZiB0aGVyZSBpcyBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFuZWwgPSBmaW5kUGFyZW50KGxpc3QsICdjb3Jkb3ZhLXBhbmVsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwgJiYgcGFuZWwuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50KCdjb3Jkb3ZhLXBhbmVsLXJvdycsIHtcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdjb3Jkb3ZhLXBhbmVsLXJvdycpO1xuICAgICAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdjb3Jkb3ZhLWdyb3VwJyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCgnY29yZG92YS1ncm91cCcsIHtcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdjb3Jkb3ZhLWdyb3VwJyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlZ2lzdGVyQ3VzdG9tRWxlbWVudCgnY29yZG92YS1jaGVja2JveCcsIHtcbiAgICAgICAgcHJvdG86IHtcbiAgICAgICAgICAgIGNoZWNrZWQ6IHtcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZVNhZmVseSh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignaW5wdXQnKSwgJ2NoZWNrZWQnLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvY3VzOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudE5vZGUudGFnTmFtZSA9PT0gJ0NPUkRPVkEtUEFORUwnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdjb3Jkb3ZhLXBhbmVsLXJvdycpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnY29yZG92YS1ncm91cCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBSZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgY2hlY2tib3ggYW5kIGNhcHRpb25cbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQodGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsJykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoJ3Nwb2tlbicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsJykuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbXVuZ2VJZHM6ICdjb3Jkb3ZhLWNoZWNrYm94LXRlbXBsYXRlLWlucHV0J1xuICAgIH0pO1xuXG4gICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50KCdjb3Jkb3ZhLXJhZGlvJywge1xuICAgICAgICBwcm90bzoge1xuICAgICAgICAgICAgY2hlY2tlZDoge1xuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFZhbHVlU2FmZWx5KHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLCAnY2hlY2tlZCcsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9jdXM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignaW5wdXQnKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGlzQ2hlY2tlZCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdjaGVja2VkJyk7XG4gICAgICAgICAgICBpZiAoaXNDaGVja2VkICYmIGlzQ2hlY2tlZC50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignaW5wdXQnKS5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHBhcmVudEdyb3VwID0gZmluZFBhcmVudCh0aGlzLCAnY29yZG92YS1ncm91cCcpO1xuICAgICAgICAgICAgaWYgKHBhcmVudEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJhZGlvQnV0dG9uID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgICAgICAgICAgICAgcmFkaW9CdXR0b24uc2V0QXR0cmlidXRlKCduYW1lJywgcGFyZW50R3JvdXAuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtdW5nZUlkczogJ2NvcmRvdmEtcmFkaW8tdGVtcGxhdGUtaW5wdXQnXG4gICAgfSk7XG5cbiAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQoJ2NvcmRvdmEtbGFiZWwnLCB7XG4gICAgICAgIHByb3RvOiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFZhbHVlU2FmZWx5KHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdsYWJlbCcpLCAndGV4dENvbnRlbnQnLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdsYWJlbCcpLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGxhYmVsID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsJyk7XG4gICAgICAgICAgICBsYWJlbC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdsYWJlbCcpO1xuICAgICAgICAgICAgbGFiZWwuc2V0QXR0cmlidXRlKCdmb3InLCB0aGlzLmdldEF0dHJpYnV0ZSgnZm9yJykpO1xuICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2ZvcicsICcnKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdzcG9rZW4nKSkge1xuICAgICAgICAgICAgICAgIGxhYmVsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVnaXN0ZXJDdXN0b21FbGVtZW50KCdjb3Jkb3ZhLXRleHQtZW50cnknLCB7XG4gICAgICAgIHByb3RvOiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFZhbHVlU2FmZWx5KHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLCAndmFsdWUnLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykudmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRpc2FibGVkOiB7XG4gICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWVTYWZlbHkodGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JyksICdkaXNhYmxlZCcsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9jdXM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignaW5wdXQnKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsJykudGV4dENvbnRlbnQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbGFiZWwnKTtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnY29yZG92YS1wYW5lbC1yb3cnKTtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnY29yZG92YS1ncm91cCcpO1xuICAgICAgICB9LFxuICAgICAgICBldmVudFRhcmdldDogJ2lucHV0JyxcbiAgICAgICAgbXVuZ2VJZHM6ICdjb3Jkb3ZhLXRleHQtZW50cnktdGVtcGxhdGUtaW5wdXQnXG4gICAgfSk7XG5cbiAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQoJ2NvcmRvdmEtbnVtYmVyLWVudHJ5Jywge1xuICAgICAgICBwcm90bzoge1xuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbHMuaXNOdW1iZXIodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX2ludGVybmFsVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZVNhZmVseSh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignaW5wdXQnKSwgJ3ZhbHVlJywgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLnZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkaXNhYmxlZDoge1xuICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFZhbHVlU2FmZWx5KHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLCAnZGlzYWJsZWQnLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvY3VzOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkaXNwbGF5TGFiZWwgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbGFiZWwnKTtcbiAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdsYWJlbCcpLnRleHRDb250ZW50ID0gZGlzcGxheUxhYmVsO1xuICAgICAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdjb3Jkb3ZhLXBhbmVsLXJvdycpO1xuICAgICAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdjb3Jkb3ZhLWdyb3VwJyk7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcm5hbFZhbHVlID0gMDtcblxuICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7XG4gICAgICAgICAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0aGlzLmdldEF0dHJpYnV0ZSgnc3Bva2VuLXRleHQnKSB8fCBkaXNwbGF5TGFiZWwpO1xuXG4gICAgICAgICAgICB2YXIgbWF4VmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbWF4JyksXG4gICAgICAgICAgICAgICAgbWluVmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbWluJyksXG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZSgndmFsdWUnKSxcbiAgICAgICAgICAgICAgICBzdGVwID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3N0ZXAnKTtcblxuICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBfaW50ZXJuYWxWYWx1ZSB3aXRoIG9uZSBvZiB0aGUgYXZhaWxhYmxlIHZhbHVlcyxcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBpdCByZW1haW5zIDBcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB1dGlscy5pc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1pblZhbHVlICE9PSBudWxsICYmIHV0aWxzLmlzTnVtYmVyKG1pblZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ludGVybmFsVmFsdWUgPSBtaW5WYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWF4VmFsdWUgIT09IG51bGwgJiYgdXRpbHMuaXNOdW1iZXIobWF4VmFsdWUpICYmIHRoaXMuX2ludGVybmFsVmFsdWUgPiBwYXJzZUZsb2F0KG1heFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ludGVybmFsVmFsdWUgPSBtYXhWYWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG1heFZhbHVlICE9PSBudWxsKSBpbnB1dC5zZXRBdHRyaWJ1dGUoJ21heCcsIG1heFZhbHVlKTtcbiAgICAgICAgICAgIGlmIChtaW5WYWx1ZSAhPT0gbnVsbCkgaW5wdXQuc2V0QXR0cmlidXRlKCdtaW4nLCBtaW5WYWx1ZSk7XG4gICAgICAgICAgICBpZiAoc3RlcCAhPT0gbnVsbCkgaW5wdXQuc2V0QXR0cmlidXRlKCdzdGVwJywgc3RlcCk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIGlucHV0LnNldEF0dHJpYnV0ZSgndmFsdWUnLCB2YWx1ZSk7XG5cbiAgICAgICAgICAgIC8vIHZlcmlmeSBhbmQgZm9yY2UgdGhlIGlucHV0IHZhbHVlIHRvIGJlIGEgdmFsaWQgbnVtYmVyXG4gICAgICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTtcblxuICAgICAgICAgICAgICAgIGlmICh1dGlscy5pc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXcgdmFsdWUgaXMgbm90IGEgbnVtYmVyLCBzZXQgdGhlIHZhbHVlIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBsYXRlc3QgbnVtYmVyIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5faW50ZXJuYWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50VGFyZ2V0OidpbnB1dCcsXG4gICAgICAgIG11bmdlSWRzOiAnY29yZG92YS1udW1iZXItZW50cnktdGVtcGxhdGUtaW5wdXQnXG4gICAgfSk7XG5cbiAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQoJ2NvcmRvdmEtbGFiZWxlZC12YWx1ZScsIHtcbiAgICAgICAgcHJvdG86IHtcbiAgICAgICAgICAgIGxhYmVsOiB7XG4gICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWVTYWZlbHkodGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsJyksICd0ZXh0Q29udGVudCcsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignbGFiZWwnKS50ZXh0Q29udGVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZVNhZmVseSh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcignc3BhbicpLCAndGV4dENvbnRlbnQnLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHNldFZhbHVlU2FmZWx5KHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdzcGFuJyksICd0aXRsZScsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcignc3BhbicpLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsJykudGV4dENvbnRlbnQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbGFiZWwnKTtcbiAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdzcGFuJykudGV4dENvbnRlbnQgPSB0aGlzLmdldEF0dHJpYnV0ZSgndmFsdWUnKTtcbiAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdzcGFuJykuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMuZ2V0QXR0cmlidXRlKCd2YWx1ZScpKTtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnY29yZG92YS1wYW5lbC1yb3cnKTtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZCgnY29yZG92YS1ncm91cCcpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQoJ2NvcmRvdmEtYnV0dG9uJywge1xuICAgICAgICBwcm90bzoge1xuICAgICAgICAgICAgZm9jdXM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignYnV0dG9uJykuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByZWFkTGFiZWwgPSB0aGlzLmdldEF0dHJpYnV0ZSgnc3Bva2VuLXRleHQnKTtcbiAgICAgICAgICAgIGlmIChyZWFkTGFiZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignYnV0dG9uJykuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgcmVhZExhYmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnRUYXJnZXQ6ICdidXR0b24nXG4gICAgfSk7XG5cbiAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQoJ2NvcmRvdmEtZmlsZScsIHtcbiAgICAgICAgcHJvdG86IHtcbiAgICAgICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmlsZXM6IHtcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLmZpbGVzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhY2NlcHQ6IHtcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZVNhZmVseSh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignaW5wdXQnKSwgJ2FjY2VwdCcsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50VGFyZ2V0OiAnaW5wdXQnXG4gICAgfSk7XG5cbiAgICByZWdpc3RlckN1c3RvbUVsZW1lbnQoJ2NvcmRvdmEtY29tYm8nLCB7XG4gICAgICAgIHByb3RvOiB7XG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcignc2VsZWN0Jykub3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VsZWN0ZWRJbmRleDoge1xuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3NlbGVjdCcpLnNlbGVjdGVkSW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcignc2VsZWN0JykudmFsdWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZVNhZmVseSh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcignc2VsZWN0JyksICd2YWx1ZScsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwZW5kQ2hpbGQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3NlbGVjdCcpLmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmb2N1czoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdzZWxlY3QnKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdjb3Jkb3ZhLXBhbmVsLXJvdycpO1xuICAgICAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdjb3Jkb3ZhLWdyb3VwJyk7XG4gICAgICAgICAgICB2YXIgc2VsZWN0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3NlbGVjdCcpO1xuXG4gICAgICAgICAgICB2YXIgbmFtZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG4gICAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgICAgIHNlbGVjdC5zZXRBdHRyaWJ1dGUoJ25hbWUnLCBuYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGxhYmVsID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2xhYmVsJyk7XG4gICAgICAgICAgICBpZiAobGFiZWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignbGFiZWwnKS50ZXh0Q29udGVudCA9IGxhYmVsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWxlY3Quc3R5bGUud2lkdGggPSB0aGlzLnN0eWxlLndpZHRoIHx8ICcxMDAlJztcbiAgICAgICAgICAgICAgICBzZWxlY3Quc3R5bGUubWluV2lkdGggPSB0aGlzLnN0eWxlLm1pbldpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgcmVhZExhYmVsID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3Nwb2tlbi10ZXh0Jyk7XG4gICAgICAgICAgICBpZiAocmVhZExhYmVsKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHJlYWRMYWJlbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE1vdmUgb3B0aW9uIGVsZW1lbnRzIHRvIGJlIGNoaWxkcmVuIG9mIHNlbGVjdCBlbGVtZW50XG4gICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uJyk7XG4gICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG9wdGlvbnMsIGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICAgICAgICAgICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBldmVudFRhcmdldDonc2VsZWN0JyxcbiAgICAgICAgbXVuZ2VJZHM6ICdjb3Jkb3ZhLWNvbWJvLXRlbXBsYXRlLXNlbGVjdCdcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIGVsZW1lbnQgKGNvcnJlc3BvbmRzIHRvIHRhZyBpbiBodG1sIGZpbGVzKS5cbiAqIEBwYXJhbSBvcHRzIC0gb3B0aW9ucyBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBlbGVtZW50LlxuICogQHBhcmFtIG9wdHMucHJvdG8gUHJvcGVydGllcyB0byBzZXQgb24gdGhlIHByb3RvdHlwZS5cbiAqIEBwYXJhbSBvcHRzLmluaXRpYWxpemUgRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBjdXN0b20gZWxlbWVudCBpcyBpbml0aWFsaXplZC5cbiAqIEBwYXJhbSBvcHRzLmV2ZW50VGFyZ2V0IFNlbGVjdG9yIGZvciBvYmplY3QgdG8gcmVkaXJlY3QgZXZlbnRzIHRvLlxuICogQHBhcmFtIG9wdHMubXVuZ2VJZHMgQW4gaWQgb3IgYXJyYXkgb2YgaWRzIHRvICdtdW5nZScgYnkgcHJlLXBlbmRpbmcgd2l0aCBjdXN0b20gZWxlbWVudCBpZCBvciByYW5kb20gdmFsdWUgKHRvXG4gKiAgICAgICAgZW5zdXJlIHVuaXF1ZSBpbiBkb2N1bWVudClcbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJDdXN0b21FbGVtZW50KG5hbWUsIG9wdHMpIHtcbiAgICB2YXIgcHJvdG9Qcm9wZXJ0aWVzID0gb3B0cy5wcm90bztcbiAgICB2YXIgaW5pdGlhbGl6ZUNhbGxiYWNrID0gb3B0cy5pbml0aWFsaXplO1xuICAgIHZhciBldmVudFRhcmdldFNlbGVjdG9yID0gb3B0cy5ldmVudFRhcmdldDtcbiAgICB2YXIgbXVuZ2VJZHMgPSBvcHRzLm11bmdlSWRzO1xuXG4gICAgaWYgKG11bmdlSWRzICYmICFBcnJheS5pc0FycmF5KG11bmdlSWRzKSkge1xuICAgICAgICBtdW5nZUlkcyA9IFttdW5nZUlkc107XG4gICAgfVxuXG4gICAgdmFyIGNvbnN0cnVjdG9yTmFtZSA9IG5hbWUuc3BsaXQoJy0nKS5tYXAoZnVuY3Rpb24gKGJpdCkge1xuICAgICAgICByZXR1cm4gYml0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgYml0LnN1YnN0cigxKTtcbiAgICB9KS5qb2luKCcnKTtcblxuICAgIHZhciBwcm90byA9IE9iamVjdC5jcmVhdGUoSFRNTEVsZW1lbnQucHJvdG90eXBlKTtcbiAgICBpZiAocHJvdG9Qcm9wZXJ0aWVzKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHByb3RvLCBwcm90b1Byb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgIHZhciBldmVudFRhcmdldCA9IGV2ZW50VGFyZ2V0U2VsZWN0b3IgJiYgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoZXZlbnRUYXJnZXRTZWxlY3Rvcik7XG4gICAgICAgIGlmIChldmVudFRhcmdldCkge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGFkZGVkIGV2ZW50cyBhcmUgcmVkaXJlY3RlZC4gQWRkIG1vcmUgb248ZXZlbnQ+IGhhbmRsZXJzIGhlcmUgYXMgd2UgZmluZCB0aGV5J3JlIG5lZWRlZFxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcywge1xuICAgICAgICAgICAgICAgIGFkZEV2ZW50TGlzdGVuZXI6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKGEsIGIsIGMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjbGljazoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXZlbnRUYXJnZXQuY2xpY2tcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uY2xpY2s6IHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnRUYXJnZXQub25jbGljaztcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VGFyZ2V0Lm9uY2xpY2sgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25jaGFuZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnRUYXJnZXQub25jaGFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFRhcmdldC5vbmNoYW5nZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBkb24ndCBhbGxvdyBpbmxpbmUgZXZlbnQgaGFuZGxlcnMuIERldGVjdCB0aGVtIGFuZCBzdHJpcC5cbiAgICAgICAgdmFyIGF0dHMgPSB0aGlzLmF0dHJpYnV0ZXM7XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYXR0cywgZnVuY3Rpb24gKGF0dCkge1xuICAgICAgICAgICAgaWYgKGF0dC5uYW1lLmluZGV4T2YoJ29uJykgPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbnN1cHBvcnRlZCBpbmxpbmUgZXZlbnQgaGFuZGxlcnMgZGV0ZWN0ZWQ6ICcgKyBuYW1lICsgJy4nICsgYXR0Lm5hbWUgKyAnPVwiJyArIGF0dC52YWx1ZSArICdcIicpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKGF0dC5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcyk7XG5cblxuICAgICAgICAvLyBJbml0aWFsaXplIGlmIGl0IGlzIHJlcXVpcmVkXG4gICAgICAgIGluaXRpYWxpemVDYWxsYmFjayAmJiBpbml0aWFsaXplQ2FsbGJhY2suY2FsbCh0aGlzKTtcblxuICAgICAgICAvLyBBcHBseSBhdHRyaWJ1dGVzXG4gICAgfVxuXG4gICAgcHJvdG8uYXR0YWNoZWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICAvLyBJZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLCBkbyBzbyBub3cuXG4gICAgICAgICAgICBpbml0aWFsaXplLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvdG8uY3JlYXRlZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG5hbWUgKyAnLXRlbXBsYXRlJyk7XG4gICAgICAgIHZhciBzaGFkb3dSb290ID0gdGhpcy5jcmVhdGVTaGFkb3dSb290KCk7XG4gICAgICAgIHNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuaW1wb3J0Tm9kZSh0LmNvbnRlbnQsIHRydWUpKTtcblxuICAgICAgICBpZiAobXVuZ2VJZHMpIHtcbiAgICAgICAgICAgIG11bmdlSWRzLmZvckVhY2goZnVuY3Rpb24gKGlkVG9NdW5nZSkge1xuICAgICAgICAgICAgICAgIHZhciBtdW5nZWRJZCA9IGlkVG9NdW5nZSArICctJyArIHVuaXF1ZUlkU3VmZml4Kys7XG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignIycgKyBpZFRvTXVuZ2UpO1xuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnaWQnLCBtdW5nZWRJZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGZvckVsZW1lbnQgPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ1tmb3I9JyArIGlkVG9NdW5nZSArICddJyk7XG4gICAgICAgICAgICAgICAgaWYgKGZvckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2ZvcicsIG11bmdlZElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbml0aWFsaXplQ2FsbGJhY2sgJiYgdGhpcy5vd25lckRvY3VtZW50ID09PSBkb2N1bWVudCkge1xuICAgICAgICAgICAgLy8gSWYgaXQgaXMgYmVpbmcgY3JlYXRlZCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgaW5pdGlhbGl6ZSBpbW1lZGlhdGVseS5cbiAgICAgICAgICAgIGluaXRpYWxpemUuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB3aW5kb3dbY29uc3RydWN0b3JOYW1lXSA9IGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudChuYW1lLCB7XG4gICAgICAgIHByb3RvdHlwZTogcHJvdG9cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gaXNNb2RpZnlLZXlQcmVzc2VkKGUpIHtcbiAgICByZXR1cm4gZS5hbHRLZXkgfHwgZS5jdHJsS2V5IHx8IGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5O1xufVxuXG5mdW5jdGlvbiBjb2xsYXBzZVBhbmVsKGljb25FbGVtLCBjb250ZW50KSB7XG4gICAgaWNvbkVsZW0uY2xhc3NMaXN0LmFkZCgnY29yZG92YS1jb2xsYXBzZWQnKTtcbiAgICBjb250ZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgY29udGVudC5zdHlsZS5oZWlnaHQgPSAnMCc7XG59XG5cbmZ1bmN0aW9uIGV4cGFuZFBhbmVsKGljb25FbGVtLCBjb250ZW50KSB7XG4gICAgaWNvbkVsZW0uY2xhc3NMaXN0LnJlbW92ZSgnY29yZG92YS1jb2xsYXBzZWQnKTtcbiAgICBjb250ZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBjb250ZW50LnN0eWxlLmhlaWdodCA9ICcnO1xufVxuXG5mdW5jdGlvbiBmaW5kUGFyZW50KGVsZW1lbnQsIHRhZykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0YWcpKSB7XG4gICAgICAgIHRhZyA9IFt0YWddO1xuICAgIH1cblxuICAgIHZhciBwYXJlbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgcmV0dXJuIHBhcmVudCAmJiBwYXJlbnQudGFnTmFtZSA/IHRhZy5pbmRleE9mKHBhcmVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpID4gLTEgPyBwYXJlbnQgOiBmaW5kUGFyZW50KHBhcmVudCwgdGFnKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlU2FmZWx5KGVsLCBwcm9wLCB2YWx1ZSkge1xuICAgIC8vIEluIElFLCBzZXR0aW5nIHRoZSBwcm9wZXJ0eSB3aGVuIHRoZSBlbGVtZW50IGhhc24ndCB5ZXQgYmVlbiBhZGRlZCB0byB0aGUgZG9jdW1lbnQgY2FuIGZhaWwgKGxpa2UgYW4gaXNzdWUgd2l0aFxuICAgIC8vIHRoZSB3ZWJjb21wb25lbnRzIHBvbHlmaWxsKSwgc28gZG8gaXQgYWZ0ZXIgYSBzZXRUaW1lb3V0KCkuXG4gICAgaWYgKGVsLm93bmVyRG9jdW1lbnQuY29udGFpbnMoZWwpKSB7XG4gICAgICAgIGVsW3Byb3BdID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZWxbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpbml0aWFsaXplOiBpbml0aWFsaXplXG59O1xuXG5pZiAoIUFycmF5LnByb3RvdHlwZS5maW5kKSB7XG4gICAgQXJyYXkucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbiAocHJlZGljYXRlKSB7XG4gICAgICAgIGlmICh0aGlzID09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5maW5kIGNhbGxlZCBvbiBudWxsIG9yIHVuZGVmaW5lZCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcmVkaWNhdGUgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxpc3QgPSBPYmplY3QodGhpcyk7XG4gICAgICAgIHZhciBsZW5ndGggPSBsaXN0Lmxlbmd0aCA+Pj4gMDtcbiAgICAgICAgdmFyIHRoaXNBcmcgPSBhcmd1bWVudHNbMV07XG4gICAgICAgIHZhciB2YWx1ZTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGxpc3RbaV07XG4gICAgICAgICAgICBpZiAocHJlZGljYXRlLmNhbGwodGhpc0FyZywgdmFsdWUsIGksIGxpc3QpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbn1cbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG5yZXF1aXJlKCdwb2x5ZmlsbHMnKTtcblxudmFyIGN1c3RvbUVsZW1lbnRzID0gcmVxdWlyZSgnLi9jdXN0b20tZWxlbWVudHMnKSxcbiAgICBkYiA9IHJlcXVpcmUoJ2RiJyksXG4gICAgZGlhbG9nID0gcmVxdWlyZSgnZGlhbG9nJyksXG4gICAgTWVzc2FnZXMgPSByZXF1aXJlKCdtZXNzYWdlcycpLFxuICAgIFEgPSByZXF1aXJlKCdxJyksXG4gICAgc29ja2V0ID0gcmVxdWlyZSgnLi4vcHJvdG9jb2wvc29ja2V0Jyk7XG5cbnZhciBDT0xMQVBTRURfUEFORUxTX0tFWSA9ICdjb2xsYXBzZWQtcGFuZWxzJztcblxudmFyIHBsdWdpbnM7XG52YXIgcGx1Z2luSGFuZGxlcnMgPSB7fTtcbnZhciBzZXJ2aWNlVG9QbHVnaW5NYXAgPSB7fTtcbnZhciBpbml0U29ja2V0UHJvbWlzZSA9IHNvY2tldC5pbml0aWFsaXplKHBsdWdpbkhhbmRsZXJzLCBzZXJ2aWNlVG9QbHVnaW5NYXApO1xuXG5jdXN0b21FbGVtZW50cy5pbml0aWFsaXplKGNoYW5nZVBhbmVsVmlzaWJpbGl0eUNhbGxiYWNrKTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgc2l6ZUNvbnRlbnQoKTtcbiAgICBRLmFsbChbZGIuaW5pdGlhbGl6ZSgpLCBpbml0U29ja2V0UHJvbWlzZV0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBpbml0aWFsaXplUGx1Z2lucyhyZXN1bHRbMV0pO1xuXG4gICAgICAgIC8vIFNvbWUgcGFuZWxzLCBsaWtlIGdlb2xvY2F0aW9uLCBuZWVkIHRvIGJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB0aGV5IGNhbiBiZSBoaWRkZW4sIG90aGVyd2lzZSB0aGV5IHdpbGxcbiAgICAgICAgLy8gc3RvcCB3b3JraW5nLiBGb3IgdGhhdCByZWFzb24sIHdlIHJlc3RvcmUgdGhlIGluaXRpYWwgY29sbGFwc2Ugc3RhdGUgdG8gdGhlIHBhbmVscyBvbmx5IGFmdGVyIHBsdWdpblxuICAgICAgICAvLyBpbml0aWFsaXphdGlvbi5cbiAgICAgICAgZ2V0Q29sbGFwc2VkUGFuZWxzKCkuZm9yRWFjaChmdW5jdGlvbiAocGFuZWxJZCkge1xuICAgICAgICAgICAgdmFyIHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocGFuZWxJZCk7XG4gICAgICAgICAgICBpZiAocGFuZWwpIHtcbiAgICAgICAgICAgICAgICBwYW5lbC5jb3Jkb3ZhQ29sbGFwc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSkuZG9uZSgpO1xufSk7XG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgc2l6ZUNvbnRlbnQoKTtcbn0pO1xuXG5mdW5jdGlvbiBjaGFuZ2VQYW5lbFZpc2liaWxpdHlDYWxsYmFjayhpZCwgaXNOb3dDb2xsYXBzZWQpIHtcbiAgICB2YXIgY29sbGFwc2VkUGFuZWxzID0gZ2V0Q29sbGFwc2VkUGFuZWxzKCk7XG4gICAgdmFyIGluZGV4ID0gY29sbGFwc2VkUGFuZWxzLmluZGV4T2YoaWQpO1xuXG4gICAgaWYgKGlzTm93Q29sbGFwc2VkICYmIGluZGV4ID09PSAtMSkge1xuICAgICAgICBjb2xsYXBzZWRQYW5lbHMucHVzaChpZCk7XG4gICAgfSBlbHNlIGlmICghaXNOb3dDb2xsYXBzZWQgJiYgaW5kZXggPiAtMSkge1xuICAgICAgICBjb2xsYXBzZWRQYW5lbHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBkYi5zYXZlT2JqZWN0KENPTExBUFNFRF9QQU5FTFNfS0VZLCBjb2xsYXBzZWRQYW5lbHMpO1xufVxuXG5mdW5jdGlvbiBnZXRDb2xsYXBzZWRQYW5lbHMoKSB7XG4gICAgdmFyIGNvbGxhcHNlZFBhbmVscyA9IGRiLnJldHJpZXZlT2JqZWN0KENPTExBUFNFRF9QQU5FTFNfS0VZKTtcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShjb2xsYXBzZWRQYW5lbHMpKSB7XG4gICAgICAgIGNvbGxhcHNlZFBhbmVscyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiBjb2xsYXBzZWRQYW5lbHM7XG59XG5cbmZ1bmN0aW9uIHNpemVDb250ZW50KCkge1xuICAgIC8vIFNpemUgdGhlIGNvbnRlbnQgYXJlYSB0byBrZWVwIGNvbHVtbiB3aWR0aHMgZml4ZWRcbiAgICB2YXIgYm9keVdpZHRoID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSkud2lkdGgpO1xuICAgIHZhciBwYW5lbFdpZHRoID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignY29yZG92YS1wYW5lbCcpKS53aWR0aCk7XG5cbiAgICAvLyBSYXRpbyBvZiBjb2x1bW4gdG8gcGFuZWwgd2lkdGggaXMgMzIzIHRvIDMyMC4gVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCBnZXQgdGhlIGNvbHVtbiB3aWR0aCBkaXJlY3RseSwgYXMgdGhlXG4gICAgLy8gY29tcHV0ZWQgdmFsdWUgaXMgaW5jb25zaXN0ZW50IGJldHdlZW4gYnJvd3NlcnMuIFNvIGlmIHdlIGNoYW5nZSBlaXRoZXIgb2YgdGhlc2Ugd2lkdGhzLCB3ZSdsbCBuZWVkIHRvIHVwZGF0ZVxuICAgIC8vIHRoaXMgZXF1YXRpb24uXG4gICAgdmFyIGNvbHVtbldpZHRoID0gcGFuZWxXaWR0aCAvIDMyMCAqIDMyMyArIDM7XG5cbiAgICB2YXIgY29udGVudFdpZHRoID0gKE1hdGguZmxvb3IoKGJvZHlXaWR0aCAtIDEpIC8gY29sdW1uV2lkdGgpIHx8IDEpICogY29sdW1uV2lkdGg7XG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNvcmRvdmEtbWFpbicpLnN0eWxlLndpZHRoID0gY29udGVudFdpZHRoICsgJ3B4Jztcbn1cblxudmFyIHBsdWdpbk1lc3NhZ2VzID0ge307XG5mdW5jdGlvbiBhcHBseVBsdWdpbnMocGx1Z2lucywgY2xvYmJlclNjb3BlLCBjbG9iYmVyVG9QbHVnaW5NYXApIHtcbiAgICBPYmplY3Qua2V5cyhwbHVnaW5zKS5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW5JZCkge1xuICAgICAgICB2YXIgcGx1Z2luID0gcGx1Z2luc1twbHVnaW5JZF07XG4gICAgICAgIGlmIChwbHVnaW4pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGx1Z2luID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcGx1Z2luTWVzc2FnZXNbcGx1Z2luSWRdID0gcGx1Z2luTWVzc2FnZXNbcGx1Z2luSWRdIHx8IG5ldyBNZXNzYWdlcyhwbHVnaW5JZCwgc29ja2V0LnNvY2tldCk7XG4gICAgICAgICAgICAgICAgcGx1Z2luID0gcGx1Z2luKHBsdWdpbk1lc3NhZ2VzW3BsdWdpbklkXSk7XG4gICAgICAgICAgICAgICAgcGx1Z2luc1twbHVnaW5JZF0gPSBwbHVnaW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2xvYmJlclNjb3BlKSB7XG4gICAgICAgICAgICAgICAgY2xvYmJlcihwbHVnaW4sIGNsb2JiZXJTY29wZSwgY2xvYmJlclRvUGx1Z2luTWFwLCBwbHVnaW5JZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY2xvYmJlcihjbG9iYmVycywgc2NvcGUsIGNsb2JiZXJUb1BsdWdpbk1hcCwgcGx1Z2luSWQpIHtcbiAgICBPYmplY3Qua2V5cyhjbG9iYmVycykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmIChjbG9iYmVyVG9QbHVnaW5NYXAgJiYgcGx1Z2luSWQpIHtcbiAgICAgICAgICAgIGNsb2JiZXJUb1BsdWdpbk1hcFtrZXldID0gcGx1Z2luSWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2xvYmJlcnNba2V5XSAmJiB0eXBlb2YgY2xvYmJlcnNba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHNjb3BlW2tleV0gPSBzY29wZVtrZXldIHx8IHt9O1xuICAgICAgICAgICAgY2xvYmJlcihjbG9iYmVyc1trZXldLCBzY29wZVtrZXldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjb3BlW2tleV0gPSBjbG9iYmVyc1trZXldO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGluaXRpYWxpemVQbHVnaW5zKGRldmljZSkge1xuICAgIHBsdWdpbnMgPSB7XG4gICAgICAgICdjb3Jkb3ZhLXBsdWdpbi1nZW9sb2NhdGlvbic6IHJlcXVpcmUoJ2NvcmRvdmEtcGx1Z2luLWdlb2xvY2F0aW9uJyksXG4nZXhlYyc6IHJlcXVpcmUoJ2V4ZWMnKSxcbidldmVudHMnOiByZXF1aXJlKCdldmVudHMnKSxcbidjb3Jkb3ZhLXBsdWdpbi1kZXZpY2UnOiByZXF1aXJlKCdjb3Jkb3ZhLXBsdWdpbi1kZXZpY2UnKSxcbidjb3Jkb3ZhLXBsdWdpbi1jYW1lcmEnOiByZXF1aXJlKCdjb3Jkb3ZhLXBsdWdpbi1jYW1lcmEnKVxuICAgIH07XG5cbiAgICB2YXIgcGx1Z2luSGFuZGxlcnNEZWZpbml0aW9ucyA9IHtcbiAgICAgICAgJ2NvcmRvdmEtcGx1Z2luLWdlb2xvY2F0aW9uJzogcmVxdWlyZSgnY29yZG92YS1wbHVnaW4tZ2VvbG9jYXRpb24taGFuZGxlcnMnKSxcbidleGVjJzogcmVxdWlyZSgnZXhlYy1oYW5kbGVycycpLFxuJ2NvcmRvdmEtcGx1Z2luLWRldmljZSc6IHJlcXVpcmUoJ2NvcmRvdmEtcGx1Z2luLWRldmljZS1oYW5kbGVycycpLFxuJ2NvcmRvdmEtcGx1Z2luLXN0YXR1c2Jhcic6IHJlcXVpcmUoJ2NvcmRvdmEtcGx1Z2luLXN0YXR1c2Jhci1oYW5kbGVycycpLFxuJ2FuZHJvaWQtcGxhdGZvcm0tY29yZSc6IHJlcXVpcmUoJ2FuZHJvaWQtcGxhdGZvcm0tY29yZS1oYW5kbGVycycpXG4gICAgfTtcblxuICAgIGFwcGx5UGx1Z2lucyhwbHVnaW5zKTtcbiAgICBhcHBseVBsdWdpbnMocGx1Z2luSGFuZGxlcnNEZWZpbml0aW9ucywgcGx1Z2luSGFuZGxlcnMsIHNlcnZpY2VUb1BsdWdpbk1hcCk7XG5cbiAgICAvLyBIaWRlIGFuZCByZWdpc3RlciBkaWFsb2dzXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncG9wdXAtd2luZG93JykuY2hpbGRyZW4sIGZ1bmN0aW9uIChkaWFsb2dSZWYpIHtcbiAgICAgICAgZGlhbG9nLnBsdWdpbkRpYWxvZ3NbZGlhbG9nUmVmLmlkXSA9IGRpYWxvZ1JlZjtcbiAgICAgICAgZGlhbG9nUmVmLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfSk7XG5cbiAgICBPYmplY3Qua2V5cyhwbHVnaW5zKS5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW5JZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGx1Z2luc1twbHVnaW5JZF0gJiYgcGx1Z2luc1twbHVnaW5JZF0uaW5pdGlhbGl6ZSAmJiBwbHVnaW5zW3BsdWdpbklkXS5pbml0aWFsaXplKGRldmljZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluaXRpYWxpemluZyBwbHVnaW4gJyArIHBsdWdpbklkKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHNvY2tldC5ub3RpZnlQbHVnaW5zUmVhZHkoKTtcbn1cbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBpcyBub3QgZGVmaW5lZCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgICAgIH1cbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgICdDb3JlQW5kcm9pZCc6IHtcbiAgICAgICAgJ3Nob3cnOiBmdW5jdGlvbiAoc3VjY2VzcywgZmFpbCwgc2VydmljZSwgYWN0aW9uLCBhcmdzKSB7XG4gICAgICAgICAgICBzdWNjZXNzICYmIHN1Y2Nlc3MoKTtcbiAgICAgICAgfSxcbiAgICAgICAgJ21lc3NhZ2VDaGFubmVsJzogZnVuY3Rpb24gKHN1Y2Nlc3MsIGZhaWwsIHNlcnZpY2UsIGFjdGlvbiwgYXJncykge1xuICAgICAgICAgICAgLy8gVGhpcyBjYWxsIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgdGhlIG1lc3NhZ2VDaGFubmVsIGNhbGxiYWNrIHRvIHRoZSBuYXRpdmUgSmF2YSBjb2RlLiBTaW5jZSB3ZSBkb24ndCBuZWVkXG4gICAgICAgICAgICAvLyB0aGF0LCB3ZSBqdXN0IHN3YWxsb3cgdGhpcyBhbmQgZG8gbm90aGluZy5cbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIEJhc2VkIGluIHBhcnQgb24gY29kZSBmcm9tIEFwYWNoZSBDb3Jkb3ZhIChodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2NvcmRvdmEtanMpXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJ3V0aWxzJyk7XG5cbnZhciBtb2R1bGVFeHBvcnRzID0gbW9kdWxlLmV4cG9ydHM7XG5cbnZhciB0eXBlTWFwID0ge1xuICAgICdBJzogJ0FycmF5JyxcbiAgICAnRCc6ICdEYXRlJyxcbiAgICAnTic6ICdOdW1iZXInLFxuICAgICdTJzogJ1N0cmluZycsXG4gICAgJ0YnOiAnRnVuY3Rpb24nLFxuICAgICdPJzogJ09iamVjdCdcbn07XG5cbmZ1bmN0aW9uIGV4dHJhY3RQYXJhbU5hbWUoY2FsbGVlLCBhcmdJbmRleCkge1xuICAgIHJldHVybiAoLy4qP1xcKCguKj8pXFwpLykuZXhlYyhjYWxsZWUpWzFdLnNwbGl0KCcsICcpW2FyZ0luZGV4XTtcbn1cblxuZnVuY3Rpb24gY2hlY2tBcmdzKHNwZWMsIGZ1bmN0aW9uTmFtZSwgYXJncywgb3B0X2NhbGxlZSkge1xuICAgIGlmICghbW9kdWxlRXhwb3J0cy5lbmFibGVDaGVja3MpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgZXJyTXNnID0gbnVsbDtcbiAgICB2YXIgdHlwZU5hbWU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGVjLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBjID0gc3BlYy5jaGFyQXQoaSksXG4gICAgICAgICAgICBjVXBwZXIgPSBjLnRvVXBwZXJDYXNlKCksXG4gICAgICAgICAgICBhcmcgPSBhcmdzW2ldO1xuICAgICAgICAvLyBBc3Rlcml4IG1lYW5zIGFsbG93IGFueXRoaW5nLlxuICAgICAgICBpZiAoYyA9PSAnKicpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHR5cGVOYW1lID0gdXRpbHMudHlwZU5hbWUoYXJnKTtcbiAgICAgICAgaWYgKChhcmcgPT09IG51bGwgfHwgYXJnID09PSB1bmRlZmluZWQpICYmIGMgPT0gY1VwcGVyKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZU5hbWUgIT0gdHlwZU1hcFtjVXBwZXJdKSB7XG4gICAgICAgICAgICBlcnJNc2cgPSAnRXhwZWN0ZWQgJyArIHR5cGVNYXBbY1VwcGVyXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJNc2cpIHtcbiAgICAgICAgZXJyTXNnICs9ICcsIGJ1dCBnb3QgJyArIHR5cGVOYW1lICsgJy4nO1xuICAgICAgICBlcnJNc2cgPSAnV3JvbmcgdHlwZSBmb3IgcGFyYW1ldGVyIFwiJyArIGV4dHJhY3RQYXJhbU5hbWUob3B0X2NhbGxlZSB8fCBhcmdzLmNhbGxlZSwgaSkgKyAnXCIgb2YgJyArIGZ1bmN0aW9uTmFtZSArICc6ICcgKyBlcnJNc2c7XG4gICAgICAgIHRocm93IFR5cGVFcnJvcihlcnJNc2cpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUodmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG59XG5cbm1vZHVsZUV4cG9ydHMuY2hlY2tBcmdzID0gY2hlY2tBcmdzO1xubW9kdWxlRXhwb3J0cy5nZXRWYWx1ZSA9IGdldFZhbHVlO1xubW9kdWxlRXhwb3J0cy5lbmFibGVDaGVja3MgPSB0cnVlO1xuXG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxudmFyIGRpYWxvZyA9IHJlcXVpcmUoJ2RpYWxvZycpO1xudmFyIHRlbGVtZXRyeSA9IHJlcXVpcmUoJ3RlbGVtZXRyeS1oZWxwZXInKTtcblxudmFyIGJhc2VQcm9wcyA9IHtcbiAgICBwbHVnaW46ICdjb3Jkb3ZhLXBsdWdpbi1jYW1lcmEnLFxuICAgIHBhbmVsOiAnY2FtZXJhJ1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWVzc2FnZXMpIHtcbiAgICB2YXIgZmlsZW5hbWVJbnB1dCxcbiAgICAgICAgZGlhbG9nRmlsZW5hbWVJbnB1dCxcbiAgICAgICAgZGlhbG9nSW1nLFxuICAgICAgICBkaWFsb2dTZWxlY3RlZEZpbGUsXG4gICAgICAgIHByZVNlbGVjdGVkRmlsZTtcblxuICAgIG1lc3NhZ2VzLnJlZ2lzdGVyKCd0YWtlUGljdHVyZScsIGZ1bmN0aW9uIChhcmdzLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbWVyYS1wcm9tcHQnKS5jaGVja2VkKSB7XG4gICAgICAgICAgICBkaWFsb2cuc2hvd0RpYWxvZygnY2FtZXJhLWNob29zZS1pbWFnZScsIGZ1bmN0aW9uIChtc2cpIHtcbiAgICAgICAgICAgICAgICBpZiAobXNnID09PSAnc2hvd2luZycpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTm90IHdlIHVzZSAub25jbGljayBldGMgaGVyZSByYXRoZXIgdGhhbiBhZGRFdmVudExpc3RlbmVyKCkgdG8gZW5zdXJlIHdlIHJlcGxhY2UgYW55IGV4aXN0aW5nXG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXIgd2l0aCBvbmUgdGhhdCB1c2VzIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBvZiAnY2FsbGJhY2snIGZyb20gdGhlIGN1cnJlbnQgY2xvc3VyZS5cbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbWVyYS1kaWFsb2ctdXNlLWltYWdlJykub25jbGljayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZy5oaWRlRGlhbG9nKCdjYW1lcmEtY2hvb3NlLWltYWdlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlhbG9nU2VsZWN0ZWRGaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGljdHVyZShkaWFsb2dTZWxlY3RlZEZpbGUsIGNhbGxiYWNrLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW1lcmEtZGlhbG9nLWNhbmNlbCcpLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cuaGlkZURpYWxvZygnY2FtZXJhLWNob29zZS1pbWFnZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbWVyYS1maWxlJykuY2hlY2tlZCkge1xuICAgICAgICAgICAgZ2V0UGljdHVyZShwcmVTZWxlY3RlZEZpbGUsIGNhbGxiYWNrLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gZ2V0UGljdHVyZShmaWxlLCBjYWxsYmFjaywgYXJncykge1xuICAgICAgICBpZiAoYXJncyAmJiBhcmdzWzFdID09PSAwKSB7XG4gICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiB0eXBlIGlzIERBVEFfVVJMICovXG4gICAgICAgICAgICBjcmVhdGVEYXRhVXJsKGZpbGUsIGNhbGxiYWNrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNyZWF0ZUFycmF5QnVmZmVyKGZpbGUsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUFycmF5QnVmZmVyKGJsb2IsIGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY2FsbGJhY2socmVhZGVyLmVycm9yLCB7IGRhdGE6IHJlYWRlci5yZXN1bHQsIHR5cGU6IGJsb2IudHlwZSB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZURhdGFVcmwoYmxvYiwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgaW1hZ2VEYXRhID0gcmVhZGVyLnJlc3VsdDtcbiAgICAgICAgICAgIGlmIChpbWFnZURhdGEpIHtcbiAgICAgICAgICAgICAgICBpbWFnZURhdGEgPSBpbWFnZURhdGEuc3Vic3RyKGltYWdlRGF0YS5pbmRleE9mKCcsJykgKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRlci5lcnJvciwgaW1hZ2VEYXRhKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZmlsZW5hbWVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW1lcmEtZmlsZW5hbWUnKTtcbiAgICAgICAgICAgIGRpYWxvZ0ZpbGVuYW1lSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FtZXJhLWRpYWxvZy1maWxlbmFtZScpO1xuICAgICAgICAgICAgZGlhbG9nSW1nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbWVyYS1kaWFsb2ctaW1hZ2UnKTtcbiAgICAgICAgICAgIHZhciBwYW5lbEltZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW1lcmEtaW1nJyk7XG5cbiAgICAgICAgICAgIC8vIFNldHVwIGhhbmRsZXJzIGZvciBjaG9vc2luZyBhbiBpbWFnZSBpbiB0aGUgcGFuZWxcbiAgICAgICAgICAgIGZpbGVuYW1lSW5wdXQuYWNjZXB0ID0gJ2ltYWdlLyonO1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbWVyYS1jaG9vc2UtZmlsZW5hbWUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0ZWxlbWV0cnkuc2VuZFVJVGVsZW1ldHJ5KE9iamVjdC5hc3NpZ24oe30sIGJhc2VQcm9wcywgeyBjb250cm9sOiAnY2FtZXJhLWNob29zZS1maWxlbmFtZScgfSkpO1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lSW5wdXQuaW5wdXQuY2xpY2soKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmaWxlbmFtZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsZW5hbWVJbnB1dC5maWxlc1swXSkge1xuICAgICAgICAgICAgICAgICAgICBwcmVTZWxlY3RlZEZpbGUgPSBmaWxlbmFtZUlucHV0LmZpbGVzWzBdO1xuICAgICAgICAgICAgICAgICAgICBwYW5lbEltZy5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKHByZVNlbGVjdGVkRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsSW1nLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gU2V0dXAgaGFuZGxlcnMgZm9yIGNob29zaW5nIGFuIGltYWdlIGluIHRoZSBkaWFsb2dcbiAgICAgICAgICAgIGRpYWxvZ0ZpbGVuYW1lSW5wdXQuYWNjZXB0ID0gJ2ltYWdlLyonO1xuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbWVyYS1kaWFsb2ctY2hvb3NlLWZpbGVuYW1lJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZGlhbG9nRmlsZW5hbWVJbnB1dC5pbnB1dC5jbGljaygpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRpYWxvZ0ZpbGVuYW1lSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChkaWFsb2dGaWxlbmFtZUlucHV0LmZpbGVzWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ1NlbGVjdGVkRmlsZSA9IGRpYWxvZ0ZpbGVuYW1lSW5wdXQuZmlsZXNbMF07XG5cbiAgICAgICAgICAgICAgICAgICAgZGlhbG9nSW1nLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZGlhbG9nU2VsZWN0ZWRGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgZGlhbG9nSW1nLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbWVyYS1kaWFsb2ctdXNlLWltYWdlJykuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2YXIgcHJldmlvdXNTZWxlY3Rpb24gPSAnY2FtZXJhLXByb21wdCc7XG4gICAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVSYWRpb0NsaWNrKHJhZGlvTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChyYWRpb05hbWUgIT09IHByZXZpb3VzU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0aW9uID0gcmFkaW9OYW1lO1xuICAgICAgICAgICAgICAgICAgICB0ZWxlbWV0cnkuc2VuZFVJVGVsZW1ldHJ5KE9iamVjdC5hc3NpZ24oe30sIGJhc2VQcm9wcywgeyBjb250cm9sOiByYWRpb05hbWUgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbWVyYS1wcm9tcHQnKS5vbmNsaWNrID0gaGFuZGxlUmFkaW9DbGljay5iaW5kKHRoaXMsICdjYW1lcmEtcHJvbXB0Jyk7XG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FtZXJhLWZpbGUnKS5vbmNsaWNrID0gaGFuZGxlUmFkaW9DbGljay5iaW5kKHRoaXMsICdjYW1lcmEtZmlsZScpO1xuICAgICAgICB9XG4gICAgfTtcbn07XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxudmFyIGRldmljZU1vZGVsID0gcmVxdWlyZSgnLi9kZXZpY2UtbW9kZWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgJ0RldmljZSc6IHtcbiAgICAgICAgJ2dldERldmljZUluZm8nOiBmdW5jdGlvbiAoc3VjY2VzcywgZmFpbCwgYXJncykge1xuICAgICAgICAgICAgdmFyIGRldmljZSA9IGRldmljZU1vZGVsLmN1cnJlbnREZXZpY2U7XG4gICAgICAgICAgICBzdWNjZXNzKHtcbiAgICAgICAgICAgICAgICBtb2RlbDogZGV2aWNlLm1vZGVsLFxuICAgICAgICAgICAgICAgIG1hbnVmYWN0dXJlcjogZGV2aWNlLm1hbnVmYWN0dXJlcixcbiAgICAgICAgICAgICAgICBwbGF0Zm9ybTogZGV2aWNlTW9kZWwuY3VycmVudERldmljZVBsYXRmb3JtLFxuICAgICAgICAgICAgICAgIHV1aWQ6IGRldmljZS51dWlkLFxuICAgICAgICAgICAgICAgIHZlcnNpb246IGRldmljZU1vZGVsLmN1cnJlbnREZXZpY2VWZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlzVmlydHVhbDogZGV2aWNlTW9kZWwuaXNWaXJ0dWFsLFxuICAgICAgICAgICAgICAgIHNlcmlhbDogZGV2aWNlLnNlcmlhbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbnZhciB0ZWxlbWV0cnkgPSByZXF1aXJlKCd0ZWxlbWV0cnktaGVscGVyJyksXG4gICAgc2ltU3RhdHVzID0gcmVxdWlyZSgnc2ltLXN0YXR1cycpLFxuICAgIGRldmljZU1vZGVsID0gcmVxdWlyZSgnLi9kZXZpY2UtbW9kZWwnKTtcblxudmFyIGJhc2VQcm9wcyA9IHtcbiAgICBwbHVnaW46ICdjb3Jkb3ZhLXBsdWdpbi1kZXZpY2UnLFxuICAgIHBhbmVsOiAnZGV2aWNlJ1xufTtcblxuZnVuY3Rpb24gaW5pdGlhbGl6ZShkZXZpY2VJbmZvLCBtZXNzYWdlcykge1xuICAgIGRldmljZU1vZGVsLmluaXQoZGV2aWNlSW5mbywgYmFzZVByb3BzKTtcblxuICAgIHZhciBkZXZpY2UgPSBkZXZpY2VNb2RlbC5jdXJyZW50RGV2aWNlO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldmljZS1wbGF0Zm9ybScpLnZhbHVlID0gZGV2aWNlTW9kZWwuZGlzcGxheWVkUGxhdGZvcm07XG5cbiAgICB2YXIgZGV2aWNlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXZpY2UtbGlzdCcpO1xuICAgIGdldFNvcnRlZERldmljZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChkZXZpY2UpIHtcbiAgICAgICAgdmFyIG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHRpb24udmFsdWUgPSBkZXZpY2UuaWQ7XG5cbiAgICAgICAgdmFyIGNhcHRpb24gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShkZXZpY2UubmFtZSk7XG4gICAgICAgIG9wdGlvbi5hcHBlbmRDaGlsZChjYXB0aW9uKTtcbiAgICAgICAgZGV2aWNlTGlzdC5hcHBlbmRDaGlsZChvcHRpb24pO1xuICAgIH0pO1xuICAgIGRldmljZUxpc3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgc2VsZWN0ZWREZXZpY2VDaGFuZ2VkKTtcbiAgICBkZXZpY2VMaXN0LnZhbHVlID0gZGV2aWNlLmlkO1xuXG4gICAgdmFyIG9zVmVyc2lvbnMgPSBkZXZpY2VNb2RlbC5vc1ZlcnNpb25zO1xuICAgIHZhciBvc1ZlcnNpb25MaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldmljZS1vcy12ZXJzaW9uJyk7XG4gICAgaWYgKG9zVmVyc2lvbnMpIHtcbiAgICAgICAgb3NWZXJzaW9ucy5mb3JFYWNoKGZ1bmN0aW9uICh2ZXJzaW9uKSB7XG4gICAgICAgICAgICB2YXIgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICAgICAgICBvcHRpb24udmFsdWUgPSB2ZXJzaW9uO1xuXG4gICAgICAgICAgICB2YXIgY2FwdGlvbiA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZlcnNpb24pO1xuICAgICAgICAgICAgb3B0aW9uLmFwcGVuZENoaWxkKGNhcHRpb24pO1xuICAgICAgICAgICAgb3NWZXJzaW9uTGlzdC5hcHBlbmRDaGlsZChvcHRpb24pO1xuICAgICAgICB9KTtcbiAgICAgICAgb3NWZXJzaW9uTGlzdC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIG9zVmVyc2lvbkxpc3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb3NWZXJzaW9uQ2hhbmdlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3NWZXJzaW9uTGlzdC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIHVwZGF0ZURldmljZSgpO1xuICAgIHJlZ2lzdGVyVGVsZW1ldHJ5RXZlbnRzKCk7XG5cbiAgICBmdW5jdGlvbiBzZWxlY3RlZERldmljZUNoYW5nZWQoKSB7XG4gICAgICAgIHZhciBkZXZpY2VJZCA9IHRoaXMudmFsdWU7XG4gICAgICAgIGRldmljZU1vZGVsLnNlbGVjdERldmljZShkZXZpY2VJZCk7XG4gICAgICAgIHVwZGF0ZURldmljZSgpO1xuICAgICAgICBtZXNzYWdlcy5yZWZyZXNoQXBwSG9zdChkZXZpY2VNb2RlbC5jdXJyZW50RGV2aWNlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvc1ZlcnNpb25DaGFuZ2VkKGUpIHtcbiAgICAgICAgZGV2aWNlTW9kZWwuY3VycmVudERldmljZVsnb3MtdmVyc2lvbiddID0gdGhpcy52YWx1ZTtcbiAgICAgICAgdmFyIGRldmljZSA9IGRldmljZU1vZGVsLmN1cnJlbnREZXZpY2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXZpY2Utb3MtdmVyc2lvbicpLnZhbHVlID0gZGV2aWNlWydvcy12ZXJzaW9uJ107XG4gICAgICAgIG1lc3NhZ2VzLnJlZnJlc2hBcHBIb3N0KGRldmljZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlRGV2aWNlKCkge1xuICAgICAgICB2YXIgZGV2aWNlID0gZGV2aWNlTW9kZWwuY3VycmVudERldmljZTtcbiAgICAgICAgdmFyIHZpZXdwb3J0V2lkdGggPSBkZXZpY2Uudmlld3BvcnQud2lkdGg7XG4gICAgICAgIHZhciB2aWV3cG9ydEhlaWdodCA9IGRldmljZS52aWV3cG9ydC5oZWlnaHQ7XG5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldmljZS1vcy12ZXJzaW9uJykudmFsdWUgPSBkZXZpY2VbJ29zLXZlcnNpb24nXTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldmljZS1tb2RlbCcpLnZhbHVlID0gZGV2aWNlLm1vZGVsO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGV2aWNlLW1hbnVmYWN0dXJlcicpLnZhbHVlID0gZGV2aWNlLm1hbnVmYWN0dXJlcjtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldmljZS11dWlkJykudmFsdWUgPSBkZXZpY2UudXVpZDtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldmljZS12ZXJzaW9uJykudmFsdWUgPSBkZXZpY2VNb2RlbC5jdXJyZW50RGV2aWNlVmVyc2lvbjtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2lzLXZpcnR1YWwtZGV2aWNlJykuY2hlY2tlZCA9IGRldmljZU1vZGVsLmlzVmlydHVhbDtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldmljZS1zZXJpYWwnKS52YWx1ZSA9IGRldmljZS5zZXJpYWw7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXZpY2UtcmVzb2x1dGlvbicpLnZhbHVlID0gZGV2aWNlLnJlc29sdXRpb24ud2lkdGggKyAnIHggJyArIGRldmljZS5yZXNvbHV0aW9uLmhlaWdodDtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldmljZS12aWV3cG9ydC1zaXplJykudmFsdWUgPSB2aWV3cG9ydFdpZHRoICsgJyB4ICcgKyB2aWV3cG9ydEhlaWdodDtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldmljZS1waXhlbC1yYXRpbycpLnZhbHVlID0gZGV2aWNlWydwaXhlbC1yYXRpbyddO1xuXG4gICAgICAgIG5vdGlmeVJlc2l6ZShtZXNzYWdlcywge1xuICAgICAgICAgICAgd2lkdGg6IHZpZXdwb3J0V2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IHZpZXdwb3J0SGVpZ2h0LFxuICAgICAgICAgICAgcGl4ZWxSYXRpbzogZGV2aWNlWydwaXhlbC1yYXRpbyddXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0U29ydGVkRGV2aWNlcygpIHtcbiAgICAvLyBDcmVhdGVkIGEgc29ydGVkIGFycmF5IG9mIGRldmljZXNcbiAgICB2YXIgZGV2aWNlc0J5SWQgPSBkZXZpY2VNb2RlbC5kZXZpY2VzQnlJZDtcbiAgICB2YXIgZGV2aWNlcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRldmljZXNCeUlkKS5tYXAoZnVuY3Rpb24gKGRldmljZUlkKSB7XG4gICAgICAgIHJldHVybiBkZXZpY2VzQnlJZFtkZXZpY2VJZF07XG4gICAgfSk7XG5cbiAgICBkZXZpY2VzLnNvcnQoZnVuY3Rpb24gKGxlZnQsIHJpZ2h0KSB7XG4gICAgICAgIGxlZnQgPSBsZWZ0Lm5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgcmlnaHQgPSByaWdodC5uYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIGlmIChsZWZ0IDwgcmlnaHQpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmlnaHQgPCBsZWZ0KSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIHJldHVybiBkZXZpY2VzO1xufVxuXG5mdW5jdGlvbiBub3RpZnlSZXNpemUobWVzc2FnZXMsIGRpbWVuc2lvbnMpIHtcbiAgICB2YXIgd2lkdGggPSBwYXJzZUludChkaW1lbnNpb25zLndpZHRoKTtcbiAgICB2YXIgaGVpZ2h0ID0gcGFyc2VJbnQoZGltZW5zaW9ucy5oZWlnaHQpO1xuICAgIHZhciBwaXhlbFJhdGlvID0gcGFyc2VGbG9hdChkaW1lbnNpb25zLnBpeGVsUmF0aW8pO1xuXG4gICAgaWYgKGlzTmFOKHdpZHRoKSB8fCBpc05hTihoZWlnaHQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBtZXNzYWdlcy5lbWl0RGVidWcoJ3Jlc2l6ZS12aWV3cG9ydCcsIHtcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgcGl4ZWxSYXRpbzogcGl4ZWxSYXRpb1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclRlbGVtZXRyeUV2ZW50cygpIHtcbiAgICB2YXIgZGV2aWNlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXZpY2UtbGlzdCcpO1xuICAgIGRldmljZUxpc3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB0ZWxlbWV0cnkuc2VuZFVJVGVsZW1ldHJ5KE9iamVjdC5hc3NpZ24oe30sIGJhc2VQcm9wcywge1xuICAgICAgICAgICAgY29udHJvbDogJ2RldmljZS1saXN0JyxcbiAgICAgICAgICAgIHZhbHVlOiBkZXZpY2VMaXN0LnZhbHVlXG4gICAgICAgIH0pKTtcbiAgICB9KTtcblxuICAgIHZhciBvc1ZlcnNpb25MaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldmljZS1vcy12ZXJzaW9uJyk7XG4gICAgb3NWZXJzaW9uTGlzdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRlbGVtZXRyeS5zZW5kVUlUZWxlbWV0cnkoT2JqZWN0LmFzc2lnbih7fSwgYmFzZVByb3BzLCB7XG4gICAgICAgICAgICBjb250cm9sOiAnZGV2aWNlLW9zLXZlcnNpb24nLFxuICAgICAgICAgICAgdmFsdWU6IGRldmljZUxpc3QudmFsdWVcbiAgICAgICAgfSkpO1xuICAgIH0pO1xuXG4gICAgdmFyIHZpcnR1YWxEZXZpY2VDaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpcy12aXJ0dWFsLWRldmljZScpO1xuICAgIHZpcnR1YWxEZXZpY2VDaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZGV2aWNlTW9kZWwuaXNWaXJ0dWFsID0gdmlydHVhbERldmljZUNoZWNrYm94LmNoZWNrZWQ7XG4gICAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1lc3NhZ2VzKSB7XG4gICAgdmFyIGNvcmRvdmFWZXJzaW9uTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGV2aWNlLWNvcmRvdmEtdmVyc2lvbicpO1xuXG4gICAgY29yZG92YVZlcnNpb25MYWJlbC52YWx1ZSA9ICdRdWVyeWluZy4uLic7XG5cbiAgICBzaW1TdGF0dXMud2hlbkFwcEhvc3RSZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgICAgIG1lc3NhZ2VzLmNhbGwoJ2NvcmRvdmEtdmVyc2lvbicpLnRoZW4oZnVuY3Rpb24gKHZlcnNpb24pIHtcbiAgICAgICAgICAgIGNvcmRvdmFWZXJzaW9uTGFiZWwudmFsdWUgPSB2ZXJzaW9uO1xuICAgICAgICB9KS5mYWlsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvcmRvdmFWZXJzaW9uTGFiZWwudmFsdWUgPSAndW5rbm93bic7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKGRldmljZUluZm8pIHtcbiAgICAgICAgICAgIGluaXRpYWxpemUoZGV2aWNlSW5mbywgbWVzc2FnZXMpO1xuICAgICAgICB9XG4gICAgfTtcbn07XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIEJhc2VkIGluIHBhcnQgb24gY29kZSBmcm9tIEFwYWNoZSBSaXBwbGUgKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLXJpcHBsZSlcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWVzc2FnZXMpIHtcbiAgICB2YXIgZ2VvID0gcmVxdWlyZSgnLi9nZW8tbW9kZWwnKSxcbiAgICAgICAgdXRpbHMgPSByZXF1aXJlKCd1dGlscycpLFxuICAgICAgICBQb3NpdGlvbkVycm9yID0gcmVxdWlyZSgnLi9Qb3NpdGlvbkVycm9yJyksXG4gICAgICAgIF93YXRjaGVzID0ge307XG5cbiAgICBmdW5jdGlvbiBfZ2V0Q3VycmVudFBvc2l0aW9uKHdpbiwgZmFpbCkge1xuICAgICAgICB2YXIgZGVsYXkgPSAoZ2VvLmRlbGF5IHx8IDApICogMTAwMDtcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGdlby50aW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFpbChuZXcgUG9zaXRpb25FcnJvcihQb3NpdGlvbkVycm9yLlRJTUVPVVQsICdQb3NpdGlvbiByZXRyaWV2YWwgdGltZWQgb3V0LicpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdpbihnZW8uZ2V0UG9zaXRpb25JbmZvKCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGRlbGF5KTtcbiAgICB9XG5cbiAgICBtZXNzYWdlcy5vbigncG9zaXRpb24taW5mby11cGRhdGVkJywgZnVuY3Rpb24gKG1lc3NhZ2UsIHBpKSB7XG4gICAgICAgIHV0aWxzLmZvckVhY2goX3dhdGNoZXMsIGZ1bmN0aW9uICh3YXRjaCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBfZ2V0Q3VycmVudFBvc2l0aW9uKHdhdGNoLndpbiwgd2F0Y2guZmFpbCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgR2VvbG9jYXRpb246IHtcbiAgICAgICAgICAgIGdldExvY2F0aW9uOiBmdW5jdGlvbiAoc3VjY2VzcywgZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBfZ2V0Q3VycmVudFBvc2l0aW9uKHN1Y2Nlc3MsIGVycm9yKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZGRXYXRjaDogZnVuY3Rpb24gKHN1Y2Nlc3MsIGVycm9yLCBhcmdzKSB7XG4gICAgICAgICAgICAgICAgX3dhdGNoZXNbYXJnc1swXV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbjogc3VjY2VzcyxcbiAgICAgICAgICAgICAgICAgICAgZmFpbDogZXJyb3JcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIF9nZXRDdXJyZW50UG9zaXRpb24oc3VjY2VzcywgZXJyb3IpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsZWFyV2F0Y2g6IGZ1bmN0aW9uIChzdWNjZXNzLCBlcnJvciwgYXJncykge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBfd2F0Y2hlc1thcmdzWzBdXTtcbiAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcyAmJiB0eXBlb2YgKHN1Y2Nlc3MpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0UGVybWlzc2lvbjogZnVuY3Rpb24gKHN1Y2Nlc3MsIGZhaWwsIGFyZ3MpIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufTtcbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gQmFzZWQgaW4gcGFydCBvbiBjb2RlIGZyb20gQXBhY2hlIFJpcHBsZSAoaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9pbmN1YmF0b3ItcmlwcGxlKVxuXG4vKmdsb2JhbCBPcGVuTGF5ZXJzOiBmYWxzZSAqL1xudmFyIHRlbGVtZXRyeSA9IHJlcXVpcmUoJ3RlbGVtZXRyeS1oZWxwZXInKTtcblxudmFyIGJhc2VQcm9wcyA9IHtcbiAgICBwbHVnaW46ICdjb3Jkb3ZhLXBsdWdpbi1nZW9sb2NhdGlvbicsXG4gICAgcGFuZWw6ICdnZW9sb2NhdGlvbidcbn07XG5cbi8vIEZvciB0ZWxlbWV0cnkgYWJvdXQgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgbWFwIHVzaW5nIHRoZSBtb3VzZSwgd2UgXCJiYXRjaFwiIHRoZSBtb3VzZSBldmVudHMgdG8gcHJldmVudCBzZW5kaW5nIHRvbyBtYW55IG1lc3NhZ2VzLlxudmFyIG1vdXNlRXZlbnRIb2xkRGVsYXkgPSAxMDAwOyAvLyBUaGUgaW5hY3Rpdml0eSBkZWxheSB0byB3YWl0IGJlZm9yZSBzZW5kaW5nIGEgdGVsZW1ldHJ5IGV2ZW50IHdoZW4gdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGggdGhlIG1hcC5cbnZhciBwZW5kaW5nTW91c2VFdmVudHMgPSAwOyAvLyBUaGUgbnVtYmVyIG9mIG1vdXNlIGV2ZW50cyB0aGF0IGFyZSBcIm9uIGhvbGRcIi5cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWVzc2FnZXMpIHtcbiAgICB2YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnc2ltLWNvbnN0YW50cycpLFxuICAgICAgICBnZW8gPSByZXF1aXJlKCcuL2dlby1tb2RlbCcpLFxuICAgICAgICBkYiA9IHJlcXVpcmUoJ2RiJyksXG4gICAgICAgIGV2ZW50ID0gcmVxdWlyZSgnZXZlbnQnKSxcbiAgICAgICAgdXRpbHMgPSByZXF1aXJlKCd1dGlscycpLFxuICAgICAgICBuYXZVdGlscyA9IHV0aWxzLm5hdkhlbHBlcigpLFxuICAgICAgICBfZ3BzTWFwWm9vbUxldmVsO1xuXG4gICAgZ2VvLmluaXRpYWxpemUobWVzc2FnZXMpO1xuXG4gICAgZnVuY3Rpb24gX3VwZGF0ZUdwc01hcCgpIHtcbiAgICAgICAgdmFyIHBvc2l0aW9uSW5mbyA9IGdlby5nZXRQb3NpdGlvbkluZm8oKSxcbiAgICAgICAgICAgIG1hcENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnN0YW50cy5HRU8uT1BUSU9OUy5NQVBfQ09OVEFJTkVSKSxcbiAgICAgICAgICAgIGdlb1pvb21WYWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnN0YW50cy5HRU8uTUFQX1pPT01fTEVWRUxfQ09OVEFJTkVSKTtcblxuICAgICAgICBpZiAobWFwQ29udGFpbmVyKSB7XG4gICAgICAgICAgICBnZW8ubWFwLnNldENlbnRlcihuZXcgT3BlbkxheWVycy5Mb25MYXQocG9zaXRpb25JbmZvLmxvbmdpdHVkZSwgcG9zaXRpb25JbmZvLmxhdGl0dWRlKSAvLyBDZW50ZXIgb2YgdGhlIG1hcFxuICAgICAgICAgICAgICAgIC50cmFuc2Zvcm0oXG4gICAgICAgICAgICAgICAgbmV3IE9wZW5MYXllcnMuUHJvamVjdGlvbignRVBTRzo0MzI2JyksIC8vIHRyYW5zZm9ybSBmcm9tIFdHUyAxOTg0XG4gICAgICAgICAgICAgICAgbmV3IE9wZW5MYXllcnMuUHJvamVjdGlvbignRVBTRzo5MDA5MTMnKSAvLyB0byBTcGhlcmljYWwgTWVyY2F0b3IgUHJvamVjdGlvblxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgX2dwc01hcFpvb21MZXZlbCxcbiAgICAgICAgICAgICAgICB0cnVlIC8vIGRvbid0IHRyaWdnZXIgZHJhZ2dpbmcgZXZlbnRzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGdlb1pvb21WYWx1ZSkge1xuICAgICAgICAgICAgZ2VvWm9vbVZhbHVlLmlubmVySFRNTCA9IF9ncHNNYXBab29tTGV2ZWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBfdXBkYXRlR3BzTWFwWm9vbShnb1VwKSB7XG4gICAgICAgIHZhciBpbmMgPSBnb1VwID8gMSA6IC0xO1xuICAgICAgICBfZ3BzTWFwWm9vbVNldChfZ3BzTWFwWm9vbUxldmVsICsgaW5jKTtcbiAgICAgICAgX3VwZGF0ZUdwc01hcCgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIF9ncHNNYXBab29tU2V0KHZhbHVlKSB7XG4gICAgICAgIF9ncHNNYXBab29tTGV2ZWwgPSBNYXRoLm1heChNYXRoLm1pbih2YWx1ZSwgY29uc3RhbnRzLkdFTy5NQVBfWk9PTV9NQVgpLCBjb25zdGFudHMuR0VPLk1BUF9aT09NX01JTik7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnN0YW50cy5HRU8uTUFQX1pPT01fTEVWRUxfQ09OVEFJTkVSKS5pbm5lckhUTUwgPSBfZ3BzTWFwWm9vbUxldmVsO1xuICAgICAgICBkYi5zYXZlKGNvbnN0YW50cy5HRU8uTUFQX1pPT01fS0VZLCBfZ3BzTWFwWm9vbUxldmVsKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXBFdmVudFRlbGVtZXRyeUhhbmRsZXIoKSB7XG4gICAgICAgIHBlbmRpbmdNb3VzZUV2ZW50cysrO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC0tcGVuZGluZ01vdXNlRXZlbnRzO1xuXG4gICAgICAgICAgICBpZiAocGVuZGluZ01vdXNlRXZlbnRzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGVsZW1ldHJ5LnNlbmRVSVRlbGVtZXRyeShPYmplY3QuYXNzaWduKHt9LCBiYXNlUHJvcHMsIHsgY29udHJvbDogJ2dlby1tYXAtY29udGFpbmVyJyB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIG1vdXNlRXZlbnRIb2xkRGVsYXkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlZ2lzdGVyVGVsZW1ldHJ5RXZlbnRzKCkge1xuICAgICAgICAvLyBSZWdpc3RlciB0aGUgc2ltcGxlIGV2ZW50cyAob25jbGljayAvIG9uY2hhbmdlIC8gZXRjIC0+IHNlbmQgdGhlIGNvbnRyb2wgSUQpLlxuICAgICAgICB2YXIgYmFzaWNUZWxlbWV0cnlFdmVudHMgPSBbXG4gICAgICAgICAgICB7IGNvbnRyb2w6ICdnZW8tbGF0aXR1ZGUnIH0sXG4gICAgICAgICAgICB7IGNvbnRyb2w6ICdnZW8tbG9uZ2l0dWRlJyB9LFxuICAgICAgICAgICAgeyBjb250cm9sOiAnZ2VvLWFsdGl0dWRlJyB9LFxuICAgICAgICAgICAgeyBjb250cm9sOiAnZ2VvLWFjY3VyYWN5JyB9LFxuICAgICAgICAgICAgeyBjb250cm9sOiAnZ2VvLWFsdGl0dWRlLWFjY3VyYWN5JyB9LFxuICAgICAgICAgICAgeyBjb250cm9sOiAnZ2VvLWhlYWRpbmcnIH0sXG4gICAgICAgICAgICB7IGNvbnRyb2w6ICdnZW8tc3BlZWQnIH0sXG4gICAgICAgICAgICB7IGNvbnRyb2w6ICdnZW8tZGVsYXknIH0sXG4gICAgICAgICAgICB7IGNvbnRyb2w6ICdnZW8tZ3B4ZmlsZS1idXR0b24nLCBldmVudDogJ2NsaWNrJyB9LFxuICAgICAgICAgICAgeyBjb250cm9sOiAnZ2VvLW1hcC16b29tLWRlY3JlYXNlJywgZXZlbnQ6ICdjbGljaycgfSxcbiAgICAgICAgICAgIHsgY29udHJvbDogJ2dlby1tYXAtem9vbS1pbmNyZWFzZScsIGV2ZW50OiAnY2xpY2snIH1cbiAgICAgICAgXTtcblxuICAgICAgICBiYXNpY1RlbGVtZXRyeUV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjb250cm9sRXZlbnQpIHtcbiAgICAgICAgICAgIHJlZ2lzdGVyVGVsZW1ldHJ5Rm9yQ29udHJvbChjb250cm9sRXZlbnQuY29udHJvbCwgY29udHJvbEV2ZW50LmV2ZW50KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGV2ZW50IGZvciB0aGUgdGltZW91dCBjaGVja2JveC5cbiAgICAgICAgLy8gQ2xpY2tpbmcgdGhlIGNoZWNrYm94J3MgbGFiZWwgZmlyZXMgdGhlIGNsaWNrIGV2ZW50IHR3aWNlLCBzbyBrZWVwIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBzdGF0ZS4gTm90ZSB0aGF0IHdlIGNhbid0IHVzZSB0aGUgY2hhbmdlIGV2ZW50IGJlY2F1c2UgdGhlIGNvbXBvbmVudCBzZWVtcyB0byBzd2FsbG93IGl0LlxuICAgICAgICB2YXIgcHJldmlvdXNUaW1lb3V0U3RhdGUgPSBmYWxzZTtcbiAgICAgICAgdmFyIGdlb1RpbWVvdXRDaGVja2JveCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNnZW8tdGltZW91dCcpO1xuXG4gICAgICAgIGdlb1RpbWVvdXRDaGVja2JveC5vbmNsaWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGdlb1RpbWVvdXRDaGVja2JveC5jaGVja2VkICE9PSBwcmV2aW91c1RpbWVvdXRTdGF0ZSkge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzVGltZW91dFN0YXRlID0gZ2VvVGltZW91dENoZWNrYm94LmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgdGVsZW1ldHJ5LnNlbmRVSVRlbGVtZXRyeShPYmplY3QuYXNzaWduKHt9LCBiYXNlUHJvcHMsIHsgY29udHJvbDogJ2dlby10aW1lb3V0JyB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIGV2ZW50IGZvciB0aGUgR28gYnV0dG9uLlxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VvLWdweC1nbycpLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmF0ZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2VvLWdweG11bHRpcGxpZXItc2VsZWN0Jyk7XG4gICAgICAgICAgICB2YXIgb3B0aW9uID0gcmF0ZUxpc3Qub3B0aW9uc1tyYXRlTGlzdC5zZWxlY3RlZEluZGV4XTtcblxuICAgICAgICAgICAgdGVsZW1ldHJ5LnNlbmRVSVRlbGVtZXRyeShPYmplY3QuYXNzaWduKHt9LCBiYXNlUHJvcHMsIHsgY29udHJvbDogJ2dlby1ncHgtZ28nLCB2YWx1ZTogb3B0aW9uLnZhbHVlIH0pKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBSZWdpc3RlciB0aGUgZXZlbnQgZm9yIHpvb21pbmcgd2l0aCB0aGUgbW91c2Ugd2hlZWwgb24gdGhlIG1hcC5cbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dlby1tYXAtY29udGFpbmVyJykub253aGVlbCA9IG1hcEV2ZW50VGVsZW1ldHJ5SGFuZGxlcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWdpc3RlclRlbGVtZXRyeUZvckNvbnRyb2woY29udHJvbElkLCBldmVudCkge1xuICAgICAgICBldmVudCA9IGV2ZW50IHx8ICdjaGFuZ2UnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250cm9sSWQpLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIHRlbGVtZXRyeS5zZW5kVUlUZWxlbWV0cnkuYmluZCh0aGlzLCBPYmplY3QuYXNzaWduKHt9LCBiYXNlUHJvcHMsIHsgY29udHJvbDogY29udHJvbElkIH0pKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcGFuZWw6IHtcbiAgICAgICAgICAgIGRvbUlkOiAnZ3BzLWNvbnRhaW5lcicsXG4gICAgICAgICAgICBjb2xsYXBzZWQ6IHRydWUsXG4gICAgICAgICAgICBwYW5lOiAncmlnaHQnXG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIEdFT19PUFRJT05TID0gY29uc3RhbnRzLkdFTy5PUFRJT05TLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uSW5mbyA9IGdlby5nZXRQb3NpdGlvbkluZm8oKSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvblVwZGF0ZWRNZXNzYWdlID0gJ3Bvc2l0aW9uLWluZm8tdXBkYXRlZCcsXG4gICAgICAgICAgICAgICAgbGF0aXR1ZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChHRU9fT1BUSU9OUy5MQVRJVFVERSksXG4gICAgICAgICAgICAgICAgbG9uZ2l0dWRlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoR0VPX09QVElPTlMuTE9OR0lUVURFKSxcbiAgICAgICAgICAgICAgICBhbHRpdHVkZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEdFT19PUFRJT05TLkFMVElUVURFKSxcbiAgICAgICAgICAgICAgICBhY2N1cmFjeSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEdFT19PUFRJT05TLkFDQ1VSQUNZKSxcbiAgICAgICAgICAgICAgICBhbHRpdHVkZUFjY3VyYWN5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoR0VPX09QVElPTlMuQUxUSVRVREVfQUNDVVJBQ1kpLFxuICAgICAgICAgICAgICAgIGhlYWRpbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChHRU9fT1BUSU9OUy5IRUFESU5HKSxcbiAgICAgICAgICAgICAgICBzcGVlZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEdFT19PUFRJT05TLlNQRUVEKSxcbiAgICAgICAgICAgICAgICBkZWxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEdFT19PUFRJT05TLkRFTEFZKSxcbiAgICAgICAgICAgICAgICBkZWxheUxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoR0VPX09QVElPTlMuREVMQVlfTEFCRUwpLFxuICAgICAgICAgICAgICAgIGhlYWRpbmdMYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEdFT19PUFRJT05TLkhFQURJTkdfTEFCRUwpLFxuICAgICAgICAgICAgICAgIGhlYWRpbmdNYXBMYWJlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEdFT19PUFRJT05TLkhFQURJTkdfTUFQX0xBQkVMKSxcbiAgICAgICAgICAgICAgICB0aW1lb3V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoR0VPX09QVElPTlMuVElNRU9VVCksXG4gICAgICAgICAgICAgICAgZ3B4TXVsdGlwbGllciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEdFT19PUFRJT05TLkdQWE1VTFRJUExJRVIpLFxuICAgICAgICAgICAgICAgIGdweFJlcGxheVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEdFT19PUFRJT05TLkdQWFJFUExBWVNUQVRVUyksXG4gICAgICAgICAgICAgICAgZ3B4R28gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChHRU9fT1BUSU9OUy5HUFhHTyksXG4gICAgICAgICAgICAgICAgbWFwTWFya2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoR0VPX09QVElPTlMuTUFQX01BUktFUiksXG4gICAgICAgICAgICAgICAgbWFwQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoR0VPX09QVElPTlMuTUFQX0NPTlRBSU5FUiksXG4gICAgICAgICAgICAgICAgbWFwID0gbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFjayA9IFtdLFxuICAgICAgICAgICAgICAgIF9yZXBsYXlpbmdHcHhGaWxlID0gZmFsc2UsXG4gICAgICAgICAgICAgICAgX2hhbHRHcHhSZXBsYXkgPSBmYWxzZTtcblxuICAgICAgICAgICAgdmFyIHVwZGF0ZUdlb1BlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUdlbygpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXVwZGF0ZUdlb1BlbmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2VvUGVuZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlby51cGRhdGVQb3NpdGlvbkluZm8oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlOiBwYXJzZUZsb2F0KGxhdGl0dWRlLnZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25naXR1ZGU6IHBhcnNlRmxvYXQobG9uZ2l0dWRlLnZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRpdHVkZTogcGFyc2VJbnQoYWx0aXR1ZGUudmFsdWUsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeTogcGFyc2VJbnQoYWNjdXJhY3kudmFsdWUsIDEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRpdHVkZUFjY3VyYWN5OiBwYXJzZUludChhbHRpdHVkZUFjY3VyYWN5LnZhbHVlLCAxMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGluZzogaGVhZGluZy52YWx1ZSA/IHBhcnNlRmxvYXQoaGVhZGluZy52YWx1ZSkgOiAwLCAvLyBIQUNLOiBzZWUgdGVjaGRlYnQgaHR0cDovL3d3dy5waXZvdGFsdHJhY2tlci5jb20vc3Rvcnkvc2hvdy81NDc4ODQ3XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWQ6IHNwZWVkLnZhbHVlID8gcGFyc2VJbnQoc3BlZWQudmFsdWUsIDEwKSA6IDAsIC8vIEhBQ0s6IHNlZSB0ZWNoZGVidCBodHRwOi8vd3d3LnBpdm90YWx0cmFja2VyLmNvbS9zdG9yeS9zaG93LzU0Nzg4NDdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU3RhbXA6IG5ldyBEYXRlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dC5jaGVja2VkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUdlb1BlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBvbkhlYWRpbmdWYWx1ZVVwZGF0ZWQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBoZWFkaW5nLnZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICB2YXIgaGVhZGluZ0RlZyAgPSBwYXJzZUludChoZWFkaW5nLnZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGluZ1RleHQgPSBuYXZVdGlscy5nZXREaXJlY3Rpb24oaGVhZGluZ0RlZyk7XG5cbiAgICAgICAgICAgICAgICBoZWFkaW5nTGFiZWwudmFsdWUgPSBoZWFkaW5nVGV4dDtcbiAgICAgICAgICAgICAgICBoZWFkaW5nTWFwTGFiZWwuaW5uZXJIVE1MID0gaGVhZGluZ1RleHQgKyAnPC9icj4nICsgaGVhZGluZ0RlZyArICcmZGVnOyc7XG5cbiAgICAgICAgICAgICAgICB2YXIgc3R5bGUgPSBbJy13ZWJraXQtdHJhbnNmb3JtJywgJy1tcy10cmFuc2Zvcm0nLCAnLW1vei10cmFuc2Zvcm0nLCAnLW8tdHJhbnNmb3JtJywgJ3RyYW5zZm9ybSddLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcCArICc6IHJvdGF0ZSgnICsgaGVhZGluZ0RlZyArICdkZWcpOyc7XG4gICAgICAgICAgICAgICAgfSkuam9pbignICcpO1xuICAgICAgICAgICAgICAgIG1hcE1hcmtlci5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgc3R5bGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiB1cGRhdGVIZWFkaW5nVmFsdWVzKCkge1xuICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBnbG9iYWxseSB0aGF0IGhlYWRpbmcgaGFzIGNoYW5nZWRcbiAgICAgICAgICAgICAgICBtZXNzYWdlcy5lbWl0KCdkZXZpY2Utb3JpZW50YXRpb24tdXBkYXRlZCcsIGhlYWRpbmcudmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiB1cGRhdGVWYWxzRnJvbU1hcCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2VudGVyID0gZ2VvLm1hcC5nZXRDZW50ZXIoKS50cmFuc2Zvcm0oXG4gICAgICAgICAgICAgICAgICAgIG5ldyBPcGVuTGF5ZXJzLlByb2plY3Rpb24oJ0VQU0c6OTAwOTEzJyksXG4gICAgICAgICAgICAgICAgICAgIG5ldyBPcGVuTGF5ZXJzLlByb2plY3Rpb24oJ0VQU0c6NDMyNicpKTtcbiAgICAgICAgICAgICAgICBsb25naXR1ZGUudmFsdWUgPSBjZW50ZXIubG9uO1xuICAgICAgICAgICAgICAgIGxhdGl0dWRlLnZhbHVlID0gY2VudGVyLmxhdDtcblxuICAgICAgICAgICAgICAgIF9ncHNNYXBab29tU2V0KGdlby5tYXAuem9vbSk7XG4gICAgICAgICAgICAgICAgdXBkYXRlR2VvKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRpYWxpemVWYWx1ZXMoKSB7XG4gICAgICAgICAgICAgICAgbGF0aXR1ZGUudmFsdWUgPSBwb3NpdGlvbkluZm8ubGF0aXR1ZGU7XG4gICAgICAgICAgICAgICAgbG9uZ2l0dWRlLnZhbHVlID0gcG9zaXRpb25JbmZvLmxvbmdpdHVkZTtcbiAgICAgICAgICAgICAgICBhbHRpdHVkZS52YWx1ZSA9IHBvc2l0aW9uSW5mby5hbHRpdHVkZTtcbiAgICAgICAgICAgICAgICBhY2N1cmFjeS52YWx1ZSA9IHBvc2l0aW9uSW5mby5hY2N1cmFjeTtcbiAgICAgICAgICAgICAgICBhbHRpdHVkZUFjY3VyYWN5LnZhbHVlID0gcG9zaXRpb25JbmZvLmFsdGl0dWRlQWNjdXJhY3k7XG5cbiAgICAgICAgICAgICAgICBkZWxheS52YWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKEdFT19PUFRJT05TLkRFTEFZX0xBQkVMKS52YWx1ZSA9IGdlby5kZWxheSB8fCAwO1xuICAgICAgICAgICAgICAgIGlmIChnZW8udGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cGRhdGVIZWFkaW5nVmFsdWVzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRNYXAoKSB7XG4gICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUgaW1hZ2UgbG9jYXRpb24gc28gd2UgZG9uJ3QgaGF2ZSB0byBpbmNsdWRlIGltYWdlIGFzc2V0c1xuICAgICAgICAgICAgICAgIE9wZW5MYXllcnMuSW1nUGF0aCA9ICdodHRwOi8vb3BlbmxheWVycy5vcmcvYXBpL2ltZy8nO1xuXG4gICAgICAgICAgICAgICAgLy8gaW5pdCBtYXBcbiAgICAgICAgICAgICAgICBnZW8ubWFwID0gbmV3IE9wZW5MYXllcnMuTWFwKG1hcENvbnRhaW5lciwgeyBjb250cm9sczogW10sIHRoZW1lOiBudWxsIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gYWRkIGNvbnRyb2xzIGFuZCBPU00gbWFwIGxheWVyXG4gICAgICAgICAgICAgICAgZ2VvLm1hcC5hZGRMYXllcihuZXcgT3BlbkxheWVycy5MYXllci5PU00oKSk7XG4gICAgICAgICAgICAgICAgZ2VvLm1hcC5hZGRDb250cm9sKG5ldyBPcGVuTGF5ZXJzLkNvbnRyb2wuTmF2aWdhdGlvbigpKTtcblxuICAgICAgICAgICAgICAgIC8vIG92ZXJyaWRlIGJlaGF2aW91ciBvZiBjbGljayB0byBwYW4gYW5kIGRvdWJsZSBjbGljayB0byB6b29tIGluXG4gICAgICAgICAgICAgICAgdmFyIGNsaWNrSGFuZGxlciA9IG5ldyBPcGVuTGF5ZXJzLkhhbmRsZXIuQ2xpY2soXG4gICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb25sYXQgPSBnZW8ubWFwLmdldExvbkxhdEZyb21WaWV3UG9ydFB4KGUueHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcEV2ZW50VGVsZW1ldHJ5SGFuZGxlcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlby5tYXAucGFuVG8obmV3IE9wZW5MYXllcnMuTG9uTGF0KGxvbmxhdC5sb24sIGxvbmxhdC5sYXQpLCBfZ3BzTWFwWm9vbUxldmVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRibGNsaWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwRXZlbnRUZWxlbWV0cnlIYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3VwZGF0ZUdwc01hcFpvb20odHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgZG91YmxlOiB0cnVlIH1cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgLy8gYWRkIGNsaWNrIGhhbmRsZXIgdG8gbWFwXG4gICAgICAgICAgICAgICAgY2xpY2tIYW5kbGVyLnNldE1hcChnZW8ubWFwKTtcbiAgICAgICAgICAgICAgICBjbGlja0hhbmRsZXIuYWN0aXZhdGUoKTtcblxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBsb25nIGFuZCBsYXQgd2hlbiBtYXAgaXMgcGFubmVkXG4gICAgICAgICAgICAgICAgZ2VvLm1hcC5ldmVudHMucmVnaXN0ZXIoJ21vdmVlbmQnLCBtYXAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwRXZlbnRUZWxlbWV0cnlIYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVZhbHNGcm9tTWFwKCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBldmVudC5vbignQXBwbGljYXRpb25TdGF0ZScsIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiAmJiBvYmpbMF0uaWQgPT09ICdncHMtY29udGFpbmVyJyAmJiBvYmouaGFzQ2xhc3MoJ3VpLWJveC1vcGVuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF91cGRhdGVHcHNNYXAoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiBsb2FkR3B4RmlsZShmaWxlbmFtZSkge1xuICAgICAgICAgICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpLFxuICAgICAgICAgICAgICAgICAgICB0LFxuICAgICAgICAgICAgICAgICAgICBhdHQsXG4gICAgICAgICAgICAgICAgICAgIGxhc3RBdHQsXG4gICAgICAgICAgICAgICAgICAgIF9lbGUsXG4gICAgICAgICAgICAgICAgICAgIF90aW1lc3RhbXAsXG4gICAgICAgICAgICAgICAgICAgIF9sYXN0VGltZXN0YW1wLFxuICAgICAgICAgICAgICAgICAgICBfdXNlVGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCksXG4gICAgICAgICAgICAgICAgICAgIF90ZW1wVGltZXN0YW1wLFxuICAgICAgICAgICAgICAgICAgICBfdGVtcFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICBfbGFzdFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICBfdXNlTGFzdFRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgX2hlYWRpbmcgPSAwLFxuICAgICAgICAgICAgICAgICAgICBfc3BlZWQgPSAwLFxuICAgICAgICAgICAgICAgICAgICBfZGlzdCA9IDA7XG5cbiAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcGFyc2VYbWwoeG1sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWwsICd0ZXh0L3htbCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdCA9IHBhcnNlWG1sKGUudGFyZ2V0LnJlc3VsdCkucXVlcnlTZWxlY3RvckFsbCgndHJrcHQnKTtcblxuICAgICAgICAgICAgICAgICAgICB0cmFjayA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIHV0aWxzLmZvckVhY2godCwgZnVuY3Rpb24gKHAsIGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4oaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHQgPSB0W2ldLmF0dHJpYnV0ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VsZSA9IHRbaV0ucXVlcnlTZWxlY3RvckFsbCgnZWxlJylbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RpbWVzdGFtcCA9IHRbaV0ucXVlcnlTZWxlY3RvckFsbCgndGltZScpWzBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF90aW1lc3RhbXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9maWxlcyByZWNvcmRlZCB3aXRoIGVuZG9tb25kbyBhbmQgb3RoZXJzIGhhdmUgdGltZXN0YW1wcywgdGhpcyBpcyBub3QgYSByb3V0ZSBwbGFuIGJ1dCBhIHJlY29yZCBvZiBhIHRyYWNrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF91c2VUaW1lc3RhbXAgPSBuZXcgRGF0ZShfdGltZXN0YW1wLmlubmVySFRNTCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0W2kgLSAxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0QXR0ID0gdFtpIC0gMV0uYXR0cmlidXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xhc3RUaW1lc3RhbXAgPSB0W2kgLSAxXS5xdWVyeVNlbGVjdG9yQWxsKCd0aW1lJylbMF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Rpc3QgPSBuYXZVdGlscy5nZXREaXN0YW5jZShhdHRbJ2xhdCddLnZhbHVlLCBhdHRbJ2xvbiddLnZhbHVlLCBsYXN0QXR0WydsYXQnXS52YWx1ZSwgbGFzdEF0dFsnbG9uJ10udmFsdWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfbGFzdFRpbWVzdGFtcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3VzZUxhc3RUaW1lc3RhbXAgPSBuZXcgRGF0ZShfbGFzdFRpbWVzdGFtcC5pbm5lckhUTUwpLmdldFRpbWUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcm91dGVzIGZyb20gWU9VUlMgY29tZSBpbiBhcyB0cmFja3MgKHJhdGhlciB0aGFuIHJvdXRlcyB1bmRlciB0aGUgR1BYIHNjaGVtYSksIGJ1dCB3aXRoIG5vIHRpbWVzdGFtcHMuICBUaGlzIGlzIGEgcm91dGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdXNlTGFzdFRpbWVzdGFtcCA9IF91c2VUaW1lc3RhbXA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdXNlVGltZXN0YW1wICs9IE1hdGgucm91bmQoX2Rpc3QgLyAyMi4yMjIyICogMTAwMCk7ICAvLzgwa20vaCBpbiBtL3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9oZWFkaW5nID0gbmF2VXRpbHMuZ2V0SGVhZGluZyhsYXN0QXR0WydsYXQnXS52YWx1ZSwgbGFzdEF0dFsnbG9uJ10udmFsdWUsIGF0dFsnbGF0J10udmFsdWUsIGF0dFsnbG9uJ10udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3BlZWQgPSAoX2Rpc3QgLyAoKF91c2VUaW1lc3RhbXAgLSBfdXNlTGFzdFRpbWVzdGFtcCkgLyAxMDAwKSkudG9GaXhlZCgyKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9sYXN0VGltZXN0YW1wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL29uIFlPVVJTIHJvdXRlcywgbWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb25lIHVwZGF0ZSBhIHNlY29uZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RlbXBUaW1lc3RhbXAgPSBfdXNlTGFzdFRpbWVzdGFtcDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF91c2VUaW1lc3RhbXAgLSBfdGVtcFRpbWVzdGFtcCA+IDEwMDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGVtcFRpbWVzdGFtcCArPSAxMDAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sYXN0UG9zaXRpb24gPSB0cmFja1t0cmFjay5sZW5ndGggLSAxXS5jb29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RlbXBQb3NpdGlvbiA9IG5hdlV0aWxzLnNpbXVsYXRlVHJhdmVsKF9sYXN0UG9zaXRpb24ubGF0aXR1ZGUsIF9sYXN0UG9zaXRpb24ubG9uZ2l0dWRlLCBfaGVhZGluZywgX3NwZWVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZTogX3RlbXBQb3NpdGlvbi5sYXRpdHVkZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogX3RlbXBQb3NpdGlvbi5sb25naXR1ZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRpdHVkZTogX2VsZSA/IF9lbGUuaW5uZXJIVE1MIDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VyYWN5OiAxNTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRpdHVkZUFjY3VyYWN5OiA4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRpbmc6IF9oZWFkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWQ6IF9zcGVlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IF90ZW1wVGltZXN0YW1wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZTogYXR0LmxhdC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogYXR0Lmxvbi52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGl0dWRlOiBfZWxlID8gX2VsZS5pbm5lckhUTUwgOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3k6IDE1MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGl0dWRlQWNjdXJhY3k6IDgwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGluZzogX2hlYWRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZDogX3NwZWVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogX3VzZVRpbWVzdGFtcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHJlYWRpbmcgZ3B4IGZpbGUgJyArIGZpbGVuYW1lICsgJzogJyArIGUpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZW5hbWUsICdVVEYtOCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiByZXBsYXlHcHhUcmFjaygpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3JlcGxheWluZ0dweEZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX2hhbHRHcHhSZXBsYXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBncHhHby50ZXh0Q29udGVudCA9IGNvbnN0YW50cy5HRU8uR1BYR09fTEFCRUxTLkdPO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9oYWx0R3B4UmVwbGF5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBncHhHby50ZXh0Q29udGVudCA9IGNvbnN0YW50cy5HRU8uR1BYR09fTEFCRUxTLlNUT1A7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlLnZhbHVlID0gdHJhY2tbMF0uY29vcmRzLmxhdGl0dWRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ2l0dWRlLnZhbHVlID0gdHJhY2tbMF0uY29vcmRzLmxvbmdpdHVkZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdGl0dWRlLnZhbHVlID0gdHJhY2tbMF0uY29vcmRzLmFsdGl0dWRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3kudmFsdWUgPSB0cmFja1swXS5jb29yZHMuYWNjdXJhY3k7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbHRpdHVkZUFjY3VyYWN5LnZhbHVlID0gdHJhY2tbMF0uY29vcmRzLmFsdGl0dWRlQWNjdXJhY3k7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkaW5nLnZhbHVlID0gdHJhY2tbMF0uY29vcmRzLmhlYWRpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVlZC52YWx1ZSA9IHRyYWNrWzBdLmNvb3Jkcy5zcGVlZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2VvKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVIZWFkaW5nVmFsdWVzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVOZXh0R3B4VHJhY2soMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIG1vdmVOZXh0R3B4VHJhY2soaSkge1xuICAgICAgICAgICAgICAgIGlmIChfaGFsdEdweFJlcGxheSkge1xuICAgICAgICAgICAgICAgICAgICBfcmVwbGF5aW5nR3B4RmlsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBfaGFsdEdweFJlcGxheSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVXNlciBpbnRlcnJ1cHRlZCByZXBsYXkgb2YgR1BYIGZpbGUuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfcmVwbGF5aW5nR3B4RmlsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfdGltZU11bHRpcGxpZXIgPSAhaXNOYU4oZ3B4TXVsdGlwbGllci52YWx1ZSkgPyBncHhNdWx0aXBsaWVyLnZhbHVlIDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9zdGVwID0gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9pbnRlcnZhbCA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF9pbnRlcnZhbCA8IDI1MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3N0ZXArKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaSArIF9zdGVwKSA+PSB0cmFjay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9pbnRlcnZhbCA9ICh0cmFja1tpICsgX3N0ZXBdLnRpbWVzdGFtcCAtIHRyYWNrW2ldLnRpbWVzdGFtcCkgLyBfdGltZU11bHRpcGxpZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBncHhSZXBsYXlTdGF0dXMudGV4dENvbnRlbnQgPSAoX2ludGVydmFsIC8gMTAwMCkudG9GaXhlZCgyKSArICdzICgnICsgKF9pbnRlcnZhbCAvIDEwMDAgKiBfdGltZU11bHRpcGxpZXIpLnRvRml4ZWQoMikgKyAncyByZWFsdGltZSksICcgKyAoaSArIDEpICsgJyBvZiAnICsgdHJhY2subGVuZ3RoICsgJyAoc3RlcHBpbmcgJyArIF9zdGVwICsgJyBhdCAnICsgX3RpbWVNdWx0aXBsaWVyICsgJ3gpJztcblxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlLnZhbHVlID0gdHJhY2tbaV0uY29vcmRzLmxhdGl0dWRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ2l0dWRlLnZhbHVlID0gdHJhY2tbaV0uY29vcmRzLmxvbmdpdHVkZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsdGl0dWRlLnZhbHVlID0gdHJhY2tbaV0uY29vcmRzLmFsdGl0dWRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3kudmFsdWUgPSB0cmFja1tpXS5jb29yZHMuYWNjdXJhY3k7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbHRpdHVkZUFjY3VyYWN5LnZhbHVlID0gdHJhY2tbaV0uY29vcmRzLmFsdGl0dWRlQWNjdXJhY3k7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkaW5nLnZhbHVlID0gdHJhY2tbaV0uY29vcmRzLmhlYWRpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVlZC52YWx1ZSA9IHRyYWNrW2ldLmNvb3Jkcy5zcGVlZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlR2VvKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVIZWFkaW5nVmFsdWVzKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFja1tpICsgX3N0ZXBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZU5leHRHcHhUcmFjayhpICsgX3N0ZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCB0cmFjay5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVOZXh0R3B4VHJhY2sodHJhY2subGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVwbGF5aW5nR3B4RmlsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHhHby50ZXh0Q29udGVudCA9IGNvbnN0YW50cy5HRU8uR1BYR09fTEFCRUxTLkdPO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRmluaXNoZWQgcmVwbGF5aW5nIEdQWCBmaWxlLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgX2ludGVydmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIF9ncHNNYXBab29tTGV2ZWwgPSBkYi5yZXRyaWV2ZShjb25zdGFudHMuR0VPLk1BUF9aT09NX0tFWSkgfHwgMTQ7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNnZW8tbWFwLXpvb20tZGVjcmVhc2UnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdXBkYXRlR3BzTWFwWm9vbShmYWxzZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNnZW8tbWFwLXpvb20taW5jcmVhc2UnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdXBkYXRlR3BzTWFwWm9vbSh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsYXRpdHVkZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB1cGRhdGVHZW8pO1xuICAgICAgICAgICAgbG9uZ2l0dWRlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHVwZGF0ZUdlbyk7XG4gICAgICAgICAgICBhbHRpdHVkZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB1cGRhdGVHZW8pO1xuICAgICAgICAgICAgYWNjdXJhY3kuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdXBkYXRlR2VvKTtcbiAgICAgICAgICAgIGFsdGl0dWRlQWNjdXJhY3kuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdXBkYXRlR2VvKTtcbiAgICAgICAgICAgIHNwZWVkLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHVwZGF0ZUdlbyk7XG5cbiAgICAgICAgICAgIGRlbGF5LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVHZW8oKTtcbiAgICAgICAgICAgICAgICBkZWxheUxhYmVsLnZhbHVlID0gZGVsYXkudmFsdWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZGVsYXkuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlR2VvKCk7XG4gICAgICAgICAgICAgICAgZGVsYXlMYWJlbC52YWx1ZSA9IGRlbGF5LnZhbHVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRpbWVvdXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1cGRhdGVHZW8pO1xuXG4gICAgICAgICAgICB2YXIgZ3B4RmlsZUxvYWRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgR0VPX09QVElPTlMuR1BYRklMRSk7XG4gICAgICAgICAgICB2YXIgZ3B4RmlsZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNnZW8tZ3B4ZmlsZS1idXR0b24nKTtcbiAgICAgICAgICAgIGdweEZpbGVCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgZ3B4RmlsZUxvYWRlci5pbnB1dC5jbGljaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBncHhGaWxlTG9hZGVyLmFjY2VwdCA9ICcuZ3B4LC5HUFgnO1xuICAgICAgICAgICAgZ3B4RmlsZUxvYWRlci5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgdG8gaGF2ZSBubyBmaWxlIHNlbGVjdGVkIGFuZCBzdGlsbCBnZXQgYSBjaGFuZ2UgZXZlbnQuXG4gICAgICAgICAgICAgICAgLy8gWW91IGRvIHRoaXMgYnkgc2VsZWN0aW5nIHNvbWV0aGluZywgdGhlbiBzZWxlY3Rpbmcgbm90aGluZy5cbiAgICAgICAgICAgICAgICAvLyBZb3Ugc2VsZWN0IG5vdGhpbmcgYnkgY2FuY2VsbGluZyBvdXQgb2YgdGhlIGZpbGUgcGlja2VyIGRpYWxvZy5cbiAgICAgICAgICAgICAgICB2YXIgc2VsZWN0ZWRGaWxlcyA9IHRoaXMuZmlsZXM7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsb2FkR3B4RmlsZShzZWxlY3RlZEZpbGVzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgZ3B4RmlsZUJ1dHRvbi50ZXh0Q29udGVudCA9IHNlbGVjdGVkRmlsZXNbMF0ubmFtZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBncHhGaWxlQnV0dG9uLnRleHRDb250ZW50ID0gJ0Nob29zZSBGaWxlJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZ3B4R28uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmVwbGF5R3B4VHJhY2soKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBoZWFkaW5nLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVHZW8oKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVIZWFkaW5nVmFsdWVzKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaGVhZGluZy5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB1cGRhdGVHZW8oKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVIZWFkaW5nVmFsdWVzKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaGVhZGluZy52YWx1ZSA9IHBvc2l0aW9uSW5mby5oZWFkaW5nO1xuICAgICAgICAgICAgc3BlZWQudmFsdWUgPSBwb3NpdGlvbkluZm8uc3BlZWQ7XG5cbiAgICAgICAgICAgIGluaXRNYXAoKTtcblxuICAgICAgICAgICAgbWVzc2FnZXMub24oJ2RldmljZS1vcmllbnRhdGlvbi11cGRhdGVkJywgZnVuY3Rpb24gKGV2ZW50LCB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIG9uSGVhZGluZ1ZhbHVlVXBkYXRlZCh2YWx1ZSk7XG4gICAgICAgICAgICB9LCB0cnVlKTsgLy8gZ2xvYmFsIGV2ZW50XG5cbiAgICAgICAgICAgIGluaXRpYWxpemVWYWx1ZXMoKTtcblxuICAgICAgICAgICAgbWVzc2FnZXMub24ocG9zaXRpb25VcGRhdGVkTWVzc2FnZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF91cGRhdGVHcHNNYXAoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB1cGRhdGVHZW8oKTtcblxuICAgICAgICAgICAgcmVnaXN0ZXJUZWxlbWV0cnlFdmVudHMoKTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgICdTdGF0dXNCYXInOiB7XG4gICAgICAgICdfcmVhZHknOiBmdW5jdGlvbiAoc3VjY2Vzc0NhbGxiYWNrKSB7XG4gICAgICAgICAgICAvLyBSZXBvcnQgdG8gdGhlIGFwcCB0aGF0IHRoZSBzdGF0dXMgYmFyIGlzIGhpZGRlblxuICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIEJhc2VkIGluIHBhcnQgb24gY29kZSBmcm9tIEFwYWNoZSBSaXBwbGUsIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLXJpcHBsZVxuXG52YXIgUSA9IHJlcXVpcmUoJ3EnKSxcbiAgICB1dGlscyA9IHJlcXVpcmUoJ3V0aWxzJyksXG4gICAgY29uc3RhbnRzID0gcmVxdWlyZSgnc2ltLWNvbnN0YW50cycpLFxuICAgIGV2ZW50ID0gcmVxdWlyZSgnZXZlbnQnKSxcbiAgICBEQl9OQU1FID0gJ3JpcHBsZScsXG4gICAgY2FjaGUsXG4gICAgc2VsZixcbiAgICBvcGVuZGI7XG5cbi8vIFRPRE86IFRoaXMgY291bGQgdXNlIHNvbWUgcmVmYWN0b3JpbmcuLlxuXG5mdW5jdGlvbiBzYXZlVG9TdG9yYWdlKCkge1xuICAgIGxvY2FsU3RvcmFnZVtEQl9OQU1FXSA9IEpTT04uc3RyaW5naWZ5KGNhY2hlKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVBbmRTZXRQcmVmaXgocHJlZml4KSB7XG4gICAgaWYgKHByZWZpeCkge1xuICAgICAgICB1dGlscy52YWxpZGF0ZUFyZ3VtZW50VHlwZShwcmVmaXgsICdzdHJpbmcnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJlZml4IHx8IGNvbnN0YW50cy5DT01NT04uUFJFRklYO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVLZXkoa2V5LCBwcmVmaXgpIHtcbiAgICByZXR1cm4gdmFsaWRhdGVBbmRTZXRQcmVmaXgocHJlZml4KSArIGtleTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSXRlbShrZXksIHZhbHVlLCBwcmVmaXgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBpZDogY3JlYXRlS2V5KGtleSwgcHJlZml4KSxcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgcHJlZml4OiB2YWxpZGF0ZUFuZFNldFByZWZpeChwcmVmaXgpXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gc2F2ZShrZXksIHZhbHVlLCBwcmVmaXgsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGl0ZW0gPSBjcmVhdGVJdGVtKGtleSwgdmFsdWUsIHByZWZpeCk7XG4gICAgY2FjaGVbaXRlbS5pZF0gPSBpdGVtO1xuXG4gICAgaWYgKCF3aW5kb3cub3BlbkRhdGFiYXNlKSB7XG4gICAgICAgIHNhdmVUb1N0b3JhZ2UoKTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7IGNhbGxiYWNrKCk7IH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBvcGVuZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24gKHR4KSB7XG4gICAgICAgICAgICB0eC5leGVjdXRlU3FsKCdSRVBMQUNFIElOVE8gcGVyc2lzdGVuY2UgKGlkLCBrZXksIHZhbHVlLCBwcmVmaXgpIFZBTFVFUyAoPywgPywgPywgPyknLCBbaXRlbS5pZCwgaXRlbS5rZXksIGl0ZW0udmFsdWUsIGl0ZW0ucHJlZml4XSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmV0cmlldmUoa2V5LCBwcmVmaXgpIHtcbiAgICB2YXIgaXRlbSA9IGNhY2hlW2NyZWF0ZUtleShrZXksIHByZWZpeCldO1xuICAgIHJldHVybiBpdGVtID8gaXRlbS52YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmV0cmlldmVBbGwocHJlZml4LCBjYWxsYmFjaykge1xuICAgIHZhciByZXN1bHQgPSB7fTtcblxuICAgIGlmIChwcmVmaXgpIHtcbiAgICAgICAgdXRpbHMuZm9yRWFjaChjYWNoZSwgZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUucHJlZml4ID09PSBwcmVmaXgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRbdmFsdWUua2V5XSA9IHZhbHVlLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2spIHsgY2FsbGJhY2socmVzdWx0KTsgfVxufVxuXG5mdW5jdGlvbiByZW1vdmUoa2V5LCBwcmVmaXgsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGlkID0gY3JlYXRlS2V5KGtleSwgcHJlZml4KTtcblxuICAgIGRlbGV0ZSBjYWNoZVtpZF07XG5cbiAgICBpZiAoIXdpbmRvdy5vcGVuRGF0YWJhc2UpIHtcbiAgICAgICAgc2F2ZVRvU3RvcmFnZSgpO1xuICAgICAgICBpZiAoY2FsbGJhY2spIHsgY2FsbGJhY2soKTsgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIG9wZW5kYi50cmFuc2FjdGlvbihmdW5jdGlvbiAodHgpIHtcbiAgICAgICAgICAgIHR4LmV4ZWN1dGVTcWwoJ0RFTEVURSBGUk9NIHBlcnNpc3RlbmNlIFdIRVJFIGtleSA9ID8gQU5EIHByZWZpeCA9ID8nLCBba2V5LCB2YWxpZGF0ZUFuZFNldFByZWZpeChwcmVmaXgpXSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlQWxsKGNhbGxiYWNrKSB7XG4gICAgY2FjaGUgPSB7fTtcblxuICAgIGlmICghd2luZG93Lm9wZW5EYXRhYmFzZSkge1xuICAgICAgICBkZWxldGUgbG9jYWxTdG9yYWdlW0RCX05BTUVdO1xuICAgICAgICBzYXZlVG9TdG9yYWdlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3BlbmRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uICh0eCkge1xuICAgICAgICAgICAgdHguZXhlY3V0ZVNxbCgnREVMRVRFIEZST00gcGVyc2lzdGVuY2UnLCBbXSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuc2VsZiA9IHtcbiAgICBzYXZlOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSwgcHJlZml4LCBjYWxsYmFjaykge1xuICAgICAgICBzYXZlKGtleSwgdmFsdWUsIHByZWZpeCwgY2FsbGJhY2spO1xuICAgICAgICBldmVudC50cmlnZ2VyKCdTdG9yYWdlVXBkYXRlZEV2ZW50Jyk7XG4gICAgfSxcblxuICAgIHNhdmVPYmplY3Q6IGZ1bmN0aW9uIChrZXksIG9iaiwgcHJlZml4LCBjYWxsYmFjaykge1xuICAgICAgICBzYXZlKGtleSwgSlNPTi5zdHJpbmdpZnkob2JqKSwgcHJlZml4LCBjYWxsYmFjayk7XG4gICAgICAgIGV2ZW50LnRyaWdnZXIoJ1N0b3JhZ2VVcGRhdGVkRXZlbnQnKTtcbiAgICB9LFxuXG4gICAgcmV0cmlldmU6IGZ1bmN0aW9uIChrZXksIHByZWZpeCkge1xuICAgICAgICByZXR1cm4gcmV0cmlldmUoa2V5LCBwcmVmaXgpO1xuICAgIH0sXG5cbiAgICByZXRyaWV2ZU9iamVjdDogZnVuY3Rpb24gKGtleSwgcHJlZml4KSB7XG4gICAgICAgIHZhciByZXRyaWV2ZWRWYWx1ZSA9IHJldHJpZXZlKGtleSwgcHJlZml4KTtcbiAgICAgICAgcmV0dXJuIHJldHJpZXZlZFZhbHVlID8gSlNPTi5wYXJzZShyZXRyaWV2ZWRWYWx1ZSkgOiByZXRyaWV2ZWRWYWx1ZTtcbiAgICB9LFxuXG4gICAgcmV0cmlldmVBbGw6IGZ1bmN0aW9uIChwcmVmaXgsIGNhbGxiYWNrKSB7XG4gICAgICAgIHJldHVybiByZXRyaWV2ZUFsbChwcmVmaXgsIGNhbGxiYWNrKTtcbiAgICB9LFxuXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoa2V5LCBwcmVmaXgsIGNhbGxiYWNrKSB7XG4gICAgICAgIGV2ZW50LnRyaWdnZXIoJ1N0b3JhZ2VVcGRhdGVkRXZlbnQnKTtcbiAgICAgICAgcmVtb3ZlKGtleSwgcHJlZml4LCBjYWxsYmFjayk7XG4gICAgfSxcblxuICAgIHJlbW92ZUFsbDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIHJlbW92ZUFsbChjYWxsYmFjayk7XG4gICAgICAgIGV2ZW50LnRyaWdnZXIoJ1N0b3JhZ2VVcGRhdGVkRXZlbnQnKTtcbiAgICB9LFxuXG4gICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZCA9IFEuZGVmZXIoKTtcblxuICAgICAgICBpZiAoIXdpbmRvdy5vcGVuRGF0YWJhc2UpIHtcbiAgICAgICAgICAgIHZhciBzdG9yZSA9IGxvY2FsU3RvcmFnZVtEQl9OQU1FXTtcbiAgICAgICAgICAgIGNhY2hlID0gc3RvcmUgPyBKU09OLnBhcnNlKHN0b3JlKSA6IHt9O1xuICAgICAgICAgICAgc2F2ZVRvU3RvcmFnZSgpO1xuICAgICAgICAgICAgZC5yZXNvbHZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZSA9IHt9O1xuICAgICAgICAgICAgb3BlbmRiID0gb3BlbkRhdGFiYXNlKCd0aW55SGlwcG9zJywgJzEuMCcsICd0aW55IEhpcHBvcyBwZXJzaXN0ZW5jZScsIDIgKiAxMDI0ICogMTAyNCk7XG4gICAgICAgICAgICBvcGVuZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24gKHR4KSB7XG4gICAgICAgICAgICAgICAgdHguZXhlY3V0ZVNxbCgnQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgcGVyc2lzdGVuY2UgKGlkIHVuaXF1ZSwga2V5LCB2YWx1ZSwgcHJlZml4KScpO1xuXG4gICAgICAgICAgICAgICAgdHguZXhlY3V0ZVNxbCgnU0VMRUNUIGlkLCBrZXksIHZhbHVlLCBwcmVmaXggRlJPTSBwZXJzaXN0ZW5jZScsIFtdLCBmdW5jdGlvbiAodHgsIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxlbiA9IHJlc3VsdHMucm93cy5sZW5ndGgsIGksIGl0ZW07XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gcmVzdWx0cy5yb3dzLml0ZW0oaSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVtpdGVtLmlkXSA9IGl0ZW07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBkLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGQucHJvbWlzZTtcbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHNlbGY7XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuLy8gVGhpcyBtb2R1bGUgbWFuYWdlcyB0aGUgcXVldWluZyBvZiBkaWFsb2dzLiBUaGUgc2ltdWxhdGlvbiBob3N0IG11c3QgcmVnaXN0ZXIgZGlhbG9ncyAoYnkgYWRkaW5nIHRoZW0gdG9cbi8vIHBsdWdpbkRpYWxvZ3MpIGFuZCBoYW5kbGUgdGhlIGFjdHVhbCBzaG93aW5nL2hpZGluZyB3aGVuIHJlcXVlc3RlZCAodmlhIGhpZGUoKSBhbmQgc2hvdygpIG1ldGhvZHMgYXR0YWNoIHRvXG4vLyB0aGUgcmVnaXN0ZXJlZCBkaWFsb2cgb2JqZWN0KS5cblxudmFyIHBsdWdpbkRpYWxvZ3MgPSB7fTtcblxudmFyIGN1cnJlbnREaWFsb2dJZCA9IG51bGw7XG52YXIgZGlhbG9nUXVldWUgPSBbXTtcblxubW9kdWxlLmV4cG9ydHMucGx1Z2luRGlhbG9ncyA9IHBsdWdpbkRpYWxvZ3M7XG5cbnZhciBwYW5lbHNEaXNhYmxlZCA9IGZhbHNlO1xudmFyIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuXG5mdW5jdGlvbiBzaG93RGlhbG9nKGRpYWxvZ0lkLCBjYikge1xuICAgIHZhciBkaWFsb2cgPSBwbHVnaW5EaWFsb2dzW2RpYWxvZ0lkXTtcbiAgICBpZiAoIWRpYWxvZykge1xuICAgICAgICB0aHJvdyAnTm8gZGlhbG9nIGRlZmluZWQgd2l0aCBpZCAnICsgZGlhbG9nSWQ7XG4gICAgfVxuXG4gICAgLy8gSWYgYSBkaWFsb2cgaXMgY3VycmVudGx5IHNob3dpbmcsIHF1ZXVlIHRoaXMgb25lIHRvIHNob3cgbGF0ZXJcbiAgICBpZiAoY3VycmVudERpYWxvZ0lkKSB7XG4gICAgICAgIGRpYWxvZ1F1ZXVlLnB1c2goe2lkOiBkaWFsb2dJZCwgY2FsbGJhY2s6IGNifSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBOb3RpZnkgY2FsbGJhY2sgd2UncmUgYWJvdXQgdG8gc2hvd1xuICAgIGNiICYmIGNiKCdzaG93aW5nJyk7XG5cbiAgICBjdXJyZW50RGlhbG9nSWQgPSBkaWFsb2dJZDtcblxuICAgIC8vIERpc2FibGUgdGhlIHBhbmVscyBpZiB0aGV5J3JlIG5vdCBhbHJlYWR5XG4gICAgaWYgKCFwYW5lbHNEaXNhYmxlZCkge1xuICAgICAgICBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgZ2V0UGFuZWxzKCkuZm9yRWFjaChmdW5jdGlvbiAocGFuZWwpIHtcbiAgICAgICAgICAgIHBhbmVsLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHBhbmVsc0Rpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBkaWFsb2cuc2hvdygpO1xuXG4gICAgLy8gTm90aWZ5IGNhbGxiYWNrIHdlJ3JlIHNob3duXG4gICAgY2IgJiYgY2IoJ3Nob3duJyk7XG59XG5tb2R1bGUuZXhwb3J0cy5zaG93RGlhbG9nID0gc2hvd0RpYWxvZztcblxuZnVuY3Rpb24gaGlkZURpYWxvZyhkaWFsb2dJZCkge1xuICAgIGlmICghZGlhbG9nSWQpIHtcbiAgICAgICAgZGlhbG9nSWQgPSBjdXJyZW50RGlhbG9nSWQ7XG4gICAgICAgIGlmICghZGlhbG9nSWQpIHtcbiAgICAgICAgICAgIHRocm93ICdUcnlpbmcgdG8gaGlkZSBkaWFsb2cgd2hlbiBub25lIGlzIHNob3dpbmcuJztcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChkaWFsb2dJZCAhPT0gY3VycmVudERpYWxvZ0lkKSB7XG4gICAgICAgICAgICB0aHJvdyAnVHJ5aW5nIHRvIGhpZGUgYSBkaWFsb2cgdGhhdCBpc25cXCd0IGN1cnJlbnRseSBzaG93aW5nOiAnICsgZGlhbG9nSWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGlhbG9nID0gcGx1Z2luRGlhbG9nc1tkaWFsb2dJZF07XG4gICAgaWYgKCFkaWFsb2cpIHtcbiAgICAgICAgdGhyb3cgJ05vIGRpYWxvZyBkZWZpbmVkIHdpdGggaWQgJyArIGRpYWxvZ0lkO1xuICAgIH1cblxuICAgIGN1cnJlbnREaWFsb2dJZCA9IG51bGw7XG4gICAgZGlhbG9nLmhpZGUoKTtcblxuICAgIC8vIEFmdGVyIGEgdGltZW91dCwgc2VlIGlmIHRoZXJlIGFyZSBtb3JlIGRpYWxvZ3MgdG8gc2hvd1xuICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGN1cnJlbnREaWFsb2dJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpYWxvZ0luZm8gPSBmaW5kTmV4dERpYWxvZygpO1xuICAgICAgICBpZiAoZGlhbG9nSW5mbykge1xuICAgICAgICAgICAgc2hvd0RpYWxvZyhkaWFsb2dJbmZvLmlkLCBkaWFsb2dJbmZvLmNhbGxiYWNrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vIGRpYWxvZyB0byBzaG93PyBSZS1lbmFibGUgdGhlIHBhbmVsc1xuICAgICAgICAgICAgZ2V0UGFuZWxzKCkuZm9yRWFjaChmdW5jdGlvbiAocGFuZWwpIHtcbiAgICAgICAgICAgICAgICBwYW5lbC5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGFjdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFuZWxzRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sIDApO1xufVxubW9kdWxlLmV4cG9ydHMuaGlkZURpYWxvZyA9IGhpZGVEaWFsb2c7XG5cbmZ1bmN0aW9uIGdldFBhbmVscygpIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnYm9keSAvZGVlcC8gY29yZG92YS1wYW5lbCcpKTtcbn1cblxuZnVuY3Rpb24gZmluZE5leHREaWFsb2coKSB7XG4gICAgd2hpbGUgKGRpYWxvZ1F1ZXVlLmxlbmd0aCkge1xuICAgICAgICB2YXIgZGlhbG9nSW5mbyA9IGRpYWxvZ1F1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHZhciBjYiA9IGRpYWxvZ0luZm8uY2FsbGJhY2s7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYSBjYWxsYmFjaywgaXQgbXVzdCBleHBsaWNpdGx5IHJldHVybiAnZmFsc2UnIChub3QgYSBmYWxzeSB2YWx1ZSkgaW4gcmVzcG9uc2UgdG8gJ3F1ZXJ5LXNob3cnIHRvXG4gICAgICAgIC8vIHByZXZlbnQgdGhlIGRpYWxvZyBmcm9tIHNob3dpbmcuXG4gICAgICAgIGlmICghY2IgfHwgY2IoJ3F1ZXJ5LXNob3cnKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBkaWFsb2dJbmZvO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbnZhciB0ZWxlbWV0cnkgPSByZXF1aXJlKCd0ZWxlbWV0cnktaGVscGVyJyk7XG5cbnZhciBiYXNlUHJvcHMgPSB7XG4gICAgcGx1Z2luOiAnZXZlbnRzJyxcbiAgICBwYW5lbDogJ2V2ZW50cydcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG1lc3NhZ2VzKSB7XG4gICAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgdmFyIGV2ZW50TGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1saXN0Jyk7XG4gICAgICAgIHZhciBldmVudHMgPSBbJ2JhY2tidXR0b24nLCAnbWVudWJ1dHRvbicsICdwYXVzZScsICdyZXN1bWUnLCAnc2VhcmNoYnV0dG9uJywgJ29ubGluZScsICdvZmZsaW5lJ107XG4gICAgICAgIGV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICAgICAgb3B0aW9uLnZhbHVlID0gZXZlbnQ7XG4gICAgICAgICAgICB2YXIgY2FwdGlvbiA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGV2ZW50KTtcbiAgICAgICAgICAgIG9wdGlvbi5hcHBlbmRDaGlsZChjYXB0aW9uKTtcbiAgICAgICAgICAgIGV2ZW50TGlzdC5hcHBlbmRDaGlsZChvcHRpb24pO1xuICAgICAgICB9KTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWZpcmUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBldmVudExpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtbGlzdCcpO1xuICAgICAgICAgICAgdmFyIG9wdGlvbiA9IGV2ZW50TGlzdC5vcHRpb25zW2V2ZW50TGlzdC5zZWxlY3RlZEluZGV4XTtcblxuICAgICAgICAgICAgdGVsZW1ldHJ5LnNlbmRVSVRlbGVtZXRyeShPYmplY3QuYXNzaWduKHt9LCBiYXNlUHJvcHMsIHsgY29udHJvbDogJ2V2ZW50LWZpcmUnLCB2YWx1ZTogb3B0aW9uLnZhbHVlIH0pKTtcbiAgICAgICAgICAgIG1lc3NhZ2VzLmNhbGwoJ2V2ZW50Jywgb3B0aW9uLnZhbHVlKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRmlyZWQgZXZlbnQ6ICcgKyByZXN1bHQpO1xuICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGaXJpbmcgZXZlbnQgZmFpbGVkOiAnICsgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBpbml0aWFsaXplOiBpbml0aWFsaXplXG4gICAgfTtcbn07XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIEJhc2VkIGluIHBhcnQgb24gY29kZSBmcm9tIEFwYWNoZSBSaXBwbGUsIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLXJpcHBsZVxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCd1dGlscycpLFxuICAgIGV4Y2VwdGlvbiA9IHJlcXVpcmUoJ2V4Y2VwdGlvbicpLFxuICAgIF9saXN0ZW5lcnMgPSB7fTtcblxuZnVuY3Rpb24gX29uKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHNjb3BlLCBvbmNlKSB7XG4gICAgaWYgKCFldmVudFR5cGUpIHtcbiAgICAgICAgdGhyb3cgJ2V2ZW50VHlwZSBtdXN0IGJlIHRydXRoeSc7XG4gICAgfVxuICAgIF9saXN0ZW5lcnNbZXZlbnRUeXBlXSA9IF9saXN0ZW5lcnNbZXZlbnRUeXBlXSB8fCBbXTtcbiAgICBfbGlzdGVuZXJzW2V2ZW50VHlwZV0ucHVzaCh7XG4gICAgICAgIGZ1bmM6IGxpc3RlbmVyLFxuICAgICAgICBzY29wZTogc2NvcGUsXG4gICAgICAgIG9uY2U6ICEhb25jZVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBfdHJpZ2dlcihsaXN0ZW5lciwgYXJncywgc3luYykge1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChzeW5jKSB7XG4gICAgICAgICAgICBsaXN0ZW5lci5mdW5jLmFwcGx5KGxpc3RlbmVyLnNjb3BlLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmZ1bmMuYXBwbHkobGlzdGVuZXIuc2NvcGUsIGFyZ3MpO1xuICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgZXhjZXB0aW9uLmhhbmRsZShlKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG9uOiBmdW5jdGlvbiAoZXZlbnRUeXBlLCBsaXN0ZW5lciwgc2NvcGUpIHtcbiAgICAgICAgX29uKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHNjb3BlLCBmYWxzZSk7XG4gICAgfSxcblxuICAgIG9uY2U6IGZ1bmN0aW9uIChldmVudFR5cGUsIGxpc3RlbmVyLCBzY29wZSkge1xuICAgICAgICBfb24oZXZlbnRUeXBlLCBsaXN0ZW5lciwgc2NvcGUsIHRydWUpO1xuICAgIH0sXG5cbiAgICB0cmlnZ2VyOiBmdW5jdGlvbiAoZXZlbnRUeXBlLCBhcmdzLCBzeW5jKSB7XG4gICAgICAgIGFyZ3MgPSBhcmdzIHx8IFtdO1xuICAgICAgICBzeW5jID0gc3luYyB8fCBmYWxzZTtcblxuICAgICAgICB2YXIgbGlzdGVuZXJzID0gX2xpc3RlbmVyc1tldmVudFR5cGVdO1xuXG4gICAgICAgIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIF90cmlnZ2VyKGxpc3RlbmVyLCBhcmdzLCBzeW5jKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBfbGlzdGVuZXJzW2V2ZW50VHlwZV0gPSBsaXN0ZW5lcnMuZmlsdGVyKGZ1bmN0aW9uIChsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIHJldHVybiAhbGlzdGVuZXIub25jZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGV2ZW50SGFzU3Vic2NyaWJlcjogZnVuY3Rpb24gKGV2ZW50VHlwZSkge1xuICAgICAgICByZXR1cm4gISFfbGlzdGVuZXJzW2V2ZW50VHlwZV07XG4gICAgfSxcblxuICAgIGdldEV2ZW50U3Vic2NyaWJlcnM6IGZ1bmN0aW9uIChldmVudFR5cGUpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLmNvcHkoX2xpc3RlbmVyc1tldmVudFR5cGVdKSB8fCBbXTtcbiAgICB9LFxuXG4gICAgY2xlYXI6IGZ1bmN0aW9uIChldmVudFR5cGUpIHtcbiAgICAgICAgaWYgKGV2ZW50VHlwZSkge1xuICAgICAgICAgICAgZGVsZXRlIF9saXN0ZW5lcnNbZXZlbnRUeXBlXTtcbiAgICAgICAgfVxuICAgIH1cbn07XG4iLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIEJhc2VkIGluIHBhcnQgb24gY29kZSBmcm9tIEFwYWNoZSBSaXBwbGUsIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLXJpcHBsZVxuXG5mdW5jdGlvbiBfZ2V0U3RhY2soZGVwdGgpIHtcbiAgICB2YXIgY2FsbGVyLFxuICAgICAgICBzdGFjayA9ICcnLFxuICAgICAgICBjb3VudCA9IDA7XG5cbiAgICB0cnkge1xuICAgICAgICAvKmpzaGludCBub2FyZzpmYWxzZSovIC8vIFRISVMgU0hPVUxEIE5PVCBiZSBhIGNvbW1vbiBvY2N1cnJlbmNlLi5cbiAgICAgICAgY2FsbGVyID0gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIuYXJndW1lbnRzLmNhbGxlZS5jYWxsZXI7XG5cbiAgICAgICAgd2hpbGUgKGNvdW50IDw9IGRlcHRoICYmIGNhbGxlcikge1xuICAgICAgICAgICAgc3RhY2sgKz0gJ2Z1bmN0aW9uOiAnICsgY2FsbGVyLnRvU3RyaW5nKCkubWF0Y2goL2Z1bmN0aW9uXFxzPyguKilcXHsvKVsxXSArICdcXG4nO1xuICAgICAgICAgICAgY2FsbGVyID0gY2FsbGVyLmFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyO1xuICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgc3RhY2sgPSAnZmFpbGVkIHRvIGRldGVybWluZSBzdGFjayB0cmFjZSAoJyArIChlLm5hbWUgfHwgZS50eXBlKSArICcgOjogJyArIGUubWVzc2FnZSArICcpJztcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhY2s7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gICAgdHlwZXM6IHtcbiAgICAgICAgQXBwbGljYXRpb246ICdBcHBsaWNhdGlvbicsXG4gICAgICAgIEFyZ3VtZW50TGVuZ3RoOiAnQXJndW1lbnRMZW5ndGgnLFxuICAgICAgICBBcmd1bWVudFR5cGU6ICdBcmd1bWVudFR5cGUnLFxuICAgICAgICBBcmd1bWVudDogJ0FyZ3VtZW50JyxcbiAgICAgICAgTm90aWZpY2F0aW9uVHlwZTogJ05vdGlmaWNhdGlvblR5cGUnLFxuICAgICAgICBOb3RpZmljYXRpb25TdGF0ZVR5cGU6ICdOb3RpZmljYXRpb25TdGF0ZVR5cGUnLFxuICAgICAgICBEb21PYmplY3ROb3RGb3VuZDogJ0RvbU9iamVjdE5vdEZvdW5kJyxcbiAgICAgICAgTGF5b3V0VHlwZTogJ0xheW91dFR5cGUnLFxuICAgICAgICBEZXZpY2VOb3RGb3VuZDogJ0RldmljZU5vdEZvdW5kJyxcbiAgICAgICAgdGlueUhpcHBvc01hc2tlZEV4Y2VwdGlvbjogJ3RpbnlIaXBwb3NNYXNrZWRFeGNlcHRpb24nLFxuICAgICAgICBHZW86ICdHZW8nLFxuICAgICAgICBBY2NlbGVyb21ldGVyOiAnQWNjZWxlcm9tZXRlcicsXG4gICAgICAgIE1ldGhvZE5vdEltcGxlbWVudGVkOiAnTWV0aG9kTm90SW1wbGVtZW50ZWQnLFxuICAgICAgICBJbnZhbGlkU3RhdGU6ICdJbnZhbGlkU3RhdGUnLFxuICAgICAgICBBcHBsaWNhdGlvblN0YXRlOiAnQXBwbGljYXRpb25TdGF0ZSdcbiAgICB9LFxuXG4gICAgaGFuZGxlOiBmdW5jdGlvbiBoYW5kbGUoZXhjZXB0aW9uLCByZVRocm93KSB7XG4gICAgICAgIHJlVGhyb3cgPSByZVRocm93IHx8IGZhbHNlO1xuXG4gICAgICAgIHZhciBlTXNnID0gZXhjZXB0aW9uLm1lc3NhZ2UgfHwgJ2V4Y2VwdGlvbiBjYXVnaHQhJyxcbiAgICAgICAgICAgIG1zZyA9IGVNc2cgKyAnXFxuXFxuJyArIChleGNlcHRpb24uc3RhY2sgfHwgJypubyBzdGFjayBwcm92aWRlZConKSArICdcXG5cXG4nO1xuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcblxuICAgICAgICBpZiAocmVUaHJvdykge1xuICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJhaXNlOiBmdW5jdGlvbiByYWlzZShleGNlcHRpb25UeXBlLCBtZXNzYWdlLCBjdXN0b21FeGNlcHRpb25PYmplY3QpIHtcbiAgICAgICAgdmFyIG9iaiA9IGN1c3RvbUV4Y2VwdGlvbk9iamVjdCB8fCB7XG4gICAgICAgICAgICB0eXBlOiAnJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICcnLFxuXG4gICAgICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLm5hbWUgKyAnOiBcXCcnICsgdGhpcy5tZXNzYWdlICsgJ1xcJyc7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGFjaykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gJ1xcbicgKyB0aGlzLnN0YWNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8ICcnO1xuXG4gICAgICAgIG9iai5uYW1lID0gZXhjZXB0aW9uVHlwZTtcbiAgICAgICAgb2JqLnR5cGUgPSBleGNlcHRpb25UeXBlO1xuICAgICAgICAvLyBUT0RPOiBpbmNsdWRlIHRoZSBleGNlcHRpb24gb2JqZWN0cyBvcmlnaW5hbCBtZXNzYWdlIGlmIGV4aXN0c1xuICAgICAgICBvYmoubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgICAgIG9iai5zdGFjayA9IF9nZXRTdGFjayg1KTtcblxuICAgICAgICB0aHJvdyBvYmo7XG4gICAgfVxufTtcbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG52YXIgZGlhbG9nID0gcmVxdWlyZSgnZGlhbG9nJyk7XG52YXIgc2F2ZWRTaW1zID0gcmVxdWlyZSgnLi9zYXZlZC1zaW1zJyk7XG52YXIgdGVsZW1ldHJ5ID0gcmVxdWlyZSgndGVsZW1ldHJ5LWhlbHBlcicpO1xuXG4vLyBIYW5kbGUgYW55IGNhbGxzIG5vdCBoYW5kbGVkIGJ5IGFueXRoaW5nIGVsc2UuLi5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgICcqJzoge1xuICAgICAgICAnKic6IGZ1bmN0aW9uIChzdWNjZXNzLCBmYWlsLCBzZXJ2aWNlLCBhY3Rpb24sIGFyZ3MpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIHN1Y2Nlc3Mgb3IgZmFpbCBtZXRob2QgcHJvdmlkZWQsIHRoZW4gdGhlcmUgaXMgbm8gcG9pbnQgaW4gdXMgdHJ5aW5nIHRvIGhhbmRsZSBpdCwgc28gd2VcbiAgICAgICAgICAgIC8vIGRvbid0LlxuICAgICAgICAgICAgaWYgKCFzdWNjZXNzICYmICFmYWlsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgc2F2ZWQgc2ltIGZvciB0aGlzIHNlcnZpY2UuYWN0aW9uLCB1c2UgdGhhdFxuICAgICAgICAgICAgaWYgKGhhbmRsZVNhdmVkU2ltKHN1Y2Nlc3MsIGZhaWwsIHNlcnZpY2UsIGFjdGlvbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSBzaG93IHRoZSBkaWFsb2dcbiAgICAgICAgICAgIGRpYWxvZy5zaG93RGlhbG9nKCdleGVjLWRpYWxvZycsIGZ1bmN0aW9uIChtc2cpIHtcbiAgICAgICAgICAgICAgICBpZiAobXNnID09PSAncXVlcnktc2hvdycpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGlzcGxheSBvZiB0aGUgZGlhbG9nIHdhcyBkZWxheWVkIGZvciBzb21lIHJlYXNvbi4gQ2hlY2sgaWYgaW4gdGhlIG1lYW50aW1lIHdlIGhhdmUgYSBzYXZlZCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjYWxsLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWhhbmRsZVNhdmVkU2ltKHN1Y2Nlc3MsIGZhaWwsIHNlcnZpY2UsIGFjdGlvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cgPT09ICdzaG93aW5nJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBkaWFsb2cgZm9yIHNob3dpbmdcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Y2Nlc3NCdXR0b24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhlYy1zdWNjZXNzJyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmYWlsdXJlQnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4ZWMtZmFpbHVyZScpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0RmllbGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhlYy1yZXNwb25zZScpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3JEaXNwbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4ZWMtZXJyb3InKTtcblxuICAgICAgICAgICAgICAgICAgICBlcnJvckRpc3BsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4ZWMtc2VydmljZScpLnRleHRDb250ZW50ID0gc2VydmljZTtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4ZWMtYWN0aW9uJykudGV4dENvbnRlbnQgPSBhY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGVjLWFyZ3MnKS50ZXh0Q29udGVudCA9IChhcmdzIHx8IFtdKS5tYXAoSlNPTi5zdHJpbmdpZnkpLmpvaW4oJywgJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLyplc2xpbnQtZGlzYWJsZSBuby1pbm5lci1kZWNsYXJhdGlvbnMgKi9cbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaGFuZGxlU3VjY2VzcygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMoc3VjY2VzcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVGYWlsdXJlKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhlYyhmYWlsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGV4ZWMoZnVuYywgaXNTdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVzdWx0RmllbGQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hvdWxkUGVyc2lzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGVjLXBlcnNpc3QnKS5jaGVja2VkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCAmJiBKU09OLnBhcnNlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4ZWMtcGFyc2UtZXJyb3InKS50ZXh0Q29udGVudCA9IGUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckRpc3BsYXkuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nLmhpZGVEaWFsb2coJ2V4ZWMtZGlhbG9nJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRQZXJzaXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRTaW1zLmFkZFNpbSh7IHNlcnZpY2U6IHNlcnZpY2UsIGFjdGlvbjogYWN0aW9uLCBhcmdzOiBhcmdzLCB2YWx1ZTogcmVzdWx0LCBzdWNjZXNzOiBpc1N1Y2Nlc3MgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFeGVjVW5oYW5kbGVkVGVsZW1ldHJ5KHNlcnZpY2UsIGFjdGlvbiwgZmFsc2UsIGlzU3VjY2VzcywgcmVzdWx0SGFzVmFsdWUocmVzdWx0KSwgc2hvdWxkUGVyc2lzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KG51bGwsIHJlc3VsdCA/IFtyZXN1bHRdIDogW10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8qZXNsaW50LWVuYWJsZSBuby1pbm5lci1kZWNsYXJhdGlvbnMgKi9cblxuICAgICAgICAgICAgICAgICAgICAvLyBEbyB0aGlzIGVhY2ggdGltZSB0byBjYXB0dXJlIHRoZSB2YWx1ZXMgZnJvbSB0aGUgY3VycmVudCBjbG9zdXJlLiBBbHNvLCB1c2UgdGhpcyBhcHByb2FjaCByYXRoZXIgdGhhblxuICAgICAgICAgICAgICAgICAgICAvLyBhZGRFdmVudExpc3RlbmVyKCksIGFzIGl0IGNhbiBwcm92ZSBkaWZmaWN1bHQgdG8gcmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0J1dHRvbi5vbmNsaWNrID0gaGFuZGxlU3VjY2VzcztcbiAgICAgICAgICAgICAgICAgICAgZmFpbHVyZUJ1dHRvbi5vbmNsaWNrID0gaGFuZGxlRmFpbHVyZTtcblxuICAgICAgICAgICAgICAgICAgICByZXN1bHRGaWVsZC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuZnVuY3Rpb24gaGFuZGxlU2F2ZWRTaW0oc3VjY2VzcywgZmFpbCwgc2VydmljZSwgYWN0aW9uKSB7XG4gICAgdmFyIHNhdmVkU2ltID0gc2F2ZWRTaW1zLmZpbmRTYXZlZFNpbShzZXJ2aWNlLCBhY3Rpb24pO1xuICAgIGlmIChzYXZlZFNpbSkge1xuICAgICAgICB2YXIgaXNTdWNjZXNzID0gISFzYXZlZFNpbS5zdWNjZXNzO1xuICAgICAgICBzZW5kRXhlY1VuaGFuZGxlZFRlbGVtZXRyeShzZXJ2aWNlLCBhY3Rpb24sIHRydWUsIGlzU3VjY2VzcywgcmVzdWx0SGFzVmFsdWUoc2F2ZWRTaW0udmFsdWUpKTtcblxuICAgICAgICBpZiAoaXNTdWNjZXNzKSB7XG4gICAgICAgICAgICBzdWNjZXNzKHNhdmVkU2ltLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZhaWwoc2F2ZWRTaW0udmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogU2VuZHMgYW4gJ2V4ZWMtdW5oYW5kbGVkJyB0ZWxlbWV0cnkgZXZlbnQgdG8gdGhlIHNlcnZlci5cbiAqIFxuICogQHBhcmFtIHtzdHJpbmd9IHNlcnZpY2UgVGhlIG5hbWUgb2YgdGhlIHBsdWdpbidzIHNlcnZpY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4ncyBhY3Rpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BlcnNpc3RlZCBXaGV0aGVyIG9yIG5vdCB0aGUgZXhlYyBjYWxsIGFscmVhZHkgaGFkIGEgcGVyc2lzdGUgcmVzdWx0IChubyBkaWFsb2cgcG9wdXAgd2FzIHNob3duIHRvIHRoZSB1c2VyKS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTdWNjZXNzIFdoZXRoZXIgb3Igbm90IHRoZSByZXN1bHQgaXMgYSBzdWNjZXNzIChhcyBpbiwgdGhlIHBsdWdpbiBhY3Rpb24ncyBzdWNjZXNzIGNhbGxiYWNrIHdhcyB1c2VkKS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFzUmVzdWx0IFdoZXRoZXIgb3Igbm90IHRoZSByZXN1bHQgY29udGFpbnMgYSB2YWx1ZSAoYXMgb3Bwb3NlZCB0byBiZWluZyBlbXB0eSAvIHRoZSBkZWZhdWx0IEpTT04gb2JqZWN0IHt9KS5cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHNhdmVSZXN1bHQgV2hldGhlciB0aGUgdXNlciBjaG9zZSB0byBwZXJzaXN0IHRoZSByZXN1bHQuIFRoaXMgaXMgaWdub3JlZCBpZiBoYXNQZXJzaXN0ZWQgaXMgdHJ1ZSwgYmVjYXVzZSBpbiB0aGF0IGNhc2UgdGhlIHVzZXIgd2Fzbid0IHByZXNlbnRlZCB0aGUgZGlhbG9nIHBvcHVwLlxuICovXG5mdW5jdGlvbiBzZW5kRXhlY1VuaGFuZGxlZFRlbGVtZXRyeShzZXJ2aWNlLCBhY3Rpb24sIGhhc1BlcnNpc3RlZCwgaXNTdWNjZXNzLCBoYXNSZXN1bHQsIHNhdmVSZXN1bHQpIHtcbiAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgICdzZXJ2aWNlJzogc2VydmljZSxcbiAgICAgICAgJ2FjdGlvbic6IGFjdGlvbixcbiAgICAgICAgJ2hhcy1wZXJzaXN0ZWQtcmVzdWx0JzogaGFzUGVyc2lzdGVkLFxuICAgICAgICAnaXMtc3VjY2Vzcyc6IGlzU3VjY2VzcyxcbiAgICAgICAgJ2hhcy1yZXN1bHQtdmFsdWUnOiBoYXNSZXN1bHRcbiAgICB9O1xuXG4gICAgaWYgKCFoYXNQZXJzaXN0ZWQpIHtcbiAgICAgICAgcHJvcHNbJ3NhdmUtcmVzdWx0J10gPSAhIXNhdmVSZXN1bHQ7XG4gICAgfVxuXG4gICAgdGVsZW1ldHJ5LnNlbmRDbGllbnRUZWxlbWV0cnkoJ2V4ZWMtdW5oYW5kbGVkJywgcHJvcHMpO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgdXNlciB0eXBlZCBzb21ldGhpbmcgaW4gdGhlIHVuaGFuZGxlZCBleGVjIHBvcHVwLlxuICogXG4gKiBAcGFyYW0ge2FueX0gcmVzdWx0IFRoZSBjb250ZW50IG9mIHRoZSB0ZXh0IGVudHJ5LlxuICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHVzZXIgZW50ZXJlZCBhIHZhbHVlLlxuICovXG5mdW5jdGlvbiByZXN1bHRIYXNWYWx1ZShyZXN1bHQpIHtcbiAgICByZXR1cm4gdHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcgJiYgcmVzdWx0ICE9PSAnJztcbn1cbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG4vKmdsb2JhbCBDb3Jkb3ZhTGFiZWxlZFZhbHVlOiBmYWxzZSwgQ29yZG92YUl0ZW06IGZhbHNlICovXG4vLyBUaGVzZSBnbG9iYWxzIGFyZSBjb3Jkb3ZhLXNpbXVsYXRlIGN1c3RvbSBlbGVtZW50cy5cblxudmFyIHNhdmVkU2ltcyA9IHJlcXVpcmUoJy4vc2F2ZWQtc2ltcycpO1xudmFyIGV2ZW50ID0gcmVxdWlyZSgnZXZlbnQnKTtcblxudmFyIGVtcHR5TGFiZWw7XG52YXIgZXhlY0xpc3Q7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNpbXMgPSBzYXZlZFNpbXMuc2ltcztcblxuICAgICAgICBlbXB0eUxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtcHR5LWxhYmVsJyk7XG4gICAgICAgIGV4ZWNMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4ZWMtbGlzdCcpO1xuICAgICAgICBleGVjTGlzdC5hZGRFdmVudExpc3RlbmVyKCdpdGVtcmVtb3ZlZCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBzYXZlZFNpbXMucmVtb3ZlU2ltKGUuZGV0YWlsLml0ZW1JbmRleCk7XG5cbiAgICAgICAgICAgIGlmICghc2F2ZWRTaW1zLnNpbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2hvd0VtcHR5TGFiZWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXZlbnQub24oJ3NhdmVkLXNpbS1hZGRlZCcsIGZ1bmN0aW9uIChzaW0pIHtcbiAgICAgICAgICAgIGhpZGVFbXB0eUxhYmVsKCk7XG4gICAgICAgICAgICBleGVjTGlzdC5hZGRJdGVtKGNvcmRvdmFJdGVtRnJvbVNpbShzaW0pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHNpbXMgJiYgc2ltcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHNpbXMuZm9yRWFjaChmdW5jdGlvbiAoc2ltKSB7XG4gICAgICAgICAgICAgICAgZXhlY0xpc3QuYWRkSXRlbShjb3Jkb3ZhSXRlbUZyb21TaW0oc2ltKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIFwiTm8gdmFsdWVzIHNhdmVkXCIgaXRlbVxuICAgICAgICAgICAgc2hvd0VtcHR5TGFiZWwoKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmZ1bmN0aW9uIGNvcmRvdmFJdGVtRnJvbVNpbShzaW0pIHtcbiAgICB2YXIgbGFiZWxlZFZhbHVlID0gbmV3IENvcmRvdmFMYWJlbGVkVmFsdWUoKTtcbiAgICBsYWJlbGVkVmFsdWUubGFiZWwgPSBzaW0uc2VydmljZSArICcuJyArIHNpbS5hY3Rpb247XG5cbiAgICB2YXIgdmFsdWUgPSBzaW0udmFsdWU7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBpZ25vcmVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxhYmVsZWRWYWx1ZS52YWx1ZSA9IHZhbHVlO1xuICAgIHZhciBjb3Jkb3ZhSXRlbSA9IG5ldyBDb3Jkb3ZhSXRlbSgpO1xuICAgIGNvcmRvdmFJdGVtLmFwcGVuZENoaWxkKGxhYmVsZWRWYWx1ZSk7XG4gICAgcmV0dXJuIGNvcmRvdmFJdGVtO1xufVxuXG5mdW5jdGlvbiBzaG93RW1wdHlMYWJlbCgpIHtcbiAgICBlbXB0eUxhYmVsLmNsYXNzTGlzdC5yZW1vdmUoJ2NvcmRvdmEtaGlkZGVuJyk7XG4gICAgZXhlY0xpc3QuY2xhc3NMaXN0LmFkZCgnY29yZG92YS1oaWRkZW4nKTtcbn1cblxuZnVuY3Rpb24gaGlkZUVtcHR5TGFiZWwoKSB7XG4gICAgZW1wdHlMYWJlbC5jbGFzc0xpc3QuYWRkKCdjb3Jkb3ZhLWhpZGRlbicpO1xuICAgIGV4ZWNMaXN0LmNsYXNzTGlzdC5yZW1vdmUoJ2NvcmRvdmEtaGlkZGVuJyk7XG59XG5cbiIsIi8qISBqUXVlcnkgdjIuMS40IHwgKGMpIDIwMDUsIDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi9cbiFmdW5jdGlvbihhLGIpe1wib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1hLmRvY3VtZW50P2IoYSwhMCk6ZnVuY3Rpb24oYSl7aWYoIWEuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiKTtyZXR1cm4gYihhKX06YihhKX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9Yy5zbGljZSxlPWMuY29uY2F0LGY9Yy5wdXNoLGc9Yy5pbmRleE9mLGg9e30saT1oLnRvU3RyaW5nLGo9aC5oYXNPd25Qcm9wZXJ0eSxrPXt9LGw9YS5kb2N1bWVudCxtPVwiMi4xLjRcIixuPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBuLmZuLmluaXQoYSxiKX0sbz0vXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2cscD0vXi1tcy0vLHE9Ly0oW1xcZGEtel0pL2dpLHI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfTtuLmZuPW4ucHJvdG90eXBlPXtqcXVlcnk6bSxjb25zdHJ1Y3RvcjpuLHNlbGVjdG9yOlwiXCIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBkLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT8wPmE/dGhpc1thK3RoaXMubGVuZ3RoXTp0aGlzW2FdOmQuY2FsbCh0aGlzKX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPW4ubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBiLnByZXZPYmplY3Q9dGhpcyxiLmNvbnRleHQ9dGhpcy5jb250ZXh0LGJ9LGVhY2g6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbi5lYWNoKHRoaXMsYSxiKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhuLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5sZW5ndGgsYz0rYSsoMD5hP2I6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGM+PTAmJmI+Yz9bdGhpc1tjXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOmYsc29ydDpjLnNvcnQsc3BsaWNlOmMuc3BsaWNlfSxuLmV4dGVuZD1uLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGIsYyxkLGUsZixnPWFyZ3VtZW50c1swXXx8e30saD0xLGk9YXJndW1lbnRzLmxlbmd0aCxqPSExO2ZvcihcImJvb2xlYW5cIj09dHlwZW9mIGcmJihqPWcsZz1hcmd1bWVudHNbaF18fHt9LGgrKyksXCJvYmplY3RcIj09dHlwZW9mIGd8fG4uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oYT1hcmd1bWVudHNbaF0pKWZvcihiIGluIGEpYz1nW2JdLGQ9YVtiXSxnIT09ZCYmKGomJmQmJihuLmlzUGxhaW5PYmplY3QoZCl8fChlPW4uaXNBcnJheShkKSkpPyhlPyhlPSExLGY9YyYmbi5pc0FycmF5KGMpP2M6W10pOmY9YyYmbi5pc1BsYWluT2JqZWN0KGMpP2M6e30sZ1tiXT1uLmV4dGVuZChqLGYsZCkpOnZvaWQgMCE9PWQmJihnW2JdPWQpKTtyZXR1cm4gZ30sbi5leHRlbmQoe2V4cGFuZG86XCJqUXVlcnlcIisobStNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cXEQvZyxcIlwiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcihhKX0sbm9vcDpmdW5jdGlvbigpe30saXNGdW5jdGlvbjpmdW5jdGlvbihhKXtyZXR1cm5cImZ1bmN0aW9uXCI9PT1uLnR5cGUoYSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09PWEud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIW4uaXNBcnJheShhKSYmYS1wYXJzZUZsb2F0KGEpKzE+PTB9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuXCJvYmplY3RcIiE9PW4udHlwZShhKXx8YS5ub2RlVHlwZXx8bi5pc1dpbmRvdyhhKT8hMTphLmNvbnN0cnVjdG9yJiYhai5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLFwiaXNQcm90b3R5cGVPZlwiKT8hMTohMH0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hP2ErXCJcIjpcIm9iamVjdFwiPT10eXBlb2YgYXx8XCJmdW5jdGlvblwiPT10eXBlb2YgYT9oW2kuY2FsbChhKV18fFwib2JqZWN0XCI6dHlwZW9mIGF9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYSl7dmFyIGIsYz1ldmFsO2E9bi50cmltKGEpLGEmJigxPT09YS5pbmRleE9mKFwidXNlIHN0cmljdFwiKT8oYj1sLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIiksYi50ZXh0PWEsbC5oZWFkLmFwcGVuZENoaWxkKGIpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYikpOmMoYSkpfSxjYW1lbENhc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucmVwbGFjZShwLFwibXMtXCIpLnJlcGxhY2UocSxyKX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yi50b0xvd2VyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPTAsZj1hLmxlbmd0aCxnPXMoYSk7aWYoYyl7aWYoZyl7Zm9yKDtmPmU7ZSsrKWlmKGQ9Yi5hcHBseShhW2VdLGMpLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgaWYoZyl7Zm9yKDtmPmU7ZSsrKWlmKGQ9Yi5jYWxsKGFbZV0sZSxhW2VdKSxkPT09ITEpYnJlYWt9ZWxzZSBmb3IoZSBpbiBhKWlmKGQ9Yi5jYWxsKGFbZV0sZSxhW2VdKSxkPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRyaW06ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/XCJcIjooYStcIlwiKS5yZXBsYWNlKG8sXCJcIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjPWJ8fFtdO3JldHVybiBudWxsIT1hJiYocyhPYmplY3QoYSkpP24ubWVyZ2UoYyxcInN0cmluZ1wiPT10eXBlb2YgYT9bYV06YSk6Zi5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBudWxsPT1iPy0xOmcuY2FsbChiLGEsYyl9LG1lcmdlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPStiLmxlbmd0aCxkPTAsZT1hLmxlbmd0aDtjPmQ7ZCsrKWFbZSsrXT1iW2RdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPTAsZz1hLmxlbmd0aCxoPXMoYSksaT1bXTtpZihoKWZvcig7Zz5mO2YrKylkPWIoYVtmXSxmLGMpLG51bGwhPWQmJmkucHVzaChkKTtlbHNlIGZvcihmIGluIGEpZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7cmV0dXJuIGUuYXBwbHkoW10saSl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZjtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgYiYmKGM9YVtiXSxiPWEsYT1jKSxuLmlzRnVuY3Rpb24oYSk/KGU9ZC5jYWxsKGFyZ3VtZW50cywyKSxmPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYnx8dGhpcyxlLmNvbmNhdChkLmNhbGwoYXJndW1lbnRzKSkpfSxmLmd1aWQ9YS5ndWlkPWEuZ3VpZHx8bi5ndWlkKyssZik6dm9pZCAwfSxub3c6RGF0ZS5ub3csc3VwcG9ydDprfSksbi5lYWNoKFwiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvclwiLnNwbGl0KFwiIFwiKSxmdW5jdGlvbihhLGIpe2hbXCJbb2JqZWN0IFwiK2IrXCJdXCJdPWIudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHMoYSl7dmFyIGI9XCJsZW5ndGhcImluIGEmJmEubGVuZ3RoLGM9bi50eXBlKGEpO3JldHVyblwiZnVuY3Rpb25cIj09PWN8fG4uaXNXaW5kb3coYSk/ITE6MT09PWEubm9kZVR5cGUmJmI/ITA6XCJhcnJheVwiPT09Y3x8MD09PWJ8fFwibnVtYmVyXCI9PXR5cGVvZiBiJiZiPjAmJmItMSBpbiBhfXZhciB0PWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHU9XCJzaXp6bGVcIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9aGEoKSx6PWhhKCksQT1oYSgpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPTE8PDMxLEQ9e30uaGFzT3duUHJvcGVydHksRT1bXSxGPUUucG9wLEc9RS5wdXNoLEg9RS5wdXNoLEk9RS5zbGljZSxKPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKWlmKGFbY109PT1iKXJldHVybiBjO3JldHVybi0xfSxLPVwiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWRcIixMPVwiW1xcXFx4MjBcXFxcdFxcXFxyXFxcXG5cXFxcZl1cIixNPVwiKD86XFxcXFxcXFwufFtcXFxcdy1dfFteXFxcXHgwMC1cXFxceGEwXSkrXCIsTj1NLnJlcGxhY2UoXCJ3XCIsXCJ3I1wiKSxPPVwiXFxcXFtcIitMK1wiKihcIitNK1wiKSg/OlwiK0wrXCIqKFsqXiR8IX5dPz0pXCIrTCtcIiooPzonKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcJ10pKiknfFxcXCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFxcXFwiXSkqKVxcXCJ8KFwiK04rXCIpKXwpXCIrTCtcIipcXFxcXVwiLFA9XCI6KFwiK00rXCIpKD86XFxcXCgoKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8KCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKClbXFxcXF1dfFwiK08rXCIpKil8LiopXFxcXCl8KVwiLFE9bmV3IFJlZ0V4cChMK1wiK1wiLFwiZ1wiKSxSPW5ldyBSZWdFeHAoXCJeXCIrTCtcIit8KCg/Ol58W15cXFxcXFxcXF0pKD86XFxcXFxcXFwuKSopXCIrTCtcIiskXCIsXCJnXCIpLFM9bmV3IFJlZ0V4cChcIl5cIitMK1wiKixcIitMK1wiKlwiKSxUPW5ldyBSZWdFeHAoXCJeXCIrTCtcIiooWz4rfl18XCIrTCtcIilcIitMK1wiKlwiKSxVPW5ldyBSZWdFeHAoXCI9XCIrTCtcIiooW15cXFxcXSdcXFwiXSo/KVwiK0wrXCIqXFxcXF1cIixcImdcIiksVj1uZXcgUmVnRXhwKFApLFc9bmV3IFJlZ0V4cChcIl5cIitOK1wiJFwiKSxYPXtJRDpuZXcgUmVnRXhwKFwiXiMoXCIrTStcIilcIiksQ0xBU1M6bmV3IFJlZ0V4cChcIl5cXFxcLihcIitNK1wiKVwiKSxUQUc6bmV3IFJlZ0V4cChcIl4oXCIrTS5yZXBsYWNlKFwid1wiLFwidypcIikrXCIpXCIpLEFUVFI6bmV3IFJlZ0V4cChcIl5cIitPKSxQU0VVRE86bmV3IFJlZ0V4cChcIl5cIitQKSxDSElMRDpuZXcgUmVnRXhwKFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIitMK1wiKihldmVufG9kZHwoKFsrLV18KShcXFxcZCopbnwpXCIrTCtcIiooPzooWystXXwpXCIrTCtcIiooXFxcXGQrKXwpKVwiK0wrXCIqXFxcXCl8KVwiLFwiaVwiKSxib29sOm5ldyBSZWdFeHAoXCJeKD86XCIrSytcIikkXCIsXCJpXCIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKFwiXlwiK0wrXCIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXFxcKFwiK0wrXCIqKCg/Oi1cXFxcZCk/XFxcXGQqKVwiK0wrXCIqXFxcXCl8KSg/PVteLV18JClcIixcImlcIil9LFk9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxaPS9eaFxcZCQvaSwkPS9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sXz0vXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxhYT0vWyt+XS8sYmE9Lyd8XFxcXC9nLGNhPW5ldyBSZWdFeHAoXCJcXFxcXFxcXChbXFxcXGRhLWZdezEsNn1cIitMK1wiP3woXCIrTCtcIil8LilcIixcImlnXCIpLGRhPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1cIjB4XCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9LGVhPWZ1bmN0aW9uKCl7bSgpfTt0cnl7SC5hcHBseShFPUkuY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRVt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChmYSl7SD17YXBwbHk6RS5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtHLmFwcGx5KGEsSS5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZ2EoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3LHg7aWYoKGI/Yi5vd25lckRvY3VtZW50fHxiOnYpIT09biYmbShiKSxiPWJ8fG4sZD1kfHxbXSxrPWIubm9kZVR5cGUsXCJzdHJpbmdcIiE9dHlwZW9mIGF8fCFhfHwxIT09ayYmOSE9PWsmJjExIT09aylyZXR1cm4gZDtpZighZSYmcCl7aWYoMTEhPT1rJiYoZj1fLmV4ZWMoYSkpKWlmKGo9ZlsxXSl7aWYoOT09PWspe2lmKGg9Yi5nZXRFbGVtZW50QnlJZChqKSwhaHx8IWgucGFyZW50Tm9kZSlyZXR1cm4gZDtpZihoLmlkPT09ailyZXR1cm4gZC5wdXNoKGgpLGR9ZWxzZSBpZihiLm93bmVyRG9jdW1lbnQmJihoPWIub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChqKSkmJnQoYixoKSYmaC5pZD09PWopcmV0dXJuIGQucHVzaChoKSxkfWVsc2V7aWYoZlsyXSlyZXR1cm4gSC5hcHBseShkLGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkpLGQ7aWYoKGo9ZlszXSkmJmMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gSC5hcHBseShkLGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShqKSksZH1pZihjLnFzYSYmKCFxfHwhcS50ZXN0KGEpKSl7aWYocz1yPXUsdz1iLHg9MSE9PWsmJmEsMT09PWsmJlwib2JqZWN0XCIhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe289ZyhhKSwocj1iLmdldEF0dHJpYnV0ZShcImlkXCIpKT9zPXIucmVwbGFjZShiYSxcIlxcXFwkJlwiKTpiLnNldEF0dHJpYnV0ZShcImlkXCIscykscz1cIltpZD0nXCIrcytcIiddIFwiLGw9by5sZW5ndGg7d2hpbGUobC0tKW9bbF09cytyYShvW2xdKTt3PWFhLnRlc3QoYSkmJnBhKGIucGFyZW50Tm9kZSl8fGIseD1vLmpvaW4oXCIsXCIpfWlmKHgpdHJ5e3JldHVybiBILmFwcGx5KGQsdy5xdWVyeVNlbGVjdG9yQWxsKHgpKSxkfWNhdGNoKHkpe31maW5hbGx5e3J8fGIucmVtb3ZlQXR0cmlidXRlKFwiaWRcIil9fX1yZXR1cm4gaShhLnJlcGxhY2UoUixcIiQxXCIpLGIsZCxlKX1mdW5jdGlvbiBoYSgpe3ZhciBhPVtdO2Z1bmN0aW9uIGIoYyxlKXtyZXR1cm4gYS5wdXNoKGMrXCIgXCIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBiW2Euc2hpZnQoKV0sYltjK1wiIFwiXT1lfXJldHVybiBifWZ1bmN0aW9uIGlhKGEpe3JldHVybiBhW3VdPSEwLGF9ZnVuY3Rpb24gamEoYSl7dmFyIGI9bi5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3RyeXtyZXR1cm4hIWEoYil9Y2F0Y2goYyl7cmV0dXJuITF9ZmluYWxseXtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSxiPW51bGx9fWZ1bmN0aW9uIGthKGEsYil7dmFyIGM9YS5zcGxpdChcInxcIiksZT1hLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gbGEoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiYofmIuc291cmNlSW5kZXh8fEMpLSh+YS5zb3VyY2VJbmRleHx8Qyk7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIG1hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuXCJpbnB1dFwiPT09YyYmYi50eXBlPT09YX19ZnVuY3Rpb24gbmEoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oXCJpbnB1dFwiPT09Y3x8XCJidXR0b25cIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBvYShhKXtyZXR1cm4gaWEoZnVuY3Rpb24oYil7cmV0dXJuIGI9K2IsaWEoZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBwYShhKXtyZXR1cm4gYSYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmF9Yz1nYS5zdXBwb3J0PXt9LGY9Z2EuaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9YSYmKGEub3duZXJEb2N1bWVudHx8YSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiP1wiSFRNTFwiIT09Yi5ub2RlTmFtZTohMX0sbT1nYS5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt2YXIgYixlLGc9YT9hLm93bmVyRG9jdW1lbnR8fGE6djtyZXR1cm4gZyE9PW4mJjk9PT1nLm5vZGVUeXBlJiZnLmRvY3VtZW50RWxlbWVudD8obj1nLG89Zy5kb2N1bWVudEVsZW1lbnQsZT1nLmRlZmF1bHRWaWV3LGUmJmUhPT1lLnRvcCYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoXCJ1bmxvYWRcIixlYSwhMSk6ZS5hdHRhY2hFdmVudCYmZS5hdHRhY2hFdmVudChcIm9udW5sb2FkXCIsZWEpKSxwPSFmKGcpLGMuYXR0cmlidXRlcz1qYShmdW5jdGlvbihhKXtyZXR1cm4gYS5jbGFzc05hbWU9XCJpXCIsIWEuZ2V0QXR0cmlidXRlKFwiY2xhc3NOYW1lXCIpfSksYy5nZXRFbGVtZW50c0J5VGFnTmFtZT1qYShmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChnLmNyZWF0ZUNvbW1lbnQoXCJcIikpLCFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKS5sZW5ndGh9KSxjLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9JC50ZXN0KGcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksYy5nZXRCeUlkPWphKGZ1bmN0aW9uKGEpe3JldHVybiBvLmFwcGVuZENoaWxkKGEpLmlkPXUsIWcuZ2V0RWxlbWVudHNCeU5hbWV8fCFnLmdldEVsZW1lbnRzQnlOYW1lKHUpLmxlbmd0aH0pLGMuZ2V0QnlJZD8oZC5maW5kLklEPWZ1bmN0aW9uKGEsYil7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJnApe3ZhciBjPWIuZ2V0RWxlbWVudEJ5SWQoYSk7cmV0dXJuIGMmJmMucGFyZW50Tm9kZT9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoXCJpZFwiKT09PWJ9fSk6KGRlbGV0ZSBkLmZpbmQuSUQsZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGNhLGRhKTtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGM9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSYmYS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVyblwidW5kZWZpbmVkXCIhPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lP2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSk6Yy5xc2E/Yi5xdWVyeVNlbGVjdG9yQWxsKGEpOnZvaWQgMH06ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9MCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSk7aWYoXCIqXCI9PT1hKXt3aGlsZShjPWZbZSsrXSkxPT09Yy5ub2RlVHlwZSYmZC5wdXNoKGMpO3JldHVybiBkfXJldHVybiBmfSxkLmZpbmQuQ0xBU1M9Yy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbihhLGIpe3JldHVybiBwP2IuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKTp2b2lkIDB9LHI9W10scT1bXSwoYy5xc2E9JC50ZXN0KGcucXVlcnlTZWxlY3RvckFsbCkpJiYoamEoZnVuY3Rpb24oYSl7by5hcHBlbmRDaGlsZChhKS5pbm5lckhUTUw9XCI8YSBpZD0nXCIrdStcIic+PC9hPjxzZWxlY3QgaWQ9J1wiK3UrXCItXFxmXScgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD5cIixhLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiKS5sZW5ndGgmJnEucHVzaChcIlsqXiRdPVwiK0wrXCIqKD86Jyd8XFxcIlxcXCIpXCIpLGEucXVlcnlTZWxlY3RvckFsbChcIltzZWxlY3RlZF1cIikubGVuZ3RofHxxLnB1c2goXCJcXFxcW1wiK0wrXCIqKD86dmFsdWV8XCIrSytcIilcIiksYS5xdWVyeVNlbGVjdG9yQWxsKFwiW2lkfj1cIit1K1wiLV1cIikubGVuZ3RofHxxLnB1c2goXCJ+PVwiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6Y2hlY2tlZFwiKS5sZW5ndGh8fHEucHVzaChcIjpjaGVja2VkXCIpLGEucXVlcnlTZWxlY3RvckFsbChcImEjXCIrdStcIisqXCIpLmxlbmd0aHx8cS5wdXNoKFwiLiMuK1srfl1cIil9KSxqYShmdW5jdGlvbihhKXt2YXIgYj1nLmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtiLnNldEF0dHJpYnV0ZShcInR5cGVcIixcImhpZGRlblwiKSxhLmFwcGVuZENoaWxkKGIpLnNldEF0dHJpYnV0ZShcIm5hbWVcIixcIkRcIiksYS5xdWVyeVNlbGVjdG9yQWxsKFwiW25hbWU9ZF1cIikubGVuZ3RoJiZxLnB1c2goXCJuYW1lXCIrTCtcIipbKl4kfCF+XT89XCIpLGEucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aHx8cS5wdXNoKFwiOmVuYWJsZWRcIixcIjpkaXNhYmxlZFwiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoXCIqLDp4XCIpLHEucHVzaChcIiwuKjpcIil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPSQudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmamEoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSxcImRpdlwiKSxzLmNhbGwoYSxcIltzIT0nJ106eFwiKSxyLnB1c2goXCIhPVwiLFApfSkscT1xLmxlbmd0aCYmbmV3IFJlZ0V4cChxLmpvaW4oXCJ8XCIpKSxyPXIubGVuZ3RoJiZuZXcgUmVnRXhwKHIuam9pbihcInxcIikpLGI9JC50ZXN0KG8uY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHQ9Ynx8JC50ZXN0KG8uY29udGFpbnMpP2Z1bmN0aW9uKGEsYil7dmFyIGM9OT09PWEubm9kZVR5cGU/YS5kb2N1bWVudEVsZW1lbnQ6YSxkPWImJmIucGFyZW50Tm9kZTtyZXR1cm4gYT09PWR8fCEoIWR8fDEhPT1kLm5vZGVUeXBlfHwhKGMuY29udGFpbnM/Yy5jb250YWlucyhkKTphLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGQpKSl9OmZ1bmN0aW9uKGEsYil7aWYoYil3aGlsZShiPWIucGFyZW50Tm9kZSlpZihiPT09YSlyZXR1cm4hMDtyZXR1cm4hMX0sQj1iP2Z1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgZD0hYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gZD9kOihkPShhLm93bmVyRG9jdW1lbnR8fGEpPT09KGIub3duZXJEb2N1bWVudHx8Yik/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKToxLDEmZHx8IWMuc29ydERldGFjaGVkJiZiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGEpPT09ZD9hPT09Z3x8YS5vd25lckRvY3VtZW50PT09diYmdCh2LGEpPy0xOmI9PT1nfHxiLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYik/MTprP0ooayxhKS1KKGssYik6MDo0JmQ/LTE6MSl9OmZ1bmN0aW9uKGEsYil7aWYoYT09PWIpcmV0dXJuIGw9ITAsMDt2YXIgYyxkPTAsZT1hLnBhcmVudE5vZGUsZj1iLnBhcmVudE5vZGUsaD1bYV0saT1bYl07aWYoIWV8fCFmKXJldHVybiBhPT09Zz8tMTpiPT09Zz8xOmU/LTE6Zj8xOms/SihrLGEpLUooayxiKTowO2lmKGU9PT1mKXJldHVybiBsYShhLGIpO2M9YTt3aGlsZShjPWMucGFyZW50Tm9kZSloLnVuc2hpZnQoYyk7Yz1iO3doaWxlKGM9Yy5wYXJlbnROb2RlKWkudW5zaGlmdChjKTt3aGlsZShoW2RdPT09aVtkXSlkKys7cmV0dXJuIGQ/bGEoaFtkXSxpW2RdKTpoW2RdPT09dj8tMTppW2RdPT09dj8xOjB9LGcpOm59LGdhLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZ2EoYSxudWxsLG51bGwsYil9LGdhLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe2lmKChhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSxiPWIucmVwbGFjZShVLFwiPSckMSddXCIpLCEoIWMubWF0Y2hlc1NlbGVjdG9yfHwhcHx8ciYmci50ZXN0KGIpfHxxJiZxLnRlc3QoYikpKXRyeXt2YXIgZD1zLmNhbGwoYSxiKTtpZihkfHxjLmRpc2Nvbm5lY3RlZE1hdGNofHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGR9Y2F0Y2goZSl7fXJldHVybiBnYShiLG4sbnVsbCxbYV0pLmxlbmd0aD4wfSxnYS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSx0KGEsYil9LGdhLmF0dHI9ZnVuY3Rpb24oYSxiKXsoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSk7dmFyIGU9ZC5hdHRySGFuZGxlW2IudG9Mb3dlckNhc2UoKV0sZj1lJiZELmNhbGwoZC5hdHRySGFuZGxlLGIudG9Mb3dlckNhc2UoKSk/ZShhLGIsIXApOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09Zj9mOmMuYXR0cmlidXRlc3x8IXA/YS5nZXRBdHRyaWJ1dGUoYik6KGY9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZi5zcGVjaWZpZWQ/Zi52YWx1ZTpudWxsfSxnYS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoXCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiBcIithKX0sZ2EudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYobD0hYy5kZXRlY3REdXBsaWNhdGVzLGs9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoQiksbCl7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGs9bnVsbCxhfSxlPWdhLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz1cIlwiLGQ9MCxmPWEubm9kZVR5cGU7aWYoZil7aWYoMT09PWZ8fDk9PT1mfHwxMT09PWYpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBhLnRleHRDb250ZW50KXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1lKGEpfWVsc2UgaWYoMz09PWZ8fDQ9PT1mKXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKGI9YVtkKytdKWMrPWUoYik7cmV0dXJuIGN9LGQ9Z2Euc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86aWEsbWF0Y2g6WCxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6e1wiPlwiOntkaXI6XCJwYXJlbnROb2RlXCIsZmlyc3Q6ITB9LFwiIFwiOntkaXI6XCJwYXJlbnROb2RlXCJ9LFwiK1wiOntkaXI6XCJwcmV2aW91c1NpYmxpbmdcIixmaXJzdDohMH0sXCJ+XCI6e2RpcjpcInByZXZpb3VzU2libGluZ1wifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0ucmVwbGFjZShjYSxkYSksYVszXT0oYVszXXx8YVs0XXx8YVs1XXx8XCJcIikucmVwbGFjZShjYSxkYSksXCJ+PVwiPT09YVsyXSYmKGFbM109XCIgXCIrYVszXStcIiBcIiksYS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnRvTG93ZXJDYXNlKCksXCJudGhcIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8Z2EuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooXCJldmVuXCI9PT1hWzNdfHxcIm9kZFwiPT09YVszXSkpLGFbNV09KyhhWzddK2FbOF18fFwib2RkXCI9PT1hWzNdKSk6YVszXSYmZ2EuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNl0mJmFbMl07cmV0dXJuIFguQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdP2FbMl09YVs0XXx8YVs1XXx8XCJcIjpjJiZWLnRlc3QoYykmJihiPWcoYywhMCkpJiYoYj1jLmluZGV4T2YoXCIpXCIsYy5sZW5ndGgtYiktYy5sZW5ndGgpJiYoYVswXT1hWzBdLnNsaWNlKDAsYiksYVsyXT1jLnNsaWNlKDAsYikpLGEuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpLnRvTG93ZXJDYXNlKCk7cmV0dXJuXCIqXCI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9eVthK1wiIFwiXTtyZXR1cm4gYnx8KGI9bmV3IFJlZ0V4cChcIihefFwiK0wrXCIpXCIrYStcIihcIitMK1wifCQpXCIpKSYmeShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoXCJzdHJpbmdcIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGEuZ2V0QXR0cmlidXRlJiZhLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpfHxcIlwiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9Z2EuYXR0cihkLGEpO3JldHVybiBudWxsPT1lP1wiIT1cIj09PWI6Yj8oZSs9XCJcIixcIj1cIj09PWI/ZT09PWM6XCIhPVwiPT09Yj9lIT09YzpcIl49XCI9PT1iP2MmJjA9PT1lLmluZGV4T2YoYyk6XCIqPVwiPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6XCIkPVwiPT09Yj9jJiZlLnNsaWNlKC1jLmxlbmd0aCk9PT1jOlwifj1cIj09PWI/KFwiIFwiK2UucmVwbGFjZShRLFwiIFwiKStcIiBcIikuaW5kZXhPZihjKT4tMTpcInw9XCI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jK1wiLVwiOiExKTohMH19LENISUxEOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9XCJudGhcIiE9PWEuc2xpY2UoMCwzKSxnPVwibGFzdFwiIT09YS5zbGljZSgtNCksaD1cIm9mLXR5cGVcIj09PWI7cmV0dXJuIDE9PT1kJiYwPT09ZT9mdW5jdGlvbihhKXtyZXR1cm4hIWEucGFyZW50Tm9kZX06ZnVuY3Rpb24oYixjLGkpe3ZhciBqLGssbCxtLG4sbyxwPWYhPT1nP1wibmV4dFNpYmxpbmdcIjpcInByZXZpb3VzU2libGluZ1wiLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoO2lmKHEpe2lmKGYpe3doaWxlKHApe2w9Yjt3aGlsZShsPWxbcF0paWYoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKXJldHVybiExO289cD1cIm9ubHlcIj09PWEmJiFvJiZcIm5leHRTaWJsaW5nXCJ9cmV0dXJuITB9aWYobz1bZz9xLmZpcnN0Q2hpbGQ6cS5sYXN0Q2hpbGRdLGcmJnMpe2s9cVt1XXx8KHFbdV09e30pLGo9a1thXXx8W10sbj1qWzBdPT09dyYmalsxXSxtPWpbMF09PT13JiZqWzJdLGw9biYmcS5jaGlsZE5vZGVzW25dO3doaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKDE9PT1sLm5vZGVUeXBlJiYrK20mJmw9PT1iKXtrW2FdPVt3LG4sbV07YnJlYWt9fWVsc2UgaWYocyYmKGo9KGJbdV18fChiW3VdPXt9KSlbYV0pJiZqWzBdPT09dyltPWpbMV07ZWxzZSB3aGlsZShsPSsrbiYmbCYmbFtwXXx8KG09bj0wKXx8by5wb3AoKSlpZigoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKSYmKyttJiYocyYmKChsW3VdfHwobFt1XT17fSkpW2FdPVt3LG1dKSxsPT09YikpYnJlYWs7cmV0dXJuIG0tPWUsbT09PWR8fG0lZD09PTAmJm0vZD49MH19fSxQU0VVRE86ZnVuY3Rpb24oYSxiKXt2YXIgYyxlPWQucHNldWRvc1thXXx8ZC5zZXRGaWx0ZXJzW2EudG9Mb3dlckNhc2UoKV18fGdhLmVycm9yKFwidW5zdXBwb3J0ZWQgcHNldWRvOiBcIithKTtyZXR1cm4gZVt1XT9lKGIpOmUubGVuZ3RoPjE/KGM9W2EsYSxcIlwiLGJdLGQuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShhLnRvTG93ZXJDYXNlKCkpP2lhKGZ1bmN0aW9uKGEsYyl7dmFyIGQsZj1lKGEsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pZD1KKGEsZltnXSksYVtkXT0hKGNbZF09ZltnXSl9KTpmdW5jdGlvbihhKXtyZXR1cm4gZShhLDAsYyl9KTplfX0scHNldWRvczp7bm90OmlhKGZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZD1oKGEucmVwbGFjZShSLFwiJDFcIikpO3JldHVybiBkW3VdP2lhKGZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmLGc9ZChhLG51bGwsZSxbXSksaD1hLmxlbmd0aDt3aGlsZShoLS0pKGY9Z1toXSkmJihhW2hdPSEoYltoXT1mKSl9KTpmdW5jdGlvbihhLGUsZil7cmV0dXJuIGJbMF09YSxkKGIsbnVsbCxmLGMpLGJbMF09bnVsbCwhYy5wb3AoKX19KSxoYXM6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBnYShhLGIpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmlhKGZ1bmN0aW9uKGEpe3JldHVybiBhPWEucmVwbGFjZShjYSxkYSksZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIFcudGVzdChhfHxcIlwiKXx8Z2EuZXJyb3IoXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIithKSxhPWEucmVwbGFjZShjYSxkYSkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbihiKXt2YXIgYztkbyBpZihjPXA/Yi5sYW5nOmIuZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIil8fGIuZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYStcIi1cIik7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmMT09PWIubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbihiKXt2YXIgYz1hLmxvY2F0aW9uJiZhLmxvY2F0aW9uLmhhc2g7cmV0dXJuIGMmJmMuc2xpY2UoMSk9PT1iLmlkfSxyb290OmZ1bmN0aW9uKGEpe3JldHVybiBhPT09b30sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1uLmFjdGl2ZUVsZW1lbnQmJighbi5oYXNGb2N1c3x8bi5oYXNGb2N1cygpKSYmISEoYS50eXBlfHxhLmhyZWZ8fH5hLnRhYkluZGV4KX0sZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm5cImlucHV0XCI9PT1iJiYhIWEuY2hlY2tlZHx8XCJvcHRpb25cIj09PWImJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsYS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihhKXtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpaWYoYS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWQucHNldWRvcy5lbXB0eShhKX0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBaLnRlc3QoYS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybiBZLnRlc3QoYS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuXCJpbnB1dFwiPT09YiYmXCJidXR0b25cIj09PWEudHlwZXx8XCJidXR0b25cIj09PWJ9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuXCJpbnB1dFwiPT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZcInRleHRcIj09PWEudHlwZSYmKG51bGw9PShiPWEuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSl8fFwidGV4dFwiPT09Yi50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6b2EoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0Om9hKGZ1bmN0aW9uKGEsYil7cmV0dXJuW2ItMV19KSxlcTpvYShmdW5jdGlvbihhLGIsYyl7cmV0dXJuWzA+Yz9jK2I6Y119KSxldmVuOm9hKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTA7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksb2RkOm9hKGZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTE7Yj5jO2MrPTIpYS5wdXNoKGMpO3JldHVybiBhfSksbHQ6b2EoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7LS1kPj0wOylhLnB1c2goZCk7cmV0dXJuIGF9KSxndDpvYShmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzsrK2Q8YjspYS5wdXNoKGQpO3JldHVybiBhfSl9fSxkLnBzZXVkb3MubnRoPWQucHNldWRvcy5lcTtmb3IoYiBpbntyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlkLnBzZXVkb3NbYl09bWEoYik7Zm9yKGIgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlkLnBzZXVkb3NbYl09bmEoYik7ZnVuY3Rpb24gcWEoKXt9cWEucHJvdG90eXBlPWQuZmlsdGVycz1kLnBzZXVkb3MsZC5zZXRGaWx0ZXJzPW5ldyBxYSxnPWdhLnRva2VuaXplPWZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz16W2ErXCIgXCJdO2lmKGspcmV0dXJuIGI/MDprLnNsaWNlKDApO2g9YSxpPVtdLGo9ZC5wcmVGaWx0ZXI7d2hpbGUoaCl7KCFjfHwoZT1TLmV4ZWMoaCkpKSYmKGUmJihoPWguc2xpY2UoZVswXS5sZW5ndGgpfHxoKSxpLnB1c2goZj1bXSkpLGM9ITEsKGU9VC5leGVjKGgpKSYmKGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmVbMF0ucmVwbGFjZShSLFwiIFwiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1YW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/Z2EuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiByYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9XCJcIjtjPmI7YisrKWQrPWFbYl0udmFsdWU7cmV0dXJuIGR9ZnVuY3Rpb24gc2EoYSxiLGMpe3ZhciBkPWIuZGlyLGU9YyYmXCJwYXJlbnROb2RlXCI9PT1kLGY9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxmKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpcmV0dXJuIGEoYixjLGYpfTpmdW5jdGlvbihiLGMsZyl7dmFyIGgsaSxqPVt3LGZdO2lmKGcpe3doaWxlKGI9YltkXSlpZigoMT09PWIubm9kZVR5cGV8fGUpJiZhKGIsYyxnKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSl7aWYoaT1iW3VdfHwoYlt1XT17fSksKGg9aVtkXSkmJmhbMF09PT13JiZoWzFdPT09ZilyZXR1cm4galsyXT1oWzJdO2lmKGlbZF09aixqWzJdPWEoYixjLGcpKXJldHVybiEwfX19ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEubGVuZ3RoPjE/ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEubGVuZ3RoO3doaWxlKGUtLSlpZighYVtlXShiLGMsZCkpcmV0dXJuITE7cmV0dXJuITB9OmFbMF19ZnVuY3Rpb24gdWEoYSxiLGMpe2Zvcih2YXIgZD0wLGU9Yi5sZW5ndGg7ZT5kO2QrKylnYShhLGJbZF0sYyk7cmV0dXJuIGN9ZnVuY3Rpb24gdmEoYSxiLGMsZCxlKXtmb3IodmFyIGYsZz1bXSxoPTAsaT1hLmxlbmd0aCxqPW51bGwhPWI7aT5oO2grKykoZj1hW2hdKSYmKCFjfHxjKGYsZCxlKSkmJihnLnB1c2goZiksaiYmYi5wdXNoKGgpKTtyZXR1cm4gZ31mdW5jdGlvbiB3YShhLGIsYyxkLGUsZil7cmV0dXJuIGQmJiFkW3VdJiYoZD13YShkKSksZSYmIWVbdV0mJihlPXdhKGUsZikpLGlhKGZ1bmN0aW9uKGYsZyxoLGkpe3ZhciBqLGssbCxtPVtdLG49W10sbz1nLmxlbmd0aCxwPWZ8fHVhKGJ8fFwiKlwiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6dmEocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXZhKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9KKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj12YShyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6SC5hcHBseShnLHIpfSl9ZnVuY3Rpb24geGEoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVtcIiBcIl0saT1nPzE6MCxrPXNhKGZ1bmN0aW9uKGEpe3JldHVybiBhPT09Yn0saCwhMCksbD1zYShmdW5jdGlvbihhKXtyZXR1cm4gSihiLGEpPi0xfSxoLCEwKSxtPVtmdW5jdGlvbihhLGMsZCl7dmFyIGU9IWcmJihkfHxjIT09ail8fCgoYj1jKS5ub2RlVHlwZT9rKGEsYyxkKTpsKGEsYyxkKSk7cmV0dXJuIGI9bnVsbCxlfV07Zj5pO2krKylpZihjPWQucmVsYXRpdmVbYVtpXS50eXBlXSltPVtzYSh0YShtKSxjKV07ZWxzZXtpZihjPWQuZmlsdGVyW2FbaV0udHlwZV0uYXBwbHkobnVsbCxhW2ldLm1hdGNoZXMpLGNbdV0pe2ZvcihlPSsraTtmPmU7ZSsrKWlmKGQucmVsYXRpdmVbYVtlXS50eXBlXSlicmVhaztyZXR1cm4gd2EoaT4xJiZ0YShtKSxpPjEmJnJhKGEuc2xpY2UoMCxpLTEpLmNvbmNhdCh7dmFsdWU6XCIgXCI9PT1hW2ktMl0udHlwZT9cIipcIjpcIlwifSkpLnJlcGxhY2UoUixcIiQxXCIpLGMsZT5pJiZ4YShhLnNsaWNlKGksZSkpLGY+ZSYmeGEoYT1hLnNsaWNlKGUpKSxmPmUmJnJhKGEpKX1tLnB1c2goYyl9cmV0dXJuIHRhKG0pfWZ1bmN0aW9uIHlhKGEsYil7dmFyIGM9Yi5sZW5ndGg+MCxlPWEubGVuZ3RoPjAsZj1mdW5jdGlvbihmLGcsaCxpLGspe3ZhciBsLG0sbyxwPTAscT1cIjBcIixyPWYmJltdLHM9W10sdD1qLHU9Znx8ZSYmZC5maW5kLlRBRyhcIipcIixrKSx2PXcrPW51bGw9PXQ/MTpNYXRoLnJhbmRvbSgpfHwuMSx4PXUubGVuZ3RoO2ZvcihrJiYoaj1nIT09biYmZyk7cSE9PXgmJm51bGwhPShsPXVbcV0pO3ErKyl7aWYoZSYmbCl7bT0wO3doaWxlKG89YVttKytdKWlmKG8obCxnLGgpKXtpLnB1c2gobCk7YnJlYWt9ayYmKHc9dil9YyYmKChsPSFvJiZsKSYmcC0tLGYmJnIucHVzaChsKSl9aWYocCs9cSxjJiZxIT09cCl7bT0wO3doaWxlKG89YlttKytdKW8ocixzLGcsaCk7aWYoZil7aWYocD4wKXdoaWxlKHEtLSlyW3FdfHxzW3FdfHwoc1txXT1GLmNhbGwoaSkpO3M9dmEocyl9SC5hcHBseShpLHMpLGsmJiFmJiZzLmxlbmd0aD4wJiZwK2IubGVuZ3RoPjEmJmdhLnVuaXF1ZVNvcnQoaSl9cmV0dXJuIGsmJih3PXYsaj10KSxyfTtyZXR1cm4gYz9pYShmKTpmfXJldHVybiBoPWdhLmNvbXBpbGU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9W10sZj1BW2ErXCIgXCJdO2lmKCFmKXtifHwoYj1nKGEpKSxjPWIubGVuZ3RoO3doaWxlKGMtLSlmPXhhKGJbY10pLGZbdV0/ZC5wdXNoKGYpOmUucHVzaChmKTtmPUEoYSx5YShlLGQpKSxmLnNlbGVjdG9yPWF9cmV0dXJuIGZ9LGk9Z2Euc2VsZWN0PWZ1bmN0aW9uKGEsYixlLGYpe3ZhciBpLGosayxsLG0sbj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBhJiZhLG89IWYmJmcoYT1uLnNlbGVjdG9yfHxhKTtpZihlPWV8fFtdLDE9PT1vLmxlbmd0aCl7aWYoaj1vWzBdPW9bMF0uc2xpY2UoMCksai5sZW5ndGg+MiYmXCJJRFwiPT09KGs9alswXSkudHlwZSYmYy5nZXRCeUlkJiY5PT09Yi5ub2RlVHlwZSYmcCYmZC5yZWxhdGl2ZVtqWzFdLnR5cGVdKXtpZihiPShkLmZpbmQuSUQoay5tYXRjaGVzWzBdLnJlcGxhY2UoY2EsZGEpLGIpfHxbXSlbMF0sIWIpcmV0dXJuIGU7biYmKGI9Yi5wYXJlbnROb2RlKSxhPWEuc2xpY2Uoai5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9aT1YLm5lZWRzQ29udGV4dC50ZXN0KGEpPzA6ai5sZW5ndGg7d2hpbGUoaS0tKXtpZihrPWpbaV0sZC5yZWxhdGl2ZVtsPWsudHlwZV0pYnJlYWs7aWYoKG09ZC5maW5kW2xdKSYmKGY9bShrLm1hdGNoZXNbMF0ucmVwbGFjZShjYSxkYSksYWEudGVzdChqWzBdLnR5cGUpJiZwYShiLnBhcmVudE5vZGUpfHxiKSkpe2lmKGouc3BsaWNlKGksMSksYT1mLmxlbmd0aCYmcmEoaiksIWEpcmV0dXJuIEguYXBwbHkoZSxmKSxlO2JyZWFrfX19cmV0dXJuKG58fGgoYSxvKSkoZixiLCFwLGUsYWEudGVzdChhKSYmcGEoYi5wYXJlbnROb2RlKXx8YiksZX0sYy5zb3J0U3RhYmxlPXUuc3BsaXQoXCJcIikuc29ydChCKS5qb2luKFwiXCIpPT09dSxjLmRldGVjdER1cGxpY2F0ZXM9ISFsLG0oKSxjLnNvcnREZXRhY2hlZD1qYShmdW5jdGlvbihhKXtyZXR1cm4gMSZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG4uY3JlYXRlRWxlbWVudChcImRpdlwiKSl9KSxqYShmdW5jdGlvbihhKXtyZXR1cm4gYS5pbm5lckhUTUw9XCI8YSBocmVmPScjJz48L2E+XCIsXCIjXCI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKX0pfHxrYShcInR5cGV8aHJlZnxoZWlnaHR8d2lkdGhcIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsXCJ0eXBlXCI9PT1iLnRvTG93ZXJDYXNlKCk/MToyKX0pLGMuYXR0cmlidXRlcyYmamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPVwiPGlucHV0Lz5cIixhLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKFwidmFsdWVcIixcIlwiKSxcIlwiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpfSl8fGthKFwidmFsdWVcIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGN8fFwiaW5wdXRcIiE9PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT92b2lkIDA6YS5kZWZhdWx0VmFsdWV9KSxqYShmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YS5nZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKX0pfHxrYShLLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxnYX0oYSk7bi5maW5kPXQsbi5leHByPXQuc2VsZWN0b3JzLG4uZXhwcltcIjpcIl09bi5leHByLnBzZXVkb3Msbi51bmlxdWU9dC51bmlxdWVTb3J0LG4udGV4dD10LmdldFRleHQsbi5pc1hNTERvYz10LmlzWE1MLG4uY29udGFpbnM9dC5jb250YWluczt2YXIgdT1uLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHY9L148KFxcdyspXFxzKlxcLz8+KD86PFxcL1xcMT58KSQvLHc9L14uW146I1xcW1xcLixdKiQvO2Z1bmN0aW9uIHgoYSxiLGMpe2lmKG4uaXNGdW5jdGlvbihiKSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4hIWIuY2FsbChhLGQsYSkhPT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gbi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iIT09Y30pO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBiKXtpZih3LnRlc3QoYikpcmV0dXJuIG4uZmlsdGVyKGIsYSxjKTtiPW4uZmlsdGVyKGIsYSl9cmV0dXJuIG4uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBnLmNhbGwoYixhKT49MCE9PWN9KX1uLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9XCI6bm90KFwiK2ErXCIpXCIpLDE9PT1iLmxlbmd0aCYmMT09PWQubm9kZVR5cGU/bi5maW5kLm1hdGNoZXNTZWxlY3RvcihkLGEpP1tkXTpbXTpuLmZpbmQubWF0Y2hlcyhhLG4uZ3JlcChiLGZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZX0pKX0sbi5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGIsYz10aGlzLmxlbmd0aCxkPVtdLGU9dGhpcztpZihcInN0cmluZ1wiIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sobihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2M+YjtiKyspaWYobi5jb250YWlucyhlW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihiPTA7Yz5iO2IrKyluLmZpbmQoYSxlW2JdLGQpO3JldHVybiBkPXRoaXMucHVzaFN0YWNrKGM+MT9uLnVuaXF1ZShkKTpkKSxkLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcitcIiBcIithOmEsZH0sZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayh4KHRoaXMsYXx8W10sITEpKX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayh4KHRoaXMsYXx8W10sITApKX0saXM6ZnVuY3Rpb24oYSl7cmV0dXJuISF4KHRoaXMsXCJzdHJpbmdcIj09dHlwZW9mIGEmJnUudGVzdChhKT9uKGEpOmF8fFtdLCExKS5sZW5ndGh9fSk7dmFyIHksej0vXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0qKSkkLyxBPW4uZm4uaW5pdD1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7aWYoIWEpcmV0dXJuIHRoaXM7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGEpe2lmKGM9XCI8XCI9PT1hWzBdJiZcIj5cIj09PWFbYS5sZW5ndGgtMV0mJmEubGVuZ3RoPj0zP1tudWxsLGEsbnVsbF06ei5leGVjKGEpLCFjfHwhY1sxXSYmYilyZXR1cm4hYnx8Yi5qcXVlcnk/KGJ8fHkpLmZpbmQoYSk6dGhpcy5jb25zdHJ1Y3RvcihiKS5maW5kKGEpO2lmKGNbMV0pe2lmKGI9YiBpbnN0YW5jZW9mIG4/YlswXTpiLG4ubWVyZ2UodGhpcyxuLnBhcnNlSFRNTChjWzFdLGImJmIubm9kZVR5cGU/Yi5vd25lckRvY3VtZW50fHxiOmwsITApKSx2LnRlc3QoY1sxXSkmJm4uaXNQbGFpbk9iamVjdChiKSlmb3IoYyBpbiBiKW4uaXNGdW5jdGlvbih0aGlzW2NdKT90aGlzW2NdKGJbY10pOnRoaXMuYXR0cihjLGJbY10pO3JldHVybiB0aGlzfXJldHVybiBkPWwuZ2V0RWxlbWVudEJ5SWQoY1syXSksZCYmZC5wYXJlbnROb2RlJiYodGhpcy5sZW5ndGg9MSx0aGlzWzBdPWQpLHRoaXMuY29udGV4dD1sLHRoaXMuc2VsZWN0b3I9YSx0aGlzfXJldHVybiBhLm5vZGVUeXBlPyh0aGlzLmNvbnRleHQ9dGhpc1swXT1hLHRoaXMubGVuZ3RoPTEsdGhpcyk6bi5pc0Z1bmN0aW9uKGEpP1widW5kZWZpbmVkXCIhPXR5cGVvZiB5LnJlYWR5P3kucmVhZHkoYSk6YShuKToodm9pZCAwIT09YS5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KSxuLm1ha2VBcnJheShhLHRoaXMpKX07QS5wcm90b3R5cGU9bi5mbix5PW4obCk7dmFyIEI9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sQz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtuLmV4dGVuZCh7ZGlyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPXZvaWQgMCE9PWM7d2hpbGUoKGE9YVtiXSkmJjkhPT1hLm5vZGVUeXBlKWlmKDE9PT1hLm5vZGVUeXBlKXtpZihlJiZuKGEpLmlzKGMpKWJyZWFrO2QucHVzaChhKX1yZXR1cm4gZH0sc2libGluZzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXTthO2E9YS5uZXh0U2libGluZykxPT09YS5ub2RlVHlwZSYmYSE9PWImJmMucHVzaChhKTtyZXR1cm4gY319KSxuLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGEpe3ZhciBiPW4oYSx0aGlzKSxjPWIubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2M+YTthKyspaWYobi5jb250YWlucyh0aGlzLGJbYV0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPXUudGVzdChhKXx8XCJzdHJpbmdcIiE9dHlwZW9mIGE/bihhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbi5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP24udW5pcXVlKGYpOmYpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT9cInN0cmluZ1wiPT10eXBlb2YgYT9nLmNhbGwobihhKSx0aGlzWzBdKTpnLmNhbGwodGhpcyxhLmpxdWVyeT9hWzBdOmEpOnRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aDotMX0sYWRkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4udW5pcXVlKG4ubWVyZ2UodGhpcy5nZXQoKSxuKGEsYikpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWE/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoYSkpfX0pO2Z1bmN0aW9uIEQoYSxiKXt3aGlsZSgoYT1hW2JdKSYmMSE9PWEubm9kZVR5cGUpO3JldHVybiBhfW4uZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmMTEhPT1iLm5vZGVUeXBlP2I6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gbi5kaXIoYSxcInBhcmVudE5vZGVcIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4uZGlyKGEsXCJwYXJlbnROb2RlXCIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSxcIm5leHRTaWJsaW5nXCIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBEKGEsXCJwcmV2aW91c1NpYmxpbmdcIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZGlyKGEsXCJuZXh0U2libGluZ1wiKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbi5kaXIoYSxcInByZXZpb3VzU2libGluZ1wiKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbi5kaXIoYSxcIm5leHRTaWJsaW5nXCIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG4uZGlyKGEsXCJwcmV2aW91c1NpYmxpbmdcIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uc2libGluZygoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIG4uc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYS5jb250ZW50RG9jdW1lbnR8fG4ubWVyZ2UoW10sYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7bi5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPW4ubWFwKHRoaXMsYixjKTtyZXR1cm5cIlVudGlsXCIhPT1hLnNsaWNlKC01KSYmKGQ9YyksZCYmXCJzdHJpbmdcIj09dHlwZW9mIGQmJihlPW4uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihDW2FdfHxuLnVuaXF1ZShlKSxCLnRlc3QoYSkmJmUucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhlKX19KTt2YXIgRT0vXFxTKy9nLEY9e307ZnVuY3Rpb24gRyhhKXt2YXIgYj1GW2FdPXt9O3JldHVybiBuLmVhY2goYS5tYXRjaChFKXx8W10sZnVuY3Rpb24oYSxjKXtiW2NdPSEwfSksYn1uLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPVwic3RyaW5nXCI9PXR5cGVvZiBhP0ZbYV18fEcoYSk6bi5leHRlbmQoe30sYSk7dmFyIGIsYyxkLGUsZixnLGg9W10saT0hYS5vbmNlJiZbXSxqPWZ1bmN0aW9uKGwpe2ZvcihiPWEubWVtb3J5JiZsLGM9ITAsZz1lfHwwLGU9MCxmPWgubGVuZ3RoLGQ9ITA7aCYmZj5nO2crKylpZihoW2ddLmFwcGx5KGxbMF0sbFsxXSk9PT0hMSYmYS5zdG9wT25GYWxzZSl7Yj0hMTticmVha31kPSExLGgmJihpP2kubGVuZ3RoJiZqKGkuc2hpZnQoKSk6Yj9oPVtdOmsuZGlzYWJsZSgpKX0saz17YWRkOmZ1bmN0aW9uKCl7aWYoaCl7dmFyIGM9aC5sZW5ndGg7IWZ1bmN0aW9uIGcoYil7bi5lYWNoKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1uLnR5cGUoYyk7XCJmdW5jdGlvblwiPT09ZD9hLnVuaXF1ZSYmay5oYXMoYyl8fGgucHVzaChjKTpjJiZjLmxlbmd0aCYmXCJzdHJpbmdcIiE9PWQmJmcoYyl9KX0oYXJndW1lbnRzKSxkP2Y9aC5sZW5ndGg6YiYmKGU9YyxqKGIpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGgmJm4uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxiKXt2YXIgYzt3aGlsZSgoYz1uLmluQXJyYXkoYixoLGMpKT4tMSloLnNwbGljZShjLDEpLGQmJihmPj1jJiZmLS0sZz49YyYmZy0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9uLmluQXJyYXkoYSxoKT4tMTohKCFofHwhaC5sZW5ndGgpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBoPVtdLGY9MCx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGg9aT1iPXZvaWQgMCx0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFofSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9dm9pZCAwLGJ8fGsuZGlzYWJsZSgpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFpfSxmaXJlV2l0aDpmdW5jdGlvbihhLGIpe3JldHVybiFofHxjJiYhaXx8KGI9Ynx8W10sYj1bYSxiLnNsaWNlP2Iuc2xpY2UoKTpiXSxkP2kucHVzaChiKTpqKGIpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGsuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFjfX07cmV0dXJuIGt9LG4uZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1bW1wicmVzb2x2ZVwiLFwiZG9uZVwiLG4uQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksXCJyZXNvbHZlZFwiXSxbXCJyZWplY3RcIixcImZhaWxcIixuLkNhbGxiYWNrcyhcIm9uY2UgbWVtb3J5XCIpLFwicmVqZWN0ZWRcIl0sW1wibm90aWZ5XCIsXCJwcm9ncmVzc1wiLG4uQ2FsbGJhY2tzKFwibWVtb3J5XCIpXV0sYz1cInBlbmRpbmdcIixkPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBjfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gZS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LHRoZW46ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7cmV0dXJuIG4uRGVmZXJyZWQoZnVuY3Rpb24oYyl7bi5lYWNoKGIsZnVuY3Rpb24oYixmKXt2YXIgZz1uLmlzRnVuY3Rpb24oYVtiXSkmJmFbYl07ZVtmWzFdXShmdW5jdGlvbigpe3ZhciBhPWcmJmcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2EmJm4uaXNGdW5jdGlvbihhLnByb21pc2UpP2EucHJvbWlzZSgpLmRvbmUoYy5yZXNvbHZlKS5mYWlsKGMucmVqZWN0KS5wcm9ncmVzcyhjLm5vdGlmeSk6Y1tmWzBdK1wiV2l0aFwiXSh0aGlzPT09ZD9jLnByb21pc2UoKTp0aGlzLGc/W2FdOmFyZ3VtZW50cyl9KX0pLGE9bnVsbH0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YT9uLmV4dGVuZChhLGQpOmR9fSxlPXt9O3JldHVybiBkLnBpcGU9ZC50aGVuLG4uZWFjaChiLGZ1bmN0aW9uKGEsZil7dmFyIGc9ZlsyXSxoPWZbM107ZFtmWzFdXT1nLmFkZCxoJiZnLmFkZChmdW5jdGlvbigpe2M9aH0sYlsxXmFdWzJdLmRpc2FibGUsYlsyXVsyXS5sb2NrKSxlW2ZbMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGVbZlswXStcIldpdGhcIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdK1wiV2l0aFwiXT1nLmZpcmVXaXRofSksZC5wcm9taXNlKGUpLGEmJmEuY2FsbChlLGUpLGV9LHdoZW46ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPWQuY2FsbChhcmd1bWVudHMpLGU9Yy5sZW5ndGgsZj0xIT09ZXx8YSYmbi5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/ZTowLGc9MT09PWY/YTpuLkRlZmVycmVkKCksaD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGUpe2JbYV09dGhpcyxjW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9kLmNhbGwoYXJndW1lbnRzKTplLGM9PT1pP2cubm90aWZ5V2l0aChiLGMpOi0tZnx8Zy5yZXNvbHZlV2l0aChiLGMpfX0saSxqLGs7aWYoZT4xKWZvcihpPW5ldyBBcnJheShlKSxqPW5ldyBBcnJheShlKSxrPW5ldyBBcnJheShlKTtlPmI7YisrKWNbYl0mJm4uaXNGdW5jdGlvbihjW2JdLnByb21pc2UpP2NbYl0ucHJvbWlzZSgpLmRvbmUoaChiLGssYykpLmZhaWwoZy5yZWplY3QpLnByb2dyZXNzKGgoYixqLGkpKTotLWY7cmV0dXJuIGZ8fGcucmVzb2x2ZVdpdGgoayxjKSxnLnByb21pc2UoKX19KTt2YXIgSDtuLmZuLnJlYWR5PWZ1bmN0aW9uKGEpe3JldHVybiBuLnJlYWR5LnByb21pc2UoKS5kb25lKGEpLHRoaXN9LG4uZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP24ucmVhZHlXYWl0Kys6bi5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpeyhhPT09ITA/LS1uLnJlYWR5V2FpdDpuLmlzUmVhZHkpfHwobi5pc1JlYWR5PSEwLGEhPT0hMCYmLS1uLnJlYWR5V2FpdD4wfHwoSC5yZXNvbHZlV2l0aChsLFtuXSksbi5mbi50cmlnZ2VySGFuZGxlciYmKG4obCkudHJpZ2dlckhhbmRsZXIoXCJyZWFkeVwiKSxuKGwpLm9mZihcInJlYWR5XCIpKSkpfX0pO2Z1bmN0aW9uIEkoKXtsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsSSwhMSksYS5yZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZFwiLEksITEpLG4ucmVhZHkoKX1uLnJlYWR5LnByb21pc2U9ZnVuY3Rpb24oYil7cmV0dXJuIEh8fChIPW4uRGVmZXJyZWQoKSxcImNvbXBsZXRlXCI9PT1sLnJlYWR5U3RhdGU/c2V0VGltZW91dChuLnJlYWR5KToobC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLEksITEpLGEuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIixJLCExKSkpLEgucHJvbWlzZShiKX0sbi5yZWFkeS5wcm9taXNlKCk7dmFyIEo9bi5hY2Nlc3M9ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyl7dmFyIGg9MCxpPWEubGVuZ3RoLGo9bnVsbD09YztpZihcIm9iamVjdFwiPT09bi50eXBlKGMpKXtlPSEwO2ZvcihoIGluIGMpbi5hY2Nlc3MoYSxiLGgsY1toXSwhMCxmLGcpfWVsc2UgaWYodm9pZCAwIT09ZCYmKGU9ITAsbi5pc0Z1bmN0aW9uKGQpfHwoZz0hMCksaiYmKGc/KGIuY2FsbChhLGQpLGI9bnVsbCk6KGo9YixiPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gai5jYWxsKG4oYSksYyl9KSksYikpZm9yKDtpPmg7aCsrKWIoYVtoXSxjLGc/ZDpkLmNhbGwoYVtoXSxoLGIoYVtoXSxjKSkpO3JldHVybiBlP2E6aj9iLmNhbGwoYSk6aT9iKGFbMF0sYyk6Zn07bi5hY2NlcHREYXRhPWZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZXx8OT09PWEubm9kZVR5cGV8fCErYS5ub2RlVHlwZX07ZnVuY3Rpb24gSygpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLmNhY2hlPXt9LDAse2dldDpmdW5jdGlvbigpe3JldHVybnt9fX0pLHRoaXMuZXhwYW5kbz1uLmV4cGFuZG8rSy51aWQrK31LLnVpZD0xLEsuYWNjZXB0cz1uLmFjY2VwdERhdGEsSy5wcm90b3R5cGU9e2tleTpmdW5jdGlvbihhKXtpZighSy5hY2NlcHRzKGEpKXJldHVybiAwO3ZhciBiPXt9LGM9YVt0aGlzLmV4cGFuZG9dO2lmKCFjKXtjPUsudWlkKys7dHJ5e2JbdGhpcy5leHBhbmRvXT17dmFsdWU6Y30sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYSxiKX1jYXRjaChkKXtiW3RoaXMuZXhwYW5kb109YyxuLmV4dGVuZChhLGIpfX1yZXR1cm4gdGhpcy5jYWNoZVtjXXx8KHRoaXMuY2FjaGVbY109e30pLGN9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZT10aGlzLmtleShhKSxmPXRoaXMuY2FjaGVbZV07aWYoXCJzdHJpbmdcIj09dHlwZW9mIGIpZltiXT1jO2Vsc2UgaWYobi5pc0VtcHR5T2JqZWN0KGYpKW4uZXh0ZW5kKHRoaXMuY2FjaGVbZV0sYik7ZWxzZSBmb3IoZCBpbiBiKWZbZF09YltkXTtyZXR1cm4gZn0sZ2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jYWNoZVt0aGlzLmtleShhKV07cmV0dXJuIHZvaWQgMD09PWI/YzpjW2JdfSxhY2Nlc3M6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiB2b2lkIDA9PT1ifHxiJiZcInN0cmluZ1wiPT10eXBlb2YgYiYmdm9pZCAwPT09Yz8oZD10aGlzLmdldChhLGIpLHZvaWQgMCE9PWQ/ZDp0aGlzLmdldChhLG4uY2FtZWxDYXNlKGIpKSk6KHRoaXMuc2V0KGEsYixjKSx2b2lkIDAhPT1jP2M6Yil9LHJlbW92ZTpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPXRoaXMua2V5KGEpLGc9dGhpcy5jYWNoZVtmXTtpZih2b2lkIDA9PT1iKXRoaXMuY2FjaGVbZl09e307ZWxzZXtuLmlzQXJyYXkoYik/ZD1iLmNvbmNhdChiLm1hcChuLmNhbWVsQ2FzZSkpOihlPW4uY2FtZWxDYXNlKGIpLGIgaW4gZz9kPVtiLGVdOihkPWUsZD1kIGluIGc/W2RdOmQubWF0Y2goRSl8fFtdKSksYz1kLmxlbmd0aDt3aGlsZShjLS0pZGVsZXRlIGdbZFtjXV19fSxoYXNEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiFuLmlzRW1wdHlPYmplY3QodGhpcy5jYWNoZVthW3RoaXMuZXhwYW5kb11dfHx7fSl9LGRpc2NhcmQ6ZnVuY3Rpb24oYSl7YVt0aGlzLmV4cGFuZG9dJiZkZWxldGUgdGhpcy5jYWNoZVthW3RoaXMuZXhwYW5kb11dfX07dmFyIEw9bmV3IEssTT1uZXcgSyxOPS9eKD86XFx7W1xcd1xcV10qXFx9fFxcW1tcXHdcXFddKlxcXSkkLyxPPS8oW0EtWl0pL2c7ZnVuY3Rpb24gUChhLGIsYyl7dmFyIGQ7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpaWYoZD1cImRhdGEtXCIrYi5yZXBsYWNlKE8sXCItJDFcIikudG9Mb3dlckNhc2UoKSxjPWEuZ2V0QXR0cmlidXRlKGQpLFwic3RyaW5nXCI9PXR5cGVvZiBjKXt0cnl7Yz1cInRydWVcIj09PWM/ITA6XCJmYWxzZVwiPT09Yz8hMTpcIm51bGxcIj09PWM/bnVsbDorYytcIlwiPT09Yz8rYzpOLnRlc3QoYyk/bi5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9TS5zZXQoYSxiLGMpfWVsc2UgYz12b2lkIDA7cmV0dXJuIGN9bi5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIE0uaGFzRGF0YShhKXx8TC5oYXNEYXRhKGEpfSxkYXRhOmZ1bmN0aW9uKGEsYixjKXtcbnJldHVybiBNLmFjY2VzcyhhLGIsYyl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtNLnJlbW92ZShhLGIpfSxfZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEwuYWNjZXNzKGEsYixjKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtMLnJlbW92ZShhLGIpfX0pLG4uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9TS5nZXQoZiksMT09PWYubm9kZVR5cGUmJiFMLmdldChmLFwiaGFzRGF0YUF0dHJzXCIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoXCJkYXRhLVwiKSYmKGQ9bi5jYW1lbENhc2UoZC5zbGljZSg1KSksUChmLGQsZVtkXSkpKTtMLnNldChmLFwiaGFzRGF0YUF0dHJzXCIsITApfXJldHVybiBlfXJldHVyblwib2JqZWN0XCI9PXR5cGVvZiBhP3RoaXMuZWFjaChmdW5jdGlvbigpe00uc2V0KHRoaXMsYSl9KTpKKHRoaXMsZnVuY3Rpb24oYil7dmFyIGMsZD1uLmNhbWVsQ2FzZShhKTtpZihmJiZ2b2lkIDA9PT1iKXtpZihjPU0uZ2V0KGYsYSksdm9pZCAwIT09YylyZXR1cm4gYztpZihjPU0uZ2V0KGYsZCksdm9pZCAwIT09YylyZXR1cm4gYztpZihjPVAoZixkLHZvaWQgMCksdm9pZCAwIT09YylyZXR1cm4gY31lbHNlIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBjPU0uZ2V0KHRoaXMsZCk7TS5zZXQodGhpcyxkLGIpLC0xIT09YS5pbmRleE9mKFwiLVwiKSYmdm9pZCAwIT09YyYmTS5zZXQodGhpcyxhLGIpfSl9LG51bGwsYixhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe00ucmVtb3ZlKHRoaXMsYSl9KX19KSxuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBhPyhiPShifHxcImZ4XCIpK1wicXVldWVcIixkPUwuZ2V0KGEsYiksYyYmKCFkfHxuLmlzQXJyYXkoYyk/ZD1MLmFjY2VzcyhhLGIsbi5tYWtlQXJyYXkoYykpOmQucHVzaChjKSksZHx8W10pOnZvaWQgMH0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8XCJmeFwiO3ZhciBjPW4ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bi5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXtuLmRlcXVldWUoYSxiKX07XCJpbnByb2dyZXNzXCI9PT1lJiYoZT1jLnNoaWZ0KCksZC0tKSxlJiYoXCJmeFwiPT09YiYmYy51bnNoaWZ0KFwiaW5wcm9ncmVzc1wiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iK1wicXVldWVIb29rc1wiO3JldHVybiBMLmdldChhLGMpfHxMLmFjY2VzcyhhLGMse2VtcHR5Om4uQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIikuYWRkKGZ1bmN0aW9uKCl7TC5yZW1vdmUoYSxbYitcInF1ZXVlXCIsY10pfSl9KX19KSxuLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVyblwic3RyaW5nXCIhPXR5cGVvZiBhJiYoYj1hLGE9XCJmeFwiLGMtLSksYXJndW1lbnRzLmxlbmd0aDxjP24ucXVldWUodGhpc1swXSxhKTp2b2lkIDA9PT1iP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGM9bi5xdWV1ZSh0aGlzLGEsYik7bi5fcXVldWVIb29rcyh0aGlzLGEpLFwiZnhcIj09PWEmJlwiaW5wcm9ncmVzc1wiIT09Y1swXSYmbi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5kZXF1ZXVlKHRoaXMsYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHxcImZ4XCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD0xLGU9bi5EZWZlcnJlZCgpLGY9dGhpcyxnPXRoaXMubGVuZ3RoLGg9ZnVuY3Rpb24oKXstLWR8fGUucmVzb2x2ZVdpdGgoZixbZl0pfTtcInN0cmluZ1wiIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHxcImZ4XCI7d2hpbGUoZy0tKWM9TC5nZXQoZltnXSxhK1wicXVldWVIb29rc1wiKSxjJiZjLmVtcHR5JiYoZCsrLGMuZW1wdHkuYWRkKGgpKTtyZXR1cm4gaCgpLGUucHJvbWlzZShiKX19KTt2YXIgUT0vWystXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVsrLV0/XFxkK3wpLy5zb3VyY2UsUj1bXCJUb3BcIixcIlJpZ2h0XCIsXCJCb3R0b21cIixcIkxlZnRcIl0sUz1mdW5jdGlvbihhLGIpe3JldHVybiBhPWJ8fGEsXCJub25lXCI9PT1uLmNzcyhhLFwiZGlzcGxheVwiKXx8IW4uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfSxUPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pOyFmdW5jdGlvbigpe3ZhciBhPWwuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGI9YS5hcHBlbmRDaGlsZChsLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpLGM9bC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7Yy5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsXCJyYWRpb1wiKSxjLnNldEF0dHJpYnV0ZShcImNoZWNrZWRcIixcImNoZWNrZWRcIiksYy5zZXRBdHRyaWJ1dGUoXCJuYW1lXCIsXCJ0XCIpLGIuYXBwZW5kQ2hpbGQoYyksay5jaGVja0Nsb25lPWIuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGIuaW5uZXJIVE1MPVwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiLGsubm9DbG9uZUNoZWNrZWQ9ISFiLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZX0oKTt2YXIgVT1cInVuZGVmaW5lZFwiO2suZm9jdXNpbkJ1YmJsZXM9XCJvbmZvY3VzaW5cImluIGE7dmFyIFY9L15rZXkvLFc9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51KXxjbGljay8sWD0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sWT0vXihbXi5dKikoPzpcXC4oLispfCkkLztmdW5jdGlvbiBaKCl7cmV0dXJuITB9ZnVuY3Rpb24gJCgpe3JldHVybiExfWZ1bmN0aW9uIF8oKXt0cnl7cmV0dXJuIGwuYWN0aXZlRWxlbWVudH1jYXRjaChhKXt9fW4uZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG8scCxxLHI9TC5nZXQoYSk7aWYocil7Yy5oYW5kbGVyJiYoZj1jLGM9Zi5oYW5kbGVyLGU9Zi5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW4uZ3VpZCsrKSwoaT1yLmV2ZW50cyl8fChpPXIuZXZlbnRzPXt9KSwoZz1yLmhhbmRsZSl8fChnPXIuaGFuZGxlPWZ1bmN0aW9uKGIpe3JldHVybiB0eXBlb2YgbiE9PVUmJm4uZXZlbnQudHJpZ2dlcmVkIT09Yi50eXBlP24uZXZlbnQuZGlzcGF0Y2guYXBwbHkoYSxhcmd1bWVudHMpOnZvaWQgMH0pLGI9KGJ8fFwiXCIpLm1hdGNoKEUpfHxbXCJcIl0saj1iLmxlbmd0aDt3aGlsZShqLS0paD1ZLmV4ZWMoYltqXSl8fFtdLG89cT1oWzFdLHA9KGhbMl18fFwiXCIpLnNwbGl0KFwiLlwiKS5zb3J0KCksbyYmKGw9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2wuZGVsZWdhdGVUeXBlOmwuYmluZFR5cGUpfHxvLGw9bi5ldmVudC5zcGVjaWFsW29dfHx7fSxrPW4uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm4uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKFwiLlwiKX0sZiksKG09aVtvXSl8fChtPWlbb109W10sbS5kZWxlZ2F0ZUNvdW50PTAsbC5zZXR1cCYmbC5zZXR1cC5jYWxsKGEsZCxwLGcpIT09ITF8fGEuYWRkRXZlbnRMaXN0ZW5lciYmYS5hZGRFdmVudExpc3RlbmVyKG8sZywhMSkpLGwuYWRkJiYobC5hZGQuY2FsbChhLGspLGsuaGFuZGxlci5ndWlkfHwoay5oYW5kbGVyLmd1aWQ9Yy5ndWlkKSksZT9tLnNwbGljZShtLmRlbGVnYXRlQ291bnQrKywwLGspOm0ucHVzaChrKSxuLmV2ZW50Lmdsb2JhbFtvXT0hMCl9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxtLG8scCxxLHI9TC5oYXNEYXRhKGEpJiZMLmdldChhKTtpZihyJiYoaT1yLmV2ZW50cykpe2I9KGJ8fFwiXCIpLm1hdGNoKEUpfHxbXCJcIl0saj1iLmxlbmd0aDt3aGlsZShqLS0paWYoaD1ZLmV4ZWMoYltqXSl8fFtdLG89cT1oWzFdLHA9KGhbMl18fFwiXCIpLnNwbGl0KFwiLlwiKS5zb3J0KCksbyl7bD1uLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGQ/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbT1pW29dfHxbXSxoPWhbMl0mJm5ldyBSZWdFeHAoXCIoXnxcXFxcLilcIitwLmpvaW4oXCJcXFxcLig/Oi4qXFxcXC58KVwiKStcIihcXFxcLnwkKVwiKSxnPWY9bS5sZW5ndGg7d2hpbGUoZi0tKWs9bVtmXSwhZSYmcSE9PWsub3JpZ1R5cGV8fGMmJmMuZ3VpZCE9PWsuZ3VpZHx8aCYmIWgudGVzdChrLm5hbWVzcGFjZSl8fGQmJmQhPT1rLnNlbGVjdG9yJiYoXCIqKlwiIT09ZHx8IWsuc2VsZWN0b3IpfHwobS5zcGxpY2UoZiwxKSxrLnNlbGVjdG9yJiZtLmRlbGVnYXRlQ291bnQtLSxsLnJlbW92ZSYmbC5yZW1vdmUuY2FsbChhLGspKTtnJiYhbS5sZW5ndGgmJihsLnRlYXJkb3duJiZsLnRlYXJkb3duLmNhbGwoYSxwLHIuaGFuZGxlKSE9PSExfHxuLnJlbW92ZUV2ZW50KGEsbyxyLmhhbmRsZSksZGVsZXRlIGlbb10pfWVsc2UgZm9yKG8gaW4gaSluLmV2ZW50LnJlbW92ZShhLG8rYltqXSxjLGQsITApO24uaXNFbXB0eU9iamVjdChpKSYmKGRlbGV0ZSByLmhhbmRsZSxMLnJlbW92ZShhLFwiZXZlbnRzXCIpKX19LHRyaWdnZXI6ZnVuY3Rpb24oYixjLGQsZSl7dmFyIGYsZyxoLGksayxtLG8scD1bZHx8bF0scT1qLmNhbGwoYixcInR5cGVcIik/Yi50eXBlOmIscj1qLmNhbGwoYixcIm5hbWVzcGFjZVwiKT9iLm5hbWVzcGFjZS5zcGxpdChcIi5cIik6W107aWYoZz1oPWQ9ZHx8bCwzIT09ZC5ub2RlVHlwZSYmOCE9PWQubm9kZVR5cGUmJiFYLnRlc3QocStuLmV2ZW50LnRyaWdnZXJlZCkmJihxLmluZGV4T2YoXCIuXCIpPj0wJiYocj1xLnNwbGl0KFwiLlwiKSxxPXIuc2hpZnQoKSxyLnNvcnQoKSksaz1xLmluZGV4T2YoXCI6XCIpPDAmJlwib25cIitxLGI9YltuLmV4cGFuZG9dP2I6bmV3IG4uRXZlbnQocSxcIm9iamVjdFwiPT10eXBlb2YgYiYmYiksYi5pc1RyaWdnZXI9ZT8yOjMsYi5uYW1lc3BhY2U9ci5qb2luKFwiLlwiKSxiLm5hbWVzcGFjZV9yZT1iLm5hbWVzcGFjZT9uZXcgUmVnRXhwKFwiKF58XFxcXC4pXCIrci5qb2luKFwiXFxcXC4oPzouKlxcXFwufClcIikrXCIoXFxcXC58JClcIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1kKSxjPW51bGw9PWM/W2JdOm4ubWFrZUFycmF5KGMsW2JdKSxvPW4uZXZlbnQuc3BlY2lhbFtxXXx8e30sZXx8IW8udHJpZ2dlcnx8by50cmlnZ2VyLmFwcGx5KGQsYykhPT0hMSkpe2lmKCFlJiYhby5ub0J1YmJsZSYmIW4uaXNXaW5kb3coZCkpe2ZvcihpPW8uZGVsZWdhdGVUeXBlfHxxLFgudGVzdChpK3EpfHwoZz1nLnBhcmVudE5vZGUpO2c7Zz1nLnBhcmVudE5vZGUpcC5wdXNoKGcpLGg9ZztoPT09KGQub3duZXJEb2N1bWVudHx8bCkmJnAucHVzaChoLmRlZmF1bHRWaWV3fHxoLnBhcmVudFdpbmRvd3x8YSl9Zj0wO3doaWxlKChnPXBbZisrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPWY+MT9pOm8uYmluZFR5cGV8fHEsbT0oTC5nZXQoZyxcImV2ZW50c1wiKXx8e30pW2IudHlwZV0mJkwuZ2V0KGcsXCJoYW5kbGVcIiksbSYmbS5hcHBseShnLGMpLG09ayYmZ1trXSxtJiZtLmFwcGx5JiZuLmFjY2VwdERhdGEoZykmJihiLnJlc3VsdD1tLmFwcGx5KGcsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gYi50eXBlPXEsZXx8Yi5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8by5fZGVmYXVsdCYmby5fZGVmYXVsdC5hcHBseShwLnBvcCgpLGMpIT09ITF8fCFuLmFjY2VwdERhdGEoZCl8fGsmJm4uaXNGdW5jdGlvbihkW3FdKSYmIW4uaXNXaW5kb3coZCkmJihoPWRba10saCYmKGRba109bnVsbCksbi5ldmVudC50cmlnZ2VyZWQ9cSxkW3FdKCksbi5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLGgmJihkW2tdPWgpKSxiLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGEpe2E9bi5ldmVudC5maXgoYSk7dmFyIGIsYyxlLGYsZyxoPVtdLGk9ZC5jYWxsKGFyZ3VtZW50cyksaj0oTC5nZXQodGhpcyxcImV2ZW50c1wiKXx8e30pW2EudHlwZV18fFtdLGs9bi5ldmVudC5zcGVjaWFsW2EudHlwZV18fHt9O2lmKGlbMF09YSxhLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWsucHJlRGlzcGF0Y2h8fGsucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGEpIT09ITEpe2g9bi5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsYSxqKSxiPTA7d2hpbGUoKGY9aFtiKytdKSYmIWEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7YS5jdXJyZW50VGFyZ2V0PWYuZWxlbSxjPTA7d2hpbGUoKGc9Zi5oYW5kbGVyc1tjKytdKSYmIWEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSkoIWEubmFtZXNwYWNlX3JlfHxhLm5hbWVzcGFjZV9yZS50ZXN0KGcubmFtZXNwYWNlKSkmJihhLmhhbmRsZU9iaj1nLGEuZGF0YT1nLmRhdGEsZT0oKG4uZXZlbnQuc3BlY2lhbFtnLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8Zy5oYW5kbGVyKS5hcHBseShmLmVsZW0saSksdm9pZCAwIT09ZSYmKGEucmVzdWx0PWUpPT09ITEmJihhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBrLnBvc3REaXNwYXRjaCYmay5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLGEpLGEucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnPVtdLGg9Yi5kZWxlZ2F0ZUNvdW50LGk9YS50YXJnZXQ7aWYoaCYmaS5ub2RlVHlwZSYmKCFhLmJ1dHRvbnx8XCJjbGlja1wiIT09YS50eXBlKSlmb3IoO2khPT10aGlzO2k9aS5wYXJlbnROb2RlfHx0aGlzKWlmKGkuZGlzYWJsZWQhPT0hMHx8XCJjbGlja1wiIT09YS50eXBlKXtmb3IoZD1bXSxjPTA7aD5jO2MrKylmPWJbY10sZT1mLnNlbGVjdG9yK1wiIFwiLHZvaWQgMD09PWRbZV0mJihkW2VdPWYubmVlZHNDb250ZXh0P24oZSx0aGlzKS5pbmRleChpKT49MDpuLmZpbmQoZSx0aGlzLG51bGwsW2ldKS5sZW5ndGgpLGRbZV0mJmQucHVzaChmKTtkLmxlbmd0aCYmZy5wdXNoKHtlbGVtOmksaGFuZGxlcnM6ZH0pfXJldHVybiBoPGIubGVuZ3RoJiZnLnB1c2goe2VsZW06dGhpcyxoYW5kbGVyczpiLnNsaWNlKGgpfSksZ30scHJvcHM6XCJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2hcIi5zcGxpdChcIiBcIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOlwiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZVwiLnNwbGl0KFwiIFwiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOlwiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50XCIuc3BsaXQoXCIgXCIpLGZpbHRlcjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPWIuYnV0dG9uO3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihjPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGwsZD1jLmRvY3VtZW50RWxlbWVudCxlPWMuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZCYmZC5zY3JvbGxMZWZ0fHxlJiZlLnNjcm9sbExlZnR8fDApLShkJiZkLmNsaWVudExlZnR8fGUmJmUuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGQmJmQuc2Nyb2xsVG9wfHxlJiZlLnNjcm9sbFRvcHx8MCktKGQmJmQuY2xpZW50VG9wfHxlJiZlLmNsaWVudFRvcHx8MCkpLGEud2hpY2h8fHZvaWQgMD09PWZ8fChhLndoaWNoPTEmZj8xOjImZj8zOjQmZj8yOjApLGF9fSxmaXg6ZnVuY3Rpb24oYSl7aWYoYVtuLmV4cGFuZG9dKXJldHVybiBhO3ZhciBiLGMsZCxlPWEudHlwZSxmPWEsZz10aGlzLmZpeEhvb2tzW2VdO2d8fCh0aGlzLmZpeEhvb2tzW2VdPWc9Vy50ZXN0KGUpP3RoaXMubW91c2VIb29rczpWLnRlc3QoZSk/dGhpcy5rZXlIb29rczp7fSksZD1nLnByb3BzP3RoaXMucHJvcHMuY29uY2F0KGcucHJvcHMpOnRoaXMucHJvcHMsYT1uZXcgbi5FdmVudChmKSxiPWQubGVuZ3RoO3doaWxlKGItLSljPWRbYl0sYVtjXT1mW2NdO3JldHVybiBhLnRhcmdldHx8KGEudGFyZ2V0PWwpLDM9PT1hLnRhcmdldC5ub2RlVHlwZSYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGcuZmlsdGVyP2cuZmlsdGVyKGEsZik6YX0sc3BlY2lhbDp7bG9hZDp7bm9CdWJibGU6ITB9LGZvY3VzOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMhPT1fKCkmJnRoaXMuZm9jdXM/KHRoaXMuZm9jdXMoKSwhMSk6dm9pZCAwfSxkZWxlZ2F0ZVR5cGU6XCJmb2N1c2luXCJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz09PV8oKSYmdGhpcy5ibHVyPyh0aGlzLmJsdXIoKSwhMSk6dm9pZCAwfSxkZWxlZ2F0ZVR5cGU6XCJmb2N1c291dFwifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVyblwiY2hlY2tib3hcIj09PXRoaXMudHlwZSYmdGhpcy5jbGljayYmbi5ub2RlTmFtZSh0aGlzLFwiaW5wdXRcIik/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbi5ub2RlTmFtZShhLnRhcmdldCxcImFcIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihhKXt2b2lkIDAhPT1hLnJlc3VsdCYmYS5vcmlnaW5hbEV2ZW50JiYoYS5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlPWEucmVzdWx0KX19fSxzaW11bGF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1uLmV4dGVuZChuZXcgbi5FdmVudCxjLHt0eXBlOmEsaXNTaW11bGF0ZWQ6ITAsb3JpZ2luYWxFdmVudDp7fX0pO2Q/bi5ldmVudC50cmlnZ2VyKGUsbnVsbCxiKTpuLmV2ZW50LmRpc3BhdGNoLmNhbGwoYixlKSxlLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZjLnByZXZlbnREZWZhdWx0KCl9fSxuLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfSxuLkV2ZW50PWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBuLkV2ZW50PyhhJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT1hLmRlZmF1bHRQcmV2ZW50ZWQmJmEucmV0dXJuVmFsdWU9PT0hMT9aOiQpOnRoaXMudHlwZT1hLGImJm4uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG4ubm93KCksdm9pZCh0aGlzW24uZXhwYW5kb109ITApKTpuZXcgbi5FdmVudChhLGIpfSxuLkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOiQsaXNQcm9wYWdhdGlvblN0b3BwZWQ6JCxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDokLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPVosYSYmYS5wcmV2ZW50RGVmYXVsdCYmYS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1aLGEmJmEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1aLGEmJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uJiZhLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSxuLmVhY2goe21vdXNlZW50ZXI6XCJtb3VzZW92ZXJcIixtb3VzZWxlYXZlOlwibW91c2VvdXRcIixwb2ludGVyZW50ZXI6XCJwb2ludGVyb3ZlclwiLHBvaW50ZXJsZWF2ZTpcInBvaW50ZXJvdXRcIn0sZnVuY3Rpb24oYSxiKXtuLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybighZXx8ZSE9PWQmJiFuLmNvbnRhaW5zKGQsZSkpJiYoYS50eXBlPWYub3JpZ1R5cGUsYz1mLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iKSxjfX19KSxrLmZvY3VzaW5CdWJibGVzfHxuLmVhY2goe2ZvY3VzOlwiZm9jdXNpblwiLGJsdXI6XCJmb2N1c291dFwifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe24uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxuLmV2ZW50LmZpeChhKSwhMCl9O24uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1MLmFjY2VzcyhkLGIpO2V8fGQuYWRkRXZlbnRMaXN0ZW5lcihhLGMsITApLEwuYWNjZXNzKGQsYiwoZXx8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLGU9TC5hY2Nlc3MoZCxiKS0xO2U/TC5hY2Nlc3MoZCxiLGUpOihkLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxjLCEwKSxMLnJlbW92ZShkLGIpKX19fSksbi5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZztpZihcIm9iamVjdFwiPT10eXBlb2YgYSl7XCJzdHJpbmdcIiE9dHlwZW9mIGImJihjPWN8fGIsYj12b2lkIDApO2ZvcihnIGluIGEpdGhpcy5vbihnLGIsYyxhW2ddLGUpO3JldHVybiB0aGlzfWlmKG51bGw9PWMmJm51bGw9PWQ/KGQ9YixjPWI9dm9pZCAwKTpudWxsPT1kJiYoXCJzdHJpbmdcIj09dHlwZW9mIGI/KGQ9YyxjPXZvaWQgMCk6KGQ9YyxjPWIsYj12b2lkIDApKSxkPT09ITEpZD0kO2Vsc2UgaWYoIWQpcmV0dXJuIHRoaXM7cmV0dXJuIDE9PT1lJiYoZj1kLGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG4oKS5vZmYoYSksZi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGQuZ3VpZD1mLmd1aWR8fChmLmd1aWQ9bi5ndWlkKyspKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmV2ZW50LmFkZCh0aGlzLGEsZCxjLGIpfSl9LG9uZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYSYmYS5wcmV2ZW50RGVmYXVsdCYmYS5oYW5kbGVPYmopcmV0dXJuIGQ9YS5oYW5kbGVPYmosbihhLmRlbGVnYXRlVGFyZ2V0KS5vZmYoZC5uYW1lc3BhY2U/ZC5vcmlnVHlwZStcIi5cIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBhKXtmb3IoZSBpbiBhKXRoaXMub2ZmKGUsYixhW2VdKTtyZXR1cm4gdGhpc31yZXR1cm4oYj09PSExfHxcImZ1bmN0aW9uXCI9PXR5cGVvZiBiKSYmKGM9YixiPXZvaWQgMCksYz09PSExJiYoYz0kKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtuLmV2ZW50LnJlbW92ZSh0aGlzLGEsYyxiKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe24uZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzWzBdO3JldHVybiBjP24uZXZlbnQudHJpZ2dlcihhLGIsYywhMCk6dm9pZCAwfX0pO3ZhciBhYT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXFx3Ol0rKVtePl0qKVxcLz4vZ2ksYmE9LzwoW1xcdzpdKykvLGNhPS88fCYjP1xcdys7LyxkYT0vPCg/OnNjcmlwdHxzdHlsZXxsaW5rKS9pLGVhPS9jaGVja2VkXFxzKig/OltePV18PVxccyouY2hlY2tlZC4pL2ksZmE9L14kfFxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxnYT0vXnRydWVcXC8oLiopLyxoYT0vXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2csaWE9e29wdGlvbjpbMSxcIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz5cIixcIjwvc2VsZWN0PlwiXSx0aGVhZDpbMSxcIjx0YWJsZT5cIixcIjwvdGFibGU+XCJdLGNvbDpbMixcIjx0YWJsZT48Y29sZ3JvdXA+XCIsXCI8L2NvbGdyb3VwPjwvdGFibGU+XCJdLHRyOlsyLFwiPHRhYmxlPjx0Ym9keT5cIixcIjwvdGJvZHk+PC90YWJsZT5cIl0sdGQ6WzMsXCI8dGFibGU+PHRib2R5Pjx0cj5cIixcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiXSxfZGVmYXVsdDpbMCxcIlwiLFwiXCJdfTtpYS5vcHRncm91cD1pYS5vcHRpb24saWEudGJvZHk9aWEudGZvb3Q9aWEuY29sZ3JvdXA9aWEuY2FwdGlvbj1pYS50aGVhZCxpYS50aD1pYS50ZDtmdW5jdGlvbiBqYShhLGIpe3JldHVybiBuLm5vZGVOYW1lKGEsXCJ0YWJsZVwiKSYmbi5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsXCJ0clwiKT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGJvZHlcIilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0Ym9keVwiKSk6YX1mdW5jdGlvbiBrYShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09YS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKStcIi9cIithLnR5cGUsYX1mdW5jdGlvbiBsYShhKXt2YXIgYj1nYS5leGVjKGEudHlwZSk7cmV0dXJuIGI/YS50eXBlPWJbMV06YS5yZW1vdmVBdHRyaWJ1dGUoXCJ0eXBlXCIpLGF9ZnVuY3Rpb24gbWEoYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2Q+YztjKyspTC5zZXQoYVtjXSxcImdsb2JhbEV2YWxcIiwhYnx8TC5nZXQoYltjXSxcImdsb2JhbEV2YWxcIikpfWZ1bmN0aW9uIG5hKGEsYil7dmFyIGMsZCxlLGYsZyxoLGksajtpZigxPT09Yi5ub2RlVHlwZSl7aWYoTC5oYXNEYXRhKGEpJiYoZj1MLmFjY2VzcyhhKSxnPUwuc2V0KGIsZiksaj1mLmV2ZW50cykpe2RlbGV0ZSBnLmhhbmRsZSxnLmV2ZW50cz17fTtmb3IoZSBpbiBqKWZvcihjPTAsZD1qW2VdLmxlbmd0aDtkPmM7YysrKW4uZXZlbnQuYWRkKGIsZSxqW2VdW2NdKX1NLmhhc0RhdGEoYSkmJihoPU0uYWNjZXNzKGEpLGk9bi5leHRlbmQoe30saCksTS5zZXQoYixpKSl9fWZ1bmN0aW9uIG9hKGEsYil7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fFwiKlwiKTphLnF1ZXJ5U2VsZWN0b3JBbGw/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fFwiKlwiKTpbXTtyZXR1cm4gdm9pZCAwPT09Ynx8YiYmbi5ub2RlTmFtZShhLGIpP24ubWVyZ2UoW2FdLGMpOmN9ZnVuY3Rpb24gcGEoYSxiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XCJpbnB1dFwiPT09YyYmVC50ZXN0KGEudHlwZSk/Yi5jaGVja2VkPWEuY2hlY2tlZDooXCJpbnB1dFwiPT09Y3x8XCJ0ZXh0YXJlYVwiPT09YykmJihiLmRlZmF1bHRWYWx1ZT1hLmRlZmF1bHRWYWx1ZSl9bi5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuY2xvbmVOb2RlKCEwKSxpPW4uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpO2lmKCEoay5ub0Nsb25lQ2hlY2tlZHx8MSE9PWEubm9kZVR5cGUmJjExIT09YS5ub2RlVHlwZXx8bi5pc1hNTERvYyhhKSkpZm9yKGc9b2EoaCksZj1vYShhKSxkPTAsZT1mLmxlbmd0aDtlPmQ7ZCsrKXBhKGZbZF0sZ1tkXSk7aWYoYilpZihjKWZvcihmPWZ8fG9hKGEpLGc9Z3x8b2EoaCksZD0wLGU9Zi5sZW5ndGg7ZT5kO2QrKyluYShmW2RdLGdbZF0pO2Vsc2UgbmEoYSxoKTtyZXR1cm4gZz1vYShoLFwic2NyaXB0XCIpLGcubGVuZ3RoPjAmJm1hKGcsIWkmJm9hKGEsXCJzY3JpcHRcIikpLGh9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlLGYsZyxoLGksaixrPWIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGw9W10sbT0wLG89YS5sZW5ndGg7bz5tO20rKylpZihlPWFbbV0sZXx8MD09PWUpaWYoXCJvYmplY3RcIj09PW4udHlwZShlKSluLm1lcmdlKGwsZS5ub2RlVHlwZT9bZV06ZSk7ZWxzZSBpZihjYS50ZXN0KGUpKXtmPWZ8fGsuYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKSxnPShiYS5leGVjKGUpfHxbXCJcIixcIlwiXSlbMV0udG9Mb3dlckNhc2UoKSxoPWlhW2ddfHxpYS5fZGVmYXVsdCxmLmlubmVySFRNTD1oWzFdK2UucmVwbGFjZShhYSxcIjwkMT48LyQyPlwiKStoWzJdLGo9aFswXTt3aGlsZShqLS0pZj1mLmxhc3RDaGlsZDtuLm1lcmdlKGwsZi5jaGlsZE5vZGVzKSxmPWsuZmlyc3RDaGlsZCxmLnRleHRDb250ZW50PVwiXCJ9ZWxzZSBsLnB1c2goYi5jcmVhdGVUZXh0Tm9kZShlKSk7ay50ZXh0Q29udGVudD1cIlwiLG09MDt3aGlsZShlPWxbbSsrXSlpZigoIWR8fC0xPT09bi5pbkFycmF5KGUsZCkpJiYoaT1uLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKSxmPW9hKGsuYXBwZW5kQ2hpbGQoZSksXCJzY3JpcHRcIiksaSYmbWEoZiksYykpe2o9MDt3aGlsZShlPWZbaisrXSlmYS50ZXN0KGUudHlwZXx8XCJcIikmJmMucHVzaChlKX1yZXR1cm4ga30sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQsZSxmPW4uZXZlbnQuc3BlY2lhbCxnPTA7dm9pZCAwIT09KGM9YVtnXSk7ZysrKXtpZihuLmFjY2VwdERhdGEoYykmJihlPWNbTC5leHBhbmRvXSxlJiYoYj1MLmNhY2hlW2VdKSkpe2lmKGIuZXZlbnRzKWZvcihkIGluIGIuZXZlbnRzKWZbZF0/bi5ldmVudC5yZW1vdmUoYyxkKTpuLnJlbW92ZUV2ZW50KGMsZCxiLmhhbmRsZSk7TC5jYWNoZVtlXSYmZGVsZXRlIEwuY2FjaGVbZV19ZGVsZXRlIE0uY2FjaGVbY1tNLmV4cGFuZG9dXX19fSksbi5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEoodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9uLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpJiYodGhpcy50ZXh0Q29udGVudD1hKX0pfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIGI9amEodGhpcyxhKTtiLmFwcGVuZENoaWxkKGEpfX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj1qYSh0aGlzLGEpO2IuaW5zZXJ0QmVmb3JlKGEsYi5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMubmV4dFNpYmxpbmcpfSl9LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPWE/bi5maWx0ZXIoYSx0aGlzKTp0aGlzLGU9MDtudWxsIT0oYz1kW2VdKTtlKyspYnx8MSE9PWMubm9kZVR5cGV8fG4uY2xlYW5EYXRhKG9hKGMpKSxjLnBhcmVudE5vZGUmJihiJiZuLmNvbnRhaW5zKGMub3duZXJEb2N1bWVudCxjKSYmbWEob2EoYyxcInNjcmlwdFwiKSksYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKykxPT09YS5ub2RlVHlwZSYmKG4uY2xlYW5EYXRhKG9hKGEsITEpKSxhLnRleHRDb250ZW50PVwiXCIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGIpe3JldHVybiBhPW51bGw9PWE/ITE6YSxiPW51bGw9PWI/YTpiLHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG4uY2xvbmUodGhpcyxhLGIpfSl9LGh0bWw6ZnVuY3Rpb24oYSl7cmV0dXJuIEoodGhpcyxmdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdfHx7fSxjPTAsZD10aGlzLmxlbmd0aDtpZih2b2lkIDA9PT1hJiYxPT09Yi5ub2RlVHlwZSlyZXR1cm4gYi5pbm5lckhUTUw7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGEmJiFkYS50ZXN0KGEpJiYhaWFbKGJhLmV4ZWMoYSl8fFtcIlwiLFwiXCJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoYWEsXCI8JDE+PC8kMj5cIik7dHJ5e2Zvcig7ZD5jO2MrKyliPXRoaXNbY118fHt9LDE9PT1iLm5vZGVUeXBlJiYobi5jbGVhbkRhdGEob2EoYiwhMSkpLGIuaW5uZXJIVE1MPWEpO2I9MH1jYXRjaChlKXt9fWImJnRoaXMuZW1wdHkoKS5hcHBlbmQoYSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHNbMF07cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGIpe2E9dGhpcy5wYXJlbnROb2RlLG4uY2xlYW5EYXRhKG9hKHRoaXMpKSxhJiZhLnJlcGxhY2VDaGlsZChiLHRoaXMpfSksYSYmKGEubGVuZ3RofHxhLm5vZGVUeXBlKT90aGlzOnRoaXMucmVtb3ZlKCl9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGEsYil7YT1lLmFwcGx5KFtdLGEpO3ZhciBjLGQsZixnLGgsaSxqPTAsbD10aGlzLmxlbmd0aCxtPXRoaXMsbz1sLTEscD1hWzBdLHE9bi5pc0Z1bmN0aW9uKHApO2lmKHF8fGw+MSYmXCJzdHJpbmdcIj09dHlwZW9mIHAmJiFrLmNoZWNrQ2xvbmUmJmVhLnRlc3QocCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZD1tLmVxKGMpO3EmJihhWzBdPXAuY2FsbCh0aGlzLGMsZC5odG1sKCkpKSxkLmRvbU1hbmlwKGEsYil9KTtpZihsJiYoYz1uLmJ1aWxkRnJhZ21lbnQoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcyksZD1jLmZpcnN0Q2hpbGQsMT09PWMuY2hpbGROb2Rlcy5sZW5ndGgmJihjPWQpLGQpKXtmb3IoZj1uLm1hcChvYShjLFwic2NyaXB0XCIpLGthKSxnPWYubGVuZ3RoO2w+ajtqKyspaD1jLGohPT1vJiYoaD1uLmNsb25lKGgsITAsITApLGcmJm4ubWVyZ2UoZixvYShoLFwic2NyaXB0XCIpKSksYi5jYWxsKHRoaXNbal0saCxqKTtpZihnKWZvcihpPWZbZi5sZW5ndGgtMV0ub3duZXJEb2N1bWVudCxuLm1hcChmLGxhKSxqPTA7Zz5qO2orKyloPWZbal0sZmEudGVzdChoLnR5cGV8fFwiXCIpJiYhTC5hY2Nlc3MoaCxcImdsb2JhbEV2YWxcIikmJm4uY29udGFpbnMoaSxoKSYmKGguc3JjP24uX2V2YWxVcmwmJm4uX2V2YWxVcmwoaC5zcmMpOm4uZ2xvYmFsRXZhbChoLnRleHRDb250ZW50LnJlcGxhY2UoaGEsXCJcIikpKX1yZXR1cm4gdGhpc319KSxuLmVhY2goe2FwcGVuZFRvOlwiYXBwZW5kXCIscHJlcGVuZFRvOlwicHJlcGVuZFwiLGluc2VydEJlZm9yZTpcImJlZm9yZVwiLGluc2VydEFmdGVyOlwiYWZ0ZXJcIixyZXBsYWNlQWxsOlwicmVwbGFjZVdpdGhcIn0sZnVuY3Rpb24oYSxiKXtuLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPVtdLGU9bihhKSxnPWUubGVuZ3RoLTEsaD0wO2c+PWg7aCsrKWM9aD09PWc/dGhpczp0aGlzLmNsb25lKCEwKSxuKGVbaF0pW2JdKGMpLGYuYXBwbHkoZCxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZCl9fSk7dmFyIHFhLHJhPXt9O2Z1bmN0aW9uIHNhKGIsYyl7dmFyIGQsZT1uKGMuY3JlYXRlRWxlbWVudChiKSkuYXBwZW5kVG8oYy5ib2R5KSxmPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUmJihkPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoZVswXSkpP2QuZGlzcGxheTpuLmNzcyhlWzBdLFwiZGlzcGxheVwiKTtyZXR1cm4gZS5kZXRhY2goKSxmfWZ1bmN0aW9uIHRhKGEpe3ZhciBiPWwsYz1yYVthXTtyZXR1cm4gY3x8KGM9c2EoYSxiKSxcIm5vbmVcIiE9PWMmJmN8fChxYT0ocWF8fG4oXCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+XCIpKS5hcHBlbmRUbyhiLmRvY3VtZW50RWxlbWVudCksYj1xYVswXS5jb250ZW50RG9jdW1lbnQsYi53cml0ZSgpLGIuY2xvc2UoKSxjPXNhKGEsYikscWEuZGV0YWNoKCkpLHJhW2FdPWMpLGN9dmFyIHVhPS9ebWFyZ2luLyx2YT1uZXcgUmVnRXhwKFwiXihcIitRK1wiKSg/IXB4KVthLXolXSskXCIsXCJpXCIpLHdhPWZ1bmN0aW9uKGIpe3JldHVybiBiLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcub3BlbmVyP2Iub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCk6YS5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCl9O2Z1bmN0aW9uIHhhKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuc3R5bGU7cmV0dXJuIGM9Y3x8d2EoYSksYyYmKGc9Yy5nZXRQcm9wZXJ0eVZhbHVlKGIpfHxjW2JdKSxjJiYoXCJcIiE9PWd8fG4uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1uLnN0eWxlKGEsYikpLHZhLnRlc3QoZykmJnVhLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9ZikpLHZvaWQgMCE9PWc/ZytcIlwiOmd9ZnVuY3Rpb24geWEoYSxiKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGEoKT92b2lkIGRlbGV0ZSB0aGlzLmdldDoodGhpcy5nZXQ9YikuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19IWZ1bmN0aW9uKCl7dmFyIGIsYyxkPWwuZG9jdW1lbnRFbGVtZW50LGU9bC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLGY9bC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO2lmKGYuc3R5bGUpe2Yuc3R5bGUuYmFja2dyb3VuZENsaXA9XCJjb250ZW50LWJveFwiLGYuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD1cIlwiLGsuY2xlYXJDbG9uZVN0eWxlPVwiY29udGVudC1ib3hcIj09PWYuc3R5bGUuYmFja2dyb3VuZENsaXAsZS5zdHlsZS5jc3NUZXh0PVwiYm9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7bWFyZ2luLXRvcDoxcHg7cG9zaXRpb246YWJzb2x1dGVcIixlLmFwcGVuZENoaWxkKGYpO2Z1bmN0aW9uIGcoKXtmLnN0eWxlLmNzc1RleHQ9XCItd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjElO3RvcDoxJTtib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjRweDtwb3NpdGlvbjphYnNvbHV0ZVwiLGYuaW5uZXJIVE1MPVwiXCIsZC5hcHBlbmRDaGlsZChlKTt2YXIgZz1hLmdldENvbXB1dGVkU3R5bGUoZixudWxsKTtiPVwiMSVcIiE9PWcudG9wLGM9XCI0cHhcIj09PWcud2lkdGgsZC5yZW1vdmVDaGlsZChlKX1hLmdldENvbXB1dGVkU3R5bGUmJm4uZXh0ZW5kKGsse3BpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gZygpLGJ9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWMmJmcoKSxjfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7dmFyIGIsYz1mLmFwcGVuZENoaWxkKGwuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7cmV0dXJuIGMuc3R5bGUuY3NzVGV4dD1mLnN0eWxlLmNzc1RleHQ9XCItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjBcIixjLnN0eWxlLm1hcmdpblJpZ2h0PWMuc3R5bGUud2lkdGg9XCIwXCIsZi5zdHlsZS53aWR0aD1cIjFweFwiLGQuYXBwZW5kQ2hpbGQoZSksYj0hcGFyc2VGbG9hdChhLmdldENvbXB1dGVkU3R5bGUoYyxudWxsKS5tYXJnaW5SaWdodCksZC5yZW1vdmVDaGlsZChlKSxmLnJlbW92ZUNoaWxkKGMpLGJ9fSl9fSgpLG4uc3dhcD1mdW5jdGlvbihhLGIsYyxkKXt2YXIgZSxmLGc9e307Zm9yKGYgaW4gYilnW2ZdPWEuc3R5bGVbZl0sYS5zdHlsZVtmXT1iW2ZdO2U9Yy5hcHBseShhLGR8fFtdKTtmb3IoZiBpbiBiKWEuc3R5bGVbZl09Z1tmXTtyZXR1cm4gZX07dmFyIHphPS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxBYT1uZXcgUmVnRXhwKFwiXihcIitRK1wiKSguKikkXCIsXCJpXCIpLEJhPW5ldyBSZWdFeHAoXCJeKFsrLV0pPShcIitRK1wiKVwiLFwiaVwiKSxDYT17cG9zaXRpb246XCJhYnNvbHV0ZVwiLHZpc2liaWxpdHk6XCJoaWRkZW5cIixkaXNwbGF5OlwiYmxvY2tcIn0sRGE9e2xldHRlclNwYWNpbmc6XCIwXCIsZm9udFdlaWdodDpcIjQwMFwifSxFYT1bXCJXZWJraXRcIixcIk9cIixcIk1velwiLFwibXNcIl07ZnVuY3Rpb24gRmEoYSxiKXtpZihiIGluIGEpcmV0dXJuIGI7dmFyIGM9YlswXS50b1VwcGVyQ2FzZSgpK2Iuc2xpY2UoMSksZD1iLGU9RWEubGVuZ3RoO3doaWxlKGUtLSlpZihiPUVhW2VdK2MsYiBpbiBhKXJldHVybiBiO3JldHVybiBkfWZ1bmN0aW9uIEdhKGEsYixjKXt2YXIgZD1BYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHxcInB4XCIpOmJ9ZnVuY3Rpb24gSGEoYSxiLGMsZCxlKXtmb3IodmFyIGY9Yz09PShkP1wiYm9yZGVyXCI6XCJjb250ZW50XCIpPzQ6XCJ3aWR0aFwiPT09Yj8xOjAsZz0wOzQ+ZjtmKz0yKVwibWFyZ2luXCI9PT1jJiYoZys9bi5jc3MoYSxjK1JbZl0sITAsZSkpLGQ/KFwiY29udGVudFwiPT09YyYmKGctPW4uY3NzKGEsXCJwYWRkaW5nXCIrUltmXSwhMCxlKSksXCJtYXJnaW5cIiE9PWMmJihnLT1uLmNzcyhhLFwiYm9yZGVyXCIrUltmXStcIldpZHRoXCIsITAsZSkpKTooZys9bi5jc3MoYSxcInBhZGRpbmdcIitSW2ZdLCEwLGUpLFwicGFkZGluZ1wiIT09YyYmKGcrPW4uY3NzKGEsXCJib3JkZXJcIitSW2ZdK1wiV2lkdGhcIiwhMCxlKSkpO3JldHVybiBnfWZ1bmN0aW9uIElhKGEsYixjKXt2YXIgZD0hMCxlPVwid2lkdGhcIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPXdhKGEpLGc9XCJib3JkZXItYm94XCI9PT1uLmNzcyhhLFwiYm94U2l6aW5nXCIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT14YShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLHZhLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK0hhKGEsYixjfHwoZz9cImJvcmRlclwiOlwiY29udGVudFwiKSxkLGYpK1wicHhcIn1mdW5jdGlvbiBKYShhLGIpe2Zvcih2YXIgYyxkLGUsZj1bXSxnPTAsaD1hLmxlbmd0aDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoZltnXT1MLmdldChkLFwib2xkZGlzcGxheVwiKSxjPWQuc3R5bGUuZGlzcGxheSxiPyhmW2ddfHxcIm5vbmVcIiE9PWN8fChkLnN0eWxlLmRpc3BsYXk9XCJcIiksXCJcIj09PWQuc3R5bGUuZGlzcGxheSYmUyhkKSYmKGZbZ109TC5hY2Nlc3MoZCxcIm9sZGRpc3BsYXlcIix0YShkLm5vZGVOYW1lKSkpKTooZT1TKGQpLFwibm9uZVwiPT09YyYmZXx8TC5zZXQoZCxcIm9sZGRpc3BsYXlcIixlP2M6bi5jc3MoZCxcImRpc3BsYXlcIikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmXCJub25lXCIhPT1kLnN0eWxlLmRpc3BsYXkmJlwiXCIhPT1kLnN0eWxlLmRpc3BsYXl8fChkLnN0eWxlLmRpc3BsYXk9Yj9mW2ddfHxcIlwiOlwibm9uZVwiKSk7cmV0dXJuIGF9bi5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz14YShhLFwib3BhY2l0eVwiKTtyZXR1cm5cIlwiPT09Yz9cIjFcIjpjfX19fSxjc3NOdW1iZXI6e2NvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOntcImZsb2F0XCI6XCJjc3NGbG9hdFwifSxzdHlsZTpmdW5jdGlvbihhLGIsYyxkKXtpZihhJiYzIT09YS5ub2RlVHlwZSYmOCE9PWEubm9kZVR5cGUmJmEuc3R5bGUpe3ZhciBlLGYsZyxoPW4uY2FtZWxDYXNlKGIpLGk9YS5zdHlsZTtyZXR1cm4gYj1uLmNzc1Byb3BzW2hdfHwobi5jc3NQcm9wc1toXT1GYShpLGgpKSxnPW4uY3NzSG9va3NbYl18fG4uY3NzSG9va3NbaF0sdm9pZCAwPT09Yz9nJiZcImdldFwiaW4gZyYmdm9pZCAwIT09KGU9Zy5nZXQoYSwhMSxkKSk/ZTppW2JdOihmPXR5cGVvZiBjLFwic3RyaW5nXCI9PT1mJiYoZT1CYS5leGVjKGMpKSYmKGM9KGVbMV0rMSkqZVsyXStwYXJzZUZsb2F0KG4uY3NzKGEsYikpLGY9XCJudW1iZXJcIiksbnVsbCE9YyYmYz09PWMmJihcIm51bWJlclwiIT09Znx8bi5jc3NOdW1iZXJbaF18fChjKz1cInB4XCIpLGsuY2xlYXJDbG9uZVN0eWxlfHxcIlwiIT09Y3x8MCE9PWIuaW5kZXhPZihcImJhY2tncm91bmRcIil8fChpW2JdPVwiaW5oZXJpdFwiKSxnJiZcInNldFwiaW4gZyYmdm9pZCAwPT09KGM9Zy5zZXQoYSxjLGQpKXx8KGlbYl09YykpLHZvaWQgMCl9fSxjc3M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnLGg9bi5jYW1lbENhc2UoYik7cmV0dXJuIGI9bi5jc3NQcm9wc1toXXx8KG4uY3NzUHJvcHNbaF09RmEoYS5zdHlsZSxoKSksZz1uLmNzc0hvb2tzW2JdfHxuLmNzc0hvb2tzW2hdLGcmJlwiZ2V0XCJpbiBnJiYoZT1nLmdldChhLCEwLGMpKSx2b2lkIDA9PT1lJiYoZT14YShhLGIsZCkpLFwibm9ybWFsXCI9PT1lJiZiIGluIERhJiYoZT1EYVtiXSksXCJcIj09PWN8fGM/KGY9cGFyc2VGbG9hdChlKSxjPT09ITB8fG4uaXNOdW1lcmljKGYpP2Z8fDA6ZSk6ZX19KSxuLmVhY2goW1wiaGVpZ2h0XCIsXCJ3aWR0aFwiXSxmdW5jdGlvbihhLGIpe24uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/emEudGVzdChuLmNzcyhhLFwiZGlzcGxheVwiKSkmJjA9PT1hLm9mZnNldFdpZHRoP24uc3dhcChhLENhLGZ1bmN0aW9uKCl7cmV0dXJuIElhKGEsYixkKX0pOklhKGEsYixkKTp2b2lkIDB9LHNldDpmdW5jdGlvbihhLGMsZCl7dmFyIGU9ZCYmd2EoYSk7cmV0dXJuIEdhKGEsYyxkP0hhKGEsYixkLFwiYm9yZGVyLWJveFwiPT09bi5jc3MoYSxcImJveFNpemluZ1wiLCExLGUpLGUpOjApfX19KSxuLmNzc0hvb2tzLm1hcmdpblJpZ2h0PXlhKGsucmVsaWFibGVNYXJnaW5SaWdodCxmdW5jdGlvbihhLGIpe3JldHVybiBiP24uc3dhcChhLHtkaXNwbGF5OlwiaW5saW5lLWJsb2NrXCJ9LHhhLFthLFwibWFyZ2luUmlnaHRcIl0pOnZvaWQgMH0pLG4uZWFjaCh7bWFyZ2luOlwiXCIscGFkZGluZzpcIlwiLGJvcmRlcjpcIldpZHRoXCJ9LGZ1bmN0aW9uKGEsYil7bi5jc3NIb29rc1thK2JdPXtleHBhbmQ6ZnVuY3Rpb24oYyl7Zm9yKHZhciBkPTAsZT17fSxmPVwic3RyaW5nXCI9PXR5cGVvZiBjP2Muc3BsaXQoXCIgXCIpOltjXTs0PmQ7ZCsrKWVbYStSW2RdK2JdPWZbZF18fGZbZC0yXXx8ZlswXTtyZXR1cm4gZX19LHVhLnRlc3QoYSl8fChuLmNzc0hvb2tzW2ErYl0uc2V0PUdhKX0pLG4uZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSih0aGlzLGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9e30sZz0wO2lmKG4uaXNBcnJheShiKSl7Zm9yKGQ9d2EoYSksZT1iLmxlbmd0aDtlPmc7ZysrKWZbYltnXV09bi5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP24uc3R5bGUoYSxiLGMpOm4uY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIEphKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIEphKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7cmV0dXJuXCJib29sZWFuXCI9PXR5cGVvZiBhP2E/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uyh0aGlzKT9uKHRoaXMpLnNob3coKTpuKHRoaXMpLmhpZGUoKX0pfX0pO2Z1bmN0aW9uIEthKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBLYS5wcm90b3R5cGUuaW5pdChhLGIsYyxkLGUpfW4uVHdlZW49S2EsS2EucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpLYSxpbml0OmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt0aGlzLmVsZW09YSx0aGlzLnByb3A9Yyx0aGlzLmVhc2luZz1lfHxcInN3aW5nXCIsdGhpcy5vcHRpb25zPWIsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPWQsdGhpcy51bml0PWZ8fChuLmNzc051bWJlcltjXT9cIlwiOlwicHhcIil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPUthLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTpLYS5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGIsYz1LYS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWI9bi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9Yj1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOkthLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LEthLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1LYS5wcm90b3R5cGUsS2EucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBudWxsPT1hLmVsZW1bYS5wcm9wXXx8YS5lbGVtLnN0eWxlJiZudWxsIT1hLmVsZW0uc3R5bGVbYS5wcm9wXT8oYj1uLmNzcyhhLmVsZW0sYS5wcm9wLFwiXCIpLGImJlwiYXV0b1wiIT09Yj9iOjApOmEuZWxlbVthLnByb3BdfSxzZXQ6ZnVuY3Rpb24oYSl7bi5meC5zdGVwW2EucHJvcF0/bi5meC5zdGVwW2EucHJvcF0oYSk6YS5lbGVtLnN0eWxlJiYobnVsbCE9YS5lbGVtLnN0eWxlW24uY3NzUHJvcHNbYS5wcm9wXV18fG4uY3NzSG9va3NbYS5wcm9wXSk/bi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCk6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0sS2EucHJvcEhvb2tzLnNjcm9sbFRvcD1LYS5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxuLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4uNS1NYXRoLmNvcyhhKk1hdGguUEkpLzJ9fSxuLmZ4PUthLnByb3RvdHlwZS5pbml0LG4uZnguc3RlcD17fTt2YXIgTGEsTWEsTmE9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLE9hPW5ldyBSZWdFeHAoXCJeKD86KFsrLV0pPXwpKFwiK1ErXCIpKFthLXolXSopJFwiLFwiaVwiKSxQYT0vcXVldWVIb29rcyQvLFFhPVtWYV0sUmE9e1wiKlwiOltmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY3JlYXRlVHdlZW4oYSxiKSxkPWMuY3VyKCksZT1PYS5leGVjKGIpLGY9ZSYmZVszXXx8KG4uY3NzTnVtYmVyW2FdP1wiXCI6XCJweFwiKSxnPShuLmNzc051bWJlclthXXx8XCJweFwiIT09ZiYmK2QpJiZPYS5leGVjKG4uY3NzKGMuZWxlbSxhKSksaD0xLGk9MjA7aWYoZyYmZ1szXSE9PWYpe2Y9Znx8Z1szXSxlPWV8fFtdLGc9K2R8fDE7ZG8gaD1ofHxcIi41XCIsZy89aCxuLnN0eWxlKGMuZWxlbSxhLGcrZik7d2hpbGUoaCE9PShoPWMuY3VyKCkvZCkmJjEhPT1oJiYtLWkpfXJldHVybiBlJiYoZz1jLnN0YXJ0PStnfHwrZHx8MCxjLnVuaXQ9ZixjLmVuZD1lWzFdP2crKGVbMV0rMSkqZVsyXTorZVsyXSksY31dfTtmdW5jdGlvbiBTYSgpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7TGE9dm9pZCAwfSksTGE9bi5ub3coKX1mdW5jdGlvbiBUYShhLGIpe3ZhciBjLGQ9MCxlPXtoZWlnaHQ6YX07Zm9yKGI9Yj8xOjA7ND5kO2QrPTItYiljPVJbZF0sZVtcIm1hcmdpblwiK2NdPWVbXCJwYWRkaW5nXCIrY109YTtyZXR1cm4gYiYmKGUub3BhY2l0eT1lLndpZHRoPWEpLGV9ZnVuY3Rpb24gVWEoYSxiLGMpe2Zvcih2YXIgZCxlPShSYVtiXXx8W10pLmNvbmNhdChSYVtcIipcIl0pLGY9MCxnPWUubGVuZ3RoO2c+ZjtmKyspaWYoZD1lW2ZdLmNhbGwoYyxiLGEpKXJldHVybiBkfWZ1bmN0aW9uIFZhKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrLGw9dGhpcyxtPXt9LG89YS5zdHlsZSxwPWEubm9kZVR5cGUmJlMoYSkscT1MLmdldChhLFwiZnhzaG93XCIpO2MucXVldWV8fChoPW4uX3F1ZXVlSG9va3MoYSxcImZ4XCIpLG51bGw9PWgudW5xdWV1ZWQmJihoLnVucXVldWVkPTAsaT1oLmVtcHR5LmZpcmUsaC5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7aC51bnF1ZXVlZHx8aSgpfSksaC51bnF1ZXVlZCsrLGwuYWx3YXlzKGZ1bmN0aW9uKCl7bC5hbHdheXMoZnVuY3Rpb24oKXtoLnVucXVldWVkLS0sbi5xdWV1ZShhLFwiZnhcIikubGVuZ3RofHxoLmVtcHR5LmZpcmUoKX0pfSkpLDE9PT1hLm5vZGVUeXBlJiYoXCJoZWlnaHRcImluIGJ8fFwid2lkdGhcImluIGIpJiYoYy5vdmVyZmxvdz1bby5vdmVyZmxvdyxvLm92ZXJmbG93WCxvLm92ZXJmbG93WV0saj1uLmNzcyhhLFwiZGlzcGxheVwiKSxrPVwibm9uZVwiPT09aj9MLmdldChhLFwib2xkZGlzcGxheVwiKXx8dGEoYS5ub2RlTmFtZSk6aixcImlubGluZVwiPT09ayYmXCJub25lXCI9PT1uLmNzcyhhLFwiZmxvYXRcIikmJihvLmRpc3BsYXk9XCJpbmxpbmUtYmxvY2tcIikpLGMub3ZlcmZsb3cmJihvLm92ZXJmbG93PVwiaGlkZGVuXCIsbC5hbHdheXMoZnVuY3Rpb24oKXtvLm92ZXJmbG93PWMub3ZlcmZsb3dbMF0sby5vdmVyZmxvd1g9Yy5vdmVyZmxvd1sxXSxvLm92ZXJmbG93WT1jLm92ZXJmbG93WzJdfSkpO2ZvcihkIGluIGIpaWYoZT1iW2RdLE5hLmV4ZWMoZSkpe2lmKGRlbGV0ZSBiW2RdLGY9Znx8XCJ0b2dnbGVcIj09PWUsZT09PShwP1wiaGlkZVwiOlwic2hvd1wiKSl7aWYoXCJzaG93XCIhPT1lfHwhcXx8dm9pZCAwPT09cVtkXSljb250aW51ZTtwPSEwfW1bZF09cSYmcVtkXXx8bi5zdHlsZShhLGQpfWVsc2Ugaj12b2lkIDA7aWYobi5pc0VtcHR5T2JqZWN0KG0pKVwiaW5saW5lXCI9PT0oXCJub25lXCI9PT1qP3RhKGEubm9kZU5hbWUpOmopJiYoby5kaXNwbGF5PWopO2Vsc2V7cT9cImhpZGRlblwiaW4gcSYmKHA9cS5oaWRkZW4pOnE9TC5hY2Nlc3MoYSxcImZ4c2hvd1wiLHt9KSxmJiYocS5oaWRkZW49IXApLHA/bihhKS5zaG93KCk6bC5kb25lKGZ1bmN0aW9uKCl7bihhKS5oaWRlKCl9KSxsLmRvbmUoZnVuY3Rpb24oKXt2YXIgYjtMLnJlbW92ZShhLFwiZnhzaG93XCIpO2ZvcihiIGluIG0pbi5zdHlsZShhLGIsbVtiXSl9KTtmb3IoZCBpbiBtKWc9VWEocD9xW2RdOjAsZCxsKSxkIGluIHF8fChxW2RdPWcuc3RhcnQscCYmKGcuZW5kPWcuc3RhcnQsZy5zdGFydD1cIndpZHRoXCI9PT1kfHxcImhlaWdodFwiPT09ZD8xOjApKX19ZnVuY3Rpb24gV2EoYSxiKXt2YXIgYyxkLGUsZixnO2ZvcihjIGluIGEpaWYoZD1uLmNhbWVsQ2FzZShjKSxlPWJbZF0sZj1hW2NdLG4uaXNBcnJheShmKSYmKGU9ZlsxXSxmPWFbY109ZlswXSksYyE9PWQmJihhW2RdPWYsZGVsZXRlIGFbY10pLGc9bi5jc3NIb29rc1tkXSxnJiZcImV4cGFuZFwiaW4gZyl7Zj1nLmV4cGFuZChmKSxkZWxldGUgYVtkXTtmb3IoYyBpbiBmKWMgaW4gYXx8KGFbY109ZltjXSxiW2NdPWUpfWVsc2UgYltkXT1lfWZ1bmN0aW9uIFhhKGEsYixjKXt2YXIgZCxlLGY9MCxnPVFhLmxlbmd0aCxoPW4uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPUxhfHxTYSgpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczpuLmV4dGVuZCh7fSxiKSxvcHRzOm4uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxjKSxvcmlnaW5hbFByb3BlcnRpZXM6YixvcmlnaW5hbE9wdGlvbnM6YyxzdGFydFRpbWU6TGF8fFNhKCksZHVyYXRpb246Yy5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oYixjKXt2YXIgZD1uLlR3ZWVuKGEsai5vcHRzLGIsYyxqLm9wdHMuc3BlY2lhbEVhc2luZ1tiXXx8ai5vcHRzLmVhc2luZyk7cmV0dXJuIGoudHdlZW5zLnB1c2goZCksZH0sc3RvcDpmdW5jdGlvbihiKXt2YXIgYz0wLGQ9Yj9qLnR3ZWVucy5sZW5ndGg6MDtpZihlKXJldHVybiB0aGlzO2ZvcihlPSEwO2Q+YztjKyspai50d2VlbnNbY10ucnVuKDEpO3JldHVybiBiP2gucmVzb2x2ZVdpdGgoYSxbaixiXSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihXYShrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9UWFbZl0uY2FsbChqLGEsayxqLm9wdHMpKXJldHVybiBkO3JldHVybiBuLm1hcChrLFVhLGopLG4uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG4uZngudGltZXIobi5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bi5BbmltYXRpb249bi5leHRlbmQoWGEse3R3ZWVuZXI6ZnVuY3Rpb24oYSxiKXtuLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVtcIipcIl0pOmE9YS5zcGxpdChcIiBcIik7Zm9yKHZhciBjLGQ9MCxlPWEubGVuZ3RoO2U+ZDtkKyspYz1hW2RdLFJhW2NdPVJhW2NdfHxbXSxSYVtjXS51bnNoaWZ0KGIpfSxwcmVmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtiP1FhLnVuc2hpZnQoYSk6UWEucHVzaChhKX19KSxuLnNwZWVkPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiZcIm9iamVjdFwiPT10eXBlb2YgYT9uLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG4uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbi5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1uLmZ4Lm9mZj8wOlwibnVtYmVyXCI9PXR5cGVvZiBkLmR1cmF0aW9uP2QuZHVyYXRpb246ZC5kdXJhdGlvbiBpbiBuLmZ4LnNwZWVkcz9uLmZ4LnNwZWVkc1tkLmR1cmF0aW9uXTpuLmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ZC5xdWV1ZXx8ZC5xdWV1ZT09PSEwKSYmKGQucXVldWU9XCJmeFwiKSxkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oKXtuLmlzRnVuY3Rpb24oZC5vbGQpJiZkLm9sZC5jYWxsKHRoaXMpLGQucXVldWUmJm4uZGVxdWV1ZSh0aGlzLGQucXVldWUpfSxkfSxuLmZuLmV4dGVuZCh7ZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcihTKS5jc3MoXCJvcGFjaXR5XCIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW4uaXNFbXB0eU9iamVjdChhKSxmPW4uc3BlZWQoYixjLGQpLGc9ZnVuY3Rpb24oKXt2YXIgYj1YYSh0aGlzLG4uZXh0ZW5kKHt9LGEpLGYpOyhlfHxMLmdldCh0aGlzLFwiZmluaXNoXCIpKSYmYi5zdG9wKCEwKX07cmV0dXJuIGcuZmluaXNoPWcsZXx8Zi5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGYucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3RvcDtkZWxldGUgYS5zdG9wLGIoYyl9O3JldHVyblwic3RyaW5nXCIhPXR5cGVvZiBhJiYoYz1iLGI9YSxhPXZvaWQgMCksYiYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fFwiZnhcIixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ITAsZT1udWxsIT1hJiZhK1wicXVldWVIb29rc1wiLGY9bi50aW1lcnMsZz1MLmdldCh0aGlzKTtpZihlKWdbZV0mJmdbZV0uc3RvcCYmZChnW2VdKTtlbHNlIGZvcihlIGluIGcpZ1tlXSYmZ1tlXS5zdG9wJiZQYS50ZXN0KGUpJiZkKGdbZV0pO2ZvcihlPWYubGVuZ3RoO2UtLTspZltlXS5lbGVtIT09dGhpc3x8bnVsbCE9YSYmZltlXS5xdWV1ZSE9PWF8fChmW2VdLmFuaW0uc3RvcChjKSxiPSExLGYuc3BsaWNlKGUsMSkpOyhifHwhYykmJm4uZGVxdWV1ZSh0aGlzLGEpfSl9LGZpbmlzaDpmdW5jdGlvbihhKXtyZXR1cm4gYSE9PSExJiYoYT1hfHxcImZ4XCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiLGM9TC5nZXQodGhpcyksZD1jW2ErXCJxdWV1ZVwiXSxlPWNbYStcInF1ZXVlSG9va3NcIl0sZj1uLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbi5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxuLmVhY2goW1widG9nZ2xlXCIsXCJzaG93XCIsXCJoaWRlXCJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bi5mbltiXTtuLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8XCJib29sZWFuXCI9PXR5cGVvZiBhP2MuYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShUYShiLCEwKSxhLGQsZSl9fSksbi5lYWNoKHtzbGlkZURvd246VGEoXCJzaG93XCIpLHNsaWRlVXA6VGEoXCJoaWRlXCIpLHNsaWRlVG9nZ2xlOlRhKFwidG9nZ2xlXCIpLGZhZGVJbjp7b3BhY2l0eTpcInNob3dcIn0sZmFkZU91dDp7b3BhY2l0eTpcImhpZGVcIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eTpcInRvZ2dsZVwifX0sZnVuY3Rpb24oYSxiKXtuLmZuW2FdPWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsYSxjLGQpfX0pLG4udGltZXJzPVtdLG4uZngudGljaz1mdW5jdGlvbigpe3ZhciBhLGI9MCxjPW4udGltZXJzO2ZvcihMYT1uLm5vdygpO2I8Yy5sZW5ndGg7YisrKWE9Y1tiXSxhKCl8fGNbYl0hPT1hfHxjLnNwbGljZShiLS0sMSk7Yy5sZW5ndGh8fG4uZnguc3RvcCgpLExhPXZvaWQgMH0sbi5meC50aW1lcj1mdW5jdGlvbihhKXtuLnRpbWVycy5wdXNoKGEpLGEoKT9uLmZ4LnN0YXJ0KCk6bi50aW1lcnMucG9wKCl9LG4uZnguaW50ZXJ2YWw9MTMsbi5meC5zdGFydD1mdW5jdGlvbigpe01hfHwoTWE9c2V0SW50ZXJ2YWwobi5meC50aWNrLG4uZnguaW50ZXJ2YWwpKX0sbi5meC5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChNYSksTWE9bnVsbH0sbi5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sbi5mbi5kZWxheT1mdW5jdGlvbihhLGIpe3JldHVybiBhPW4uZng/bi5meC5zcGVlZHNbYV18fGE6YSxiPWJ8fFwiZnhcIix0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxmdW5jdGlvbigpe3ZhciBhPWwuY3JlYXRlRWxlbWVudChcImlucHV0XCIpLGI9bC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpLGM9Yi5hcHBlbmRDaGlsZChsLmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIikpO2EudHlwZT1cImNoZWNrYm94XCIsay5jaGVja09uPVwiXCIhPT1hLnZhbHVlLGsub3B0U2VsZWN0ZWQ9Yy5zZWxlY3RlZCxiLmRpc2FibGVkPSEwLGsub3B0RGlzYWJsZWQ9IWMuZGlzYWJsZWQsYT1sLmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKSxhLnZhbHVlPVwidFwiLGEudHlwZT1cInJhZGlvXCIsay5yYWRpb1ZhbHVlPVwidFwiPT09YS52YWx1ZX0oKTt2YXIgWWEsWmEsJGE9bi5leHByLmF0dHJIYW5kbGU7bi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSih0aGlzLG4uYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bi5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoYSYmMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gdHlwZW9mIGEuZ2V0QXR0cmlidXRlPT09VT9uLnByb3AoYSxiLGMpOigxPT09ZiYmbi5pc1hNTERvYyhhKXx8KGI9Yi50b0xvd2VyQ2FzZSgpLGQ9bi5hdHRySG9va3NbYl18fChuLmV4cHIubWF0Y2guYm9vbC50ZXN0KGIpP1phOllhKSksXG52b2lkIDA9PT1jP2QmJlwiZ2V0XCJpbiBkJiZudWxsIT09KGU9ZC5nZXQoYSxiKSk/ZTooZT1uLmZpbmQuYXR0cihhLGIpLG51bGw9PWU/dm9pZCAwOmUpOm51bGwhPT1jP2QmJlwic2V0XCJpbiBkJiZ2b2lkIDAhPT0oZT1kLnNldChhLGMsYikpP2U6KGEuc2V0QXR0cmlidXRlKGIsYytcIlwiKSxjKTp2b2lkIG4ucmVtb3ZlQXR0cihhLGIpKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT0wLGY9YiYmYi5tYXRjaChFKTtpZihmJiYxPT09YS5ub2RlVHlwZSl3aGlsZShjPWZbZSsrXSlkPW4ucHJvcEZpeFtjXXx8YyxuLmV4cHIubWF0Y2guYm9vbC50ZXN0KGMpJiYoYVtkXT0hMSksYS5yZW1vdmVBdHRyaWJ1dGUoYyl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIWsucmFkaW9WYWx1ZSYmXCJyYWRpb1wiPT09YiYmbi5ub2RlTmFtZShhLFwiaW5wdXRcIikpe3ZhciBjPWEudmFsdWU7cmV0dXJuIGEuc2V0QXR0cmlidXRlKFwidHlwZVwiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19fSksWmE9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI9PT0hMT9uLnJlbW92ZUF0dHIoYSxjKTphLnNldEF0dHJpYnV0ZShjLGMpLGN9fSxuLmVhY2gobi5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9JGFbYl18fG4uZmluZC5hdHRyOyRhW2JdPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmO3JldHVybiBkfHwoZj0kYVtiXSwkYVtiXT1lLGU9bnVsbCE9YyhhLGIsZCk/Yi50b0xvd2VyQ2FzZSgpOm51bGwsJGFbYl09ZiksZX19KTt2YXIgX2E9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaTtuLmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihhLGIpe3JldHVybiBKKHRoaXMsbi5wcm9wLGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1tuLnByb3BGaXhbYV18fGFdfSl9fSksbi5leHRlbmQoe3Byb3BGaXg6e1wiZm9yXCI6XCJodG1sRm9yXCIsXCJjbGFzc1wiOlwiY2xhc3NOYW1lXCJ9LHByb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPWEubm9kZVR5cGU7aWYoYSYmMyE9PWcmJjghPT1nJiYyIT09ZylyZXR1cm4gZj0xIT09Z3x8IW4uaXNYTUxEb2MoYSksZiYmKGI9bi5wcm9wRml4W2JdfHxiLGU9bi5wcm9wSG9va3NbYl0pLHZvaWQgMCE9PWM/ZSYmXCJzZXRcImluIGUmJnZvaWQgMCE9PShkPWUuc2V0KGEsYyxiKSk/ZDphW2JdPWM6ZSYmXCJnZXRcImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOmFbYl19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKXx8X2EudGVzdChhLm5vZGVOYW1lKXx8YS5ocmVmP2EudGFiSW5kZXg6LTF9fX19KSxrLm9wdFNlbGVjdGVkfHwobi5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJmIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH19KSxuLmVhY2goW1widGFiSW5kZXhcIixcInJlYWRPbmx5XCIsXCJtYXhMZW5ndGhcIixcImNlbGxTcGFjaW5nXCIsXCJjZWxsUGFkZGluZ1wiLFwicm93U3BhblwiLFwiY29sU3BhblwiLFwidXNlTWFwXCIsXCJmcmFtZUJvcmRlclwiLFwiY29udGVudEVkaXRhYmxlXCJdLGZ1bmN0aW9uKCl7bi5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pO3ZhciBhYj0vW1xcdFxcclxcblxcZl0vZztuLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9XCJzdHJpbmdcIj09dHlwZW9mIGEmJmEsaT0wLGo9dGhpcy5sZW5ndGg7aWYobi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihoKWZvcihiPShhfHxcIlwiKS5tYXRjaChFKXx8W107aj5pO2krKylpZihjPXRoaXNbaV0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPyhcIiBcIitjLmNsYXNzTmFtZStcIiBcIikucmVwbGFjZShhYixcIiBcIik6XCIgXCIpKXtmPTA7d2hpbGUoZT1iW2YrK10pZC5pbmRleE9mKFwiIFwiK2UrXCIgXCIpPDAmJihkKz1lK1wiIFwiKTtnPW4udHJpbShkKSxjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MD09PWFyZ3VtZW50cy5sZW5ndGh8fFwic3RyaW5nXCI9PXR5cGVvZiBhJiZhLGk9MCxqPXRoaXMubGVuZ3RoO2lmKG4uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykucmVtb3ZlQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoaClmb3IoYj0oYXx8XCJcIikubWF0Y2goRSl8fFtdO2o+aTtpKyspaWYoYz10aGlzW2ldLGQ9MT09PWMubm9kZVR5cGUmJihjLmNsYXNzTmFtZT8oXCIgXCIrYy5jbGFzc05hbWUrXCIgXCIpLnJlcGxhY2UoYWIsXCIgXCIpOlwiXCIpKXtmPTA7d2hpbGUoZT1iW2YrK10pd2hpbGUoZC5pbmRleE9mKFwiIFwiK2UrXCIgXCIpPj0wKWQ9ZC5yZXBsYWNlKFwiIFwiK2UrXCIgXCIsXCIgXCIpO2c9YT9uLnRyaW0oZCk6XCJcIixjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm5cImJvb2xlYW5cIj09dHlwZW9mIGImJlwic3RyaW5nXCI9PT1jP2I/dGhpcy5hZGRDbGFzcyhhKTp0aGlzLnJlbW92ZUNsYXNzKGEpOnRoaXMuZWFjaChuLmlzRnVuY3Rpb24oYSk/ZnVuY3Rpb24oYyl7bih0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHRoaXMuY2xhc3NOYW1lLGIpLGIpfTpmdW5jdGlvbigpe2lmKFwic3RyaW5nXCI9PT1jKXt2YXIgYixkPTAsZT1uKHRoaXMpLGY9YS5tYXRjaChFKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZShjPT09VXx8XCJib29sZWFuXCI9PT1jKSYmKHRoaXMuY2xhc3NOYW1lJiZMLnNldCh0aGlzLFwiX19jbGFzc05hbWVfX1wiLHRoaXMuY2xhc3NOYW1lKSx0aGlzLmNsYXNzTmFtZT10aGlzLmNsYXNzTmFtZXx8YT09PSExP1wiXCI6TC5nZXQodGhpcyxcIl9fY2xhc3NOYW1lX19cIil8fFwiXCIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1cIiBcIithK1wiIFwiLGM9MCxkPXRoaXMubGVuZ3RoO2Q+YztjKyspaWYoMT09PXRoaXNbY10ubm9kZVR5cGUmJihcIiBcIit0aGlzW2NdLmNsYXNzTmFtZStcIiBcIikucmVwbGFjZShhYixcIiBcIikuaW5kZXhPZihiKT49MClyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgYmI9L1xcci9nO24uZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZD1uLmlzRnVuY3Rpb24oYSksdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe3ZhciBlOzE9PT10aGlzLm5vZGVUeXBlJiYoZT1kP2EuY2FsbCh0aGlzLGMsbih0aGlzKS52YWwoKSk6YSxudWxsPT1lP2U9XCJcIjpcIm51bWJlclwiPT10eXBlb2YgZT9lKz1cIlwiOm4uaXNBcnJheShlKSYmKGU9bi5tYXAoZSxmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9cIlwiOmErXCJcIn0pKSxiPW4udmFsSG9va3NbdGhpcy50eXBlXXx8bi52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJlwic2V0XCJpbiBiJiZ2b2lkIDAhPT1iLnNldCh0aGlzLGUsXCJ2YWx1ZVwiKXx8KHRoaXMudmFsdWU9ZSkpfSk7aWYoZSlyZXR1cm4gYj1uLnZhbEhvb2tzW2UudHlwZV18fG4udmFsSG9va3NbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiZcImdldFwiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSxcInZhbHVlXCIpKT9jOihjPWUudmFsdWUsXCJzdHJpbmdcIj09dHlwZW9mIGM/Yy5yZXBsYWNlKGJiLFwiXCIpOm51bGw9PWM/XCJcIjpjKX19fSksbi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1uLmZpbmQuYXR0cihhLFwidmFsdWVcIik7cmV0dXJuIG51bGwhPWI/YjpuLnRyaW0obi50ZXh0KGEpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQ9YS5vcHRpb25zLGU9YS5zZWxlY3RlZEluZGV4LGY9XCJzZWxlY3Qtb25lXCI9PT1hLnR5cGV8fDA+ZSxnPWY/bnVsbDpbXSxoPWY/ZSsxOmQubGVuZ3RoLGk9MD5lP2g6Zj9lOjA7aD5pO2krKylpZihjPWRbaV0sISghYy5zZWxlY3RlZCYmaSE9PWV8fChrLm9wdERpc2FibGVkP2MuZGlzYWJsZWQ6bnVsbCE9PWMuZ2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIikpfHxjLnBhcmVudE5vZGUuZGlzYWJsZWQmJm4ubm9kZU5hbWUoYy5wYXJlbnROb2RlLFwib3B0Z3JvdXBcIikpKXtpZihiPW4oYykudmFsKCksZilyZXR1cm4gYjtnLnB1c2goYil9cmV0dXJuIGd9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT1hLm9wdGlvbnMsZj1uLm1ha2VBcnJheShiKSxnPWUubGVuZ3RoO3doaWxlKGctLSlkPWVbZ10sKGQuc2VsZWN0ZWQ9bi5pbkFycmF5KGQudmFsdWUsZik+PTApJiYoYz0hMCk7cmV0dXJuIGN8fChhLnNlbGVjdGVkSW5kZXg9LTEpLGZ9fX19KSxuLmVhY2goW1wicmFkaW9cIixcImNoZWNrYm94XCJdLGZ1bmN0aW9uKCl7bi52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG4uaXNBcnJheShiKT9hLmNoZWNrZWQ9bi5pbkFycmF5KG4oYSkudmFsKCksYik+PTA6dm9pZCAwfX0say5jaGVja09ufHwobi52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpP1wib25cIjphLnZhbHVlfSl9KSxuLmVhY2goXCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIGNvbnRleHRtZW51XCIuc3BsaXQoXCIgXCIpLGZ1bmN0aW9uKGEsYil7bi5mbltiXT1mdW5jdGlvbihhLGMpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihiLG51bGwsYSxjKTp0aGlzLnRyaWdnZXIoYil9fSksbi5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfSxiaW5kOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vbihhLG51bGwsYixjKX0sdW5iaW5kOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub2ZmKGEsbnVsbCxiKX0sZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24oYixhLGMsZCl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihhLFwiKipcIik6dGhpcy5vZmYoYixhfHxcIioqXCIsYyl9fSk7dmFyIGNiPW4ubm93KCksZGI9L1xcPy87bi5wYXJzZUpTT049ZnVuY3Rpb24oYSl7cmV0dXJuIEpTT04ucGFyc2UoYStcIlwiKX0sbi5wYXJzZVhNTD1mdW5jdGlvbihhKXt2YXIgYixjO2lmKCFhfHxcInN0cmluZ1wiIT10eXBlb2YgYSlyZXR1cm4gbnVsbDt0cnl7Yz1uZXcgRE9NUGFyc2VyLGI9Yy5wYXJzZUZyb21TdHJpbmcoYSxcInRleHQveG1sXCIpfWNhdGNoKGQpe2I9dm9pZCAwfXJldHVybighYnx8Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShcInBhcnNlcmVycm9yXCIpLmxlbmd0aCkmJm4uZXJyb3IoXCJJbnZhbGlkIFhNTDogXCIrYSksYn07dmFyIGViPS8jLiokLyxmYj0vKFs/Jl0pXz1bXiZdKi8sZ2I9L14oLio/KTpbIFxcdF0qKFteXFxyXFxuXSopJC9nbSxoYj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxpYj0vXig/OkdFVHxIRUFEKSQvLGpiPS9eXFwvXFwvLyxrYj0vXihbXFx3ListXSs6KSg/OlxcL1xcLyg/OlteXFwvPyNdKkB8KShbXlxcLz8jOl0qKSg/OjooXFxkKyl8KXwpLyxsYj17fSxtYj17fSxuYj1cIiovXCIuY29uY2F0KFwiKlwiKSxvYj1hLmxvY2F0aW9uLmhyZWYscGI9a2IuZXhlYyhvYi50b0xvd2VyQ2FzZSgpKXx8W107ZnVuY3Rpb24gcWIoYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7XCJzdHJpbmdcIiE9dHlwZW9mIGImJihjPWIsYj1cIipcIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbXTtpZihuLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pXCIrXCI9PT1kWzBdPyhkPWQuc2xpY2UoMSl8fFwiKlwiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gcmIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09bWI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxuLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm5cInN0cmluZ1wiIT10eXBlb2Yganx8Znx8ZVtqXT9mPyEoaT1qKTp2b2lkIDA6KGIuZGF0YVR5cGVzLnVuc2hpZnQoaiksZyhqKSwhMSl9KSxpfXJldHVybiBnKGIuZGF0YVR5cGVzWzBdKXx8IWVbXCIqXCJdJiZnKFwiKlwiKX1mdW5jdGlvbiBzYihhLGIpe3ZhciBjLGQsZT1uLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGMgaW4gYil2b2lkIDAhPT1iW2NdJiYoKGVbY10/YTpkfHwoZD17fSkpW2NdPWJbY10pO3JldHVybiBkJiZuLmV4dGVuZCghMCxhLGQpLGF9ZnVuY3Rpb24gdGIoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKFwiKlwiPT09aVswXSlpLnNoaWZ0KCksdm9pZCAwPT09ZCYmKGQ9YS5taW1lVHlwZXx8Yi5nZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtVHlwZVwiKSk7aWYoZClmb3IoZSBpbiBoKWlmKGhbZV0mJmhbZV0udGVzdChkKSl7aS51bnNoaWZ0KGUpO2JyZWFrfWlmKGlbMF1pbiBjKWY9aVswXTtlbHNle2ZvcihlIGluIGMpe2lmKCFpWzBdfHxhLmNvbnZlcnRlcnNbZStcIiBcIitpWzBdXSl7Zj1lO2JyZWFrfWd8fChnPWUpfWY9Znx8Z31yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gdWIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZihcIipcIj09PWYpZj1pO2Vsc2UgaWYoXCIqXCIhPT1pJiZpIT09Zil7aWYoZz1qW2krXCIgXCIrZl18fGpbXCIqIFwiK2ZdLCFnKWZvcihlIGluIGopaWYoaD1lLnNwbGl0KFwiIFwiKSxoWzFdPT09ZiYmKGc9altpK1wiIFwiK2hbMF1dfHxqW1wiKiBcIitoWzBdXSkpe2c9PT0hMD9nPWpbZV06altlXSE9PSEwJiYoZj1oWzBdLGsudW5zaGlmdChoWzFdKSk7YnJlYWt9aWYoZyE9PSEwKWlmKGcmJmFbXCJ0aHJvd3NcIl0pYj1nKGIpO2Vsc2UgdHJ5e2I9ZyhiKX1jYXRjaChsKXtyZXR1cm57c3RhdGU6XCJwYXJzZXJlcnJvclwiLGVycm9yOmc/bDpcIk5vIGNvbnZlcnNpb24gZnJvbSBcIitpK1wiIHRvIFwiK2Z9fX1yZXR1cm57c3RhdGU6XCJzdWNjZXNzXCIsZGF0YTpifX1uLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6b2IsdHlwZTpcIkdFVFwiLGlzTG9jYWw6aGIudGVzdChwYlsxXSksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOlwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsYWNjZXB0czp7XCIqXCI6bmIsdGV4dDpcInRleHQvcGxhaW5cIixodG1sOlwidGV4dC9odG1sXCIseG1sOlwiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbFwiLGpzb246XCJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHRcIn0sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDpcInJlc3BvbnNlWE1MXCIsdGV4dDpcInJlc3BvbnNlVGV4dFwiLGpzb246XCJyZXNwb25zZUpTT05cIn0sY29udmVydGVyczp7XCIqIHRleHRcIjpTdHJpbmcsXCJ0ZXh0IGh0bWxcIjohMCxcInRleHQganNvblwiOm4ucGFyc2VKU09OLFwidGV4dCB4bWxcIjpuLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9zYihzYihhLG4uYWpheFNldHRpbmdzKSxiKTpzYihuLmFqYXhTZXR0aW5ncyxhKX0sYWpheFByZWZpbHRlcjpxYihsYiksYWpheFRyYW5zcG9ydDpxYihtYiksYWpheDpmdW5jdGlvbihhLGIpe1wib2JqZWN0XCI9PXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxiPWJ8fHt9O3ZhciBjLGQsZSxmLGcsaCxpLGosaz1uLmFqYXhTZXR1cCh7fSxiKSxsPWsuY29udGV4dHx8ayxtPWsuY29udGV4dCYmKGwubm9kZVR5cGV8fGwuanF1ZXJ5KT9uKGwpOm4uZXZlbnQsbz1uLkRlZmVycmVkKCkscD1uLkNhbGxiYWNrcyhcIm9uY2UgbWVtb3J5XCIpLHE9ay5zdGF0dXNDb2RlfHx7fSxyPXt9LHM9e30sdD0wLHU9XCJjYW5jZWxlZFwiLHY9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYjtpZigyPT09dCl7aWYoIWYpe2Y9e307d2hpbGUoYj1nYi5leGVjKGUpKWZbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9ZlthLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT10P2U6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTtyZXR1cm4gdHx8KGE9c1tjXT1zW2NdfHxhLHJbYV09YiksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gdHx8KGsubWltZVR5cGU9YSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihhKXt2YXIgYjtpZihhKWlmKDI+dClmb3IoYiBpbiBhKXFbYl09W3FbYl0sYVtiXV07ZWxzZSB2LmFsd2F5cyhhW3Yuc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHU7cmV0dXJuIGMmJmMuYWJvcnQoYikseCgwLGIpLHRoaXN9fTtpZihvLnByb21pc2UodikuY29tcGxldGU9cC5hZGQsdi5zdWNjZXNzPXYuZG9uZSx2LmVycm9yPXYuZmFpbCxrLnVybD0oKGF8fGsudXJsfHxvYikrXCJcIikucmVwbGFjZShlYixcIlwiKS5yZXBsYWNlKGpiLHBiWzFdK1wiLy9cIiksay50eXBlPWIubWV0aG9kfHxiLnR5cGV8fGsubWV0aG9kfHxrLnR5cGUsay5kYXRhVHlwZXM9bi50cmltKGsuZGF0YVR5cGV8fFwiKlwiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbXCJcIl0sbnVsbD09ay5jcm9zc0RvbWFpbiYmKGg9a2IuZXhlYyhrLnVybC50b0xvd2VyQ2FzZSgpKSxrLmNyb3NzRG9tYWluPSEoIWh8fGhbMV09PT1wYlsxXSYmaFsyXT09PXBiWzJdJiYoaFszXXx8KFwiaHR0cDpcIj09PWhbMV0/XCI4MFwiOlwiNDQzXCIpKT09PShwYlszXXx8KFwiaHR0cDpcIj09PXBiWzFdP1wiODBcIjpcIjQ0M1wiKSkpKSxrLmRhdGEmJmsucHJvY2Vzc0RhdGEmJlwic3RyaW5nXCIhPXR5cGVvZiBrLmRhdGEmJihrLmRhdGE9bi5wYXJhbShrLmRhdGEsay50cmFkaXRpb25hbCkpLHJiKGxiLGssYix2KSwyPT09dClyZXR1cm4gdjtpPW4uZXZlbnQmJmsuZ2xvYmFsLGkmJjA9PT1uLmFjdGl2ZSsrJiZuLmV2ZW50LnRyaWdnZXIoXCJhamF4U3RhcnRcIiksay50eXBlPWsudHlwZS50b1VwcGVyQ2FzZSgpLGsuaGFzQ29udGVudD0haWIudGVzdChrLnR5cGUpLGQ9ay51cmwsay5oYXNDb250ZW50fHwoay5kYXRhJiYoZD1rLnVybCs9KGRiLnRlc3QoZCk/XCImXCI6XCI/XCIpK2suZGF0YSxkZWxldGUgay5kYXRhKSxrLmNhY2hlPT09ITEmJihrLnVybD1mYi50ZXN0KGQpP2QucmVwbGFjZShmYixcIiQxXz1cIitjYisrKTpkKyhkYi50ZXN0KGQpP1wiJlwiOlwiP1wiKStcIl89XCIrY2IrKykpLGsuaWZNb2RpZmllZCYmKG4ubGFzdE1vZGlmaWVkW2RdJiZ2LnNldFJlcXVlc3RIZWFkZXIoXCJJZi1Nb2RpZmllZC1TaW5jZVwiLG4ubGFzdE1vZGlmaWVkW2RdKSxuLmV0YWdbZF0mJnYuc2V0UmVxdWVzdEhlYWRlcihcIklmLU5vbmUtTWF0Y2hcIixuLmV0YWdbZF0pKSwoay5kYXRhJiZrLmhhc0NvbnRlbnQmJmsuY29udGVudFR5cGUhPT0hMXx8Yi5jb250ZW50VHlwZSkmJnYuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLGsuY29udGVudFR5cGUpLHYuc2V0UmVxdWVzdEhlYWRlcihcIkFjY2VwdFwiLGsuZGF0YVR5cGVzWzBdJiZrLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dP2suYWNjZXB0c1trLmRhdGFUeXBlc1swXV0rKFwiKlwiIT09ay5kYXRhVHlwZXNbMF0/XCIsIFwiK25iK1wiOyBxPTAuMDFcIjpcIlwiKTprLmFjY2VwdHNbXCIqXCJdKTtmb3IoaiBpbiBrLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKGosay5oZWFkZXJzW2pdKTtpZihrLmJlZm9yZVNlbmQmJihrLmJlZm9yZVNlbmQuY2FsbChsLHYsayk9PT0hMXx8Mj09PXQpKXJldHVybiB2LmFib3J0KCk7dT1cImFib3J0XCI7Zm9yKGogaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pdltqXShrW2pdKTtpZihjPXJiKG1iLGssYix2KSl7di5yZWFkeVN0YXRlPTEsaSYmbS50cmlnZ2VyKFwiYWpheFNlbmRcIixbdixrXSksay5hc3luYyYmay50aW1lb3V0PjAmJihnPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KFwidGltZW91dFwiKX0say50aW1lb3V0KSk7dHJ5e3Q9MSxjLnNlbmQocix4KX1jYXRjaCh3KXtpZighKDI+dCkpdGhyb3cgdzt4KC0xLHcpfX1lbHNlIHgoLTEsXCJObyBUcmFuc3BvcnRcIik7ZnVuY3Rpb24geChhLGIsZixoKXt2YXIgaixyLHMsdSx3LHg9YjsyIT09dCYmKHQ9MixnJiZjbGVhclRpbWVvdXQoZyksYz12b2lkIDAsZT1ofHxcIlwiLHYucmVhZHlTdGF0ZT1hPjA/NDowLGo9YT49MjAwJiYzMDA+YXx8MzA0PT09YSxmJiYodT10YihrLHYsZikpLHU9dWIoayx1LHYsaiksaj8oay5pZk1vZGlmaWVkJiYodz12LmdldFJlc3BvbnNlSGVhZGVyKFwiTGFzdC1Nb2RpZmllZFwiKSx3JiYobi5sYXN0TW9kaWZpZWRbZF09dyksdz12LmdldFJlc3BvbnNlSGVhZGVyKFwiZXRhZ1wiKSx3JiYobi5ldGFnW2RdPXcpKSwyMDQ9PT1hfHxcIkhFQURcIj09PWsudHlwZT94PVwibm9jb250ZW50XCI6MzA0PT09YT94PVwibm90bW9kaWZpZWRcIjooeD11LnN0YXRlLHI9dS5kYXRhLHM9dS5lcnJvcixqPSFzKSk6KHM9eCwoYXx8IXgpJiYoeD1cImVycm9yXCIsMD5hJiYoYT0wKSkpLHYuc3RhdHVzPWEsdi5zdGF0dXNUZXh0PShifHx4KStcIlwiLGo/by5yZXNvbHZlV2l0aChsLFtyLHgsdl0pOm8ucmVqZWN0V2l0aChsLFt2LHgsc10pLHYuc3RhdHVzQ29kZShxKSxxPXZvaWQgMCxpJiZtLnRyaWdnZXIoaj9cImFqYXhTdWNjZXNzXCI6XCJhamF4RXJyb3JcIixbdixrLGo/cjpzXSkscC5maXJlV2l0aChsLFt2LHhdKSxpJiYobS50cmlnZ2VyKFwiYWpheENvbXBsZXRlXCIsW3Ysa10pLC0tbi5hY3RpdmV8fG4uZXZlbnQudHJpZ2dlcihcImFqYXhTdG9wXCIpKSl9cmV0dXJuIHZ9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuLmdldChhLGIsYyxcImpzb25cIil9LGdldFNjcmlwdDpmdW5jdGlvbihhLGIpe3JldHVybiBuLmdldChhLHZvaWQgMCxiLFwic2NyaXB0XCIpfX0pLG4uZWFjaChbXCJnZXRcIixcInBvc3RcIl0sZnVuY3Rpb24oYSxiKXtuW2JdPWZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybiBuLmlzRnVuY3Rpb24oYykmJihlPWV8fGQsZD1jLGM9dm9pZCAwKSxuLmFqYXgoe3VybDphLHR5cGU6YixkYXRhVHlwZTplLGRhdGE6YyxzdWNjZXNzOmR9KX19KSxuLl9ldmFsVXJsPWZ1bmN0aW9uKGEpe3JldHVybiBuLmFqYXgoe3VybDphLHR5cGU6XCJHRVRcIixkYXRhVHlwZTpcInNjcmlwdFwiLGFzeW5jOiExLGdsb2JhbDohMSxcInRocm93c1wiOiEwfSl9LG4uZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBuLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24odGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxiKSl9KToodGhpc1swXSYmKGI9bihhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApLHRoaXNbMF0ucGFyZW50Tm9kZSYmYi5pbnNlcnRCZWZvcmUodGhpc1swXSksYi5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzO3doaWxlKGEuZmlyc3RFbGVtZW50Q2hpbGQpYT1hLmZpcnN0RWxlbWVudENoaWxkO3JldHVybiBhfSkuYXBwZW5kKHRoaXMpKSx0aGlzKX0sd3JhcElubmVyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2gobi5pc0Z1bmN0aW9uKGEpP2Z1bmN0aW9uKGIpe24odGhpcykud3JhcElubmVyKGEuY2FsbCh0aGlzLGIpKX06ZnVuY3Rpb24oKXt2YXIgYj1uKHRoaXMpLGM9Yi5jb250ZW50cygpO2MubGVuZ3RoP2Mud3JhcEFsbChhKTpiLmFwcGVuZChhKX0pfSx3cmFwOmZ1bmN0aW9uKGEpe3ZhciBiPW4uaXNGdW5jdGlvbihhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe24odGhpcykud3JhcEFsbChiP2EuY2FsbCh0aGlzLGMpOmEpfSl9LHVud3JhcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXtuLm5vZGVOYW1lKHRoaXMsXCJib2R5XCIpfHxuKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KSxuLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7cmV0dXJuIGEub2Zmc2V0V2lkdGg8PTAmJmEub2Zmc2V0SGVpZ2h0PD0wfSxuLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFuLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9O3ZhciB2Yj0vJTIwL2csd2I9L1xcW1xcXSQvLHhiPS9cXHI/XFxuL2cseWI9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLHpiPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBBYihhLGIsYyxkKXt2YXIgZTtpZihuLmlzQXJyYXkoYikpbi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHx3Yi50ZXN0KGEpP2QoYSxlKTpBYihhK1wiW1wiKyhcIm9iamVjdFwiPT10eXBlb2YgZT9iOlwiXCIpK1wiXVwiLGUsYyxkKX0pO2Vsc2UgaWYoY3x8XCJvYmplY3RcIiE9PW4udHlwZShiKSlkKGEsYik7ZWxzZSBmb3IoZSBpbiBiKUFiKGErXCJbXCIrZStcIl1cIixiW2VdLGMsZCl9bi5wYXJhbT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9bi5pc0Z1bmN0aW9uKGIpP2IoKTpudWxsPT1iP1wiXCI6YixkW2QubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoYSkrXCI9XCIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtpZih2b2lkIDA9PT1iJiYoYj1uLmFqYXhTZXR0aW5ncyYmbi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLG4uaXNBcnJheShhKXx8YS5qcXVlcnkmJiFuLmlzUGxhaW5PYmplY3QoYSkpbi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlBYihjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKFwiJlwiKS5yZXBsYWNlKHZiLFwiK1wiKX0sbi5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBuLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9bi5wcm9wKHRoaXMsXCJlbGVtZW50c1wiKTtyZXR1cm4gYT9uLm1ha2VBcnJheShhKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFuKHRoaXMpLmlzKFwiOmRpc2FibGVkXCIpJiZ6Yi50ZXN0KHRoaXMubm9kZU5hbWUpJiYheWIudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IVQudGVzdChhKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1uKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1jP251bGw6bi5pc0FycmF5KGMpP24ubWFwKGMsZnVuY3Rpb24oYSl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZSh4YixcIlxcclxcblwiKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKHhiLFwiXFxyXFxuXCIpfX0pLmdldCgpfX0pLG4uYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0fWNhdGNoKGEpe319O3ZhciBCYj0wLENiPXt9LERiPXswOjIwMCwxMjIzOjIwNH0sRWI9bi5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudChcIm9udW5sb2FkXCIsZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gQ2IpQ2JbYV0oKX0pLGsuY29ycz0hIUViJiZcIndpdGhDcmVkZW50aWFsc1wiaW4gRWIsay5hamF4PUViPSEhRWIsbi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBrLmNvcnN8fEViJiYhYS5jcm9zc0RvbWFpbj97c2VuZDpmdW5jdGlvbihjLGQpe3ZhciBlLGY9YS54aHIoKSxnPSsrQmI7aWYoZi5vcGVuKGEudHlwZSxhLnVybCxhLmFzeW5jLGEudXNlcm5hbWUsYS5wYXNzd29yZCksYS54aHJGaWVsZHMpZm9yKGUgaW4gYS54aHJGaWVsZHMpZltlXT1hLnhockZpZWxkc1tlXTthLm1pbWVUeXBlJiZmLm92ZXJyaWRlTWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZShhLm1pbWVUeXBlKSxhLmNyb3NzRG9tYWlufHxjW1wiWC1SZXF1ZXN0ZWQtV2l0aFwiXXx8KGNbXCJYLVJlcXVlc3RlZC1XaXRoXCJdPVwiWE1MSHR0cFJlcXVlc3RcIik7Zm9yKGUgaW4gYylmLnNldFJlcXVlc3RIZWFkZXIoZSxjW2VdKTtiPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe2ImJihkZWxldGUgQ2JbZ10sYj1mLm9ubG9hZD1mLm9uZXJyb3I9bnVsbCxcImFib3J0XCI9PT1hP2YuYWJvcnQoKTpcImVycm9yXCI9PT1hP2QoZi5zdGF0dXMsZi5zdGF0dXNUZXh0KTpkKERiW2Yuc3RhdHVzXXx8Zi5zdGF0dXMsZi5zdGF0dXNUZXh0LFwic3RyaW5nXCI9PXR5cGVvZiBmLnJlc3BvbnNlVGV4dD97dGV4dDpmLnJlc3BvbnNlVGV4dH06dm9pZCAwLGYuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LGYub25sb2FkPWIoKSxmLm9uZXJyb3I9YihcImVycm9yXCIpLGI9Q2JbZ109YihcImFib3J0XCIpO3RyeXtmLnNlbmQoYS5oYXNDb250ZW50JiZhLmRhdGF8fG51bGwpfWNhdGNoKGgpe2lmKGIpdGhyb3cgaH19LGFib3J0OmZ1bmN0aW9uKCl7YiYmYigpfX06dm9pZCAwfSksbi5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDpcInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0XCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOntcInRleHQgc2NyaXB0XCI6ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZ2xvYmFsRXZhbChhKSxhfX19KSxuLmFqYXhQcmVmaWx0ZXIoXCJzY3JpcHRcIixmdW5jdGlvbihhKXt2b2lkIDA9PT1hLmNhY2hlJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT1cIkdFVFwiKX0pLG4uYWpheFRyYW5zcG9ydChcInNjcmlwdFwiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBiLGM7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZCxlKXtiPW4oXCI8c2NyaXB0PlwiKS5wcm9wKHthc3luYzohMCxjaGFyc2V0OmEuc2NyaXB0Q2hhcnNldCxzcmM6YS51cmx9KS5vbihcImxvYWQgZXJyb3JcIixjPWZ1bmN0aW9uKGEpe2IucmVtb3ZlKCksYz1udWxsLGEmJmUoXCJlcnJvclwiPT09YS50eXBlPzQwNDoyMDAsYS50eXBlKX0pLGwuaGVhZC5hcHBlbmRDaGlsZChiWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtjJiZjKCl9fX19KTt2YXIgRmI9W10sR2I9Lyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztuLmFqYXhTZXR1cCh7anNvbnA6XCJjYWxsYmFja1wiLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgYT1GYi5wb3AoKXx8bi5leHBhbmRvK1wiX1wiK2NiKys7cmV0dXJuIHRoaXNbYV09ITAsYX19KSxuLmFqYXhQcmVmaWx0ZXIoXCJqc29uIGpzb25wXCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKEdiLnRlc3QoYi51cmwpP1widXJsXCI6XCJzdHJpbmdcIj09dHlwZW9mIGIuZGF0YSYmIShiLmNvbnRlbnRUeXBlfHxcIlwiKS5pbmRleE9mKFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIpJiZHYi50ZXN0KGIuZGF0YSkmJlwiZGF0YVwiKTtyZXR1cm4gaHx8XCJqc29ucFwiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW4uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKEdiLFwiJDFcIitlKTpiLmpzb25wIT09ITEmJihiLnVybCs9KGRiLnRlc3QoYi51cmwpP1wiJlwiOlwiP1wiKStiLmpzb25wK1wiPVwiK2UpLGIuY29udmVydGVyc1tcInNjcmlwdCBqc29uXCJdPWZ1bmN0aW9uKCl7cmV0dXJuIGd8fG4uZXJyb3IoZStcIiB3YXMgbm90IGNhbGxlZFwiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT1cImpzb25cIixmPWFbZV0sYVtlXT1mdW5jdGlvbigpe2c9YXJndW1lbnRzfSxkLmFsd2F5cyhmdW5jdGlvbigpe2FbZV09ZixiW2VdJiYoYi5qc29ucENhbGxiYWNrPWMuanNvbnBDYWxsYmFjayxGYi5wdXNoKGUpKSxnJiZuLmlzRnVuY3Rpb24oZikmJmYoZ1swXSksZz1mPXZvaWQgMH0pLFwic2NyaXB0XCIpOnZvaWQgMH0pLG4ucGFyc2VIVE1MPWZ1bmN0aW9uKGEsYixjKXtpZighYXx8XCJzdHJpbmdcIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7XCJib29sZWFuXCI9PXR5cGVvZiBiJiYoYz1iLGI9ITEpLGI9Ynx8bDt2YXIgZD12LmV4ZWMoYSksZT0hYyYmW107cmV0dXJuIGQ/W2IuY3JlYXRlRWxlbWVudChkWzFdKV06KGQ9bi5idWlsZEZyYWdtZW50KFthXSxiLGUpLGUmJmUubGVuZ3RoJiZuKGUpLnJlbW92ZSgpLG4ubWVyZ2UoW10sZC5jaGlsZE5vZGVzKSl9O3ZhciBIYj1uLmZuLmxvYWQ7bi5mbi5sb2FkPWZ1bmN0aW9uKGEsYixjKXtpZihcInN0cmluZ1wiIT10eXBlb2YgYSYmSGIpcmV0dXJuIEhiLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZCxlLGYsZz10aGlzLGg9YS5pbmRleE9mKFwiIFwiKTtyZXR1cm4gaD49MCYmKGQ9bi50cmltKGEuc2xpY2UoaCkpLGE9YS5zbGljZSgwLGgpKSxuLmlzRnVuY3Rpb24oYik/KGM9YixiPXZvaWQgMCk6YiYmXCJvYmplY3RcIj09dHlwZW9mIGImJihlPVwiUE9TVFwiKSxnLmxlbmd0aD4wJiZuLmFqYXgoe3VybDphLHR5cGU6ZSxkYXRhVHlwZTpcImh0bWxcIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2Y9YXJndW1lbnRzLGcuaHRtbChkP24oXCI8ZGl2PlwiKS5hcHBlbmQobi5wYXJzZUhUTUwoYSkpLmZpbmQoZCk6YSl9KS5jb21wbGV0ZShjJiZmdW5jdGlvbihhLGIpe2cuZWFjaChjLGZ8fFthLnJlc3BvbnNlVGV4dCxiLGFdKX0pLHRoaXN9LG4uZWFjaChbXCJhamF4U3RhcnRcIixcImFqYXhTdG9wXCIsXCJhamF4Q29tcGxldGVcIixcImFqYXhFcnJvclwiLFwiYWpheFN1Y2Nlc3NcIixcImFqYXhTZW5kXCJdLGZ1bmN0aW9uKGEsYil7bi5mbltiXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5vbihiLGEpfX0pLG4uZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGEpe3JldHVybiBuLmdyZXAobi50aW1lcnMsZnVuY3Rpb24oYil7cmV0dXJuIGE9PT1iLmVsZW19KS5sZW5ndGh9O3ZhciBJYj1hLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtmdW5jdGlvbiBKYihhKXtyZXR1cm4gbi5pc1dpbmRvdyhhKT9hOjk9PT1hLm5vZGVUeXBlJiZhLmRlZmF1bHRWaWV3fW4ub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaSxqLGs9bi5jc3MoYSxcInBvc2l0aW9uXCIpLGw9bihhKSxtPXt9O1wic3RhdGljXCI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj1cInJlbGF0aXZlXCIpLGg9bC5vZmZzZXQoKSxmPW4uY3NzKGEsXCJ0b3BcIiksaT1uLmNzcyhhLFwibGVmdFwiKSxqPShcImFic29sdXRlXCI9PT1rfHxcImZpeGVkXCI9PT1rKSYmKGYraSkuaW5kZXhPZihcImF1dG9cIik+LTEsaj8oZD1sLnBvc2l0aW9uKCksZz1kLnRvcCxlPWQubGVmdCk6KGc9cGFyc2VGbG9hdChmKXx8MCxlPXBhcnNlRmxvYXQoaSl8fDApLG4uaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxoKSksbnVsbCE9Yi50b3AmJihtLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihtLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSxcInVzaW5nXCJpbiBiP2IudXNpbmcuY2FsbChhLG0pOmwuY3NzKG0pfX0sbi5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1hP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe24ub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYixjLGQ9dGhpc1swXSxlPXt0b3A6MCxsZWZ0OjB9LGY9ZCYmZC5vd25lckRvY3VtZW50O2lmKGYpcmV0dXJuIGI9Zi5kb2N1bWVudEVsZW1lbnQsbi5jb250YWlucyhiLGQpPyh0eXBlb2YgZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QhPT1VJiYoZT1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxjPUpiKGYpLHt0b3A6ZS50b3ArYy5wYWdlWU9mZnNldC1iLmNsaWVudFRvcCxsZWZ0OmUubGVmdCtjLnBhZ2VYT2Zmc2V0LWIuY2xpZW50TGVmdH0pOmV9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsYixjPXRoaXNbMF0sZD17dG9wOjAsbGVmdDowfTtyZXR1cm5cImZpeGVkXCI9PT1uLmNzcyhjLFwicG9zaXRpb25cIik/Yj1jLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihhPXRoaXMub2Zmc2V0UGFyZW50KCksYj10aGlzLm9mZnNldCgpLG4ubm9kZU5hbWUoYVswXSxcImh0bWxcIil8fChkPWEub2Zmc2V0KCkpLGQudG9wKz1uLmNzcyhhWzBdLFwiYm9yZGVyVG9wV2lkdGhcIiwhMCksZC5sZWZ0Kz1uLmNzcyhhWzBdLFwiYm9yZGVyTGVmdFdpZHRoXCIsITApKSx7dG9wOmIudG9wLWQudG9wLW4uY3NzKGMsXCJtYXJnaW5Ub3BcIiwhMCksbGVmdDpiLmxlZnQtZC5sZWZ0LW4uY3NzKGMsXCJtYXJnaW5MZWZ0XCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxJYjt3aGlsZShhJiYhbi5ub2RlTmFtZShhLFwiaHRtbFwiKSYmXCJzdGF0aWNcIj09PW4uY3NzKGEsXCJwb3NpdGlvblwiKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxJYn0pfX0pLG4uZWFjaCh7c2Nyb2xsTGVmdDpcInBhZ2VYT2Zmc2V0XCIsc2Nyb2xsVG9wOlwicGFnZVlPZmZzZXRcIn0sZnVuY3Rpb24oYixjKXt2YXIgZD1cInBhZ2VZT2Zmc2V0XCI9PT1jO24uZm5bYl09ZnVuY3Rpb24oZSl7cmV0dXJuIEoodGhpcyxmdW5jdGlvbihiLGUsZil7dmFyIGc9SmIoYik7cmV0dXJuIHZvaWQgMD09PWY/Zz9nW2NdOmJbZV06dm9pZChnP2cuc2Nyb2xsVG8oZD9hLnBhZ2VYT2Zmc2V0OmYsZD9mOmEucGFnZVlPZmZzZXQpOmJbZV09Zil9LGIsZSxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLG4uZWFjaChbXCJ0b3BcIixcImxlZnRcIl0sZnVuY3Rpb24oYSxiKXtuLmNzc0hvb2tzW2JdPXlhKGsucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihhLGMpe3JldHVybiBjPyhjPXhhKGEsYiksdmEudGVzdChjKT9uKGEpLnBvc2l0aW9uKClbYl0rXCJweFwiOmMpOnZvaWQgMH0pfSksbi5lYWNoKHtIZWlnaHQ6XCJoZWlnaHRcIixXaWR0aDpcIndpZHRoXCJ9LGZ1bmN0aW9uKGEsYil7bi5lYWNoKHtwYWRkaW5nOlwiaW5uZXJcIithLGNvbnRlbnQ6YixcIlwiOlwib3V0ZXJcIithfSxmdW5jdGlvbihjLGQpe24uZm5bZF09ZnVuY3Rpb24oZCxlKXt2YXIgZj1hcmd1bWVudHMubGVuZ3RoJiYoY3x8XCJib29sZWFuXCIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD9cIm1hcmdpblwiOlwiYm9yZGVyXCIpO3JldHVybiBKKHRoaXMsZnVuY3Rpb24oYixjLGQpe3ZhciBlO3JldHVybiBuLmlzV2luZG93KGIpP2IuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W1wiY2xpZW50XCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5W1wic2Nyb2xsXCIrYV0sZVtcInNjcm9sbFwiK2FdLGIuYm9keVtcIm9mZnNldFwiK2FdLGVbXCJvZmZzZXRcIithXSxlW1wiY2xpZW50XCIrYV0pKTp2b2lkIDA9PT1kP24uY3NzKGIsYyxnKTpuLnN0eWxlKGIsYyxkLGcpfSxiLGY/ZDp2b2lkIDAsZixudWxsKX19KX0pLG4uZm4uc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sbi5mbi5hbmRTZWxmPW4uZm4uYWRkQmFjayxcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZShcImpxdWVyeVwiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIG59KTt2YXIgS2I9YS5qUXVlcnksTGI9YS4kO3JldHVybiBuLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oYil7cmV0dXJuIGEuJD09PW4mJihhLiQ9TGIpLGImJmEualF1ZXJ5PT09biYmKGEualF1ZXJ5PUtiKSxufSx0eXBlb2YgYj09PVUmJihhLmpRdWVyeT1hLiQ9biksbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9anF1ZXJ5Lm1pbi5tYXAiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxudmFyIFEgPSByZXF1aXJlKCdxJyk7XG5cbi8vIFBsdWdpbiBjb21tdW5pY2F0aW9ucyBsYXllci4gVHdvIHR5cGVzIG9mIGNvbW11bmljYXRpb24gYXJlIHN1cHBvcnRlZDpcbi8vIDEuIE1lc3NhZ2VzIC0gd2hlbiBlbWl0dGVkLCBhbnkgbG9jYWwgaGFuZGxlcnMgYXJlIG5vdGlmaWVkLCBhbmQgaXQgaXMgYWxzbyBzZW50IGFjcm9zcyB0byB3ZWIgc29ja2V0cyBjb25uZWN0aW9uXG4vLyAgICB3aGVyZSBhbnkgcmVtb3RlIGhhbmRsZXJzIGFyZSBub3RpZmllZC4gVGhlcmUgY2FuIGJlIGFueSBudW1iZXIgb2YgbG9jYWwgYW5kL29yIHJlbW90ZSBoYW5kbGVycy4gVGhlcmUgaXMgbm9cbi8vICAgIG9wcG9ydHVuaXR5IHRvIHJlc3BvbmQuXG4vLyAyLiBNZXRob2RzIC0gY2FsbHMgYWNyb3NzIHRoZSB3ZWIgc29ja2V0IGNvbm5lY3Rpb24gd2hlcmUgdGhlcmUgY2FuIGJlIGEgc2luZ2xlIGhhbmRsZXIgdGhhdCBjYW4gcmV0dXJuIGEgc2luZ2xlXG4vLyAgICB2YWx1ZSBvciBlcnJvciB2YWx1ZS5cblxuZnVuY3Rpb24gTWVzc2FnZXMocGx1Z2luSWQsIHNvY2tldCkge1xuICAgIHRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDtcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICB0aGlzLm1lc3NhZ2VzID0ge307XG4gICAgdGhpcy5tZXRob2RzID0ge307XG5cbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgc29ja2V0Lm9uKCdwbHVnaW4tbWVzc2FnZScsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLnBsdWdpbklkID09PSBwbHVnaW5JZCkge1xuICAgICAgICAgICAgbm90aWZ5LmNhbGwodGhhdCwgdGhhdC5tZXNzYWdlcywgZGF0YS5tZXNzYWdlLCBkYXRhLmRhdGEpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgc29ja2V0Lm9uKCdwbHVnaW4tbWV0aG9kJywgZnVuY3Rpb24gKGRhdGEsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChkYXRhLnBsdWdpbklkID09PSBwbHVnaW5JZCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSB0aGF0Lm1ldGhvZHMgJiYgdGhhdC5tZXRob2RzW2RhdGEubWV0aG9kXTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBkYXRhLmFyZ3M7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbk1lc3NhZ2VzLl9nbG9iYWxNZXNzYWdlcyA9IHt9O1xuXG5mdW5jdGlvbiBub3RpZnkobWVzc2FnZXNPYmosIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAvLyBOb3RpZmllcyBsb2NhbCBsaXN0ZW5lcnMgb2YgYSBtZXNzYWdlXG4gICAgdmFyIGhhbmRsZXJzID0gbWVzc2FnZXNPYmogJiYgbWVzc2FnZXNPYmpbbWVzc2FnZV07XG4gICAgaWYgKGhhbmRsZXJzKSB7XG4gICAgICAgIGhhbmRsZXJzLmZvckVhY2goZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBtZXNzYWdlLCBkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5NZXNzYWdlcy5wcm90b3R5cGUgPSB7XG4gICAgLy8gQ2FsbCBhbmQgcmVnaXN0ZXIgZm9yIG1ldGhvZHNcblxuICAgIC8qKlxuICAgICAqIEBkZXNjIENhbGxzIHRoZSBzcGVjaWZpZWQgbWV0aG9kLCB3aXRoIGFueSBudW1iZXIgb2YgcGFyYW1ldGVycy4gUmV0dXJuIGEgcHJvbWlzZS5cbiAgICAgKiBAcGFyYW0gbWV0aG9kXG4gICAgICovXG4gICAgY2FsbDogZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICB2YXIgZCA9IFEuZGVmZXIoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQuZW1pdCgncGx1Z2luLW1ldGhvZCcsIHtcbiAgICAgICAgICAgIHBsdWdpbklkOiB0aGlzLnBsdWdpbklkLFxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICBhcmdzOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpXG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnIsIHJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIGQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGQucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGQucHJvbWlzZTtcbiAgICB9LFxuXG4gICAgcmVnaXN0ZXI6IGZ1bmN0aW9uKG1ldGhvZCwgaGFuZGxlcikge1xuICAgICAgICAvLyBDYW4gb25seSBldmVyIGhhdmUgb25lIGhhbmRsZXIgZm9yIGEgbWV0aG9kLiBDYW5jZWwgYnkgY2FsbGluZyB3aXRoIGhhbmRsZXIgbnVsbCBvciB1bmRlZmluZWQuXG4gICAgICAgIHRoaXMubWV0aG9kc1ttZXRob2RdID0gaGFuZGxlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIC8vIEVtaXQgYW5kIGhhbmRsZSBtZXNzYWdlc1xuICAgIGVtaXQ6IGZ1bmN0aW9uIChtZXNzYWdlLCBkYXRhLCBpc0dsb2JhbCkge1xuICAgICAgICAvLyBQYXNzIHRoZSBtZXNzYWdlIGFjcm9zcyB0aGUgc29ja2V0XG4gICAgICAgIHZhciBldmVudE5hbWUsXG4gICAgICAgICAgICBtZXNzYWdlc09iajtcblxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdnbG9iYWwtcGx1Z2luLW1lc3NhZ2UnO1xuICAgICAgICAgICAgbWVzc2FnZXNPYmogPSBNZXNzYWdlcy5fZ2xvYmFsTWVzc2FnZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAncGx1Z2luLW1lc3NhZ2UnO1xuICAgICAgICAgICAgbWVzc2FnZXNPYmogPSB0aGlzLm1lc3NhZ2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zb2NrZXQuZW1pdChldmVudE5hbWUsIHtcbiAgICAgICAgICAgIHBsdWdpbklkOiB0aGlzLnBsdWdpbklkLFxuICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTm90aWZ5IGFueSBsb2NhbCBsaXN0ZW5lcnNcbiAgICAgICAgbm90aWZ5LmNhbGwodGhpcywgbWVzc2FnZXNPYmosIG1lc3NhZ2UsIGRhdGEpO1xuICAgIH0sXG4gICAgXG4gICAgLy8gRW1pdCBtZXNzYWdlcyBkZXN0aW5lZCB0byBleHRlcm5hbCBkZWJ1Zy1ob3N0c1xuICAgIGVtaXREZWJ1ZzogZnVuY3Rpb24obWVzc2FnZSwgZGF0YSkge1xuICAgICAgICB0aGlzLnNvY2tldC5lbWl0KCdkZWJ1Zy1tZXNzYWdlJywge1xuICAgICAgICAgICAgcGx1Z2luSWQ6IHRoaXMucGx1Z2luSWQsXG4gICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLFxuICAgICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgcmVmcmVzaEFwcEhvc3Q6IGZ1bmN0aW9uIChkZXZpY2UpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuZW1pdCgncmVmcmVzaC1hcHAtaG9zdCcsIGRldmljZSk7XG4gICAgfSxcblxuICAgIG9uOiBmdW5jdGlvbiAobWVzc2FnZSwgaGFuZGxlciwgaXNHbG9iYWwpIHtcbiAgICAgICAgdmFyIG1lc3NhZ2VzT2JqID0gKCFpc0dsb2JhbCkgPyB0aGlzLm1lc3NhZ2VzIDogTWVzc2FnZXMuX2dsb2JhbE1lc3NhZ2VzO1xuXG4gICAgICAgIGlmICghbWVzc2FnZXNPYmpbbWVzc2FnZV0pIHtcbiAgICAgICAgICAgIG1lc3NhZ2VzT2JqW21lc3NhZ2VdID0gW2hhbmRsZXJdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWVzc2FnZXNPYmpbbWVzc2FnZV0ucHVzaChoYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgb2ZmOiBmdW5jdGlvbiAobWVzc2FnZSwgaGFuZGxlcikge1xuICAgICAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLm1lc3NhZ2VzW21lc3NhZ2VdO1xuICAgICAgICBpZiAoIWhhbmRsZXJzKSB7XG4gICAgICAgICAgICAvLyB0cnkgb24gdGhlIGdsb2JhbCBtZXNzYWdlcyBoYW5kbGVyc1xuICAgICAgICAgICAgaGFuZGxlcnMgPSBNZXNzYWdlcy5fZ2xvYmFsTWVzc2FnZXNbbWVzc2FnZV07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZXJzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcG9zID0gaGFuZGxlcnMuaW5kZXhPZihoYW5kbGVyKTtcbiAgICAgICAgd2hpbGUgKHBvcyA+IC0xKSB7XG4gICAgICAgICAgICBoYW5kbGVycy5zcGxpY2UocG9zLCAxKTtcbiAgICAgICAgICAgIHBvcyA9IGhhbmRsZXJzLmluZGV4T2YoaGFuZGxlcik7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1lc3NhZ2VzO1xuIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cblxuaWYgKHR5cGVvZiBPYmplY3QuYXNzaWduICE9ICdmdW5jdGlvbicpIHtcbiAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICBPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgICAgICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBuZXh0S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtuZXh0S2V5XSA9IHNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH07XG4gICAgfSkoKTtcbn1cbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gQmFzZWQgaW4gcGFydCBvbiBjb2RlIGZyb20gQXBhY2hlIFJpcHBsZSwgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9pbmN1YmF0b3ItcmlwcGxlXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgICdBUElfVVJMJzogJ2h0dHBzOi8vcmlwcGxlYXBpLmhlcm9rdWFwcC5jb20nLFxuXG4gICAgJ1NFUlZJQ0VTJzoge1xuICAgICAgICAnR09PR0xFX01BUFNfVVJJJzogJ2h0dHA6Ly9tYXBzLmdvb2dsZS5jb20vbWFwcy9hcGkvc3RhdGljbWFwP3NpemU9NDc2eDQ3NiZtYXB0eXBlPXJvYWRtYXAnLFxuICAgICAgICAnR09PR0xFX01BUFNfQVBJX0tFWSc6ICdBQlFJQUFBQS1DYVBaSFhSLTBUemh1aV9oNmdwamhTRV8yckdsbllpQjdMLVpHVndnYXV0NXM3T1lSU2xCQWFIQ3pCdVpmMl8yM192ckNPZlB4WEhqQSdcbiAgICB9LFxuXG4gICAgJ0ZTX1NJWkUnOiAxMDI0ICogMTAyNCAqIDEwLFxuXG4gICAgJ0NPTU1PTic6ICB7XG4gICAgICAgICdBUFBMSUNBVElPTl9TVEFURSc6ICd1aS1hcHBsaWNhdGlvbi1zdGF0ZS0nLFxuICAgICAgICAnUFJFRklYJzogJ3RpbnloaXBwb3MtJyxcbiAgICAgICAgJ01FTlVfQlVUVE9OJyA6ICdtZW51LWJ1dHRvbicsXG4gICAgICAgICdCQUNLX0JVVFRPTicgOiAnYmFjay1idXR0b24nLFxuICAgICAgICAnSFRNTF9DT05UQUlORVInIDogJ2RvY3VtZW50JyxcbiAgICAgICAgJ0lORk9fU0VDVElPTic6ICdpbmZvcm1hdGlvbi1zdWItY29udGFpbmVyJyxcbiAgICAgICAgJ09SSUVOVEFUSU9OX1NFTEVDVF9QT1JUUkFJVF9JRCcgOiAnbGF5b3V0LXBvcnRyYWl0JyxcbiAgICAgICAgJ09SSUVOVEFUSU9OX1NFTEVDVF9MQU5EU0NBUEVfSUQnIDogJ2xheW91dC1sYW5kc2NhcGUnLFxuICAgICAgICAnUExBVEZPUk1fU0VMRUNUX0lEJzogJ3BsYXRmb3JtLXNlbGVjdCcsXG4gICAgICAgICdERVZJQ0VfU0VMRUNUX0lEJzogJ2RldmljZS1zZWxlY3QnLFxuICAgICAgICAnU1RPUkFHRV9UQUJMRV9CT0RZX0NMQVNTJzogJ3ByZWZlcmVuY2VzLWxpc3QtYm9keScsXG4gICAgICAgICdTVE9SQUdFX0NPVU5UX0NPTlRBSU5FUl9JRCc6ICdwcmVmZXJlbmNlcy1jb3VudCcsXG4gICAgICAgICdHRU9fTUFQX0NPTlRBSU5FUl9JRCc6ICdnZW8tbWFwJyxcbiAgICAgICAgJ0ZJTEVTWVNURU1fVVBEQVRFX0JVVFRPTl9JRF9XSVRIX0hBU0gnOiAnI3VwZGF0ZS1maWxlc3lzdGVtLWJ1dHRvbicsXG4gICAgICAgICdBUFBMSUNBVElPTlNfQ09OVEFJTkVSX0lEJzogJ3dpZGdldC1hcHBsaWNhdGlvbnMtY29udGVudCcsXG4gICAgICAgICdTVE9SQUdFX0NMRUFSX0JVVFRPTl9JRCc6ICdwcmVmZXJlbmNlcy1jbGVhci1idXR0b24nLFxuICAgICAgICAnQ0hBTkdFX1BMQVRGT1JNX0JVVFRPTl9JRCc6ICdjaGFuZ2UtcGxhdGZvcm0nLFxuICAgICAgICAnQUpBWF9MT0FERVJfQ09OVEFJTkVSX0NMQVNTJzogJy5sb2FkZXInLFxuICAgICAgICAnSVJSRUxFVkFOVF9DTEFTUyc6ICdpcnJlbGV2YW50JyxcbiAgICAgICAgJ01VTFRJTUVESUFfVk9MVU1FX1NMSURFUl9JRCc6ICdtZWRpYS12b2x1bWUnLFxuICAgICAgICAnTVVMVElNRURJQV9WT0xVTUVfRklFTERfSUQnOiAnbWVkaWEtdm9sdW1lLXZhbHVlJyxcbiAgICAgICAgJ01VTFRJTUVESUFfQVVESU9fU1RBVEVfRklFTERfSUQnOiAnbWVkaWEtYXVkaW8tc3RhdGUnLFxuICAgICAgICAnTVVMVElNRURJQV9BVURJT19QTEFZSU5HX0ZJRUxEX0lEJzogJ211bHRpbWVkaWEtaXNhdWRpb3BsYXlpbmcnLFxuICAgICAgICAnTVVMVElNRURJQV9BVURJT19QUk9HUkVTU19JRCc6ICdtZWRpYS1hdWRpby1wcm9ncmVzcycsXG4gICAgICAgICdNVUxUSU1FRElBX0FVRElPX0ZJTEVfRklFTERfSUQnOiAnbWVkaWEtYXVkaW8tZmlsZScsXG4gICAgICAgICdNVUxUSU1FRElBX1ZJREVPX1NUQVRFX0ZJRUxEX0lEJzogJ21lZGlhLXZpZGVvLXN0YXRlJyxcbiAgICAgICAgJ01VTFRJTUVESUFfVklERU9fUExBWUlOR19GSUVMRF9JRCc6ICdtdWx0aW1lZGlhLWlzdmlkZW9wbGF5aW5nJyxcbiAgICAgICAgJ01VTFRJTUVESUFfVklERU9fUFJPR1JFU1NfSUQnOiAnbWVkaWEtdmlkZW8tcHJvZ3Jlc3MnLFxuICAgICAgICAnTVVMVElNRURJQV9WSURFT19GSUxFX0ZJRUxEX0lEJzogJ21lZGlhLXZpZGVvLWZpbGUnLFxuICAgICAgICAnRVhURU5TSU9OX1VSTF9DT05UQUlORVInOiAnZXh0ZW5zaW9uLXVybCcsXG4gICAgICAgICdTRUNVUklUWV9MRVZFTCc6ICdzZWN1cml0eS1sZXZlbCdcbiAgICB9LFxuXG4gICAgJ0ZJTEVTWVNURU0nOiB7XG4gICAgICAgICdQRVJTSVNURU5DRV9LRVknOiAnZmlsZXN5c3RlbScsXG4gICAgICAgICdJTlBVVF9QUkVGSVhfSUQnOiAnI3BhbmVsLWZpbGVzeXN0ZW0tJ1xuICAgIH0sXG5cbiAgICAnUExBVEZPUk0nOiAge1xuICAgICAgICAnREVGQVVMVCc6IHtcbiAgICAgICAgICAgICduYW1lJzogJ2NvcmRvdmEnLFxuICAgICAgICAgICAgJ3ZlcnNpb24nOiAnMS4wLjAnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ0VOQ0FQU1VMQVRPUic6ICB7XG4gICAgICAgICdERUZBVUxUX0hFSUdIVCc6IDY4NCxcbiAgICAgICAgJ0RFRkFVTFRfV0lEVEgnOiA0ODBcbiAgICB9LFxuXG4gICAgJ0dFTyc6ICB7XG4gICAgICAgICdPUFRJT05TJyA6IHtcbiAgICAgICAgICAgICdMQVRJVFVERScgOiAnZ2VvLWxhdGl0dWRlJyxcbiAgICAgICAgICAgICdMT05HSVRVREUnIDogJ2dlby1sb25naXR1ZGUnLFxuICAgICAgICAgICAgJ0FMVElUVURFJyA6ICdnZW8tYWx0aXR1ZGUnLFxuICAgICAgICAgICAgJ0NFTExfSUQnIDogJ2dlby1jZWxsaWQnLFxuICAgICAgICAgICAgJ0FDQ1VSQUNZJyA6ICdnZW8tYWNjdXJhY3knLFxuICAgICAgICAgICAgJ0FMVElUVURFX0FDQ1VSQUNZJyA6ICdnZW8tYWx0aXR1ZGUtYWNjdXJhY3knLFxuICAgICAgICAgICAgJ0hFQURJTkcnIDogJ2dlby1oZWFkaW5nJyxcbiAgICAgICAgICAgICdTUEVFRCcgOiAnZ2VvLXNwZWVkJyxcbiAgICAgICAgICAgICdUSU1FX1NUQU1QJyA6ICdnZW8tdGltZXN0YW1wJyxcbiAgICAgICAgICAgICdERUxBWScgOiAnZ2VvLWRlbGF5JyxcbiAgICAgICAgICAgICdERUxBWV9MQUJFTCcgOiAnZ2VvLWRlbGF5LWxhYmVsJyxcbiAgICAgICAgICAgICdIRUFESU5HX0xBQkVMJyA6ICdnZW8taGVhZGluZy1sYWJlbCcsXG4gICAgICAgICAgICAnSEVBRElOR19NQVBfTEFCRUwnIDogJ2dlby1tYXAtZGlyZWN0aW9uLWxhYmVsJyxcbiAgICAgICAgICAgICdJTUFHRScgOiAnZ2VvLW1hcC1pbWcnLFxuICAgICAgICAgICAgJ01BUF9NQVJLRVInIDogJ2dlby1tYXAtbWFya2VyJyxcbiAgICAgICAgICAgICdNQVBfQ09OVEFJTkVSJyA6ICdnZW8tbWFwLWNvbnRhaW5lcicsXG4gICAgICAgICAgICAnVElNRU9VVCcgOiAnZ2VvLXRpbWVvdXQnLFxuICAgICAgICAgICAgJ0dQWEZJTEUnOiAnZ2VvLWdweGZpbGUnLFxuICAgICAgICAgICAgJ0dQWEdPJzogJ2dlby1ncHgtZ28nLFxuICAgICAgICAgICAgJ0dQWE1VTFRJUExJRVInOiAnZ2VvLWdweG11bHRpcGxpZXItc2VsZWN0JyxcbiAgICAgICAgICAgICdHUFhSRVBMQVlTVEFUVVMnOiAnZ2VvLWdweHJlcGxheXN0YXR1cydcbiAgICAgICAgfSxcbiAgICAgICAgJ01BUF9aT09NX01BWCc6IDE4LFxuICAgICAgICAnTUFQX1pPT01fTUlOJzogMCxcbiAgICAgICAgJ01BUF9aT09NX0xFVkVMX0NPTlRBSU5FUic6ICdnZW8tbWFwLXpvb21sZXZlbC12YWx1ZScsXG4gICAgICAgICdNQVBfWk9PTV9LRVknOiAnZ2VvLW1hcC16b29tLWtleScsXG4gICAgICAgICdHUFhHT19MQUJFTFMnOiB7XG4gICAgICAgICAgICAnR08nOiAnR28nLFxuICAgICAgICAgICAgJ1NUT1AnOiAnU3RvcCdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnUFVTSCc6IHtcbiAgICAgICAgJ09QVElPTlMnIDoge1xuICAgICAgICAgICAgJ1BBWUxPQUQnIDogJ3B1c2gtdGV4dCdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnVEVMRVBIT05ZJzoge1xuICAgICAgICAnQ0FMTF9MSVNUX0tFWSc6ICd0ZWxlcGhvbnktY2FsbC1saXN0LWtleSdcbiAgICB9LFxuXG4gICAgJ1BJTSc6IHtcbiAgICAgICAgJ0FERFJFU1NfTElTVF9LRVknOiAncGltLWFkZHJlc3MtbGlzdC1rZXknLFxuICAgICAgICAnQ0FMRU5EQVJfTElTVF9LRVknOiAncGltLWNhbGVuZGFyLWxpc3Qta2V5J1xuICAgIH0sXG5cbiAgICAnQ0FNRVJBJzoge1xuICAgICAgICAnV0lORE9XX0FOSU1BVElPTic6ICdpbWFnZXMvZGFuY2UuZ2lmJyxcbiAgICAgICAgJ1dBUk5JTkdfVEVYVCc6ICdUaGUgcnVudGltZSBzaW11bGF0ZWQgc2F2aW5nIHRoZSBjYW1lcmEgZmlsZSB0byB7ZmlsZX0uIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGlzIGZpbGUgaW4geW91ciBhcHBsaWNhdGlvbiwgcGxlYXNlIGNvcHkgYSBmaWxlIHRvIHRoZSBzYXZlZCBsb2NhdGlvbidcbiAgICB9LFxuXG4gICAgJ0FVRElPUExBWUVSJyA6IHtcbiAgICAgICAgJ1dBUk5JTkdfVEVYVCc6ICdUaGUgcnVudGltZSBzaW11bGF0ZWQgc2F2aW5nIHRoZSBhdWRpbyBmaWxlIHRvIHtmaWxlfS4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoaXMgZmlsZSBpbiB5b3VyIGFwcGxpY2F0aW9uLCBwbGVhc2UgY29weSBhIGZpbGUgdG8gdGhlIHNhdmVkIGxvY2F0aW9uJ1xuICAgIH0sXG5cbiAgICAnQVBJX0FQUExJQ0FUSU9OJzoge1xuICAgICAgICAnTk9fQVBQTElDQVRJT05TX01FU1NBR0UnOiAnTm8gYXBwbGljYXRpb25zIGF2YWlsYWJsZSBmb3IgeW91ciBwbGF0Zm9ybSdcbiAgICB9LFxuXG4gICAgJ05PVElGSUNBVElPTlMnOiAge1xuICAgICAgICAnTUVTU0FHRV9DT05UQUlORVJfQ0xBU1MnOiAnbm90aWZpY2F0aW9uLW1lc3NhZ2UtZGl2JyxcbiAgICAgICAgJ01BSU5fQ09OVEFJTkVSX0NMQVNTJzogJ3BhbmVsLW5vdGlmaWNhdGlvbicsXG4gICAgICAgICdDTE9TRV9CVVRUT05fQ0xBU1MnOiAncGFuZWwtbm90aWZpY2F0aW9uLWNsb3NlYnRuJyxcbiAgICAgICAgJ01FU1NBR0VfVEVYVF9DT05UQUlORVJfQ0xBU1MnOiAncGFuZWwtbm90aWZpY2F0aW9uLXRleHQnLFxuICAgICAgICAnQ1NTX1BSRUZJWCc6ICdwYW5lbC1ub3RpZmljYXRpb24tJyxcbiAgICAgICAgJ1NUQVRFX1RZUEVTJzoge1xuICAgICAgICAgICAgJ09QRU4nOiAxLFxuICAgICAgICAgICAgJ0NMT1NFJzogMlxuICAgICAgICB9XG4gICAgfSxcblxuICAgICdCQVRURVJZX1NUQVRVUycgOiB7XG4gICAgICAgICdCQVRURVJZX1NUQVRVU19LRVknOiAnYmF0dGVyeS1zdGF0dXMta2V5JyxcbiAgICAgICAgJ0lTX1BMVUdHRURfS0VZJyA6ICdpcy1wbHVnZ2VkLWtleScsXG4gICAgICAgICdMRVZFTF9MQUJFTCcgOiAnYmF0dGVyeS1sZXZlbC1sYWJlbCcsXG4gICAgICAgICdMRVZFTF9WQUxVRScgOiAnYmF0dGVyeS1sZXZlbCcsXG4gICAgICAgICdJU19QTFVHR0VEX0NIRUNLQk9YJyA6ICdpcy1wbHVnZ2VkJ1xuICAgIH0sXG5cbiAgICAnQ1NTX1BSRUZJWCc6ICB7XG4gICAgICAgICdJUlJFTEVWQU5UJyA6ICdpcnJlbGV2YW50J1xuICAgIH0sXG5cbiAgICAnU1RPUkFHRSc6ICB7XG4gICAgICAgICdQQUlSX0RFTElNRVRFUicgOiAnLCcsXG4gICAgICAgICdLRVlfVkFMVUVfREVMSU1FVEVSJyA6ICd8J1xuICAgIH0sXG5cbiAgICAnUkVHRVgnOiAge1xuICAgICAgICAnR0VPJyA6IC9eZ2VvLS8sXG4gICAgICAgICdVUkwnOiAvXigoaHR0cHM/fGZ0cHxnb3BoZXJ8dGVsbmV0fGZpbGV8bm90ZXN8bXMtaGVscCk6KChcXC9cXC8pfChcXFxcXFxcXCkpK1tcXHdcXGQ6I0AlXFwvOyQoKX5fP1xcKy09XFxcXFxcLiZdKikkLyxcbiAgICAgICAgLy8nRW1haWwnOiAvXlthLXpBLVowLTkuXyUrLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Miw0fSQvXG4gICAgICAgICdFTUFJTCc6IC9eKFteQFxcc10rKUAoKD86W1xcLWEtejAtOV0rXFwuKStbYS16XXsyLH0pJC8sXG4gICAgICAgICdXQzNfRFRGJzogL14oKFxcZHs0fSktKFxcZFxcZCktKFxcZFxcZClUKFxcZFxcZCk6KFxcZFxcZCk6KFxcZFxcZCl8KFxcZHs0fSktKFxcZFxcZCktKFxcZFxcZClUKFxcZFxcZCk6KFxcZFxcZCl8KFxcZHs0fSktKFxcZFxcZCktKFxcZFxcZCl8KFxcZHs0fSktKFxcZFxcZCl8KFxcZFxcZFxcZFxcZCkpJC8sXG4gICAgICAgICdOT05fUkVMQVRJVkVfVVJJJzogL15odHRwcz86XFwvXFwvfF5maWxlOlxcL1xcLy9cbiAgICB9LFxuXG4gICAgJ0NPTkZJRyc6IHtcbiAgICAgICAgJ1NVQ0NFU1NfQ1NTJzoge1xuICAgICAgICAgICAgJ3RydWUnOiAndWktdGV4dC1wYXNzJyxcbiAgICAgICAgICAgICdmYWxzZSc6ICd1aS10ZXh0LWZhaWwnLFxuICAgICAgICAgICAgJ21pc3NpbmcnOiAndWktdGV4dC1taXNzaW5nJ1xuICAgICAgICB9XG4gICAgfSxcblxuICAgICdTRVRUSU5HUyc6IHtcbiAgICAgICAgJ1RPT0xUSVBTX1RPR0dMRV9ESVYnOiAnI3NldHRpbmdzLXRvZ2dsZXRvb2x0aXBzJyxcbiAgICAgICAgJ1RPT0xUSVBTX0tFWSc6ICd0b29sLXRpcHMta2V5J1xuICAgIH0sXG5cbiAgICAnVUknOiB7XG4gICAgICAgICdKUVVFUllfVUlfQlVUVE9OX0NMQVNTRVMnOiAndWktYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwgdWktYnV0dG9uLXRleHQtb25seScsXG4gICAgICAgICdKUVVFUllfVUlfSU5QVVRfQ0xBU1NFUyc6ICd1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwnLFxuICAgICAgICAnUEFORUxfVEFCTEVfQ0xBU1MnOiAncGFuZWwtdGFibGUnLFxuICAgICAgICAnUklHSFRfUkFOR0VfTEFCRUxfQ0xBU1MnOiAncmFuZ2UtbGFiZWwnLFxuICAgICAgICAnTEVGVF9SQU5HRV9MQUJFTF9DTEFTUyc6ICdyYW5nZS1sYWJlbC1sZWZ0JyxcbiAgICAgICAgJ1RFWFRfTEFCRUxfQ0xBU1MnOiAndWktdGV4dC1sYWJlbCcsXG4gICAgICAgICdTQ1JFRU5fUFBJJzogOTZcbiAgICB9LFxuXG4gICAgJ01VTFRJTUVESUEnOiB7XG4gICAgICAgICdBVURJT19TVEFURVMnOiB7XG4gICAgICAgICAgICAnT1BFTkVEJzogJ29wZW5lZCcsXG4gICAgICAgICAgICAnU1RPUFBFRCc6ICdzdG9wcGVkJyxcbiAgICAgICAgICAgICdQQVVTRUQnOiAncGF1c2VkJyxcbiAgICAgICAgICAgICdQTEFZSU5HJzogJ3BsYXlpbmcnLFxuICAgICAgICAgICAgJ0NPTVBMRVRFRCc6ICdjb21wbGV0ZWQnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgJ0xBTkcnOiB7XG4gICAgICAgICdJU082MzkyX0xJU1QnOiBbJ2FiaycsICdhY2UnLCAnYWNoJywgJ2FkYScsICdhZHknLCAnYWFyJywgJ2FmaCcsICdhZnInLCAnYWZhJywgJ2FpbicsICdha2EnLCAnYWtrJywgJ2FsYi9zcWknLCAnZ3N3JywgJ2FsZScsICdhbGcnLCAndHV0JywgJ2FtaCcsICdhbnAnLCAnYXBhJywgJ2FyYScsICdhcmcnLCAnYXJwJywgJ2FydycsICdhcm0vaHllJywgJ3J1cCcsICdhcnQnLCAnYXNtJywgJ2FzdCcsICdhdGgnLCAnYXVzJywgJ21hcCcsICdhdmEnLCAnYXZlJywgJ2F3YScsICdheW0nLCAnYXplJywgJ2JhbicsICdiYXQnLCAnYmFsJywgJ2JhbScsICdiYWknLCAnYmFkJywgJ2JudCcsICdiYXMnLCAnYmFrJywgJ2JhcS9ldXMnLCAnYnRrJywgJ2JlaicsICdiZWwnLCAnYmVtJywgJ2JlbicsICdiZXInLCAnYmhvJywgJ2JpaCcsICdiaWsnLCAnYnluJywgJ2JpbicsICdiaXMnLCAnemJsJywgJ25vYicsICdib3MnLCAnYnJhJywgJ2JyZScsICdidWcnLCAnYnVsJywgJ2J1YScsICdidXIvbXlhJywgJ2NhZCcsICdzcGEnLCAnY2F0JywgJ2NhdScsICdjZWInLCAnY2VsJywgJ2NhaScsICdraG0nLCAnY2hnJywgJ2NtYycsICdjaGEnLCAnY2hlJywgJ2NocicsICdueWEnLCAnY2h5JywgJ2NoYicsICdjaGkvemhvJywgJ2NobicsICdjaHAnLCAnY2hvJywgJ3poYScsICdjaHUnLCAnY2hrJywgJ2NodicsICdud2MnLCAnc3ljJywgJ3JhcicsICdjb3AnLCAnY29yJywgJ2NvcycsICdjcmUnLCAnbXVzJywgJ2NycCcsICdjcGUnLCAnY3BmJywgJ2NwcCcsICdjcmgnLCAnaHJ2JywgJ2N1cycsICdjemUvY2VzJywgJ2RhaycsICdkYW4nLCAnZGFyJywgJ2RlbCcsICdkaXYnLCAnenphJywgJ2RpbicsICdkb2knLCAnZGdyJywgJ2RyYScsICdkdWEnLCAnZHV0L25sZCcsICdkdW0nLCAnZHl1JywgJ2R6bycsICdmcnMnLCAnZWZpJywgJ2VneScsICdla2EnLCAnZWx4JywgJ2VuZycsICdlbm0nLCAnYW5nJywgJ215dicsICdlcG8nLCAnZXN0JywgJ2V3ZScsICdld28nLCAnZmFuJywgJ2ZhdCcsICdmYW8nLCAnZmlqJywgJ2ZpbCcsICdmaW4nLCAnZml1JywgJ2ZvbicsICdmcmUvZnJhJywgJ2ZybScsICdmcm8nLCAnZnVyJywgJ2Z1bCcsICdnYWEnLCAnZ2xhJywgJ2NhcicsICdnbGcnLCAnbHVnJywgJ2dheScsICdnYmEnLCAnZ2V6JywgJ2dlby9rYXQnLCAnZ2VyL2RldScsICduZHMnLCAnZ21oJywgJ2dvaCcsICdnZW0nLCAna2lrJywgJ2dpbCcsICdnb24nLCAnZ29yJywgJ2dvdCcsICdncmInLCAnZ3JjJywgJ2dyZS9lbGwnLCAna2FsJywgJ2dybicsICdndWonLCAnZ3dpJywgJ2hhaScsICdoYXQnLCAnaGF1JywgJ2hhdycsICdoZWInLCAnaGVyJywgJ2hpbCcsICdoaW0nLCAnaGluJywgJ2htbycsICdoaXQnLCAnaG1uJywgJ2h1bicsICdodXAnLCAnaWJhJywgJ2ljZS9pc2wnLCAnaWRvJywgJ2libycsICdpam8nLCAnaWxvJywgJ2FyYycsICdzbW4nLCAnaW5jJywgJ2luZScsICdpbmQnLCAnaW5oJywgJ2luYScsICdpbGUnLCAnaWt1JywgJ2lwaycsICdpcmEnLCAnZ2xlJywgJ21nYScsICdzZ2EnLCAnaXJvJywgJ2l0YScsICdqcG4nLCAnamF2JywgJ2thYycsICdqcmInLCAnanByJywgJ2tiZCcsICdrYWInLCAneGFsJywgJ2thbScsICdrYW4nLCAna2F1JywgJ3BhbScsICdrYWEnLCAna3JjJywgJ2tybCcsICdrYXInLCAna2FzJywgJ2NzYicsICdrYXcnLCAna2F6JywgJ2toYScsICdraGknLCAna2hvJywgJ2ttYicsICdraW4nLCAna2lyJywgJ3RsaCcsICdrb20nLCAna29uJywgJ2tvaycsICdrb3InLCAna29zJywgJ2twZScsICdrcm8nLCAna3VhJywgJ2t1bScsICdrdXInLCAna3J1JywgJ2t1dCcsICdsYWQnLCAnbGFoJywgJ2xhbScsICdkYXknLCAnbGFvJywgJ2xhdCcsICdsYXYnLCAnbHR6JywgJ2xleicsICdsaW0nLCAnbGluJywgJ2xpdCcsICdqYm8nLCAnZHNiJywgJ2xveicsICdsdWInLCAnbHVhJywgJ2x1aScsICdzbWonLCAnbHVuJywgJ2x1bycsICdsdXMnLCAnbWFjL21rZCcsICdtYWQnLCAnbWFnJywgJ21haScsICdtYWsnLCAnbWxnJywgJ21heS9tc2EnLCAnbWFsJywgJ21sdCcsICdtbmMnLCAnbWRyJywgJ21hbicsICdtbmknLCAnbW5vJywgJ2dsdicsICdtYW8vbXJpJywgJ2FybicsICdtYXInLCAnY2htJywgJ21haCcsICdtd3InLCAnbWFzJywgJ215bicsICdtZW4nLCAnbWljJywgJ21pbicsICdtd2wnLCAnbW9oJywgJ21kZicsICdydW0vcm9uJywgJ21raCcsICdsb2wnLCAnbW9uJywgJ21vcycsICdtdWwnLCAnbXVuJywgJ25xbycsICduYWgnLCAnbmF1JywgJ25hdicsICduZGUnLCAnbmJsJywgJ25kbycsICduYXAnLCAnbmV3JywgJ25lcCcsICduaWEnLCAnbmljJywgJ3NzYScsICduaXUnLCAnenh4JywgJ25vZycsICdub24nLCAnbmFpJywgJ2ZycicsICdzbWUnLCAnbnNvJywgJ25vcicsICdubm8nLCAnbnViJywgJ2lpaScsICdueW0nLCAnbnluJywgJ255bycsICduemknLCAnb2NpJywgJ3BybycsICdvamknLCAnb3JpJywgJ29ybScsICdvc2EnLCAnb3NzJywgJ290bycsICdwYWwnLCAncGF1JywgJ3BsaScsICdwYWcnLCAncGFuJywgJ3BhcCcsICdwYWEnLCAncHVzJywgJ3Blci9mYXMnLCAncGVvJywgJ3BoaScsICdwaG4nLCAncG9uJywgJ3BvbCcsICdwb3InLCAncHJhJywgJ3F1ZScsICdyYWonLCAncmFwJywgJ3FhYS1xdHonLCAncm9hJywgJ3JvaCcsICdyb20nLCAncnVuJywgJ3J1cycsICdzYWwnLCAnc2FtJywgJ3NtaScsICdzbW8nLCAnc2FkJywgJ3NhZycsICdzYW4nLCAnc2F0JywgJ3NyZCcsICdzYXMnLCAnc2NvJywgJ3NlbCcsICdzZW0nLCAnc3JwJywgJ3NycicsICdzaG4nLCAnc25hJywgJ3NjbicsICdzaWQnLCAnc2duJywgJ2JsYScsICdzbmQnLCAnc2luJywgJ3NpdCcsICdzaW8nLCAnc21zJywgJ2RlbicsICdzbGEnLCAnc2xvL3NsaycsICdzbHYnLCAnc29nJywgJ3NvbScsICdzb24nLCAnc25rJywgJ3dlbicsICdzb3QnLCAnc2FpJywgJ2FsdCcsICdzbWEnLCAnc3JuJywgJ3N1aycsICdzdXgnLCAnc3VuJywgJ3N1cycsICdzd2EnLCAnc3N3JywgJ3N3ZScsICdzeXInLCAndGdsJywgJ3RhaCcsICd0YWknLCAndGdrJywgJ3RtaCcsICd0YW0nLCAndGF0JywgJ3RlbCcsICd0ZXInLCAndGV0JywgJ3RoYScsICd0aWIvYm9kJywgJ3RpZycsICd0aXInLCAndGVtJywgJ3RpdicsICd0bGknLCAndHBpJywgJ3RrbCcsICd0b2cnLCAndG9uJywgJ3RzaScsICd0c28nLCAndHNuJywgJ3R1bScsICd0dXAnLCAndHVyJywgJ290YScsICd0dWsnLCAndHZsJywgJ3R5dicsICd0d2knLCAndWRtJywgJ3VnYScsICd1aWcnLCAndWtyJywgJ3VtYicsICdtaXMnLCAndW5kJywgJ2hzYicsICd1cmQnLCAndXpiJywgJ3ZhaScsICd2ZW4nLCAndmllJywgJ3ZvbCcsICd2b3QnLCAnd2FrJywgJ3dsbicsICd3YXInLCAnd2FzJywgJ3dlbC9jeW0nLCAnZnJ5JywgJ3dhbCcsICd3b2wnLCAneGhvJywgJ3NhaCcsICd5YW8nLCAneWFwJywgJ3lpZCcsICd5b3InLCAneXBrJywgJ3puZCcsICd6YXAnLCAnemVuJywgJ3p1bCcsICd6dW4nXVxuICAgIH0sXG5cbiAgICAnWEhSJzoge1xuICAgICAgICBQUk9YWV9TRVRUSU5HOiAnc2V0dGluZ3MteGhyLXByb3h5LXNldHRpbmcnLFxuICAgICAgICBQUk9YWV9TRVRUSU5HU19MSVNUOiB7XG4gICAgICAgICAgICByZW1vdGU6ICdyZW1vdGUnLFxuICAgICAgICAgICAgbG9jYWw6ICdsb2NhbCcsXG4gICAgICAgICAgICBkaXNhYmxlZDogJ2Rpc2FibGVkJ1xuICAgICAgICB9LFxuICAgICAgICBERUZBVUxUX0xPQ0FMX1BPUlQ6IDQ0MDAsXG4gICAgICAgIERFRkFVTFRfTE9DQUxfUk9VVEU6ICcvcmlwcGxlJyxcbiAgICAgICAgTE9DQUxfUFJPWFlfUE9SVF9TRVRUSU5HOiAnc2V0dGluZ3MteGhyLXByb3h5LWxvY2FsLXBvcnQnLFxuICAgICAgICBMT0NBTF9QUk9YWV9ST1VURV9TRVRUSU5HOiAnc2V0dGluZ3MteGhyLXByb3h5LWxvY2FsLXJvdXRlJ1xuICAgIH1cbn07XG4iLCIvLyBDb3B5cmlnaHQgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxudmFyIGlzQXBwSG9zdFJlYWR5ID0gZmFsc2UsXG4gICAgYXBwSG9zdFJlYWR5SGFuZGxlcnMgPSBbXTtcblxuZnVuY3Rpb24gd2hlbkFwcEhvc3RSZWFkeShoYW5kbGVyKSB7XG4gICAgdmFyIGlkeDtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZHggPSBhcHBIb3N0UmVhZHlIYW5kbGVycy5wdXNoKHsnaGFuZGxlcic6IGhhbmRsZXIsICdmaXJlZCc6IGZhbHNlfSk7XG4gICAgaWYgKGlzQXBwSG9zdFJlYWR5KSB7XG4gICAgICAgIGhhbmRsZXIoKTtcbiAgICAgICAgYXBwSG9zdFJlYWR5SGFuZGxlcnNbaWR4LTFdLmZpcmVkID0gdHJ1ZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGZpcmVBcHBIb3N0UmVhZHkoKSB7XG4gICAgaXNBcHBIb3N0UmVhZHkgPSB0cnVlO1xuICAgIGFwcEhvc3RSZWFkeUhhbmRsZXJzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50LmZpcmVkKSB7XG4gICAgICAgICAgICBlbGVtZW50LmhhbmRsZXIoKTtcbiAgICAgICAgICAgIGVsZW1lbnQuZmlyZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8qIEludGVybmFsIHVzZSBmdW5jdGlvbiAqL1xubW9kdWxlLmV4cG9ydHMuX2ZpcmVBcHBIb3N0UmVhZHkgICAgPSBmaXJlQXBwSG9zdFJlYWR5O1xuLyogUHVibGljIEFQSSAqL1xubW9kdWxlLmV4cG9ydHMud2hlbkFwcEhvc3RSZWFkeSAgICAgPSB3aGVuQXBwSG9zdFJlYWR5O1xuIiwiLyogQHZlcnNpb24gMS40LjUgKi9cbihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PVwib2JqZWN0XCImJnR5cGVvZiBtb2R1bGUhPT1cInVuZGVmaW5lZFwiKXttb2R1bGUuZXhwb3J0cz1mKCl9ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09XCJmdW5jdGlvblwiJiZkZWZpbmUuYW1kKXtkZWZpbmUoW10sZil9ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIil7Zz13aW5kb3d9ZWxzZSBpZih0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIil7Zz1nbG9iYWx9ZWxzZSBpZih0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCIpe2c9c2VsZn1lbHNle2c9dGhpc31nLmlvPWYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSh7MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9X2RlcmVxXyhcIi4vbGliL1wiKX0se1wiLi9saWIvXCI6Mn1dLDI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPV9kZXJlcV8oXCIuL3NvY2tldFwiKTttb2R1bGUuZXhwb3J0cy5wYXJzZXI9X2RlcmVxXyhcImVuZ2luZS5pby1wYXJzZXJcIil9LHtcIi4vc29ja2V0XCI6MyxcImVuZ2luZS5pby1wYXJzZXJcIjoxOX1dLDM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpe3ZhciB0cmFuc3BvcnRzPV9kZXJlcV8oXCIuL3RyYW5zcG9ydHNcIik7dmFyIEVtaXR0ZXI9X2RlcmVxXyhcImNvbXBvbmVudC1lbWl0dGVyXCIpO3ZhciBkZWJ1Zz1fZGVyZXFfKFwiZGVidWdcIikoXCJlbmdpbmUuaW8tY2xpZW50OnNvY2tldFwiKTt2YXIgaW5kZXg9X2RlcmVxXyhcImluZGV4b2ZcIik7dmFyIHBhcnNlcj1fZGVyZXFfKFwiZW5naW5lLmlvLXBhcnNlclwiKTt2YXIgcGFyc2V1cmk9X2RlcmVxXyhcInBhcnNldXJpXCIpO3ZhciBwYXJzZWpzb249X2RlcmVxXyhcInBhcnNlanNvblwiKTt2YXIgcGFyc2Vxcz1fZGVyZXFfKFwicGFyc2Vxc1wiKTttb2R1bGUuZXhwb3J0cz1Tb2NrZXQ7ZnVuY3Rpb24gbm9vcCgpe31mdW5jdGlvbiBTb2NrZXQodXJpLG9wdHMpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNvY2tldCkpcmV0dXJuIG5ldyBTb2NrZXQodXJpLG9wdHMpO29wdHM9b3B0c3x8e307aWYodXJpJiZcIm9iamVjdFwiPT10eXBlb2YgdXJpKXtvcHRzPXVyaTt1cmk9bnVsbH1pZih1cmkpe3VyaT1wYXJzZXVyaSh1cmkpO29wdHMuaG9zdG5hbWU9dXJpLmhvc3Q7b3B0cy5zZWN1cmU9dXJpLnByb3RvY29sPT1cImh0dHBzXCJ8fHVyaS5wcm90b2NvbD09XCJ3c3NcIjtvcHRzLnBvcnQ9dXJpLnBvcnQ7aWYodXJpLnF1ZXJ5KW9wdHMucXVlcnk9dXJpLnF1ZXJ5fWVsc2UgaWYob3B0cy5ob3N0KXtvcHRzLmhvc3RuYW1lPXBhcnNldXJpKG9wdHMuaG9zdCkuaG9zdH10aGlzLnNlY3VyZT1udWxsIT1vcHRzLnNlY3VyZT9vcHRzLnNlY3VyZTpnbG9iYWwubG9jYXRpb24mJlwiaHR0cHM6XCI9PWxvY2F0aW9uLnByb3RvY29sO2lmKG9wdHMuaG9zdG5hbWUmJiFvcHRzLnBvcnQpe29wdHMucG9ydD10aGlzLnNlY3VyZT9cIjQ0M1wiOlwiODBcIn10aGlzLmFnZW50PW9wdHMuYWdlbnR8fGZhbHNlO3RoaXMuaG9zdG5hbWU9b3B0cy5ob3N0bmFtZXx8KGdsb2JhbC5sb2NhdGlvbj9sb2NhdGlvbi5ob3N0bmFtZTpcImxvY2FsaG9zdFwiKTt0aGlzLnBvcnQ9b3B0cy5wb3J0fHwoZ2xvYmFsLmxvY2F0aW9uJiZsb2NhdGlvbi5wb3J0P2xvY2F0aW9uLnBvcnQ6dGhpcy5zZWN1cmU/NDQzOjgwKTt0aGlzLnF1ZXJ5PW9wdHMucXVlcnl8fHt9O2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0aGlzLnF1ZXJ5KXRoaXMucXVlcnk9cGFyc2Vxcy5kZWNvZGUodGhpcy5xdWVyeSk7dGhpcy51cGdyYWRlPWZhbHNlIT09b3B0cy51cGdyYWRlO3RoaXMucGF0aD0ob3B0cy5wYXRofHxcIi9lbmdpbmUuaW9cIikucmVwbGFjZSgvXFwvJC8sXCJcIikrXCIvXCI7dGhpcy5mb3JjZUpTT05QPSEhb3B0cy5mb3JjZUpTT05QO3RoaXMuanNvbnA9ZmFsc2UhPT1vcHRzLmpzb25wO3RoaXMuZm9yY2VCYXNlNjQ9ISFvcHRzLmZvcmNlQmFzZTY0O3RoaXMuZW5hYmxlc1hEUj0hIW9wdHMuZW5hYmxlc1hEUjt0aGlzLnRpbWVzdGFtcFBhcmFtPW9wdHMudGltZXN0YW1wUGFyYW18fFwidFwiO3RoaXMudGltZXN0YW1wUmVxdWVzdHM9b3B0cy50aW1lc3RhbXBSZXF1ZXN0czt0aGlzLnRyYW5zcG9ydHM9b3B0cy50cmFuc3BvcnRzfHxbXCJwb2xsaW5nXCIsXCJ3ZWJzb2NrZXRcIl07dGhpcy5yZWFkeVN0YXRlPVwiXCI7dGhpcy53cml0ZUJ1ZmZlcj1bXTt0aGlzLnBvbGljeVBvcnQ9b3B0cy5wb2xpY3lQb3J0fHw4NDM7dGhpcy5yZW1lbWJlclVwZ3JhZGU9b3B0cy5yZW1lbWJlclVwZ3JhZGV8fGZhbHNlO3RoaXMuYmluYXJ5VHlwZT1udWxsO3RoaXMub25seUJpbmFyeVVwZ3JhZGVzPW9wdHMub25seUJpbmFyeVVwZ3JhZGVzO3RoaXMucGVyTWVzc2FnZURlZmxhdGU9ZmFsc2UhPT1vcHRzLnBlck1lc3NhZ2VEZWZsYXRlP29wdHMucGVyTWVzc2FnZURlZmxhdGV8fHt9OmZhbHNlO2lmKHRydWU9PT10aGlzLnBlck1lc3NhZ2VEZWZsYXRlKXRoaXMucGVyTWVzc2FnZURlZmxhdGU9e307aWYodGhpcy5wZXJNZXNzYWdlRGVmbGF0ZSYmbnVsbD09dGhpcy5wZXJNZXNzYWdlRGVmbGF0ZS50aHJlc2hvbGQpe3RoaXMucGVyTWVzc2FnZURlZmxhdGUudGhyZXNob2xkPTEwMjR9dGhpcy5wZng9b3B0cy5wZnh8fG51bGw7dGhpcy5rZXk9b3B0cy5rZXl8fG51bGw7dGhpcy5wYXNzcGhyYXNlPW9wdHMucGFzc3BocmFzZXx8bnVsbDt0aGlzLmNlcnQ9b3B0cy5jZXJ0fHxudWxsO3RoaXMuY2E9b3B0cy5jYXx8bnVsbDt0aGlzLmNpcGhlcnM9b3B0cy5jaXBoZXJzfHxudWxsO3RoaXMucmVqZWN0VW5hdXRob3JpemVkPW9wdHMucmVqZWN0VW5hdXRob3JpemVkPT09dW5kZWZpbmVkP251bGw6b3B0cy5yZWplY3RVbmF1dGhvcml6ZWQ7dmFyIGZyZWVHbG9iYWw9dHlwZW9mIGdsb2JhbD09XCJvYmplY3RcIiYmZ2xvYmFsO2lmKGZyZWVHbG9iYWwuZ2xvYmFsPT09ZnJlZUdsb2JhbCl7aWYob3B0cy5leHRyYUhlYWRlcnMmJk9iamVjdC5rZXlzKG9wdHMuZXh0cmFIZWFkZXJzKS5sZW5ndGg+MCl7dGhpcy5leHRyYUhlYWRlcnM9b3B0cy5leHRyYUhlYWRlcnN9fXRoaXMub3BlbigpfVNvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3M9ZmFsc2U7RW1pdHRlcihTb2NrZXQucHJvdG90eXBlKTtTb2NrZXQucHJvdG9jb2w9cGFyc2VyLnByb3RvY29sO1NvY2tldC5Tb2NrZXQ9U29ja2V0O1NvY2tldC5UcmFuc3BvcnQ9X2RlcmVxXyhcIi4vdHJhbnNwb3J0XCIpO1NvY2tldC50cmFuc3BvcnRzPV9kZXJlcV8oXCIuL3RyYW5zcG9ydHNcIik7U29ja2V0LnBhcnNlcj1fZGVyZXFfKFwiZW5naW5lLmlvLXBhcnNlclwiKTtTb2NrZXQucHJvdG90eXBlLmNyZWF0ZVRyYW5zcG9ydD1mdW5jdGlvbihuYW1lKXtkZWJ1ZygnY3JlYXRpbmcgdHJhbnNwb3J0IFwiJXNcIicsbmFtZSk7dmFyIHF1ZXJ5PWNsb25lKHRoaXMucXVlcnkpO3F1ZXJ5LkVJTz1wYXJzZXIucHJvdG9jb2w7cXVlcnkudHJhbnNwb3J0PW5hbWU7aWYodGhpcy5pZClxdWVyeS5zaWQ9dGhpcy5pZDt2YXIgdHJhbnNwb3J0PW5ldyB0cmFuc3BvcnRzW25hbWVdKHthZ2VudDp0aGlzLmFnZW50LGhvc3RuYW1lOnRoaXMuaG9zdG5hbWUscG9ydDp0aGlzLnBvcnQsc2VjdXJlOnRoaXMuc2VjdXJlLHBhdGg6dGhpcy5wYXRoLHF1ZXJ5OnF1ZXJ5LGZvcmNlSlNPTlA6dGhpcy5mb3JjZUpTT05QLGpzb25wOnRoaXMuanNvbnAsZm9yY2VCYXNlNjQ6dGhpcy5mb3JjZUJhc2U2NCxlbmFibGVzWERSOnRoaXMuZW5hYmxlc1hEUix0aW1lc3RhbXBSZXF1ZXN0czp0aGlzLnRpbWVzdGFtcFJlcXVlc3RzLHRpbWVzdGFtcFBhcmFtOnRoaXMudGltZXN0YW1wUGFyYW0scG9saWN5UG9ydDp0aGlzLnBvbGljeVBvcnQsc29ja2V0OnRoaXMscGZ4OnRoaXMucGZ4LGtleTp0aGlzLmtleSxwYXNzcGhyYXNlOnRoaXMucGFzc3BocmFzZSxjZXJ0OnRoaXMuY2VydCxjYTp0aGlzLmNhLGNpcGhlcnM6dGhpcy5jaXBoZXJzLHJlamVjdFVuYXV0aG9yaXplZDp0aGlzLnJlamVjdFVuYXV0aG9yaXplZCxwZXJNZXNzYWdlRGVmbGF0ZTp0aGlzLnBlck1lc3NhZ2VEZWZsYXRlLGV4dHJhSGVhZGVyczp0aGlzLmV4dHJhSGVhZGVyc30pO3JldHVybiB0cmFuc3BvcnR9O2Z1bmN0aW9uIGNsb25lKG9iail7dmFyIG89e307Zm9yKHZhciBpIGluIG9iail7aWYob2JqLmhhc093blByb3BlcnR5KGkpKXtvW2ldPW9ialtpXX19cmV0dXJuIG99U29ja2V0LnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKCl7dmFyIHRyYW5zcG9ydDtpZih0aGlzLnJlbWVtYmVyVXBncmFkZSYmU29ja2V0LnByaW9yV2Vic29ja2V0U3VjY2VzcyYmdGhpcy50cmFuc3BvcnRzLmluZGV4T2YoXCJ3ZWJzb2NrZXRcIikhPS0xKXt0cmFuc3BvcnQ9XCJ3ZWJzb2NrZXRcIn1lbHNlIGlmKDA9PT10aGlzLnRyYW5zcG9ydHMubGVuZ3RoKXt2YXIgc2VsZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzZWxmLmVtaXQoXCJlcnJvclwiLFwiTm8gdHJhbnNwb3J0cyBhdmFpbGFibGVcIil9LDApO3JldHVybn1lbHNle3RyYW5zcG9ydD10aGlzLnRyYW5zcG9ydHNbMF19dGhpcy5yZWFkeVN0YXRlPVwib3BlbmluZ1wiO3RyeXt0cmFuc3BvcnQ9dGhpcy5jcmVhdGVUcmFuc3BvcnQodHJhbnNwb3J0KX1jYXRjaChlKXt0aGlzLnRyYW5zcG9ydHMuc2hpZnQoKTt0aGlzLm9wZW4oKTtyZXR1cm59dHJhbnNwb3J0Lm9wZW4oKTt0aGlzLnNldFRyYW5zcG9ydCh0cmFuc3BvcnQpfTtTb2NrZXQucHJvdG90eXBlLnNldFRyYW5zcG9ydD1mdW5jdGlvbih0cmFuc3BvcnQpe2RlYnVnKFwic2V0dGluZyB0cmFuc3BvcnQgJXNcIix0cmFuc3BvcnQubmFtZSk7dmFyIHNlbGY9dGhpcztpZih0aGlzLnRyYW5zcG9ydCl7ZGVidWcoXCJjbGVhcmluZyBleGlzdGluZyB0cmFuc3BvcnQgJXNcIix0aGlzLnRyYW5zcG9ydC5uYW1lKTt0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKX10aGlzLnRyYW5zcG9ydD10cmFuc3BvcnQ7dHJhbnNwb3J0Lm9uKFwiZHJhaW5cIixmdW5jdGlvbigpe3NlbGYub25EcmFpbigpfSkub24oXCJwYWNrZXRcIixmdW5jdGlvbihwYWNrZXQpe3NlbGYub25QYWNrZXQocGFja2V0KX0pLm9uKFwiZXJyb3JcIixmdW5jdGlvbihlKXtzZWxmLm9uRXJyb3IoZSl9KS5vbihcImNsb3NlXCIsZnVuY3Rpb24oKXtzZWxmLm9uQ2xvc2UoXCJ0cmFuc3BvcnQgY2xvc2VcIil9KX07U29ja2V0LnByb3RvdHlwZS5wcm9iZT1mdW5jdGlvbihuYW1lKXtkZWJ1ZygncHJvYmluZyB0cmFuc3BvcnQgXCIlc1wiJyxuYW1lKTt2YXIgdHJhbnNwb3J0PXRoaXMuY3JlYXRlVHJhbnNwb3J0KG5hbWUse3Byb2JlOjF9KSxmYWlsZWQ9ZmFsc2Usc2VsZj10aGlzO1NvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3M9ZmFsc2U7ZnVuY3Rpb24gb25UcmFuc3BvcnRPcGVuKCl7aWYoc2VsZi5vbmx5QmluYXJ5VXBncmFkZXMpe3ZhciB1cGdyYWRlTG9zZXNCaW5hcnk9IXRoaXMuc3VwcG9ydHNCaW5hcnkmJnNlbGYudHJhbnNwb3J0LnN1cHBvcnRzQmluYXJ5O2ZhaWxlZD1mYWlsZWR8fHVwZ3JhZGVMb3Nlc0JpbmFyeX1pZihmYWlsZWQpcmV0dXJuO2RlYnVnKCdwcm9iZSB0cmFuc3BvcnQgXCIlc1wiIG9wZW5lZCcsbmFtZSk7dHJhbnNwb3J0LnNlbmQoW3t0eXBlOlwicGluZ1wiLGRhdGE6XCJwcm9iZVwifV0pO3RyYW5zcG9ydC5vbmNlKFwicGFja2V0XCIsZnVuY3Rpb24obXNnKXtpZihmYWlsZWQpcmV0dXJuO2lmKFwicG9uZ1wiPT1tc2cudHlwZSYmXCJwcm9iZVwiPT1tc2cuZGF0YSl7ZGVidWcoJ3Byb2JlIHRyYW5zcG9ydCBcIiVzXCIgcG9uZycsbmFtZSk7c2VsZi51cGdyYWRpbmc9dHJ1ZTtzZWxmLmVtaXQoXCJ1cGdyYWRpbmdcIix0cmFuc3BvcnQpO2lmKCF0cmFuc3BvcnQpcmV0dXJuO1NvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3M9XCJ3ZWJzb2NrZXRcIj09dHJhbnNwb3J0Lm5hbWU7ZGVidWcoJ3BhdXNpbmcgY3VycmVudCB0cmFuc3BvcnQgXCIlc1wiJyxzZWxmLnRyYW5zcG9ydC5uYW1lKTtzZWxmLnRyYW5zcG9ydC5wYXVzZShmdW5jdGlvbigpe2lmKGZhaWxlZClyZXR1cm47aWYoXCJjbG9zZWRcIj09c2VsZi5yZWFkeVN0YXRlKXJldHVybjtkZWJ1ZyhcImNoYW5naW5nIHRyYW5zcG9ydCBhbmQgc2VuZGluZyB1cGdyYWRlIHBhY2tldFwiKTtjbGVhbnVwKCk7c2VsZi5zZXRUcmFuc3BvcnQodHJhbnNwb3J0KTt0cmFuc3BvcnQuc2VuZChbe3R5cGU6XCJ1cGdyYWRlXCJ9XSk7c2VsZi5lbWl0KFwidXBncmFkZVwiLHRyYW5zcG9ydCk7dHJhbnNwb3J0PW51bGw7c2VsZi51cGdyYWRpbmc9ZmFsc2U7c2VsZi5mbHVzaCgpfSl9ZWxzZXtkZWJ1ZygncHJvYmUgdHJhbnNwb3J0IFwiJXNcIiBmYWlsZWQnLG5hbWUpO3ZhciBlcnI9bmV3IEVycm9yKFwicHJvYmUgZXJyb3JcIik7ZXJyLnRyYW5zcG9ydD10cmFuc3BvcnQubmFtZTtzZWxmLmVtaXQoXCJ1cGdyYWRlRXJyb3JcIixlcnIpfX0pfWZ1bmN0aW9uIGZyZWV6ZVRyYW5zcG9ydCgpe2lmKGZhaWxlZClyZXR1cm47ZmFpbGVkPXRydWU7Y2xlYW51cCgpO3RyYW5zcG9ydC5jbG9zZSgpO3RyYW5zcG9ydD1udWxsfWZ1bmN0aW9uIG9uZXJyb3IoZXJyKXt2YXIgZXJyb3I9bmV3IEVycm9yKFwicHJvYmUgZXJyb3I6IFwiK2Vycik7ZXJyb3IudHJhbnNwb3J0PXRyYW5zcG9ydC5uYW1lO2ZyZWV6ZVRyYW5zcG9ydCgpO2RlYnVnKCdwcm9iZSB0cmFuc3BvcnQgXCIlc1wiIGZhaWxlZCBiZWNhdXNlIG9mIGVycm9yOiAlcycsbmFtZSxlcnIpO3NlbGYuZW1pdChcInVwZ3JhZGVFcnJvclwiLGVycm9yKX1mdW5jdGlvbiBvblRyYW5zcG9ydENsb3NlKCl7b25lcnJvcihcInRyYW5zcG9ydCBjbG9zZWRcIil9ZnVuY3Rpb24gb25jbG9zZSgpe29uZXJyb3IoXCJzb2NrZXQgY2xvc2VkXCIpfWZ1bmN0aW9uIG9udXBncmFkZSh0byl7aWYodHJhbnNwb3J0JiZ0by5uYW1lIT10cmFuc3BvcnQubmFtZSl7ZGVidWcoJ1wiJXNcIiB3b3JrcyAtIGFib3J0aW5nIFwiJXNcIicsdG8ubmFtZSx0cmFuc3BvcnQubmFtZSk7ZnJlZXplVHJhbnNwb3J0KCl9fWZ1bmN0aW9uIGNsZWFudXAoKXt0cmFuc3BvcnQucmVtb3ZlTGlzdGVuZXIoXCJvcGVuXCIsb25UcmFuc3BvcnRPcGVuKTt0cmFuc3BvcnQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLG9uZXJyb3IpO3RyYW5zcG9ydC5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsb25UcmFuc3BvcnRDbG9zZSk7c2VsZi5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsb25jbG9zZSk7c2VsZi5yZW1vdmVMaXN0ZW5lcihcInVwZ3JhZGluZ1wiLG9udXBncmFkZSl9dHJhbnNwb3J0Lm9uY2UoXCJvcGVuXCIsb25UcmFuc3BvcnRPcGVuKTt0cmFuc3BvcnQub25jZShcImVycm9yXCIsb25lcnJvcik7dHJhbnNwb3J0Lm9uY2UoXCJjbG9zZVwiLG9uVHJhbnNwb3J0Q2xvc2UpO3RoaXMub25jZShcImNsb3NlXCIsb25jbG9zZSk7dGhpcy5vbmNlKFwidXBncmFkaW5nXCIsb251cGdyYWRlKTt0cmFuc3BvcnQub3BlbigpfTtTb2NrZXQucHJvdG90eXBlLm9uT3Blbj1mdW5jdGlvbigpe2RlYnVnKFwic29ja2V0IG9wZW5cIik7dGhpcy5yZWFkeVN0YXRlPVwib3BlblwiO1NvY2tldC5wcmlvcldlYnNvY2tldFN1Y2Nlc3M9XCJ3ZWJzb2NrZXRcIj09dGhpcy50cmFuc3BvcnQubmFtZTt0aGlzLmVtaXQoXCJvcGVuXCIpO3RoaXMuZmx1c2goKTtpZihcIm9wZW5cIj09dGhpcy5yZWFkeVN0YXRlJiZ0aGlzLnVwZ3JhZGUmJnRoaXMudHJhbnNwb3J0LnBhdXNlKXtkZWJ1ZyhcInN0YXJ0aW5nIHVwZ3JhZGUgcHJvYmVzXCIpO2Zvcih2YXIgaT0wLGw9dGhpcy51cGdyYWRlcy5sZW5ndGg7aTxsO2krKyl7dGhpcy5wcm9iZSh0aGlzLnVwZ3JhZGVzW2ldKX19fTtTb2NrZXQucHJvdG90eXBlLm9uUGFja2V0PWZ1bmN0aW9uKHBhY2tldCl7aWYoXCJvcGVuaW5nXCI9PXRoaXMucmVhZHlTdGF0ZXx8XCJvcGVuXCI9PXRoaXMucmVhZHlTdGF0ZSl7ZGVidWcoJ3NvY2tldCByZWNlaXZlOiB0eXBlIFwiJXNcIiwgZGF0YSBcIiVzXCInLHBhY2tldC50eXBlLHBhY2tldC5kYXRhKTt0aGlzLmVtaXQoXCJwYWNrZXRcIixwYWNrZXQpO3RoaXMuZW1pdChcImhlYXJ0YmVhdFwiKTtzd2l0Y2gocGFja2V0LnR5cGUpe2Nhc2VcIm9wZW5cIjp0aGlzLm9uSGFuZHNoYWtlKHBhcnNlanNvbihwYWNrZXQuZGF0YSkpO2JyZWFrO2Nhc2VcInBvbmdcIjp0aGlzLnNldFBpbmcoKTt0aGlzLmVtaXQoXCJwb25nXCIpO2JyZWFrO2Nhc2VcImVycm9yXCI6dmFyIGVycj1uZXcgRXJyb3IoXCJzZXJ2ZXIgZXJyb3JcIik7ZXJyLmNvZGU9cGFja2V0LmRhdGE7dGhpcy5vbkVycm9yKGVycik7YnJlYWs7Y2FzZVwibWVzc2FnZVwiOnRoaXMuZW1pdChcImRhdGFcIixwYWNrZXQuZGF0YSk7dGhpcy5lbWl0KFwibWVzc2FnZVwiLHBhY2tldC5kYXRhKTticmVha319ZWxzZXtkZWJ1ZygncGFja2V0IHJlY2VpdmVkIHdpdGggc29ja2V0IHJlYWR5U3RhdGUgXCIlc1wiJyx0aGlzLnJlYWR5U3RhdGUpfX07U29ja2V0LnByb3RvdHlwZS5vbkhhbmRzaGFrZT1mdW5jdGlvbihkYXRhKXt0aGlzLmVtaXQoXCJoYW5kc2hha2VcIixkYXRhKTt0aGlzLmlkPWRhdGEuc2lkO3RoaXMudHJhbnNwb3J0LnF1ZXJ5LnNpZD1kYXRhLnNpZDt0aGlzLnVwZ3JhZGVzPXRoaXMuZmlsdGVyVXBncmFkZXMoZGF0YS51cGdyYWRlcyk7dGhpcy5waW5nSW50ZXJ2YWw9ZGF0YS5waW5nSW50ZXJ2YWw7dGhpcy5waW5nVGltZW91dD1kYXRhLnBpbmdUaW1lb3V0O3RoaXMub25PcGVuKCk7aWYoXCJjbG9zZWRcIj09dGhpcy5yZWFkeVN0YXRlKXJldHVybjt0aGlzLnNldFBpbmcoKTt0aGlzLnJlbW92ZUxpc3RlbmVyKFwiaGVhcnRiZWF0XCIsdGhpcy5vbkhlYXJ0YmVhdCk7dGhpcy5vbihcImhlYXJ0YmVhdFwiLHRoaXMub25IZWFydGJlYXQpfTtTb2NrZXQucHJvdG90eXBlLm9uSGVhcnRiZWF0PWZ1bmN0aW9uKHRpbWVvdXQpe2NsZWFyVGltZW91dCh0aGlzLnBpbmdUaW1lb3V0VGltZXIpO3ZhciBzZWxmPXRoaXM7c2VsZi5waW5nVGltZW91dFRpbWVyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihcImNsb3NlZFwiPT1zZWxmLnJlYWR5U3RhdGUpcmV0dXJuO3NlbGYub25DbG9zZShcInBpbmcgdGltZW91dFwiKX0sdGltZW91dHx8c2VsZi5waW5nSW50ZXJ2YWwrc2VsZi5waW5nVGltZW91dCl9O1NvY2tldC5wcm90b3R5cGUuc2V0UGluZz1mdW5jdGlvbigpe3ZhciBzZWxmPXRoaXM7Y2xlYXJUaW1lb3V0KHNlbGYucGluZ0ludGVydmFsVGltZXIpO3NlbGYucGluZ0ludGVydmFsVGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe2RlYnVnKFwid3JpdGluZyBwaW5nIHBhY2tldCAtIGV4cGVjdGluZyBwb25nIHdpdGhpbiAlc21zXCIsc2VsZi5waW5nVGltZW91dCk7c2VsZi5waW5nKCk7c2VsZi5vbkhlYXJ0YmVhdChzZWxmLnBpbmdUaW1lb3V0KX0sc2VsZi5waW5nSW50ZXJ2YWwpfTtTb2NrZXQucHJvdG90eXBlLnBpbmc9ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO3RoaXMuc2VuZFBhY2tldChcInBpbmdcIixmdW5jdGlvbigpe3NlbGYuZW1pdChcInBpbmdcIil9KX07U29ja2V0LnByb3RvdHlwZS5vbkRyYWluPWZ1bmN0aW9uKCl7dGhpcy53cml0ZUJ1ZmZlci5zcGxpY2UoMCx0aGlzLnByZXZCdWZmZXJMZW4pO3RoaXMucHJldkJ1ZmZlckxlbj0wO2lmKDA9PT10aGlzLndyaXRlQnVmZmVyLmxlbmd0aCl7dGhpcy5lbWl0KFwiZHJhaW5cIil9ZWxzZXt0aGlzLmZsdXNoKCl9fTtTb2NrZXQucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7aWYoXCJjbG9zZWRcIiE9dGhpcy5yZWFkeVN0YXRlJiZ0aGlzLnRyYW5zcG9ydC53cml0YWJsZSYmIXRoaXMudXBncmFkaW5nJiZ0aGlzLndyaXRlQnVmZmVyLmxlbmd0aCl7ZGVidWcoXCJmbHVzaGluZyAlZCBwYWNrZXRzIGluIHNvY2tldFwiLHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoKTt0aGlzLnRyYW5zcG9ydC5zZW5kKHRoaXMud3JpdGVCdWZmZXIpO3RoaXMucHJldkJ1ZmZlckxlbj10aGlzLndyaXRlQnVmZmVyLmxlbmd0aDt0aGlzLmVtaXQoXCJmbHVzaFwiKX19O1NvY2tldC5wcm90b3R5cGUud3JpdGU9U29ja2V0LnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKG1zZyxvcHRpb25zLGZuKXt0aGlzLnNlbmRQYWNrZXQoXCJtZXNzYWdlXCIsbXNnLG9wdGlvbnMsZm4pO3JldHVybiB0aGlzfTtTb2NrZXQucHJvdG90eXBlLnNlbmRQYWNrZXQ9ZnVuY3Rpb24odHlwZSxkYXRhLG9wdGlvbnMsZm4pe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGRhdGEpe2ZuPWRhdGE7ZGF0YT11bmRlZmluZWR9aWYoXCJmdW5jdGlvblwiPT10eXBlb2Ygb3B0aW9ucyl7Zm49b3B0aW9ucztvcHRpb25zPW51bGx9aWYoXCJjbG9zaW5nXCI9PXRoaXMucmVhZHlTdGF0ZXx8XCJjbG9zZWRcIj09dGhpcy5yZWFkeVN0YXRlKXtyZXR1cm59b3B0aW9ucz1vcHRpb25zfHx7fTtvcHRpb25zLmNvbXByZXNzPWZhbHNlIT09b3B0aW9ucy5jb21wcmVzczt2YXIgcGFja2V0PXt0eXBlOnR5cGUsZGF0YTpkYXRhLG9wdGlvbnM6b3B0aW9uc307dGhpcy5lbWl0KFwicGFja2V0Q3JlYXRlXCIscGFja2V0KTt0aGlzLndyaXRlQnVmZmVyLnB1c2gocGFja2V0KTtpZihmbil0aGlzLm9uY2UoXCJmbHVzaFwiLGZuKTt0aGlzLmZsdXNoKCl9O1NvY2tldC5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXtpZihcIm9wZW5pbmdcIj09dGhpcy5yZWFkeVN0YXRlfHxcIm9wZW5cIj09dGhpcy5yZWFkeVN0YXRlKXt0aGlzLnJlYWR5U3RhdGU9XCJjbG9zaW5nXCI7dmFyIHNlbGY9dGhpcztpZih0aGlzLndyaXRlQnVmZmVyLmxlbmd0aCl7dGhpcy5vbmNlKFwiZHJhaW5cIixmdW5jdGlvbigpe2lmKHRoaXMudXBncmFkaW5nKXt3YWl0Rm9yVXBncmFkZSgpfWVsc2V7Y2xvc2UoKX19KX1lbHNlIGlmKHRoaXMudXBncmFkaW5nKXt3YWl0Rm9yVXBncmFkZSgpfWVsc2V7Y2xvc2UoKX19ZnVuY3Rpb24gY2xvc2UoKXtzZWxmLm9uQ2xvc2UoXCJmb3JjZWQgY2xvc2VcIik7ZGVidWcoXCJzb2NrZXQgY2xvc2luZyAtIHRlbGxpbmcgdHJhbnNwb3J0IHRvIGNsb3NlXCIpO3NlbGYudHJhbnNwb3J0LmNsb3NlKCl9ZnVuY3Rpb24gY2xlYW51cEFuZENsb3NlKCl7c2VsZi5yZW1vdmVMaXN0ZW5lcihcInVwZ3JhZGVcIixjbGVhbnVwQW5kQ2xvc2UpO3NlbGYucmVtb3ZlTGlzdGVuZXIoXCJ1cGdyYWRlRXJyb3JcIixjbGVhbnVwQW5kQ2xvc2UpO2Nsb3NlKCl9ZnVuY3Rpb24gd2FpdEZvclVwZ3JhZGUoKXtzZWxmLm9uY2UoXCJ1cGdyYWRlXCIsY2xlYW51cEFuZENsb3NlKTtzZWxmLm9uY2UoXCJ1cGdyYWRlRXJyb3JcIixjbGVhbnVwQW5kQ2xvc2UpfXJldHVybiB0aGlzfTtTb2NrZXQucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24oZXJyKXtkZWJ1ZyhcInNvY2tldCBlcnJvciAlalwiLGVycik7U29ja2V0LnByaW9yV2Vic29ja2V0U3VjY2Vzcz1mYWxzZTt0aGlzLmVtaXQoXCJlcnJvclwiLGVycik7dGhpcy5vbkNsb3NlKFwidHJhbnNwb3J0IGVycm9yXCIsZXJyKX07U29ja2V0LnByb3RvdHlwZS5vbkNsb3NlPWZ1bmN0aW9uKHJlYXNvbixkZXNjKXtpZihcIm9wZW5pbmdcIj09dGhpcy5yZWFkeVN0YXRlfHxcIm9wZW5cIj09dGhpcy5yZWFkeVN0YXRlfHxcImNsb3NpbmdcIj09dGhpcy5yZWFkeVN0YXRlKXtkZWJ1Zygnc29ja2V0IGNsb3NlIHdpdGggcmVhc29uOiBcIiVzXCInLHJlYXNvbik7dmFyIHNlbGY9dGhpcztjbGVhclRpbWVvdXQodGhpcy5waW5nSW50ZXJ2YWxUaW1lcik7Y2xlYXJUaW1lb3V0KHRoaXMucGluZ1RpbWVvdXRUaW1lcik7dGhpcy50cmFuc3BvcnQucmVtb3ZlQWxsTGlzdGVuZXJzKFwiY2xvc2VcIik7dGhpcy50cmFuc3BvcnQuY2xvc2UoKTt0aGlzLnRyYW5zcG9ydC5yZW1vdmVBbGxMaXN0ZW5lcnMoKTt0aGlzLnJlYWR5U3RhdGU9XCJjbG9zZWRcIjt0aGlzLmlkPW51bGw7dGhpcy5lbWl0KFwiY2xvc2VcIixyZWFzb24sZGVzYyk7c2VsZi53cml0ZUJ1ZmZlcj1bXTtzZWxmLnByZXZCdWZmZXJMZW49MH19O1NvY2tldC5wcm90b3R5cGUuZmlsdGVyVXBncmFkZXM9ZnVuY3Rpb24odXBncmFkZXMpe3ZhciBmaWx0ZXJlZFVwZ3JhZGVzPVtdO2Zvcih2YXIgaT0wLGo9dXBncmFkZXMubGVuZ3RoO2k8ajtpKyspe2lmKH5pbmRleCh0aGlzLnRyYW5zcG9ydHMsdXBncmFkZXNbaV0pKWZpbHRlcmVkVXBncmFkZXMucHVzaCh1cGdyYWRlc1tpXSl9cmV0dXJuIGZpbHRlcmVkVXBncmFkZXN9fSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIj9zZWxmOnR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIj9nbG9iYWw6e30pfSx7XCIuL3RyYW5zcG9ydFwiOjQsXCIuL3RyYW5zcG9ydHNcIjo1LFwiY29tcG9uZW50LWVtaXR0ZXJcIjoxNSxkZWJ1ZzoxNyxcImVuZ2luZS5pby1wYXJzZXJcIjoxOSxpbmRleG9mOjIzLHBhcnNlanNvbjoyNixwYXJzZXFzOjI3LHBhcnNldXJpOjI4fV0sNDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7dmFyIHBhcnNlcj1fZGVyZXFfKFwiZW5naW5lLmlvLXBhcnNlclwiKTt2YXIgRW1pdHRlcj1fZGVyZXFfKFwiY29tcG9uZW50LWVtaXR0ZXJcIik7bW9kdWxlLmV4cG9ydHM9VHJhbnNwb3J0O2Z1bmN0aW9uIFRyYW5zcG9ydChvcHRzKXt0aGlzLnBhdGg9b3B0cy5wYXRoO3RoaXMuaG9zdG5hbWU9b3B0cy5ob3N0bmFtZTt0aGlzLnBvcnQ9b3B0cy5wb3J0O3RoaXMuc2VjdXJlPW9wdHMuc2VjdXJlO3RoaXMucXVlcnk9b3B0cy5xdWVyeTt0aGlzLnRpbWVzdGFtcFBhcmFtPW9wdHMudGltZXN0YW1wUGFyYW07dGhpcy50aW1lc3RhbXBSZXF1ZXN0cz1vcHRzLnRpbWVzdGFtcFJlcXVlc3RzO3RoaXMucmVhZHlTdGF0ZT1cIlwiO3RoaXMuYWdlbnQ9b3B0cy5hZ2VudHx8ZmFsc2U7dGhpcy5zb2NrZXQ9b3B0cy5zb2NrZXQ7dGhpcy5lbmFibGVzWERSPW9wdHMuZW5hYmxlc1hEUjt0aGlzLnBmeD1vcHRzLnBmeDt0aGlzLmtleT1vcHRzLmtleTt0aGlzLnBhc3NwaHJhc2U9b3B0cy5wYXNzcGhyYXNlO3RoaXMuY2VydD1vcHRzLmNlcnQ7dGhpcy5jYT1vcHRzLmNhO3RoaXMuY2lwaGVycz1vcHRzLmNpcGhlcnM7dGhpcy5yZWplY3RVbmF1dGhvcml6ZWQ9b3B0cy5yZWplY3RVbmF1dGhvcml6ZWQ7dGhpcy5leHRyYUhlYWRlcnM9b3B0cy5leHRyYUhlYWRlcnN9RW1pdHRlcihUcmFuc3BvcnQucHJvdG90eXBlKTtUcmFuc3BvcnQucHJvdG90eXBlLm9uRXJyb3I9ZnVuY3Rpb24obXNnLGRlc2Mpe3ZhciBlcnI9bmV3IEVycm9yKG1zZyk7ZXJyLnR5cGU9XCJUcmFuc3BvcnRFcnJvclwiO2Vyci5kZXNjcmlwdGlvbj1kZXNjO3RoaXMuZW1pdChcImVycm9yXCIsZXJyKTtyZXR1cm4gdGhpc307VHJhbnNwb3J0LnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKCl7aWYoXCJjbG9zZWRcIj09dGhpcy5yZWFkeVN0YXRlfHxcIlwiPT10aGlzLnJlYWR5U3RhdGUpe3RoaXMucmVhZHlTdGF0ZT1cIm9wZW5pbmdcIjt0aGlzLmRvT3BlbigpfXJldHVybiB0aGlzfTtUcmFuc3BvcnQucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7aWYoXCJvcGVuaW5nXCI9PXRoaXMucmVhZHlTdGF0ZXx8XCJvcGVuXCI9PXRoaXMucmVhZHlTdGF0ZSl7dGhpcy5kb0Nsb3NlKCk7dGhpcy5vbkNsb3NlKCl9cmV0dXJuIHRoaXN9O1RyYW5zcG9ydC5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihwYWNrZXRzKXtpZihcIm9wZW5cIj09dGhpcy5yZWFkeVN0YXRlKXt0aGlzLndyaXRlKHBhY2tldHMpfWVsc2V7dGhyb3cgbmV3IEVycm9yKFwiVHJhbnNwb3J0IG5vdCBvcGVuXCIpfX07VHJhbnNwb3J0LnByb3RvdHlwZS5vbk9wZW49ZnVuY3Rpb24oKXt0aGlzLnJlYWR5U3RhdGU9XCJvcGVuXCI7dGhpcy53cml0YWJsZT10cnVlO3RoaXMuZW1pdChcIm9wZW5cIil9O1RyYW5zcG9ydC5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKGRhdGEpe3ZhciBwYWNrZXQ9cGFyc2VyLmRlY29kZVBhY2tldChkYXRhLHRoaXMuc29ja2V0LmJpbmFyeVR5cGUpO3RoaXMub25QYWNrZXQocGFja2V0KX07VHJhbnNwb3J0LnByb3RvdHlwZS5vblBhY2tldD1mdW5jdGlvbihwYWNrZXQpe3RoaXMuZW1pdChcInBhY2tldFwiLHBhY2tldCl9O1RyYW5zcG9ydC5wcm90b3R5cGUub25DbG9zZT1mdW5jdGlvbigpe3RoaXMucmVhZHlTdGF0ZT1cImNsb3NlZFwiO3RoaXMuZW1pdChcImNsb3NlXCIpfX0se1wiY29tcG9uZW50LWVtaXR0ZXJcIjoxNSxcImVuZ2luZS5pby1wYXJzZXJcIjoxOX1dLDU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpe3ZhciBYTUxIdHRwUmVxdWVzdD1fZGVyZXFfKFwieG1saHR0cHJlcXVlc3Qtc3NsXCIpO3ZhciBYSFI9X2RlcmVxXyhcIi4vcG9sbGluZy14aHJcIik7dmFyIEpTT05QPV9kZXJlcV8oXCIuL3BvbGxpbmctanNvbnBcIik7dmFyIHdlYnNvY2tldD1fZGVyZXFfKFwiLi93ZWJzb2NrZXRcIik7ZXhwb3J0cy5wb2xsaW5nPXBvbGxpbmc7ZXhwb3J0cy53ZWJzb2NrZXQ9d2Vic29ja2V0O2Z1bmN0aW9uIHBvbGxpbmcob3B0cyl7dmFyIHhocjt2YXIgeGQ9ZmFsc2U7dmFyIHhzPWZhbHNlO3ZhciBqc29ucD1mYWxzZSE9PW9wdHMuanNvbnA7aWYoZ2xvYmFsLmxvY2F0aW9uKXt2YXIgaXNTU0w9XCJodHRwczpcIj09bG9jYXRpb24ucHJvdG9jb2w7dmFyIHBvcnQ9bG9jYXRpb24ucG9ydDtpZighcG9ydCl7cG9ydD1pc1NTTD80NDM6ODB9eGQ9b3B0cy5ob3N0bmFtZSE9bG9jYXRpb24uaG9zdG5hbWV8fHBvcnQhPW9wdHMucG9ydDt4cz1vcHRzLnNlY3VyZSE9aXNTU0x9b3B0cy54ZG9tYWluPXhkO29wdHMueHNjaGVtZT14czt4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0KG9wdHMpO2lmKFwib3BlblwiaW4geGhyJiYhb3B0cy5mb3JjZUpTT05QKXtyZXR1cm4gbmV3IFhIUihvcHRzKX1lbHNle2lmKCFqc29ucCl0aHJvdyBuZXcgRXJyb3IoXCJKU09OUCBkaXNhYmxlZFwiKTtyZXR1cm4gbmV3IEpTT05QKG9wdHMpfX19KS5jYWxsKHRoaXMsdHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiP3NlbGY6dHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCI/d2luZG93OnR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiP2dsb2JhbDp7fSl9LHtcIi4vcG9sbGluZy1qc29ucFwiOjYsXCIuL3BvbGxpbmcteGhyXCI6NyxcIi4vd2Vic29ja2V0XCI6OSxcInhtbGh0dHByZXF1ZXN0LXNzbFwiOjEwfV0sNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKGdsb2JhbCl7dmFyIFBvbGxpbmc9X2RlcmVxXyhcIi4vcG9sbGluZ1wiKTt2YXIgaW5oZXJpdD1fZGVyZXFfKFwiY29tcG9uZW50LWluaGVyaXRcIik7bW9kdWxlLmV4cG9ydHM9SlNPTlBQb2xsaW5nO3ZhciByTmV3bGluZT0vXFxuL2c7dmFyIHJFc2NhcGVkTmV3bGluZT0vXFxcXG4vZzt2YXIgY2FsbGJhY2tzO3ZhciBpbmRleD0wO2Z1bmN0aW9uIGVtcHR5KCl7fWZ1bmN0aW9uIEpTT05QUG9sbGluZyhvcHRzKXtQb2xsaW5nLmNhbGwodGhpcyxvcHRzKTt0aGlzLnF1ZXJ5PXRoaXMucXVlcnl8fHt9O2lmKCFjYWxsYmFja3Mpe2lmKCFnbG9iYWwuX19fZWlvKWdsb2JhbC5fX19laW89W107Y2FsbGJhY2tzPWdsb2JhbC5fX19laW99dGhpcy5pbmRleD1jYWxsYmFja3MubGVuZ3RoO3ZhciBzZWxmPXRoaXM7Y2FsbGJhY2tzLnB1c2goZnVuY3Rpb24obXNnKXtzZWxmLm9uRGF0YShtc2cpfSk7dGhpcy5xdWVyeS5qPXRoaXMuaW5kZXg7aWYoZ2xvYmFsLmRvY3VtZW50JiZnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcil7Z2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIixmdW5jdGlvbigpe2lmKHNlbGYuc2NyaXB0KXNlbGYuc2NyaXB0Lm9uZXJyb3I9ZW1wdHl9LGZhbHNlKX19aW5oZXJpdChKU09OUFBvbGxpbmcsUG9sbGluZyk7SlNPTlBQb2xsaW5nLnByb3RvdHlwZS5zdXBwb3J0c0JpbmFyeT1mYWxzZTtKU09OUFBvbGxpbmcucHJvdG90eXBlLmRvQ2xvc2U9ZnVuY3Rpb24oKXtpZih0aGlzLnNjcmlwdCl7dGhpcy5zY3JpcHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnNjcmlwdCk7dGhpcy5zY3JpcHQ9bnVsbH1pZih0aGlzLmZvcm0pe3RoaXMuZm9ybS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZm9ybSk7dGhpcy5mb3JtPW51bGw7dGhpcy5pZnJhbWU9bnVsbH1Qb2xsaW5nLnByb3RvdHlwZS5kb0Nsb3NlLmNhbGwodGhpcyl9O0pTT05QUG9sbGluZy5wcm90b3R5cGUuZG9Qb2xsPWZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpczt2YXIgc2NyaXB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7aWYodGhpcy5zY3JpcHQpe3RoaXMuc2NyaXB0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zY3JpcHQpO3RoaXMuc2NyaXB0PW51bGx9c2NyaXB0LmFzeW5jPXRydWU7c2NyaXB0LnNyYz10aGlzLnVyaSgpO3NjcmlwdC5vbmVycm9yPWZ1bmN0aW9uKGUpe3NlbGYub25FcnJvcihcImpzb25wIHBvbGwgZXJyb3JcIixlKX07dmFyIGluc2VydEF0PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic2NyaXB0XCIpWzBdO2lmKGluc2VydEF0KXtpbnNlcnRBdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzY3JpcHQsaW5zZXJ0QXQpfWVsc2V7KGRvY3VtZW50LmhlYWR8fGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKHNjcmlwdCl9dGhpcy5zY3JpcHQ9c2NyaXB0O3ZhciBpc1VBZ2Vja289XCJ1bmRlZmluZWRcIiE9dHlwZW9mIG5hdmlnYXRvciYmL2dlY2tvL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZihpc1VBZ2Vja28pe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgaWZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpZnJhbWUpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoaWZyYW1lKX0sMTAwKX19O0pTT05QUG9sbGluZy5wcm90b3R5cGUuZG9Xcml0ZT1mdW5jdGlvbihkYXRhLGZuKXt2YXIgc2VsZj10aGlzO2lmKCF0aGlzLmZvcm0pe3ZhciBmb3JtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmb3JtXCIpO3ZhciBhcmVhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTt2YXIgaWQ9dGhpcy5pZnJhbWVJZD1cImVpb19pZnJhbWVfXCIrdGhpcy5pbmRleDt2YXIgaWZyYW1lO2Zvcm0uY2xhc3NOYW1lPVwic29ja2V0aW9cIjtmb3JtLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIjtmb3JtLnN0eWxlLnRvcD1cIi0xMDAwcHhcIjtmb3JtLnN0eWxlLmxlZnQ9XCItMTAwMHB4XCI7Zm9ybS50YXJnZXQ9aWQ7Zm9ybS5tZXRob2Q9XCJQT1NUXCI7Zm9ybS5zZXRBdHRyaWJ1dGUoXCJhY2NlcHQtY2hhcnNldFwiLFwidXRmLThcIik7YXJlYS5uYW1lPVwiZFwiO2Zvcm0uYXBwZW5kQ2hpbGQoYXJlYSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTt0aGlzLmZvcm09Zm9ybTt0aGlzLmFyZWE9YXJlYX10aGlzLmZvcm0uYWN0aW9uPXRoaXMudXJpKCk7ZnVuY3Rpb24gY29tcGxldGUoKXtpbml0SWZyYW1lKCk7Zm4oKX1mdW5jdGlvbiBpbml0SWZyYW1lKCl7aWYoc2VsZi5pZnJhbWUpe3RyeXtzZWxmLmZvcm0ucmVtb3ZlQ2hpbGQoc2VsZi5pZnJhbWUpfWNhdGNoKGUpe3NlbGYub25FcnJvcihcImpzb25wIHBvbGxpbmcgaWZyYW1lIHJlbW92YWwgZXJyb3JcIixlKX19dHJ5e3ZhciBodG1sPSc8aWZyYW1lIHNyYz1cImphdmFzY3JpcHQ6MFwiIG5hbWU9XCInK3NlbGYuaWZyYW1lSWQrJ1wiPic7aWZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaHRtbCl9Y2F0Y2goZSl7aWZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7aWZyYW1lLm5hbWU9c2VsZi5pZnJhbWVJZDtpZnJhbWUuc3JjPVwiamF2YXNjcmlwdDowXCJ9aWZyYW1lLmlkPXNlbGYuaWZyYW1lSWQ7c2VsZi5mb3JtLmFwcGVuZENoaWxkKGlmcmFtZSk7c2VsZi5pZnJhbWU9aWZyYW1lfWluaXRJZnJhbWUoKTtkYXRhPWRhdGEucmVwbGFjZShyRXNjYXBlZE5ld2xpbmUsXCJcXFxcXFxuXCIpO3RoaXMuYXJlYS52YWx1ZT1kYXRhLnJlcGxhY2Uock5ld2xpbmUsXCJcXFxcblwiKTt0cnl7dGhpcy5mb3JtLnN1Ym1pdCgpfWNhdGNoKGUpe31pZih0aGlzLmlmcmFtZS5hdHRhY2hFdmVudCl7dGhpcy5pZnJhbWUub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoc2VsZi5pZnJhbWUucmVhZHlTdGF0ZT09XCJjb21wbGV0ZVwiKXtjb21wbGV0ZSgpfX19ZWxzZXt0aGlzLmlmcmFtZS5vbmxvYWQ9Y29tcGxldGV9fX0pLmNhbGwodGhpcyx0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCI/c2VsZjp0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIj93aW5kb3c6dHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCI/Z2xvYmFsOnt9KX0se1wiLi9wb2xsaW5nXCI6OCxcImNvbXBvbmVudC1pbmhlcml0XCI6MTZ9XSw3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24oZ2xvYmFsKXt2YXIgWE1MSHR0cFJlcXVlc3Q9X2RlcmVxXyhcInhtbGh0dHByZXF1ZXN0LXNzbFwiKTt2YXIgUG9sbGluZz1fZGVyZXFfKFwiLi9wb2xsaW5nXCIpO3ZhciBFbWl0dGVyPV9kZXJlcV8oXCJjb21wb25lbnQtZW1pdHRlclwiKTt2YXIgaW5oZXJpdD1fZGVyZXFfKFwiY29tcG9uZW50LWluaGVyaXRcIik7dmFyIGRlYnVnPV9kZXJlcV8oXCJkZWJ1Z1wiKShcImVuZ2luZS5pby1jbGllbnQ6cG9sbGluZy14aHJcIik7bW9kdWxlLmV4cG9ydHM9WEhSO21vZHVsZS5leHBvcnRzLlJlcXVlc3Q9UmVxdWVzdDtmdW5jdGlvbiBlbXB0eSgpe31mdW5jdGlvbiBYSFIob3B0cyl7UG9sbGluZy5jYWxsKHRoaXMsb3B0cyk7aWYoZ2xvYmFsLmxvY2F0aW9uKXt2YXIgaXNTU0w9XCJodHRwczpcIj09bG9jYXRpb24ucHJvdG9jb2w7dmFyIHBvcnQ9bG9jYXRpb24ucG9ydDtpZighcG9ydCl7cG9ydD1pc1NTTD80NDM6ODB9dGhpcy54ZD1vcHRzLmhvc3RuYW1lIT1nbG9iYWwubG9jYXRpb24uaG9zdG5hbWV8fHBvcnQhPW9wdHMucG9ydDt0aGlzLnhzPW9wdHMuc2VjdXJlIT1pc1NTTH1lbHNle3RoaXMuZXh0cmFIZWFkZXJzPW9wdHMuZXh0cmFIZWFkZXJzfX1pbmhlcml0KFhIUixQb2xsaW5nKTtYSFIucHJvdG90eXBlLnN1cHBvcnRzQmluYXJ5PXRydWU7WEhSLnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKG9wdHMpe29wdHM9b3B0c3x8e307b3B0cy51cmk9dGhpcy51cmkoKTtvcHRzLnhkPXRoaXMueGQ7b3B0cy54cz10aGlzLnhzO29wdHMuYWdlbnQ9dGhpcy5hZ2VudHx8ZmFsc2U7b3B0cy5zdXBwb3J0c0JpbmFyeT10aGlzLnN1cHBvcnRzQmluYXJ5O29wdHMuZW5hYmxlc1hEUj10aGlzLmVuYWJsZXNYRFI7b3B0cy5wZng9dGhpcy5wZng7b3B0cy5rZXk9dGhpcy5rZXk7b3B0cy5wYXNzcGhyYXNlPXRoaXMucGFzc3BocmFzZTtvcHRzLmNlcnQ9dGhpcy5jZXJ0O29wdHMuY2E9dGhpcy5jYTtvcHRzLmNpcGhlcnM9dGhpcy5jaXBoZXJzO29wdHMucmVqZWN0VW5hdXRob3JpemVkPXRoaXMucmVqZWN0VW5hdXRob3JpemVkO29wdHMuZXh0cmFIZWFkZXJzPXRoaXMuZXh0cmFIZWFkZXJzO3JldHVybiBuZXcgUmVxdWVzdChvcHRzKX07WEhSLnByb3RvdHlwZS5kb1dyaXRlPWZ1bmN0aW9uKGRhdGEsZm4pe3ZhciBpc0JpbmFyeT10eXBlb2YgZGF0YSE9PVwic3RyaW5nXCImJmRhdGEhPT11bmRlZmluZWQ7dmFyIHJlcT10aGlzLnJlcXVlc3Qoe21ldGhvZDpcIlBPU1RcIixkYXRhOmRhdGEsaXNCaW5hcnk6aXNCaW5hcnl9KTt2YXIgc2VsZj10aGlzO3JlcS5vbihcInN1Y2Nlc3NcIixmbik7cmVxLm9uKFwiZXJyb3JcIixmdW5jdGlvbihlcnIpe3NlbGYub25FcnJvcihcInhociBwb3N0IGVycm9yXCIsZXJyKX0pO3RoaXMuc2VuZFhocj1yZXF9O1hIUi5wcm90b3R5cGUuZG9Qb2xsPWZ1bmN0aW9uKCl7ZGVidWcoXCJ4aHIgcG9sbFwiKTt2YXIgcmVxPXRoaXMucmVxdWVzdCgpO3ZhciBzZWxmPXRoaXM7cmVxLm9uKFwiZGF0YVwiLGZ1bmN0aW9uKGRhdGEpe3NlbGYub25EYXRhKGRhdGEpfSk7cmVxLm9uKFwiZXJyb3JcIixmdW5jdGlvbihlcnIpe3NlbGYub25FcnJvcihcInhociBwb2xsIGVycm9yXCIsZXJyKX0pO3RoaXMucG9sbFhocj1yZXF9O2Z1bmN0aW9uIFJlcXVlc3Qob3B0cyl7dGhpcy5tZXRob2Q9b3B0cy5tZXRob2R8fFwiR0VUXCI7dGhpcy51cmk9b3B0cy51cmk7dGhpcy54ZD0hIW9wdHMueGQ7dGhpcy54cz0hIW9wdHMueHM7dGhpcy5hc3luYz1mYWxzZSE9PW9wdHMuYXN5bmM7dGhpcy5kYXRhPXVuZGVmaW5lZCE9b3B0cy5kYXRhP29wdHMuZGF0YTpudWxsO3RoaXMuYWdlbnQ9b3B0cy5hZ2VudDt0aGlzLmlzQmluYXJ5PW9wdHMuaXNCaW5hcnk7dGhpcy5zdXBwb3J0c0JpbmFyeT1vcHRzLnN1cHBvcnRzQmluYXJ5O3RoaXMuZW5hYmxlc1hEUj1vcHRzLmVuYWJsZXNYRFI7dGhpcy5wZng9b3B0cy5wZng7dGhpcy5rZXk9b3B0cy5rZXk7dGhpcy5wYXNzcGhyYXNlPW9wdHMucGFzc3BocmFzZTt0aGlzLmNlcnQ9b3B0cy5jZXJ0O3RoaXMuY2E9b3B0cy5jYTt0aGlzLmNpcGhlcnM9b3B0cy5jaXBoZXJzO3RoaXMucmVqZWN0VW5hdXRob3JpemVkPW9wdHMucmVqZWN0VW5hdXRob3JpemVkO3RoaXMuZXh0cmFIZWFkZXJzPW9wdHMuZXh0cmFIZWFkZXJzO3RoaXMuY3JlYXRlKCl9RW1pdHRlcihSZXF1ZXN0LnByb3RvdHlwZSk7UmVxdWVzdC5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIG9wdHM9e2FnZW50OnRoaXMuYWdlbnQseGRvbWFpbjp0aGlzLnhkLHhzY2hlbWU6dGhpcy54cyxlbmFibGVzWERSOnRoaXMuZW5hYmxlc1hEUn07b3B0cy5wZng9dGhpcy5wZng7b3B0cy5rZXk9dGhpcy5rZXk7b3B0cy5wYXNzcGhyYXNlPXRoaXMucGFzc3BocmFzZTtvcHRzLmNlcnQ9dGhpcy5jZXJ0O29wdHMuY2E9dGhpcy5jYTtvcHRzLmNpcGhlcnM9dGhpcy5jaXBoZXJzO29wdHMucmVqZWN0VW5hdXRob3JpemVkPXRoaXMucmVqZWN0VW5hdXRob3JpemVkO3ZhciB4aHI9dGhpcy54aHI9bmV3IFhNTEh0dHBSZXF1ZXN0KG9wdHMpO3ZhciBzZWxmPXRoaXM7dHJ5e2RlYnVnKFwieGhyIG9wZW4gJXM6ICVzXCIsdGhpcy5tZXRob2QsdGhpcy51cmkpO3hoci5vcGVuKHRoaXMubWV0aG9kLHRoaXMudXJpLHRoaXMuYXN5bmMpO3RyeXtpZih0aGlzLmV4dHJhSGVhZGVycyl7eGhyLnNldERpc2FibGVIZWFkZXJDaGVjayh0cnVlKTtmb3IodmFyIGkgaW4gdGhpcy5leHRyYUhlYWRlcnMpe2lmKHRoaXMuZXh0cmFIZWFkZXJzLmhhc093blByb3BlcnR5KGkpKXt4aHIuc2V0UmVxdWVzdEhlYWRlcihpLHRoaXMuZXh0cmFIZWFkZXJzW2ldKX19fX1jYXRjaChlKXt9aWYodGhpcy5zdXBwb3J0c0JpbmFyeSl7eGhyLnJlc3BvbnNlVHlwZT1cImFycmF5YnVmZmVyXCJ9aWYoXCJQT1NUXCI9PXRoaXMubWV0aG9kKXt0cnl7aWYodGhpcy5pc0JpbmFyeSl7eGhyLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LXR5cGVcIixcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiKX1lbHNle3hoci5zZXRSZXF1ZXN0SGVhZGVyKFwiQ29udGVudC10eXBlXCIsXCJ0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLThcIil9fWNhdGNoKGUpe319aWYoXCJ3aXRoQ3JlZGVudGlhbHNcImluIHhocil7eGhyLndpdGhDcmVkZW50aWFscz10cnVlfWlmKHRoaXMuaGFzWERSKCkpe3hoci5vbmxvYWQ9ZnVuY3Rpb24oKXtzZWxmLm9uTG9hZCgpfTt4aHIub25lcnJvcj1mdW5jdGlvbigpe3NlbGYub25FcnJvcih4aHIucmVzcG9uc2VUZXh0KX19ZWxzZXt4aHIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aWYoNCE9eGhyLnJlYWR5U3RhdGUpcmV0dXJuO2lmKDIwMD09eGhyLnN0YXR1c3x8MTIyMz09eGhyLnN0YXR1cyl7c2VsZi5vbkxvYWQoKX1lbHNle3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzZWxmLm9uRXJyb3IoeGhyLnN0YXR1cyl9LDApfX19ZGVidWcoXCJ4aHIgZGF0YSAlc1wiLHRoaXMuZGF0YSk7eGhyLnNlbmQodGhpcy5kYXRhKX1jYXRjaChlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VsZi5vbkVycm9yKGUpfSwwKTtyZXR1cm59aWYoZ2xvYmFsLmRvY3VtZW50KXt0aGlzLmluZGV4PVJlcXVlc3QucmVxdWVzdHNDb3VudCsrO1JlcXVlc3QucmVxdWVzdHNbdGhpcy5pbmRleF09dGhpc319O1JlcXVlc3QucHJvdG90eXBlLm9uU3VjY2Vzcz1mdW5jdGlvbigpe3RoaXMuZW1pdChcInN1Y2Nlc3NcIik7dGhpcy5jbGVhbnVwKCl9O1JlcXVlc3QucHJvdG90eXBlLm9uRGF0YT1mdW5jdGlvbihkYXRhKXt0aGlzLmVtaXQoXCJkYXRhXCIsZGF0YSk7dGhpcy5vblN1Y2Nlc3MoKX07UmVxdWVzdC5wcm90b3R5cGUub25FcnJvcj1mdW5jdGlvbihlcnIpe3RoaXMuZW1pdChcImVycm9yXCIsZXJyKTt0aGlzLmNsZWFudXAodHJ1ZSl9O1JlcXVlc3QucHJvdG90eXBlLmNsZWFudXA9ZnVuY3Rpb24oZnJvbUVycm9yKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgdGhpcy54aHJ8fG51bGw9PT10aGlzLnhocil7cmV0dXJufWlmKHRoaXMuaGFzWERSKCkpe3RoaXMueGhyLm9ubG9hZD10aGlzLnhoci5vbmVycm9yPWVtcHR5fWVsc2V7dGhpcy54aHIub25yZWFkeXN0YXRlY2hhbmdlPWVtcHR5fWlmKGZyb21FcnJvcil7dHJ5e3RoaXMueGhyLmFib3J0KCl9Y2F0Y2goZSl7fX1pZihnbG9iYWwuZG9jdW1lbnQpe2RlbGV0ZSBSZXF1ZXN0LnJlcXVlc3RzW3RoaXMuaW5kZXhdfXRoaXMueGhyPW51bGx9O1JlcXVlc3QucHJvdG90eXBlLm9uTG9hZD1mdW5jdGlvbigpe3ZhciBkYXRhO3RyeXt2YXIgY29udGVudFR5cGU7dHJ5e2NvbnRlbnRUeXBlPXRoaXMueGhyLmdldFJlc3BvbnNlSGVhZGVyKFwiQ29udGVudC1UeXBlXCIpLnNwbGl0KFwiO1wiKVswXX1jYXRjaChlKXt9aWYoY29udGVudFR5cGU9PT1cImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiKXtkYXRhPXRoaXMueGhyLnJlc3BvbnNlfWVsc2V7aWYoIXRoaXMuc3VwcG9ydHNCaW5hcnkpe2RhdGE9dGhpcy54aHIucmVzcG9uc2VUZXh0fWVsc2V7dHJ5e2RhdGE9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50OEFycmF5KHRoaXMueGhyLnJlc3BvbnNlKSl9Y2F0Y2goZSl7dmFyIHVpOEFycj1uZXcgVWludDhBcnJheSh0aGlzLnhoci5yZXNwb25zZSk7dmFyIGRhdGFBcnJheT1bXTtmb3IodmFyIGlkeD0wLGxlbmd0aD11aThBcnIubGVuZ3RoO2lkeDxsZW5ndGg7aWR4Kyspe2RhdGFBcnJheS5wdXNoKHVpOEFycltpZHhdKX1kYXRhPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxkYXRhQXJyYXkpfX19fWNhdGNoKGUpe3RoaXMub25FcnJvcihlKX1pZihudWxsIT1kYXRhKXt0aGlzLm9uRGF0YShkYXRhKX19O1JlcXVlc3QucHJvdG90eXBlLmhhc1hEUj1mdW5jdGlvbigpe3JldHVyblwidW5kZWZpbmVkXCIhPT10eXBlb2YgZ2xvYmFsLlhEb21haW5SZXF1ZXN0JiYhdGhpcy54cyYmdGhpcy5lbmFibGVzWERSfTtSZXF1ZXN0LnByb3RvdHlwZS5hYm9ydD1mdW5jdGlvbigpe3RoaXMuY2xlYW51cCgpfTtpZihnbG9iYWwuZG9jdW1lbnQpe1JlcXVlc3QucmVxdWVzdHNDb3VudD0wO1JlcXVlc3QucmVxdWVzdHM9e307aWYoZ2xvYmFsLmF0dGFjaEV2ZW50KXtnbG9iYWwuYXR0YWNoRXZlbnQoXCJvbnVubG9hZFwiLHVubG9hZEhhbmRsZXIpfWVsc2UgaWYoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIpe2dsb2JhbC5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsdW5sb2FkSGFuZGxlcixmYWxzZSl9fWZ1bmN0aW9uIHVubG9hZEhhbmRsZXIoKXtmb3IodmFyIGkgaW4gUmVxdWVzdC5yZXF1ZXN0cyl7aWYoUmVxdWVzdC5yZXF1ZXN0cy5oYXNPd25Qcm9wZXJ0eShpKSl7UmVxdWVzdC5yZXF1ZXN0c1tpXS5hYm9ydCgpfX19fSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIj9zZWxmOnR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIj9nbG9iYWw6e30pfSx7XCIuL3BvbGxpbmdcIjo4LFwiY29tcG9uZW50LWVtaXR0ZXJcIjoxNSxcImNvbXBvbmVudC1pbmhlcml0XCI6MTYsZGVidWc6MTcsXCJ4bWxodHRwcmVxdWVzdC1zc2xcIjoxMH1dLDg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe3ZhciBUcmFuc3BvcnQ9X2RlcmVxXyhcIi4uL3RyYW5zcG9ydFwiKTt2YXIgcGFyc2Vxcz1fZGVyZXFfKFwicGFyc2Vxc1wiKTt2YXIgcGFyc2VyPV9kZXJlcV8oXCJlbmdpbmUuaW8tcGFyc2VyXCIpO3ZhciBpbmhlcml0PV9kZXJlcV8oXCJjb21wb25lbnQtaW5oZXJpdFwiKTt2YXIgeWVhc3Q9X2RlcmVxXyhcInllYXN0XCIpO3ZhciBkZWJ1Zz1fZGVyZXFfKFwiZGVidWdcIikoXCJlbmdpbmUuaW8tY2xpZW50OnBvbGxpbmdcIik7bW9kdWxlLmV4cG9ydHM9UG9sbGluZzt2YXIgaGFzWEhSMj1mdW5jdGlvbigpe3ZhciBYTUxIdHRwUmVxdWVzdD1fZGVyZXFfKFwieG1saHR0cHJlcXVlc3Qtc3NsXCIpO3ZhciB4aHI9bmV3IFhNTEh0dHBSZXF1ZXN0KHt4ZG9tYWluOmZhbHNlfSk7cmV0dXJuIG51bGwhPXhoci5yZXNwb25zZVR5cGV9KCk7ZnVuY3Rpb24gUG9sbGluZyhvcHRzKXt2YXIgZm9yY2VCYXNlNjQ9b3B0cyYmb3B0cy5mb3JjZUJhc2U2NDtpZighaGFzWEhSMnx8Zm9yY2VCYXNlNjQpe3RoaXMuc3VwcG9ydHNCaW5hcnk9ZmFsc2V9VHJhbnNwb3J0LmNhbGwodGhpcyxvcHRzKX1pbmhlcml0KFBvbGxpbmcsVHJhbnNwb3J0KTtQb2xsaW5nLnByb3RvdHlwZS5uYW1lPVwicG9sbGluZ1wiO1BvbGxpbmcucHJvdG90eXBlLmRvT3Blbj1mdW5jdGlvbigpe3RoaXMucG9sbCgpfTtQb2xsaW5nLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbihvblBhdXNlKXt2YXIgcGVuZGluZz0wO3ZhciBzZWxmPXRoaXM7dGhpcy5yZWFkeVN0YXRlPVwicGF1c2luZ1wiO2Z1bmN0aW9uIHBhdXNlKCl7ZGVidWcoXCJwYXVzZWRcIik7c2VsZi5yZWFkeVN0YXRlPVwicGF1c2VkXCI7b25QYXVzZSgpfWlmKHRoaXMucG9sbGluZ3x8IXRoaXMud3JpdGFibGUpe3ZhciB0b3RhbD0wO2lmKHRoaXMucG9sbGluZyl7ZGVidWcoXCJ3ZSBhcmUgY3VycmVudGx5IHBvbGxpbmcgLSB3YWl0aW5nIHRvIHBhdXNlXCIpO3RvdGFsKys7dGhpcy5vbmNlKFwicG9sbENvbXBsZXRlXCIsZnVuY3Rpb24oKXtkZWJ1ZyhcInByZS1wYXVzZSBwb2xsaW5nIGNvbXBsZXRlXCIpOy0tdG90YWx8fHBhdXNlKCl9KX1pZighdGhpcy53cml0YWJsZSl7ZGVidWcoXCJ3ZSBhcmUgY3VycmVudGx5IHdyaXRpbmcgLSB3YWl0aW5nIHRvIHBhdXNlXCIpO3RvdGFsKys7dGhpcy5vbmNlKFwiZHJhaW5cIixmdW5jdGlvbigpe2RlYnVnKFwicHJlLXBhdXNlIHdyaXRpbmcgY29tcGxldGVcIik7LS10b3RhbHx8cGF1c2UoKX0pfX1lbHNle3BhdXNlKCl9fTtQb2xsaW5nLnByb3RvdHlwZS5wb2xsPWZ1bmN0aW9uKCl7ZGVidWcoXCJwb2xsaW5nXCIpO3RoaXMucG9sbGluZz10cnVlO3RoaXMuZG9Qb2xsKCk7dGhpcy5lbWl0KFwicG9sbFwiKX07UG9sbGluZy5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKGRhdGEpe3ZhciBzZWxmPXRoaXM7ZGVidWcoXCJwb2xsaW5nIGdvdCBkYXRhICVzXCIsZGF0YSk7dmFyIGNhbGxiYWNrPWZ1bmN0aW9uKHBhY2tldCxpbmRleCx0b3RhbCl7aWYoXCJvcGVuaW5nXCI9PXNlbGYucmVhZHlTdGF0ZSl7c2VsZi5vbk9wZW4oKX1pZihcImNsb3NlXCI9PXBhY2tldC50eXBlKXtzZWxmLm9uQ2xvc2UoKTtyZXR1cm4gZmFsc2V9c2VsZi5vblBhY2tldChwYWNrZXQpfTtwYXJzZXIuZGVjb2RlUGF5bG9hZChkYXRhLHRoaXMuc29ja2V0LmJpbmFyeVR5cGUsY2FsbGJhY2spO2lmKFwiY2xvc2VkXCIhPXRoaXMucmVhZHlTdGF0ZSl7dGhpcy5wb2xsaW5nPWZhbHNlO3RoaXMuZW1pdChcInBvbGxDb21wbGV0ZVwiKTtpZihcIm9wZW5cIj09dGhpcy5yZWFkeVN0YXRlKXt0aGlzLnBvbGwoKX1lbHNle2RlYnVnKCdpZ25vcmluZyBwb2xsIC0gdHJhbnNwb3J0IHN0YXRlIFwiJXNcIicsdGhpcy5yZWFkeVN0YXRlKX19fTtQb2xsaW5nLnByb3RvdHlwZS5kb0Nsb3NlPWZ1bmN0aW9uKCl7dmFyIHNlbGY9dGhpcztmdW5jdGlvbiBjbG9zZSgpe2RlYnVnKFwid3JpdGluZyBjbG9zZSBwYWNrZXRcIik7c2VsZi53cml0ZShbe3R5cGU6XCJjbG9zZVwifV0pfWlmKFwib3BlblwiPT10aGlzLnJlYWR5U3RhdGUpe2RlYnVnKFwidHJhbnNwb3J0IG9wZW4gLSBjbG9zaW5nXCIpO2Nsb3NlKCl9ZWxzZXtkZWJ1ZyhcInRyYW5zcG9ydCBub3Qgb3BlbiAtIGRlZmVycmluZyBjbG9zZVwiKTt0aGlzLm9uY2UoXCJvcGVuXCIsY2xvc2UpfX07UG9sbGluZy5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24ocGFja2V0cyl7dmFyIHNlbGY9dGhpczt0aGlzLndyaXRhYmxlPWZhbHNlO3ZhciBjYWxsYmFja2ZuPWZ1bmN0aW9uKCl7c2VsZi53cml0YWJsZT10cnVlO3NlbGYuZW1pdChcImRyYWluXCIpfTt2YXIgc2VsZj10aGlzO3BhcnNlci5lbmNvZGVQYXlsb2FkKHBhY2tldHMsdGhpcy5zdXBwb3J0c0JpbmFyeSxmdW5jdGlvbihkYXRhKXtzZWxmLmRvV3JpdGUoZGF0YSxjYWxsYmFja2ZuKX0pfTtQb2xsaW5nLnByb3RvdHlwZS51cmk9ZnVuY3Rpb24oKXt2YXIgcXVlcnk9dGhpcy5xdWVyeXx8e307dmFyIHNjaGVtYT10aGlzLnNlY3VyZT9cImh0dHBzXCI6XCJodHRwXCI7dmFyIHBvcnQ9XCJcIjtpZihmYWxzZSE9PXRoaXMudGltZXN0YW1wUmVxdWVzdHMpe3F1ZXJ5W3RoaXMudGltZXN0YW1wUGFyYW1dPXllYXN0KCl9aWYoIXRoaXMuc3VwcG9ydHNCaW5hcnkmJiFxdWVyeS5zaWQpe3F1ZXJ5LmI2ND0xfXF1ZXJ5PXBhcnNlcXMuZW5jb2RlKHF1ZXJ5KTtpZih0aGlzLnBvcnQmJihcImh0dHBzXCI9PXNjaGVtYSYmdGhpcy5wb3J0IT00NDN8fFwiaHR0cFwiPT1zY2hlbWEmJnRoaXMucG9ydCE9ODApKXtwb3J0PVwiOlwiK3RoaXMucG9ydH1pZihxdWVyeS5sZW5ndGgpe3F1ZXJ5PVwiP1wiK3F1ZXJ5fXZhciBpcHY2PXRoaXMuaG9zdG5hbWUuaW5kZXhPZihcIjpcIikhPT0tMTtyZXR1cm4gc2NoZW1hK1wiOi8vXCIrKGlwdjY/XCJbXCIrdGhpcy5ob3N0bmFtZStcIl1cIjp0aGlzLmhvc3RuYW1lKStwb3J0K3RoaXMucGF0aCtxdWVyeX19LHtcIi4uL3RyYW5zcG9ydFwiOjQsXCJjb21wb25lbnQtaW5oZXJpdFwiOjE2LGRlYnVnOjE3LFwiZW5naW5lLmlvLXBhcnNlclwiOjE5LHBhcnNlcXM6MjcsXCJ4bWxodHRwcmVxdWVzdC1zc2xcIjoxMCx5ZWFzdDozMH1dLDk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpe3ZhciBUcmFuc3BvcnQ9X2RlcmVxXyhcIi4uL3RyYW5zcG9ydFwiKTt2YXIgcGFyc2VyPV9kZXJlcV8oXCJlbmdpbmUuaW8tcGFyc2VyXCIpO3ZhciBwYXJzZXFzPV9kZXJlcV8oXCJwYXJzZXFzXCIpO3ZhciBpbmhlcml0PV9kZXJlcV8oXCJjb21wb25lbnQtaW5oZXJpdFwiKTt2YXIgeWVhc3Q9X2RlcmVxXyhcInllYXN0XCIpO3ZhciBkZWJ1Zz1fZGVyZXFfKFwiZGVidWdcIikoXCJlbmdpbmUuaW8tY2xpZW50OndlYnNvY2tldFwiKTt2YXIgQnJvd3NlcldlYlNvY2tldD1nbG9iYWwuV2ViU29ja2V0fHxnbG9iYWwuTW96V2ViU29ja2V0O3ZhciBXZWJTb2NrZXQ9QnJvd3NlcldlYlNvY2tldDtpZighV2ViU29ja2V0JiZ0eXBlb2Ygd2luZG93PT09XCJ1bmRlZmluZWRcIil7dHJ5e1dlYlNvY2tldD1fZGVyZXFfKFwid3NcIil9Y2F0Y2goZSl7fX1tb2R1bGUuZXhwb3J0cz1XUztmdW5jdGlvbiBXUyhvcHRzKXt2YXIgZm9yY2VCYXNlNjQ9b3B0cyYmb3B0cy5mb3JjZUJhc2U2NDtpZihmb3JjZUJhc2U2NCl7dGhpcy5zdXBwb3J0c0JpbmFyeT1mYWxzZX10aGlzLnBlck1lc3NhZ2VEZWZsYXRlPW9wdHMucGVyTWVzc2FnZURlZmxhdGU7VHJhbnNwb3J0LmNhbGwodGhpcyxvcHRzKX1pbmhlcml0KFdTLFRyYW5zcG9ydCk7V1MucHJvdG90eXBlLm5hbWU9XCJ3ZWJzb2NrZXRcIjtXUy5wcm90b3R5cGUuc3VwcG9ydHNCaW5hcnk9dHJ1ZTtXUy5wcm90b3R5cGUuZG9PcGVuPWZ1bmN0aW9uKCl7aWYoIXRoaXMuY2hlY2soKSl7cmV0dXJufXZhciBzZWxmPXRoaXM7dmFyIHVyaT10aGlzLnVyaSgpO3ZhciBwcm90b2NvbHM9dm9pZCAwO3ZhciBvcHRzPXthZ2VudDp0aGlzLmFnZW50LHBlck1lc3NhZ2VEZWZsYXRlOnRoaXMucGVyTWVzc2FnZURlZmxhdGV9O29wdHMucGZ4PXRoaXMucGZ4O29wdHMua2V5PXRoaXMua2V5O29wdHMucGFzc3BocmFzZT10aGlzLnBhc3NwaHJhc2U7b3B0cy5jZXJ0PXRoaXMuY2VydDtvcHRzLmNhPXRoaXMuY2E7b3B0cy5jaXBoZXJzPXRoaXMuY2lwaGVycztvcHRzLnJlamVjdFVuYXV0aG9yaXplZD10aGlzLnJlamVjdFVuYXV0aG9yaXplZDtpZih0aGlzLmV4dHJhSGVhZGVycyl7b3B0cy5oZWFkZXJzPXRoaXMuZXh0cmFIZWFkZXJzfXRoaXMud3M9QnJvd3NlcldlYlNvY2tldD9uZXcgV2ViU29ja2V0KHVyaSk6bmV3IFdlYlNvY2tldCh1cmkscHJvdG9jb2xzLG9wdHMpO2lmKHRoaXMud3MuYmluYXJ5VHlwZT09PXVuZGVmaW5lZCl7dGhpcy5zdXBwb3J0c0JpbmFyeT1mYWxzZX1pZih0aGlzLndzLnN1cHBvcnRzJiZ0aGlzLndzLnN1cHBvcnRzLmJpbmFyeSl7dGhpcy5zdXBwb3J0c0JpbmFyeT10cnVlO3RoaXMud3MuYmluYXJ5VHlwZT1cImJ1ZmZlclwifWVsc2V7dGhpcy53cy5iaW5hcnlUeXBlPVwiYXJyYXlidWZmZXJcIn10aGlzLmFkZEV2ZW50TGlzdGVuZXJzKCl9O1dTLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBzZWxmPXRoaXM7dGhpcy53cy5vbm9wZW49ZnVuY3Rpb24oKXtzZWxmLm9uT3BlbigpfTt0aGlzLndzLm9uY2xvc2U9ZnVuY3Rpb24oKXtzZWxmLm9uQ2xvc2UoKX07dGhpcy53cy5vbm1lc3NhZ2U9ZnVuY3Rpb24oZXYpe3NlbGYub25EYXRhKGV2LmRhdGEpfTt0aGlzLndzLm9uZXJyb3I9ZnVuY3Rpb24oZSl7c2VsZi5vbkVycm9yKFwid2Vic29ja2V0IGVycm9yXCIsZSl9fTtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yJiYvaVBhZHxpUGhvbmV8aVBvZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpe1dTLnByb3RvdHlwZS5vbkRhdGE9ZnVuY3Rpb24oZGF0YSl7dmFyIHNlbGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VHJhbnNwb3J0LnByb3RvdHlwZS5vbkRhdGEuY2FsbChzZWxmLGRhdGEpfSwwKX19V1MucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHBhY2tldHMpe3ZhciBzZWxmPXRoaXM7dGhpcy53cml0YWJsZT1mYWxzZTt2YXIgdG90YWw9cGFja2V0cy5sZW5ndGg7Zm9yKHZhciBpPTAsbD10b3RhbDtpPGw7aSsrKXsoZnVuY3Rpb24ocGFja2V0KXtwYXJzZXIuZW5jb2RlUGFja2V0KHBhY2tldCxzZWxmLnN1cHBvcnRzQmluYXJ5LGZ1bmN0aW9uKGRhdGEpe2lmKCFCcm93c2VyV2ViU29ja2V0KXt2YXIgb3B0cz17fTtpZihwYWNrZXQub3B0aW9ucyl7b3B0cy5jb21wcmVzcz1wYWNrZXQub3B0aW9ucy5jb21wcmVzc31pZihzZWxmLnBlck1lc3NhZ2VEZWZsYXRlKXt2YXIgbGVuPVwic3RyaW5nXCI9PXR5cGVvZiBkYXRhP2dsb2JhbC5CdWZmZXIuYnl0ZUxlbmd0aChkYXRhKTpkYXRhLmxlbmd0aDtpZihsZW48c2VsZi5wZXJNZXNzYWdlRGVmbGF0ZS50aHJlc2hvbGQpe29wdHMuY29tcHJlc3M9ZmFsc2V9fX10cnl7aWYoQnJvd3NlcldlYlNvY2tldCl7c2VsZi53cy5zZW5kKGRhdGEpfWVsc2V7c2VsZi53cy5zZW5kKGRhdGEsb3B0cyl9fWNhdGNoKGUpe2RlYnVnKFwid2Vic29ja2V0IGNsb3NlZCBiZWZvcmUgb25jbG9zZSBldmVudFwiKX0tLXRvdGFsfHxkb25lKCl9KX0pKHBhY2tldHNbaV0pfWZ1bmN0aW9uIGRvbmUoKXtzZWxmLmVtaXQoXCJmbHVzaFwiKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7c2VsZi53cml0YWJsZT10cnVlO3NlbGYuZW1pdChcImRyYWluXCIpfSwwKX19O1dTLnByb3RvdHlwZS5vbkNsb3NlPWZ1bmN0aW9uKCl7VHJhbnNwb3J0LnByb3RvdHlwZS5vbkNsb3NlLmNhbGwodGhpcyl9O1dTLnByb3RvdHlwZS5kb0Nsb3NlPWZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXMud3MhPT1cInVuZGVmaW5lZFwiKXt0aGlzLndzLmNsb3NlKCl9fTtXUy5wcm90b3R5cGUudXJpPWZ1bmN0aW9uKCl7dmFyIHF1ZXJ5PXRoaXMucXVlcnl8fHt9O3ZhciBzY2hlbWE9dGhpcy5zZWN1cmU/XCJ3c3NcIjpcIndzXCI7dmFyIHBvcnQ9XCJcIjtpZih0aGlzLnBvcnQmJihcIndzc1wiPT1zY2hlbWEmJnRoaXMucG9ydCE9NDQzfHxcIndzXCI9PXNjaGVtYSYmdGhpcy5wb3J0IT04MCkpe3BvcnQ9XCI6XCIrdGhpcy5wb3J0fWlmKHRoaXMudGltZXN0YW1wUmVxdWVzdHMpe3F1ZXJ5W3RoaXMudGltZXN0YW1wUGFyYW1dPXllYXN0KCl9aWYoIXRoaXMuc3VwcG9ydHNCaW5hcnkpe3F1ZXJ5LmI2ND0xfXF1ZXJ5PXBhcnNlcXMuZW5jb2RlKHF1ZXJ5KTtpZihxdWVyeS5sZW5ndGgpe3F1ZXJ5PVwiP1wiK3F1ZXJ5fXZhciBpcHY2PXRoaXMuaG9zdG5hbWUuaW5kZXhPZihcIjpcIikhPT0tMTtyZXR1cm4gc2NoZW1hK1wiOi8vXCIrKGlwdjY/XCJbXCIrdGhpcy5ob3N0bmFtZStcIl1cIjp0aGlzLmhvc3RuYW1lKStwb3J0K3RoaXMucGF0aCtxdWVyeX07V1MucHJvdG90eXBlLmNoZWNrPWZ1bmN0aW9uKCl7cmV0dXJuISFXZWJTb2NrZXQmJiEoXCJfX2luaXRpYWxpemVcImluIFdlYlNvY2tldCYmdGhpcy5uYW1lPT09V1MucHJvdG90eXBlLm5hbWUpfX0pLmNhbGwodGhpcyx0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCI/c2VsZjp0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIj93aW5kb3c6dHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCI/Z2xvYmFsOnt9KX0se1wiLi4vdHJhbnNwb3J0XCI6NCxcImNvbXBvbmVudC1pbmhlcml0XCI6MTYsZGVidWc6MTcsXCJlbmdpbmUuaW8tcGFyc2VyXCI6MTkscGFyc2VxczoyNyx3czp1bmRlZmluZWQseWVhc3Q6MzB9XSwxMDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7dmFyIGhhc0NPUlM9X2RlcmVxXyhcImhhcy1jb3JzXCIpO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKG9wdHMpe3ZhciB4ZG9tYWluPW9wdHMueGRvbWFpbjt2YXIgeHNjaGVtZT1vcHRzLnhzY2hlbWU7dmFyIGVuYWJsZXNYRFI9b3B0cy5lbmFibGVzWERSO3RyeXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgWE1MSHR0cFJlcXVlc3QmJigheGRvbWFpbnx8aGFzQ09SUykpe3JldHVybiBuZXcgWE1MSHR0cFJlcXVlc3R9fWNhdGNoKGUpe310cnl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFhEb21haW5SZXF1ZXN0JiYheHNjaGVtZSYmZW5hYmxlc1hEUil7cmV0dXJuIG5ldyBYRG9tYWluUmVxdWVzdH19Y2F0Y2goZSl7fWlmKCF4ZG9tYWluKXt0cnl7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KFwiTWljcm9zb2Z0LlhNTEhUVFBcIil9Y2F0Y2goZSl7fX19fSx7XCJoYXMtY29yc1wiOjIyfV0sMTE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPWFmdGVyO2Z1bmN0aW9uIGFmdGVyKGNvdW50LGNhbGxiYWNrLGVycl9jYil7dmFyIGJhaWw9ZmFsc2U7ZXJyX2NiPWVycl9jYnx8bm9vcDtwcm94eS5jb3VudD1jb3VudDtyZXR1cm4gY291bnQ9PT0wP2NhbGxiYWNrKCk6cHJveHk7ZnVuY3Rpb24gcHJveHkoZXJyLHJlc3VsdCl7aWYocHJveHkuY291bnQ8PTApe3Rocm93IG5ldyBFcnJvcihcImFmdGVyIGNhbGxlZCB0b28gbWFueSB0aW1lc1wiKX0tLXByb3h5LmNvdW50O2lmKGVycil7YmFpbD10cnVlO2NhbGxiYWNrKGVycik7Y2FsbGJhY2s9ZXJyX2NifWVsc2UgaWYocHJveHkuY291bnQ9PT0wJiYhYmFpbCl7Y2FsbGJhY2sobnVsbCxyZXN1bHQpfX19ZnVuY3Rpb24gbm9vcCgpe319LHt9XSwxMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oYXJyYXlidWZmZXIsc3RhcnQsZW5kKXt2YXIgYnl0ZXM9YXJyYXlidWZmZXIuYnl0ZUxlbmd0aDtzdGFydD1zdGFydHx8MDtlbmQ9ZW5kfHxieXRlcztpZihhcnJheWJ1ZmZlci5zbGljZSl7cmV0dXJuIGFycmF5YnVmZmVyLnNsaWNlKHN0YXJ0LGVuZCl9aWYoc3RhcnQ8MCl7c3RhcnQrPWJ5dGVzfWlmKGVuZDwwKXtlbmQrPWJ5dGVzfWlmKGVuZD5ieXRlcyl7ZW5kPWJ5dGVzfWlmKHN0YXJ0Pj1ieXRlc3x8c3RhcnQ+PWVuZHx8Ynl0ZXM9PT0wKXtyZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApfXZhciBhYnY9bmV3IFVpbnQ4QXJyYXkoYXJyYXlidWZmZXIpO3ZhciByZXN1bHQ9bmV3IFVpbnQ4QXJyYXkoZW5kLXN0YXJ0KTtmb3IodmFyIGk9c3RhcnQsaWk9MDtpPGVuZDtpKyssaWkrKyl7cmVzdWx0W2lpXT1hYnZbaV19cmV0dXJuIHJlc3VsdC5idWZmZXJ9fSx7fV0sMTM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihjaGFycyl7XCJ1c2Ugc3RyaWN0XCI7ZXhwb3J0cy5lbmNvZGU9ZnVuY3Rpb24oYXJyYXlidWZmZXIpe3ZhciBieXRlcz1uZXcgVWludDhBcnJheShhcnJheWJ1ZmZlciksaSxsZW49Ynl0ZXMubGVuZ3RoLGJhc2U2ND1cIlwiO2ZvcihpPTA7aTxsZW47aSs9Myl7YmFzZTY0Kz1jaGFyc1tieXRlc1tpXT4+Ml07XG5iYXNlNjQrPWNoYXJzWyhieXRlc1tpXSYzKTw8NHxieXRlc1tpKzFdPj40XTtiYXNlNjQrPWNoYXJzWyhieXRlc1tpKzFdJjE1KTw8MnxieXRlc1tpKzJdPj42XTtiYXNlNjQrPWNoYXJzW2J5dGVzW2krMl0mNjNdfWlmKGxlbiUzPT09Mil7YmFzZTY0PWJhc2U2NC5zdWJzdHJpbmcoMCxiYXNlNjQubGVuZ3RoLTEpK1wiPVwifWVsc2UgaWYobGVuJTM9PT0xKXtiYXNlNjQ9YmFzZTY0LnN1YnN0cmluZygwLGJhc2U2NC5sZW5ndGgtMikrXCI9PVwifXJldHVybiBiYXNlNjR9O2V4cG9ydHMuZGVjb2RlPWZ1bmN0aW9uKGJhc2U2NCl7dmFyIGJ1ZmZlckxlbmd0aD1iYXNlNjQubGVuZ3RoKi43NSxsZW49YmFzZTY0Lmxlbmd0aCxpLHA9MCxlbmNvZGVkMSxlbmNvZGVkMixlbmNvZGVkMyxlbmNvZGVkNDtpZihiYXNlNjRbYmFzZTY0Lmxlbmd0aC0xXT09PVwiPVwiKXtidWZmZXJMZW5ndGgtLTtpZihiYXNlNjRbYmFzZTY0Lmxlbmd0aC0yXT09PVwiPVwiKXtidWZmZXJMZW5ndGgtLX19dmFyIGFycmF5YnVmZmVyPW5ldyBBcnJheUJ1ZmZlcihidWZmZXJMZW5ndGgpLGJ5dGVzPW5ldyBVaW50OEFycmF5KGFycmF5YnVmZmVyKTtmb3IoaT0wO2k8bGVuO2krPTQpe2VuY29kZWQxPWNoYXJzLmluZGV4T2YoYmFzZTY0W2ldKTtlbmNvZGVkMj1jaGFycy5pbmRleE9mKGJhc2U2NFtpKzFdKTtlbmNvZGVkMz1jaGFycy5pbmRleE9mKGJhc2U2NFtpKzJdKTtlbmNvZGVkND1jaGFycy5pbmRleE9mKGJhc2U2NFtpKzNdKTtieXRlc1twKytdPWVuY29kZWQxPDwyfGVuY29kZWQyPj40O2J5dGVzW3ArK109KGVuY29kZWQyJjE1KTw8NHxlbmNvZGVkMz4+MjtieXRlc1twKytdPShlbmNvZGVkMyYzKTw8NnxlbmNvZGVkNCY2M31yZXR1cm4gYXJyYXlidWZmZXJ9fSkoXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCIpfSx7fV0sMTQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpe3ZhciBCbG9iQnVpbGRlcj1nbG9iYWwuQmxvYkJ1aWxkZXJ8fGdsb2JhbC5XZWJLaXRCbG9iQnVpbGRlcnx8Z2xvYmFsLk1TQmxvYkJ1aWxkZXJ8fGdsb2JhbC5Nb3pCbG9iQnVpbGRlcjt2YXIgYmxvYlN1cHBvcnRlZD1mdW5jdGlvbigpe3RyeXt2YXIgYT1uZXcgQmxvYihbXCJoaVwiXSk7cmV0dXJuIGEuc2l6ZT09PTJ9Y2F0Y2goZSl7cmV0dXJuIGZhbHNlfX0oKTt2YXIgYmxvYlN1cHBvcnRzQXJyYXlCdWZmZXJWaWV3PWJsb2JTdXBwb3J0ZWQmJmZ1bmN0aW9uKCl7dHJ5e3ZhciBiPW5ldyBCbG9iKFtuZXcgVWludDhBcnJheShbMSwyXSldKTtyZXR1cm4gYi5zaXplPT09Mn1jYXRjaChlKXtyZXR1cm4gZmFsc2V9fSgpO3ZhciBibG9iQnVpbGRlclN1cHBvcnRlZD1CbG9iQnVpbGRlciYmQmxvYkJ1aWxkZXIucHJvdG90eXBlLmFwcGVuZCYmQmxvYkJ1aWxkZXIucHJvdG90eXBlLmdldEJsb2I7ZnVuY3Rpb24gbWFwQXJyYXlCdWZmZXJWaWV3cyhhcnkpe2Zvcih2YXIgaT0wO2k8YXJ5Lmxlbmd0aDtpKyspe3ZhciBjaHVuaz1hcnlbaV07aWYoY2h1bmsuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpe3ZhciBidWY9Y2h1bmsuYnVmZmVyO2lmKGNodW5rLmJ5dGVMZW5ndGghPT1idWYuYnl0ZUxlbmd0aCl7dmFyIGNvcHk9bmV3IFVpbnQ4QXJyYXkoY2h1bmsuYnl0ZUxlbmd0aCk7Y29weS5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmLGNodW5rLmJ5dGVPZmZzZXQsY2h1bmsuYnl0ZUxlbmd0aCkpO2J1Zj1jb3B5LmJ1ZmZlcn1hcnlbaV09YnVmfX19ZnVuY3Rpb24gQmxvYkJ1aWxkZXJDb25zdHJ1Y3Rvcihhcnksb3B0aW9ucyl7b3B0aW9ucz1vcHRpb25zfHx7fTt2YXIgYmI9bmV3IEJsb2JCdWlsZGVyO21hcEFycmF5QnVmZmVyVmlld3MoYXJ5KTtmb3IodmFyIGk9MDtpPGFyeS5sZW5ndGg7aSsrKXtiYi5hcHBlbmQoYXJ5W2ldKX1yZXR1cm4gb3B0aW9ucy50eXBlP2JiLmdldEJsb2Iob3B0aW9ucy50eXBlKTpiYi5nZXRCbG9iKCl9ZnVuY3Rpb24gQmxvYkNvbnN0cnVjdG9yKGFyeSxvcHRpb25zKXttYXBBcnJheUJ1ZmZlclZpZXdzKGFyeSk7cmV0dXJuIG5ldyBCbG9iKGFyeSxvcHRpb25zfHx7fSl9bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oKXtpZihibG9iU3VwcG9ydGVkKXtyZXR1cm4gYmxvYlN1cHBvcnRzQXJyYXlCdWZmZXJWaWV3P2dsb2JhbC5CbG9iOkJsb2JDb25zdHJ1Y3Rvcn1lbHNlIGlmKGJsb2JCdWlsZGVyU3VwcG9ydGVkKXtyZXR1cm4gQmxvYkJ1aWxkZXJDb25zdHJ1Y3Rvcn1lbHNle3JldHVybiB1bmRlZmluZWR9fSgpfSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIj9zZWxmOnR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIj9nbG9iYWw6e30pfSx7fV0sMTU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPUVtaXR0ZXI7ZnVuY3Rpb24gRW1pdHRlcihvYmope2lmKG9iailyZXR1cm4gbWl4aW4ob2JqKX1mdW5jdGlvbiBtaXhpbihvYmope2Zvcih2YXIga2V5IGluIEVtaXR0ZXIucHJvdG90eXBlKXtvYmpba2V5XT1FbWl0dGVyLnByb3RvdHlwZVtrZXldfXJldHVybiBvYmp9RW1pdHRlci5wcm90b3R5cGUub249RW1pdHRlci5wcm90b3R5cGUuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihldmVudCxmbil7dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e307KHRoaXMuX2NhbGxiYWNrc1tldmVudF09dGhpcy5fY2FsbGJhY2tzW2V2ZW50XXx8W10pLnB1c2goZm4pO3JldHVybiB0aGlzfTtFbWl0dGVyLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGV2ZW50LGZuKXt2YXIgc2VsZj10aGlzO3RoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fHt9O2Z1bmN0aW9uIG9uKCl7c2VsZi5vZmYoZXZlbnQsb24pO2ZuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1vbi5mbj1mbjt0aGlzLm9uKGV2ZW50LG9uKTtyZXR1cm4gdGhpc307RW1pdHRlci5wcm90b3R5cGUub2ZmPUVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPUVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGV2ZW50LGZuKXt0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fTtpZigwPT1hcmd1bWVudHMubGVuZ3RoKXt0aGlzLl9jYWxsYmFja3M9e307cmV0dXJuIHRoaXN9dmFyIGNhbGxiYWNrcz10aGlzLl9jYWxsYmFja3NbZXZlbnRdO2lmKCFjYWxsYmFja3MpcmV0dXJuIHRoaXM7aWYoMT09YXJndW1lbnRzLmxlbmd0aCl7ZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1tldmVudF07cmV0dXJuIHRoaXN9dmFyIGNiO2Zvcih2YXIgaT0wO2k8Y2FsbGJhY2tzLmxlbmd0aDtpKyspe2NiPWNhbGxiYWNrc1tpXTtpZihjYj09PWZufHxjYi5mbj09PWZuKXtjYWxsYmFja3Muc3BsaWNlKGksMSk7YnJlYWt9fXJldHVybiB0aGlzfTtFbWl0dGVyLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKGV2ZW50KXt0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fTt2YXIgYXJncz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxjYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzW2V2ZW50XTtpZihjYWxsYmFja3Mpe2NhbGxiYWNrcz1jYWxsYmFja3Muc2xpY2UoMCk7Zm9yKHZhciBpPTAsbGVuPWNhbGxiYWNrcy5sZW5ndGg7aTxsZW47KytpKXtjYWxsYmFja3NbaV0uYXBwbHkodGhpcyxhcmdzKX19cmV0dXJuIHRoaXN9O0VtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbihldmVudCl7dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e307cmV0dXJuIHRoaXMuX2NhbGxiYWNrc1tldmVudF18fFtdfTtFbWl0dGVyLnByb3RvdHlwZS5oYXNMaXN0ZW5lcnM9ZnVuY3Rpb24oZXZlbnQpe3JldHVybiEhdGhpcy5saXN0ZW5lcnMoZXZlbnQpLmxlbmd0aH19LHt9XSwxNjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24oYSxiKXt2YXIgZm49ZnVuY3Rpb24oKXt9O2ZuLnByb3RvdHlwZT1iLnByb3RvdHlwZTthLnByb3RvdHlwZT1uZXcgZm47YS5wcm90b3R5cGUuY29uc3RydWN0b3I9YX19LHt9XSwxNzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7ZXhwb3J0cz1tb2R1bGUuZXhwb3J0cz1fZGVyZXFfKFwiLi9kZWJ1Z1wiKTtleHBvcnRzLmxvZz1sb2c7ZXhwb3J0cy5mb3JtYXRBcmdzPWZvcm1hdEFyZ3M7ZXhwb3J0cy5zYXZlPXNhdmU7ZXhwb3J0cy5sb2FkPWxvYWQ7ZXhwb3J0cy51c2VDb2xvcnM9dXNlQ29sb3JzO2V4cG9ydHMuc3RvcmFnZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgY2hyb21lJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgY2hyb21lLnN0b3JhZ2U/Y2hyb21lLnN0b3JhZ2UubG9jYWw6bG9jYWxzdG9yYWdlKCk7ZXhwb3J0cy5jb2xvcnM9W1wibGlnaHRzZWFncmVlblwiLFwiZm9yZXN0Z3JlZW5cIixcImdvbGRlbnJvZFwiLFwiZG9kZ2VyYmx1ZVwiLFwiZGFya29yY2hpZFwiLFwiY3JpbXNvblwiXTtmdW5jdGlvbiB1c2VDb2xvcnMoKXtyZXR1cm5cIldlYmtpdEFwcGVhcmFuY2VcImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZXx8d2luZG93LmNvbnNvbGUmJihjb25zb2xlLmZpcmVidWd8fGNvbnNvbGUuZXhjZXB0aW9uJiZjb25zb2xlLnRhYmxlKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykmJnBhcnNlSW50KFJlZ0V4cC4kMSwxMCk+PTMxfWV4cG9ydHMuZm9ybWF0dGVycy5qPWZ1bmN0aW9uKHYpe3JldHVybiBKU09OLnN0cmluZ2lmeSh2KX07ZnVuY3Rpb24gZm9ybWF0QXJncygpe3ZhciBhcmdzPWFyZ3VtZW50czt2YXIgdXNlQ29sb3JzPXRoaXMudXNlQ29sb3JzO2FyZ3NbMF09KHVzZUNvbG9ycz9cIiVjXCI6XCJcIikrdGhpcy5uYW1lc3BhY2UrKHVzZUNvbG9ycz9cIiAlY1wiOlwiIFwiKSthcmdzWzBdKyh1c2VDb2xvcnM/XCIlYyBcIjpcIiBcIikrXCIrXCIrZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpO2lmKCF1c2VDb2xvcnMpcmV0dXJuIGFyZ3M7dmFyIGM9XCJjb2xvcjogXCIrdGhpcy5jb2xvcjthcmdzPVthcmdzWzBdLGMsXCJjb2xvcjogaW5oZXJpdFwiXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncywxKSk7dmFyIGluZGV4PTA7dmFyIGxhc3RDPTA7YXJnc1swXS5yZXBsYWNlKC8lW2EteiVdL2csZnVuY3Rpb24obWF0Y2gpe2lmKFwiJSVcIj09PW1hdGNoKXJldHVybjtpbmRleCsrO2lmKFwiJWNcIj09PW1hdGNoKXtsYXN0Qz1pbmRleH19KTthcmdzLnNwbGljZShsYXN0QywwLGMpO3JldHVybiBhcmdzfWZ1bmN0aW9uIGxvZygpe3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgY29uc29sZSYmY29uc29sZS5sb2cmJkZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGUubG9nLGNvbnNvbGUsYXJndW1lbnRzKX1mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpe3RyeXtpZihudWxsPT1uYW1lc3BhY2VzKXtleHBvcnRzLnN0b3JhZ2UucmVtb3ZlSXRlbShcImRlYnVnXCIpfWVsc2V7ZXhwb3J0cy5zdG9yYWdlLmRlYnVnPW5hbWVzcGFjZXN9fWNhdGNoKGUpe319ZnVuY3Rpb24gbG9hZCgpe3ZhciByO3RyeXtyPWV4cG9ydHMuc3RvcmFnZS5kZWJ1Z31jYXRjaChlKXt9cmV0dXJuIHJ9ZXhwb3J0cy5lbmFibGUobG9hZCgpKTtmdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKXt0cnl7cmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2V9Y2F0Y2goZSl7fX19LHtcIi4vZGVidWdcIjoxOH1dLDE4OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtleHBvcnRzPW1vZHVsZS5leHBvcnRzPWRlYnVnO2V4cG9ydHMuY29lcmNlPWNvZXJjZTtleHBvcnRzLmRpc2FibGU9ZGlzYWJsZTtleHBvcnRzLmVuYWJsZT1lbmFibGU7ZXhwb3J0cy5lbmFibGVkPWVuYWJsZWQ7ZXhwb3J0cy5odW1hbml6ZT1fZGVyZXFfKFwibXNcIik7ZXhwb3J0cy5uYW1lcz1bXTtleHBvcnRzLnNraXBzPVtdO2V4cG9ydHMuZm9ybWF0dGVycz17fTt2YXIgcHJldkNvbG9yPTA7dmFyIHByZXZUaW1lO2Z1bmN0aW9uIHNlbGVjdENvbG9yKCl7cmV0dXJuIGV4cG9ydHMuY29sb3JzW3ByZXZDb2xvcisrJWV4cG9ydHMuY29sb3JzLmxlbmd0aF19ZnVuY3Rpb24gZGVidWcobmFtZXNwYWNlKXtmdW5jdGlvbiBkaXNhYmxlZCgpe31kaXNhYmxlZC5lbmFibGVkPWZhbHNlO2Z1bmN0aW9uIGVuYWJsZWQoKXt2YXIgc2VsZj1lbmFibGVkO3ZhciBjdXJyPStuZXcgRGF0ZTt2YXIgbXM9Y3Vyci0ocHJldlRpbWV8fGN1cnIpO3NlbGYuZGlmZj1tcztzZWxmLnByZXY9cHJldlRpbWU7c2VsZi5jdXJyPWN1cnI7cHJldlRpbWU9Y3VycjtpZihudWxsPT1zZWxmLnVzZUNvbG9ycylzZWxmLnVzZUNvbG9ycz1leHBvcnRzLnVzZUNvbG9ycygpO2lmKG51bGw9PXNlbGYuY29sb3ImJnNlbGYudXNlQ29sb3JzKXNlbGYuY29sb3I9c2VsZWN0Q29sb3IoKTt2YXIgYXJncz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO2FyZ3NbMF09ZXhwb3J0cy5jb2VyY2UoYXJnc1swXSk7aWYoXCJzdHJpbmdcIiE9PXR5cGVvZiBhcmdzWzBdKXthcmdzPVtcIiVvXCJdLmNvbmNhdChhcmdzKX12YXIgaW5kZXg9MDthcmdzWzBdPWFyZ3NbMF0ucmVwbGFjZSgvJShbYS16JV0pL2csZnVuY3Rpb24obWF0Y2gsZm9ybWF0KXtpZihtYXRjaD09PVwiJSVcIilyZXR1cm4gbWF0Y2g7aW5kZXgrKzt2YXIgZm9ybWF0dGVyPWV4cG9ydHMuZm9ybWF0dGVyc1tmb3JtYXRdO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBmb3JtYXR0ZXIpe3ZhciB2YWw9YXJnc1tpbmRleF07bWF0Y2g9Zm9ybWF0dGVyLmNhbGwoc2VsZix2YWwpO2FyZ3Muc3BsaWNlKGluZGV4LDEpO2luZGV4LS19cmV0dXJuIG1hdGNofSk7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGV4cG9ydHMuZm9ybWF0QXJncyl7YXJncz1leHBvcnRzLmZvcm1hdEFyZ3MuYXBwbHkoc2VsZixhcmdzKX12YXIgbG9nRm49ZW5hYmxlZC5sb2d8fGV4cG9ydHMubG9nfHxjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO2xvZ0ZuLmFwcGx5KHNlbGYsYXJncyl9ZW5hYmxlZC5lbmFibGVkPXRydWU7dmFyIGZuPWV4cG9ydHMuZW5hYmxlZChuYW1lc3BhY2UpP2VuYWJsZWQ6ZGlzYWJsZWQ7Zm4ubmFtZXNwYWNlPW5hbWVzcGFjZTtyZXR1cm4gZm59ZnVuY3Rpb24gZW5hYmxlKG5hbWVzcGFjZXMpe2V4cG9ydHMuc2F2ZShuYW1lc3BhY2VzKTt2YXIgc3BsaXQ9KG5hbWVzcGFjZXN8fFwiXCIpLnNwbGl0KC9bXFxzLF0rLyk7dmFyIGxlbj1zcGxpdC5sZW5ndGg7Zm9yKHZhciBpPTA7aTxsZW47aSsrKXtpZighc3BsaXRbaV0pY29udGludWU7bmFtZXNwYWNlcz1zcGxpdFtpXS5yZXBsYWNlKC9cXCovZyxcIi4qP1wiKTtpZihuYW1lc3BhY2VzWzBdPT09XCItXCIpe2V4cG9ydHMuc2tpcHMucHVzaChuZXcgUmVnRXhwKFwiXlwiK25hbWVzcGFjZXMuc3Vic3RyKDEpK1wiJFwiKSl9ZWxzZXtleHBvcnRzLm5hbWVzLnB1c2gobmV3IFJlZ0V4cChcIl5cIituYW1lc3BhY2VzK1wiJFwiKSl9fX1mdW5jdGlvbiBkaXNhYmxlKCl7ZXhwb3J0cy5lbmFibGUoXCJcIil9ZnVuY3Rpb24gZW5hYmxlZChuYW1lKXt2YXIgaSxsZW47Zm9yKGk9MCxsZW49ZXhwb3J0cy5za2lwcy5sZW5ndGg7aTxsZW47aSsrKXtpZihleHBvcnRzLnNraXBzW2ldLnRlc3QobmFtZSkpe3JldHVybiBmYWxzZX19Zm9yKGk9MCxsZW49ZXhwb3J0cy5uYW1lcy5sZW5ndGg7aTxsZW47aSsrKXtpZihleHBvcnRzLm5hbWVzW2ldLnRlc3QobmFtZSkpe3JldHVybiB0cnVlfX1yZXR1cm4gZmFsc2V9ZnVuY3Rpb24gY29lcmNlKHZhbCl7aWYodmFsIGluc3RhbmNlb2YgRXJyb3IpcmV0dXJuIHZhbC5zdGFja3x8dmFsLm1lc3NhZ2U7cmV0dXJuIHZhbH19LHttczoyNX1dLDE5OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24oZ2xvYmFsKXt2YXIga2V5cz1fZGVyZXFfKFwiLi9rZXlzXCIpO3ZhciBoYXNCaW5hcnk9X2RlcmVxXyhcImhhcy1iaW5hcnlcIik7dmFyIHNsaWNlQnVmZmVyPV9kZXJlcV8oXCJhcnJheWJ1ZmZlci5zbGljZVwiKTt2YXIgYmFzZTY0ZW5jb2Rlcj1fZGVyZXFfKFwiYmFzZTY0LWFycmF5YnVmZmVyXCIpO3ZhciBhZnRlcj1fZGVyZXFfKFwiYWZ0ZXJcIik7dmFyIHV0Zjg9X2RlcmVxXyhcInV0ZjhcIik7dmFyIGlzQW5kcm9pZD1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpO3ZhciBpc1BoYW50b21KUz0vUGhhbnRvbUpTL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTt2YXIgZG9udFNlbmRCbG9icz1pc0FuZHJvaWR8fGlzUGhhbnRvbUpTO2V4cG9ydHMucHJvdG9jb2w9Mzt2YXIgcGFja2V0cz1leHBvcnRzLnBhY2tldHM9e29wZW46MCxjbG9zZToxLHBpbmc6Mixwb25nOjMsbWVzc2FnZTo0LHVwZ3JhZGU6NSxub29wOjZ9O3ZhciBwYWNrZXRzbGlzdD1rZXlzKHBhY2tldHMpO3ZhciBlcnI9e3R5cGU6XCJlcnJvclwiLGRhdGE6XCJwYXJzZXIgZXJyb3JcIn07dmFyIEJsb2I9X2RlcmVxXyhcImJsb2JcIik7ZXhwb3J0cy5lbmNvZGVQYWNrZXQ9ZnVuY3Rpb24ocGFja2V0LHN1cHBvcnRzQmluYXJ5LHV0ZjhlbmNvZGUsY2FsbGJhY2spe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHN1cHBvcnRzQmluYXJ5KXtjYWxsYmFjaz1zdXBwb3J0c0JpbmFyeTtzdXBwb3J0c0JpbmFyeT1mYWxzZX1pZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB1dGY4ZW5jb2RlKXtjYWxsYmFjaz11dGY4ZW5jb2RlO3V0ZjhlbmNvZGU9bnVsbH12YXIgZGF0YT1wYWNrZXQuZGF0YT09PXVuZGVmaW5lZD91bmRlZmluZWQ6cGFja2V0LmRhdGEuYnVmZmVyfHxwYWNrZXQuZGF0YTtpZihnbG9iYWwuQXJyYXlCdWZmZXImJmRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7cmV0dXJuIGVuY29kZUFycmF5QnVmZmVyKHBhY2tldCxzdXBwb3J0c0JpbmFyeSxjYWxsYmFjayl9ZWxzZSBpZihCbG9iJiZkYXRhIGluc3RhbmNlb2YgZ2xvYmFsLkJsb2Ipe3JldHVybiBlbmNvZGVCbG9iKHBhY2tldCxzdXBwb3J0c0JpbmFyeSxjYWxsYmFjayl9aWYoZGF0YSYmZGF0YS5iYXNlNjQpe3JldHVybiBlbmNvZGVCYXNlNjRPYmplY3QocGFja2V0LGNhbGxiYWNrKX12YXIgZW5jb2RlZD1wYWNrZXRzW3BhY2tldC50eXBlXTtpZih1bmRlZmluZWQhPT1wYWNrZXQuZGF0YSl7ZW5jb2RlZCs9dXRmOGVuY29kZT91dGY4LmVuY29kZShTdHJpbmcocGFja2V0LmRhdGEpKTpTdHJpbmcocGFja2V0LmRhdGEpfXJldHVybiBjYWxsYmFjayhcIlwiK2VuY29kZWQpfTtmdW5jdGlvbiBlbmNvZGVCYXNlNjRPYmplY3QocGFja2V0LGNhbGxiYWNrKXt2YXIgbWVzc2FnZT1cImJcIitleHBvcnRzLnBhY2tldHNbcGFja2V0LnR5cGVdK3BhY2tldC5kYXRhLmRhdGE7cmV0dXJuIGNhbGxiYWNrKG1lc3NhZ2UpfWZ1bmN0aW9uIGVuY29kZUFycmF5QnVmZmVyKHBhY2tldCxzdXBwb3J0c0JpbmFyeSxjYWxsYmFjayl7aWYoIXN1cHBvcnRzQmluYXJ5KXtyZXR1cm4gZXhwb3J0cy5lbmNvZGVCYXNlNjRQYWNrZXQocGFja2V0LGNhbGxiYWNrKX12YXIgZGF0YT1wYWNrZXQuZGF0YTt2YXIgY29udGVudEFycmF5PW5ldyBVaW50OEFycmF5KGRhdGEpO3ZhciByZXN1bHRCdWZmZXI9bmV3IFVpbnQ4QXJyYXkoMStkYXRhLmJ5dGVMZW5ndGgpO3Jlc3VsdEJ1ZmZlclswXT1wYWNrZXRzW3BhY2tldC50eXBlXTtmb3IodmFyIGk9MDtpPGNvbnRlbnRBcnJheS5sZW5ndGg7aSsrKXtyZXN1bHRCdWZmZXJbaSsxXT1jb250ZW50QXJyYXlbaV19cmV0dXJuIGNhbGxiYWNrKHJlc3VsdEJ1ZmZlci5idWZmZXIpfWZ1bmN0aW9uIGVuY29kZUJsb2JBc0FycmF5QnVmZmVyKHBhY2tldCxzdXBwb3J0c0JpbmFyeSxjYWxsYmFjayl7aWYoIXN1cHBvcnRzQmluYXJ5KXtyZXR1cm4gZXhwb3J0cy5lbmNvZGVCYXNlNjRQYWNrZXQocGFja2V0LGNhbGxiYWNrKX12YXIgZnI9bmV3IEZpbGVSZWFkZXI7ZnIub25sb2FkPWZ1bmN0aW9uKCl7cGFja2V0LmRhdGE9ZnIucmVzdWx0O2V4cG9ydHMuZW5jb2RlUGFja2V0KHBhY2tldCxzdXBwb3J0c0JpbmFyeSx0cnVlLGNhbGxiYWNrKX07cmV0dXJuIGZyLnJlYWRBc0FycmF5QnVmZmVyKHBhY2tldC5kYXRhKX1mdW5jdGlvbiBlbmNvZGVCbG9iKHBhY2tldCxzdXBwb3J0c0JpbmFyeSxjYWxsYmFjayl7aWYoIXN1cHBvcnRzQmluYXJ5KXtyZXR1cm4gZXhwb3J0cy5lbmNvZGVCYXNlNjRQYWNrZXQocGFja2V0LGNhbGxiYWNrKX1pZihkb250U2VuZEJsb2JzKXtyZXR1cm4gZW5jb2RlQmxvYkFzQXJyYXlCdWZmZXIocGFja2V0LHN1cHBvcnRzQmluYXJ5LGNhbGxiYWNrKX12YXIgbGVuZ3RoPW5ldyBVaW50OEFycmF5KDEpO2xlbmd0aFswXT1wYWNrZXRzW3BhY2tldC50eXBlXTt2YXIgYmxvYj1uZXcgQmxvYihbbGVuZ3RoLmJ1ZmZlcixwYWNrZXQuZGF0YV0pO3JldHVybiBjYWxsYmFjayhibG9iKX1leHBvcnRzLmVuY29kZUJhc2U2NFBhY2tldD1mdW5jdGlvbihwYWNrZXQsY2FsbGJhY2spe3ZhciBtZXNzYWdlPVwiYlwiK2V4cG9ydHMucGFja2V0c1twYWNrZXQudHlwZV07aWYoQmxvYiYmcGFja2V0LmRhdGEgaW5zdGFuY2VvZiBnbG9iYWwuQmxvYil7dmFyIGZyPW5ldyBGaWxlUmVhZGVyO2ZyLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiNjQ9ZnIucmVzdWx0LnNwbGl0KFwiLFwiKVsxXTtjYWxsYmFjayhtZXNzYWdlK2I2NCl9O3JldHVybiBmci5yZWFkQXNEYXRhVVJMKHBhY2tldC5kYXRhKX12YXIgYjY0ZGF0YTt0cnl7YjY0ZGF0YT1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsbmV3IFVpbnQ4QXJyYXkocGFja2V0LmRhdGEpKX1jYXRjaChlKXt2YXIgdHlwZWQ9bmV3IFVpbnQ4QXJyYXkocGFja2V0LmRhdGEpO3ZhciBiYXNpYz1uZXcgQXJyYXkodHlwZWQubGVuZ3RoKTtmb3IodmFyIGk9MDtpPHR5cGVkLmxlbmd0aDtpKyspe2Jhc2ljW2ldPXR5cGVkW2ldfWI2NGRhdGE9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLGJhc2ljKX1tZXNzYWdlKz1nbG9iYWwuYnRvYShiNjRkYXRhKTtyZXR1cm4gY2FsbGJhY2sobWVzc2FnZSl9O2V4cG9ydHMuZGVjb2RlUGFja2V0PWZ1bmN0aW9uKGRhdGEsYmluYXJ5VHlwZSx1dGY4ZGVjb2RlKXtpZih0eXBlb2YgZGF0YT09XCJzdHJpbmdcInx8ZGF0YT09PXVuZGVmaW5lZCl7aWYoZGF0YS5jaGFyQXQoMCk9PVwiYlwiKXtyZXR1cm4gZXhwb3J0cy5kZWNvZGVCYXNlNjRQYWNrZXQoZGF0YS5zdWJzdHIoMSksYmluYXJ5VHlwZSl9aWYodXRmOGRlY29kZSl7dHJ5e2RhdGE9dXRmOC5kZWNvZGUoZGF0YSl9Y2F0Y2goZSl7cmV0dXJuIGVycn19dmFyIHR5cGU9ZGF0YS5jaGFyQXQoMCk7aWYoTnVtYmVyKHR5cGUpIT10eXBlfHwhcGFja2V0c2xpc3RbdHlwZV0pe3JldHVybiBlcnJ9aWYoZGF0YS5sZW5ndGg+MSl7cmV0dXJue3R5cGU6cGFja2V0c2xpc3RbdHlwZV0sZGF0YTpkYXRhLnN1YnN0cmluZygxKX19ZWxzZXtyZXR1cm57dHlwZTpwYWNrZXRzbGlzdFt0eXBlXX19fXZhciBhc0FycmF5PW5ldyBVaW50OEFycmF5KGRhdGEpO3ZhciB0eXBlPWFzQXJyYXlbMF07dmFyIHJlc3Q9c2xpY2VCdWZmZXIoZGF0YSwxKTtpZihCbG9iJiZiaW5hcnlUeXBlPT09XCJibG9iXCIpe3Jlc3Q9bmV3IEJsb2IoW3Jlc3RdKX1yZXR1cm57dHlwZTpwYWNrZXRzbGlzdFt0eXBlXSxkYXRhOnJlc3R9fTtleHBvcnRzLmRlY29kZUJhc2U2NFBhY2tldD1mdW5jdGlvbihtc2csYmluYXJ5VHlwZSl7dmFyIHR5cGU9cGFja2V0c2xpc3RbbXNnLmNoYXJBdCgwKV07aWYoIWdsb2JhbC5BcnJheUJ1ZmZlcil7cmV0dXJue3R5cGU6dHlwZSxkYXRhOntiYXNlNjQ6dHJ1ZSxkYXRhOm1zZy5zdWJzdHIoMSl9fX12YXIgZGF0YT1iYXNlNjRlbmNvZGVyLmRlY29kZShtc2cuc3Vic3RyKDEpKTtpZihiaW5hcnlUeXBlPT09XCJibG9iXCImJkJsb2Ipe2RhdGE9bmV3IEJsb2IoW2RhdGFdKX1yZXR1cm57dHlwZTp0eXBlLGRhdGE6ZGF0YX19O2V4cG9ydHMuZW5jb2RlUGF5bG9hZD1mdW5jdGlvbihwYWNrZXRzLHN1cHBvcnRzQmluYXJ5LGNhbGxiYWNrKXtpZih0eXBlb2Ygc3VwcG9ydHNCaW5hcnk9PVwiZnVuY3Rpb25cIil7Y2FsbGJhY2s9c3VwcG9ydHNCaW5hcnk7c3VwcG9ydHNCaW5hcnk9bnVsbH12YXIgaXNCaW5hcnk9aGFzQmluYXJ5KHBhY2tldHMpO2lmKHN1cHBvcnRzQmluYXJ5JiZpc0JpbmFyeSl7aWYoQmxvYiYmIWRvbnRTZW5kQmxvYnMpe3JldHVybiBleHBvcnRzLmVuY29kZVBheWxvYWRBc0Jsb2IocGFja2V0cyxjYWxsYmFjayl9cmV0dXJuIGV4cG9ydHMuZW5jb2RlUGF5bG9hZEFzQXJyYXlCdWZmZXIocGFja2V0cyxjYWxsYmFjayl9aWYoIXBhY2tldHMubGVuZ3RoKXtyZXR1cm4gY2FsbGJhY2soXCIwOlwiKX1mdW5jdGlvbiBzZXRMZW5ndGhIZWFkZXIobWVzc2FnZSl7cmV0dXJuIG1lc3NhZ2UubGVuZ3RoK1wiOlwiK21lc3NhZ2V9ZnVuY3Rpb24gZW5jb2RlT25lKHBhY2tldCxkb25lQ2FsbGJhY2spe2V4cG9ydHMuZW5jb2RlUGFja2V0KHBhY2tldCwhaXNCaW5hcnk/ZmFsc2U6c3VwcG9ydHNCaW5hcnksdHJ1ZSxmdW5jdGlvbihtZXNzYWdlKXtkb25lQ2FsbGJhY2sobnVsbCxzZXRMZW5ndGhIZWFkZXIobWVzc2FnZSkpfSl9bWFwKHBhY2tldHMsZW5jb2RlT25lLGZ1bmN0aW9uKGVycixyZXN1bHRzKXtyZXR1cm4gY2FsbGJhY2socmVzdWx0cy5qb2luKFwiXCIpKX0pfTtmdW5jdGlvbiBtYXAoYXJ5LGVhY2gsZG9uZSl7dmFyIHJlc3VsdD1uZXcgQXJyYXkoYXJ5Lmxlbmd0aCk7dmFyIG5leHQ9YWZ0ZXIoYXJ5Lmxlbmd0aCxkb25lKTt2YXIgZWFjaFdpdGhJbmRleD1mdW5jdGlvbihpLGVsLGNiKXtlYWNoKGVsLGZ1bmN0aW9uKGVycm9yLG1zZyl7cmVzdWx0W2ldPW1zZztjYihlcnJvcixyZXN1bHQpfSl9O2Zvcih2YXIgaT0wO2k8YXJ5Lmxlbmd0aDtpKyspe2VhY2hXaXRoSW5kZXgoaSxhcnlbaV0sbmV4dCl9fWV4cG9ydHMuZGVjb2RlUGF5bG9hZD1mdW5jdGlvbihkYXRhLGJpbmFyeVR5cGUsY2FsbGJhY2spe2lmKHR5cGVvZiBkYXRhIT1cInN0cmluZ1wiKXtyZXR1cm4gZXhwb3J0cy5kZWNvZGVQYXlsb2FkQXNCaW5hcnkoZGF0YSxiaW5hcnlUeXBlLGNhbGxiYWNrKX1pZih0eXBlb2YgYmluYXJ5VHlwZT09PVwiZnVuY3Rpb25cIil7Y2FsbGJhY2s9YmluYXJ5VHlwZTtiaW5hcnlUeXBlPW51bGx9dmFyIHBhY2tldDtpZihkYXRhPT1cIlwiKXtyZXR1cm4gY2FsbGJhY2soZXJyLDAsMSl9dmFyIGxlbmd0aD1cIlwiLG4sbXNnO2Zvcih2YXIgaT0wLGw9ZGF0YS5sZW5ndGg7aTxsO2krKyl7dmFyIGNocj1kYXRhLmNoYXJBdChpKTtpZihcIjpcIiE9Y2hyKXtsZW5ndGgrPWNocn1lbHNle2lmKFwiXCI9PWxlbmd0aHx8bGVuZ3RoIT0obj1OdW1iZXIobGVuZ3RoKSkpe3JldHVybiBjYWxsYmFjayhlcnIsMCwxKX1tc2c9ZGF0YS5zdWJzdHIoaSsxLG4pO2lmKGxlbmd0aCE9bXNnLmxlbmd0aCl7cmV0dXJuIGNhbGxiYWNrKGVyciwwLDEpfWlmKG1zZy5sZW5ndGgpe3BhY2tldD1leHBvcnRzLmRlY29kZVBhY2tldChtc2csYmluYXJ5VHlwZSx0cnVlKTtpZihlcnIudHlwZT09cGFja2V0LnR5cGUmJmVyci5kYXRhPT1wYWNrZXQuZGF0YSl7cmV0dXJuIGNhbGxiYWNrKGVyciwwLDEpfXZhciByZXQ9Y2FsbGJhY2socGFja2V0LGkrbixsKTtpZihmYWxzZT09PXJldClyZXR1cm59aSs9bjtsZW5ndGg9XCJcIn19aWYobGVuZ3RoIT1cIlwiKXtyZXR1cm4gY2FsbGJhY2soZXJyLDAsMSl9fTtleHBvcnRzLmVuY29kZVBheWxvYWRBc0FycmF5QnVmZmVyPWZ1bmN0aW9uKHBhY2tldHMsY2FsbGJhY2spe2lmKCFwYWNrZXRzLmxlbmd0aCl7cmV0dXJuIGNhbGxiYWNrKG5ldyBBcnJheUJ1ZmZlcigwKSl9ZnVuY3Rpb24gZW5jb2RlT25lKHBhY2tldCxkb25lQ2FsbGJhY2spe2V4cG9ydHMuZW5jb2RlUGFja2V0KHBhY2tldCx0cnVlLHRydWUsZnVuY3Rpb24oZGF0YSl7cmV0dXJuIGRvbmVDYWxsYmFjayhudWxsLGRhdGEpfSl9bWFwKHBhY2tldHMsZW5jb2RlT25lLGZ1bmN0aW9uKGVycixlbmNvZGVkUGFja2V0cyl7dmFyIHRvdGFsTGVuZ3RoPWVuY29kZWRQYWNrZXRzLnJlZHVjZShmdW5jdGlvbihhY2MscCl7dmFyIGxlbjtpZih0eXBlb2YgcD09PVwic3RyaW5nXCIpe2xlbj1wLmxlbmd0aH1lbHNle2xlbj1wLmJ5dGVMZW5ndGh9cmV0dXJuIGFjYytsZW4udG9TdHJpbmcoKS5sZW5ndGgrbGVuKzJ9LDApO3ZhciByZXN1bHRBcnJheT1uZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7dmFyIGJ1ZmZlckluZGV4PTA7ZW5jb2RlZFBhY2tldHMuZm9yRWFjaChmdW5jdGlvbihwKXt2YXIgaXNTdHJpbmc9dHlwZW9mIHA9PT1cInN0cmluZ1wiO3ZhciBhYj1wO2lmKGlzU3RyaW5nKXt2YXIgdmlldz1uZXcgVWludDhBcnJheShwLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTxwLmxlbmd0aDtpKyspe3ZpZXdbaV09cC5jaGFyQ29kZUF0KGkpfWFiPXZpZXcuYnVmZmVyfWlmKGlzU3RyaW5nKXtyZXN1bHRBcnJheVtidWZmZXJJbmRleCsrXT0wfWVsc2V7cmVzdWx0QXJyYXlbYnVmZmVySW5kZXgrK109MX12YXIgbGVuU3RyPWFiLmJ5dGVMZW5ndGgudG9TdHJpbmcoKTtmb3IodmFyIGk9MDtpPGxlblN0ci5sZW5ndGg7aSsrKXtyZXN1bHRBcnJheVtidWZmZXJJbmRleCsrXT1wYXJzZUludChsZW5TdHJbaV0pfXJlc3VsdEFycmF5W2J1ZmZlckluZGV4KytdPTI1NTt2YXIgdmlldz1uZXcgVWludDhBcnJheShhYik7Zm9yKHZhciBpPTA7aTx2aWV3Lmxlbmd0aDtpKyspe3Jlc3VsdEFycmF5W2J1ZmZlckluZGV4KytdPXZpZXdbaV19fSk7cmV0dXJuIGNhbGxiYWNrKHJlc3VsdEFycmF5LmJ1ZmZlcil9KX07ZXhwb3J0cy5lbmNvZGVQYXlsb2FkQXNCbG9iPWZ1bmN0aW9uKHBhY2tldHMsY2FsbGJhY2spe2Z1bmN0aW9uIGVuY29kZU9uZShwYWNrZXQsZG9uZUNhbGxiYWNrKXtleHBvcnRzLmVuY29kZVBhY2tldChwYWNrZXQsdHJ1ZSx0cnVlLGZ1bmN0aW9uKGVuY29kZWQpe3ZhciBiaW5hcnlJZGVudGlmaWVyPW5ldyBVaW50OEFycmF5KDEpO2JpbmFyeUlkZW50aWZpZXJbMF09MTtpZih0eXBlb2YgZW5jb2RlZD09PVwic3RyaW5nXCIpe3ZhciB2aWV3PW5ldyBVaW50OEFycmF5KGVuY29kZWQubGVuZ3RoKTtmb3IodmFyIGk9MDtpPGVuY29kZWQubGVuZ3RoO2krKyl7dmlld1tpXT1lbmNvZGVkLmNoYXJDb2RlQXQoaSl9ZW5jb2RlZD12aWV3LmJ1ZmZlcjtiaW5hcnlJZGVudGlmaWVyWzBdPTB9dmFyIGxlbj1lbmNvZGVkIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZW5jb2RlZC5ieXRlTGVuZ3RoOmVuY29kZWQuc2l6ZTt2YXIgbGVuU3RyPWxlbi50b1N0cmluZygpO3ZhciBsZW5ndGhBcnk9bmV3IFVpbnQ4QXJyYXkobGVuU3RyLmxlbmd0aCsxKTtmb3IodmFyIGk9MDtpPGxlblN0ci5sZW5ndGg7aSsrKXtsZW5ndGhBcnlbaV09cGFyc2VJbnQobGVuU3RyW2ldKX1sZW5ndGhBcnlbbGVuU3RyLmxlbmd0aF09MjU1O2lmKEJsb2Ipe3ZhciBibG9iPW5ldyBCbG9iKFtiaW5hcnlJZGVudGlmaWVyLmJ1ZmZlcixsZW5ndGhBcnkuYnVmZmVyLGVuY29kZWRdKTtkb25lQ2FsbGJhY2sobnVsbCxibG9iKX19KX1tYXAocGFja2V0cyxlbmNvZGVPbmUsZnVuY3Rpb24oZXJyLHJlc3VsdHMpe3JldHVybiBjYWxsYmFjayhuZXcgQmxvYihyZXN1bHRzKSl9KX07ZXhwb3J0cy5kZWNvZGVQYXlsb2FkQXNCaW5hcnk9ZnVuY3Rpb24oZGF0YSxiaW5hcnlUeXBlLGNhbGxiYWNrKXtpZih0eXBlb2YgYmluYXJ5VHlwZT09PVwiZnVuY3Rpb25cIil7Y2FsbGJhY2s9YmluYXJ5VHlwZTtiaW5hcnlUeXBlPW51bGx9dmFyIGJ1ZmZlclRhaWw9ZGF0YTt2YXIgYnVmZmVycz1bXTt2YXIgbnVtYmVyVG9vTG9uZz1mYWxzZTt3aGlsZShidWZmZXJUYWlsLmJ5dGVMZW5ndGg+MCl7dmFyIHRhaWxBcnJheT1uZXcgVWludDhBcnJheShidWZmZXJUYWlsKTt2YXIgaXNTdHJpbmc9dGFpbEFycmF5WzBdPT09MDt2YXIgbXNnTGVuZ3RoPVwiXCI7Zm9yKHZhciBpPTE7O2krKyl7aWYodGFpbEFycmF5W2ldPT0yNTUpYnJlYWs7aWYobXNnTGVuZ3RoLmxlbmd0aD4zMTApe251bWJlclRvb0xvbmc9dHJ1ZTticmVha31tc2dMZW5ndGgrPXRhaWxBcnJheVtpXX1pZihudW1iZXJUb29Mb25nKXJldHVybiBjYWxsYmFjayhlcnIsMCwxKTtidWZmZXJUYWlsPXNsaWNlQnVmZmVyKGJ1ZmZlclRhaWwsMittc2dMZW5ndGgubGVuZ3RoKTttc2dMZW5ndGg9cGFyc2VJbnQobXNnTGVuZ3RoKTt2YXIgbXNnPXNsaWNlQnVmZmVyKGJ1ZmZlclRhaWwsMCxtc2dMZW5ndGgpO2lmKGlzU3RyaW5nKXt0cnl7bXNnPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheShtc2cpKX1jYXRjaChlKXt2YXIgdHlwZWQ9bmV3IFVpbnQ4QXJyYXkobXNnKTttc2c9XCJcIjtmb3IodmFyIGk9MDtpPHR5cGVkLmxlbmd0aDtpKyspe21zZys9U3RyaW5nLmZyb21DaGFyQ29kZSh0eXBlZFtpXSl9fX1idWZmZXJzLnB1c2gobXNnKTtidWZmZXJUYWlsPXNsaWNlQnVmZmVyKGJ1ZmZlclRhaWwsbXNnTGVuZ3RoKX12YXIgdG90YWw9YnVmZmVycy5sZW5ndGg7YnVmZmVycy5mb3JFYWNoKGZ1bmN0aW9uKGJ1ZmZlcixpKXtjYWxsYmFjayhleHBvcnRzLmRlY29kZVBhY2tldChidWZmZXIsYmluYXJ5VHlwZSx0cnVlKSxpLHRvdGFsKX0pfX0pLmNhbGwodGhpcyx0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCI/c2VsZjp0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIj93aW5kb3c6dHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCI/Z2xvYmFsOnt9KX0se1wiLi9rZXlzXCI6MjAsYWZ0ZXI6MTEsXCJhcnJheWJ1ZmZlci5zbGljZVwiOjEyLFwiYmFzZTY0LWFycmF5YnVmZmVyXCI6MTMsYmxvYjoxNCxcImhhcy1iaW5hcnlcIjoyMSx1dGY4OjI5fV0sMjA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPU9iamVjdC5rZXlzfHxmdW5jdGlvbiBrZXlzKG9iail7dmFyIGFycj1bXTt2YXIgaGFzPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7Zm9yKHZhciBpIGluIG9iail7aWYoaGFzLmNhbGwob2JqLGkpKXthcnIucHVzaChpKX19cmV0dXJuIGFycn19LHt9XSwyMTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKGdsb2JhbCl7dmFyIGlzQXJyYXk9X2RlcmVxXyhcImlzYXJyYXlcIik7bW9kdWxlLmV4cG9ydHM9aGFzQmluYXJ5O2Z1bmN0aW9uIGhhc0JpbmFyeShkYXRhKXtmdW5jdGlvbiBfaGFzQmluYXJ5KG9iail7aWYoIW9iailyZXR1cm4gZmFsc2U7aWYoZ2xvYmFsLkJ1ZmZlciYmZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlcihvYmopfHxnbG9iYWwuQXJyYXlCdWZmZXImJm9iaiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxnbG9iYWwuQmxvYiYmb2JqIGluc3RhbmNlb2YgQmxvYnx8Z2xvYmFsLkZpbGUmJm9iaiBpbnN0YW5jZW9mIEZpbGUpe3JldHVybiB0cnVlfWlmKGlzQXJyYXkob2JqKSl7Zm9yKHZhciBpPTA7aTxvYmoubGVuZ3RoO2krKyl7aWYoX2hhc0JpbmFyeShvYmpbaV0pKXtyZXR1cm4gdHJ1ZX19fWVsc2UgaWYob2JqJiZcIm9iamVjdFwiPT10eXBlb2Ygb2JqKXtpZihvYmoudG9KU09OKXtvYmo9b2JqLnRvSlNPTigpfWZvcih2YXIga2V5IGluIG9iail7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixrZXkpJiZfaGFzQmluYXJ5KG9ialtrZXldKSl7cmV0dXJuIHRydWV9fX1yZXR1cm4gZmFsc2V9cmV0dXJuIF9oYXNCaW5hcnkoZGF0YSl9fSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIj9zZWxmOnR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIj9nbG9iYWw6e30pfSx7aXNhcnJheToyNH1dLDIyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXt0cnl7bW9kdWxlLmV4cG9ydHM9dHlwZW9mIFhNTEh0dHBSZXF1ZXN0IT09XCJ1bmRlZmluZWRcIiYmXCJ3aXRoQ3JlZGVudGlhbHNcImluIG5ldyBYTUxIdHRwUmVxdWVzdH1jYXRjaChlcnIpe21vZHVsZS5leHBvcnRzPWZhbHNlfX0se31dLDIzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXt2YXIgaW5kZXhPZj1bXS5pbmRleE9mO21vZHVsZS5leHBvcnRzPWZ1bmN0aW9uKGFycixvYmope2lmKGluZGV4T2YpcmV0dXJuIGFyci5pbmRleE9mKG9iaik7Zm9yKHZhciBpPTA7aTxhcnIubGVuZ3RoOysraSl7aWYoYXJyW2ldPT09b2JqKXJldHVybiBpfXJldHVybi0xfX0se31dLDI0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihhcnIpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJyKT09XCJbb2JqZWN0IEFycmF5XVwifX0se31dLDI1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXt2YXIgcz0xZTM7dmFyIG09cyo2MDt2YXIgaD1tKjYwO3ZhciBkPWgqMjQ7dmFyIHk9ZCozNjUuMjU7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24odmFsLG9wdGlvbnMpe29wdGlvbnM9b3B0aW9uc3x8e307aWYoXCJzdHJpbmdcIj09dHlwZW9mIHZhbClyZXR1cm4gcGFyc2UodmFsKTtyZXR1cm4gb3B0aW9ucy5sb25nP2xvbmcodmFsKTpzaG9ydCh2YWwpfTtmdW5jdGlvbiBwYXJzZShzdHIpe3N0cj1cIlwiK3N0cjtpZihzdHIubGVuZ3RoPjFlNClyZXR1cm47dmFyIG1hdGNoPS9eKCg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoc3RyKTtpZighbWF0Y2gpcmV0dXJuO3ZhciBuPXBhcnNlRmxvYXQobWF0Y2hbMV0pO3ZhciB0eXBlPShtYXRjaFsyXXx8XCJtc1wiKS50b0xvd2VyQ2FzZSgpO3N3aXRjaCh0eXBlKXtjYXNlXCJ5ZWFyc1wiOmNhc2VcInllYXJcIjpjYXNlXCJ5cnNcIjpjYXNlXCJ5clwiOmNhc2VcInlcIjpyZXR1cm4gbip5O2Nhc2VcImRheXNcIjpjYXNlXCJkYXlcIjpjYXNlXCJkXCI6cmV0dXJuIG4qZDtjYXNlXCJob3Vyc1wiOmNhc2VcImhvdXJcIjpjYXNlXCJocnNcIjpjYXNlXCJoclwiOmNhc2VcImhcIjpyZXR1cm4gbipoO2Nhc2VcIm1pbnV0ZXNcIjpjYXNlXCJtaW51dGVcIjpjYXNlXCJtaW5zXCI6Y2FzZVwibWluXCI6Y2FzZVwibVwiOnJldHVybiBuKm07Y2FzZVwic2Vjb25kc1wiOmNhc2VcInNlY29uZFwiOmNhc2VcInNlY3NcIjpjYXNlXCJzZWNcIjpjYXNlXCJzXCI6cmV0dXJuIG4qcztjYXNlXCJtaWxsaXNlY29uZHNcIjpjYXNlXCJtaWxsaXNlY29uZFwiOmNhc2VcIm1zZWNzXCI6Y2FzZVwibXNlY1wiOmNhc2VcIm1zXCI6cmV0dXJuIG59fWZ1bmN0aW9uIHNob3J0KG1zKXtpZihtcz49ZClyZXR1cm4gTWF0aC5yb3VuZChtcy9kKStcImRcIjtpZihtcz49aClyZXR1cm4gTWF0aC5yb3VuZChtcy9oKStcImhcIjtpZihtcz49bSlyZXR1cm4gTWF0aC5yb3VuZChtcy9tKStcIm1cIjtpZihtcz49cylyZXR1cm4gTWF0aC5yb3VuZChtcy9zKStcInNcIjtyZXR1cm4gbXMrXCJtc1wifWZ1bmN0aW9uIGxvbmcobXMpe3JldHVybiBwbHVyYWwobXMsZCxcImRheVwiKXx8cGx1cmFsKG1zLGgsXCJob3VyXCIpfHxwbHVyYWwobXMsbSxcIm1pbnV0ZVwiKXx8cGx1cmFsKG1zLHMsXCJzZWNvbmRcIil8fG1zK1wiIG1zXCJ9ZnVuY3Rpb24gcGx1cmFsKG1zLG4sbmFtZSl7aWYobXM8bilyZXR1cm47aWYobXM8bioxLjUpcmV0dXJuIE1hdGguZmxvb3IobXMvbikrXCIgXCIrbmFtZTtyZXR1cm4gTWF0aC5jZWlsKG1zL24pK1wiIFwiK25hbWUrXCJzXCJ9fSx7fV0sMjY6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpe3ZhciBydmFsaWRjaGFycz0vXltcXF0sOnt9XFxzXSokLzt2YXIgcnZhbGlkZXNjYXBlPS9cXFxcKD86W1wiXFxcXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2c7dmFyIHJ2YWxpZHRva2Vucz0vXCJbXlwiXFxcXFxcblxccl0qXCJ8dHJ1ZXxmYWxzZXxudWxsfC0/XFxkKyg/OlxcLlxcZCopPyg/OltlRV1bK1xcLV0/XFxkKyk/L2c7dmFyIHJ2YWxpZGJyYWNlcz0vKD86Xnw6fCwpKD86XFxzKlxcWykrL2c7dmFyIHJ0cmltTGVmdD0vXlxccysvO3ZhciBydHJpbVJpZ2h0PS9cXHMrJC87bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gcGFyc2Vqc29uKGRhdGEpe2lmKFwic3RyaW5nXCIhPXR5cGVvZiBkYXRhfHwhZGF0YSl7cmV0dXJuIG51bGx9ZGF0YT1kYXRhLnJlcGxhY2UocnRyaW1MZWZ0LFwiXCIpLnJlcGxhY2UocnRyaW1SaWdodCxcIlwiKTtpZihnbG9iYWwuSlNPTiYmSlNPTi5wYXJzZSl7cmV0dXJuIEpTT04ucGFyc2UoZGF0YSl9aWYocnZhbGlkY2hhcnMudGVzdChkYXRhLnJlcGxhY2UocnZhbGlkZXNjYXBlLFwiQFwiKS5yZXBsYWNlKHJ2YWxpZHRva2VucyxcIl1cIikucmVwbGFjZShydmFsaWRicmFjZXMsXCJcIikpKXtyZXR1cm4gbmV3IEZ1bmN0aW9uKFwicmV0dXJuIFwiK2RhdGEpKCl9fX0pLmNhbGwodGhpcyx0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCI/c2VsZjp0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIj93aW5kb3c6dHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCI/Z2xvYmFsOnt9KX0se31dLDI3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtleHBvcnRzLmVuY29kZT1mdW5jdGlvbihvYmope3ZhciBzdHI9XCJcIjtmb3IodmFyIGkgaW4gb2JqKXtpZihvYmouaGFzT3duUHJvcGVydHkoaSkpe2lmKHN0ci5sZW5ndGgpc3RyKz1cIiZcIjtzdHIrPWVuY29kZVVSSUNvbXBvbmVudChpKStcIj1cIitlbmNvZGVVUklDb21wb25lbnQob2JqW2ldKX19cmV0dXJuIHN0cn07ZXhwb3J0cy5kZWNvZGU9ZnVuY3Rpb24ocXMpe3ZhciBxcnk9e307dmFyIHBhaXJzPXFzLnNwbGl0KFwiJlwiKTtmb3IodmFyIGk9MCxsPXBhaXJzLmxlbmd0aDtpPGw7aSsrKXt2YXIgcGFpcj1wYWlyc1tpXS5zcGxpdChcIj1cIik7cXJ5W2RlY29kZVVSSUNvbXBvbmVudChwYWlyWzBdKV09ZGVjb2RlVVJJQ29tcG9uZW50KHBhaXJbMV0pfXJldHVybiBxcnl9fSx7fV0sMjg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe3ZhciByZT0vXig/Oig/IVteOkBdKzpbXjpAXFwvXSpAKShodHRwfGh0dHBzfHdzfHdzcyk6XFwvXFwvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPygoPzpbYS1mMC05XXswLDR9Oil7Miw3fVthLWYwLTldezAsNH18W146XFwvPyNdKikoPzo6KFxcZCopKT8pKCgoXFwvKD86W14/I10oPyFbXj8jXFwvXSpcXC5bXj8jXFwvLl0rKD86Wz8jXXwkKSkpKlxcLz8pPyhbXj8jXFwvXSopKSg/OlxcPyhbXiNdKikpPyg/OiMoLiopKT8pLzt2YXIgcGFydHM9W1wic291cmNlXCIsXCJwcm90b2NvbFwiLFwiYXV0aG9yaXR5XCIsXCJ1c2VySW5mb1wiLFwidXNlclwiLFwicGFzc3dvcmRcIixcImhvc3RcIixcInBvcnRcIixcInJlbGF0aXZlXCIsXCJwYXRoXCIsXCJkaXJlY3RvcnlcIixcImZpbGVcIixcInF1ZXJ5XCIsXCJhbmNob3JcIl07bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24gcGFyc2V1cmkoc3RyKXt2YXIgc3JjPXN0cixiPXN0ci5pbmRleE9mKFwiW1wiKSxlPXN0ci5pbmRleE9mKFwiXVwiKTtpZihiIT0tMSYmZSE9LTEpe3N0cj1zdHIuc3Vic3RyaW5nKDAsYikrc3RyLnN1YnN0cmluZyhiLGUpLnJlcGxhY2UoLzovZyxcIjtcIikrc3RyLnN1YnN0cmluZyhlLHN0ci5sZW5ndGgpfXZhciBtPXJlLmV4ZWMoc3RyfHxcIlwiKSx1cmk9e30saT0xNDt3aGlsZShpLS0pe3VyaVtwYXJ0c1tpXV09bVtpXXx8XCJcIn1pZihiIT0tMSYmZSE9LTEpe3VyaS5zb3VyY2U9c3JjO3VyaS5ob3N0PXVyaS5ob3N0LnN1YnN0cmluZygxLHVyaS5ob3N0Lmxlbmd0aC0xKS5yZXBsYWNlKC87L2csXCI6XCIpO3VyaS5hdXRob3JpdHk9dXJpLmF1dGhvcml0eS5yZXBsYWNlKFwiW1wiLFwiXCIpLnJlcGxhY2UoXCJdXCIsXCJcIikucmVwbGFjZSgvOy9nLFwiOlwiKTt1cmkuaXB2NnVyaT10cnVlfXJldHVybiB1cml9fSx7fV0sMjk6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpeyhmdW5jdGlvbihyb290KXt2YXIgZnJlZUV4cG9ydHM9dHlwZW9mIGV4cG9ydHM9PVwib2JqZWN0XCImJmV4cG9ydHM7dmFyIGZyZWVNb2R1bGU9dHlwZW9mIG1vZHVsZT09XCJvYmplY3RcIiYmbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz09ZnJlZUV4cG9ydHMmJm1vZHVsZTt2YXIgZnJlZUdsb2JhbD10eXBlb2YgZ2xvYmFsPT1cIm9iamVjdFwiJiZnbG9iYWw7aWYoZnJlZUdsb2JhbC5nbG9iYWw9PT1mcmVlR2xvYmFsfHxmcmVlR2xvYmFsLndpbmRvdz09PWZyZWVHbG9iYWwpe3Jvb3Q9ZnJlZUdsb2JhbH12YXIgc3RyaW5nRnJvbUNoYXJDb2RlPVN0cmluZy5mcm9tQ2hhckNvZGU7ZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpe3ZhciBvdXRwdXQ9W107dmFyIGNvdW50ZXI9MDt2YXIgbGVuZ3RoPXN0cmluZy5sZW5ndGg7dmFyIHZhbHVlO3ZhciBleHRyYTt3aGlsZShjb3VudGVyPGxlbmd0aCl7dmFsdWU9c3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtpZih2YWx1ZT49NTUyOTYmJnZhbHVlPD01NjMxOSYmY291bnRlcjxsZW5ndGgpe2V4dHJhPXN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7aWYoKGV4dHJhJjY0NTEyKT09NTYzMjApe291dHB1dC5wdXNoKCgodmFsdWUmMTAyMyk8PDEwKSsoZXh0cmEmMTAyMykrNjU1MzYpfWVsc2V7b3V0cHV0LnB1c2godmFsdWUpO2NvdW50ZXItLX19ZWxzZXtvdXRwdXQucHVzaCh2YWx1ZSl9fXJldHVybiBvdXRwdXR9ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7dmFyIGluZGV4PS0xO3ZhciB2YWx1ZTt2YXIgb3V0cHV0PVwiXCI7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhbHVlPWFycmF5W2luZGV4XTtpZih2YWx1ZT42NTUzNSl7dmFsdWUtPTY1NTM2O291dHB1dCs9c3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlPj4+MTAmMTAyM3w1NTI5Nik7dmFsdWU9NTYzMjB8dmFsdWUmMTAyM31vdXRwdXQrPXN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSl9cmV0dXJuIG91dHB1dH1mdW5jdGlvbiBjaGVja1NjYWxhclZhbHVlKGNvZGVQb2ludCl7aWYoY29kZVBvaW50Pj01NTI5NiYmY29kZVBvaW50PD01NzM0Myl7dGhyb3cgRXJyb3IoXCJMb25lIHN1cnJvZ2F0ZSBVK1wiK2NvZGVQb2ludC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKStcIiBpcyBub3QgYSBzY2FsYXIgdmFsdWVcIil9fWZ1bmN0aW9uIGNyZWF0ZUJ5dGUoY29kZVBvaW50LHNoaWZ0KXtyZXR1cm4gc3RyaW5nRnJvbUNoYXJDb2RlKGNvZGVQb2ludD4+c2hpZnQmNjN8MTI4KX1mdW5jdGlvbiBlbmNvZGVDb2RlUG9pbnQoY29kZVBvaW50KXtpZigoY29kZVBvaW50JjQyOTQ5NjcxNjgpPT0wKXtyZXR1cm4gc3RyaW5nRnJvbUNoYXJDb2RlKGNvZGVQb2ludCl9dmFyIHN5bWJvbD1cIlwiO2lmKChjb2RlUG9pbnQmNDI5NDk2NTI0OCk9PTApe3N5bWJvbD1zdHJpbmdGcm9tQ2hhckNvZGUoY29kZVBvaW50Pj42JjMxfDE5Mil9ZWxzZSBpZigoY29kZVBvaW50JjQyOTQ5MDE3NjApPT0wKXtjaGVja1NjYWxhclZhbHVlKGNvZGVQb2ludCk7c3ltYm9sPXN0cmluZ0Zyb21DaGFyQ29kZShjb2RlUG9pbnQ+PjEyJjE1fDIyNCk7c3ltYm9sKz1jcmVhdGVCeXRlKGNvZGVQb2ludCw2KX1lbHNlIGlmKChjb2RlUG9pbnQmNDI5Mjg3MDE0NCk9PTApe3N5bWJvbD1zdHJpbmdGcm9tQ2hhckNvZGUoY29kZVBvaW50Pj4xOCY3fDI0MCk7c3ltYm9sKz1jcmVhdGVCeXRlKGNvZGVQb2ludCwxMik7c3ltYm9sKz1jcmVhdGVCeXRlKGNvZGVQb2ludCw2KX1zeW1ib2wrPXN0cmluZ0Zyb21DaGFyQ29kZShjb2RlUG9pbnQmNjN8MTI4KTtyZXR1cm4gc3ltYm9sfWZ1bmN0aW9uIHV0ZjhlbmNvZGUoc3RyaW5nKXt2YXIgY29kZVBvaW50cz11Y3MyZGVjb2RlKHN0cmluZyk7dmFyIGxlbmd0aD1jb2RlUG9pbnRzLmxlbmd0aDt2YXIgaW5kZXg9LTE7dmFyIGNvZGVQb2ludDt2YXIgYnl0ZVN0cmluZz1cIlwiO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtjb2RlUG9pbnQ9Y29kZVBvaW50c1tpbmRleF07Ynl0ZVN0cmluZys9ZW5jb2RlQ29kZVBvaW50KGNvZGVQb2ludCl9cmV0dXJuIGJ5dGVTdHJpbmd9ZnVuY3Rpb24gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKXtpZihieXRlSW5kZXg+PWJ5dGVDb3VudCl7dGhyb3cgRXJyb3IoXCJJbnZhbGlkIGJ5dGUgaW5kZXhcIil9dmFyIGNvbnRpbnVhdGlvbkJ5dGU9Ynl0ZUFycmF5W2J5dGVJbmRleF0mMjU1O2J5dGVJbmRleCsrO2lmKChjb250aW51YXRpb25CeXRlJjE5Mik9PTEyOCl7cmV0dXJuIGNvbnRpbnVhdGlvbkJ5dGUmNjN9dGhyb3cgRXJyb3IoXCJJbnZhbGlkIGNvbnRpbnVhdGlvbiBieXRlXCIpfWZ1bmN0aW9uIGRlY29kZVN5bWJvbCgpe3ZhciBieXRlMTt2YXIgYnl0ZTI7dmFyIGJ5dGUzO3ZhciBieXRlNDt2YXIgY29kZVBvaW50O2lmKGJ5dGVJbmRleD5ieXRlQ291bnQpe3Rocm93IEVycm9yKFwiSW52YWxpZCBieXRlIGluZGV4XCIpfWlmKGJ5dGVJbmRleD09Ynl0ZUNvdW50KXtyZXR1cm4gZmFsc2V9Ynl0ZTE9Ynl0ZUFycmF5W2J5dGVJbmRleF0mMjU1O2J5dGVJbmRleCsrO2lmKChieXRlMSYxMjgpPT0wKXtyZXR1cm4gYnl0ZTF9aWYoKGJ5dGUxJjIyNCk9PTE5Mil7dmFyIGJ5dGUyPXJlYWRDb250aW51YXRpb25CeXRlKCk7Y29kZVBvaW50PShieXRlMSYzMSk8PDZ8Ynl0ZTI7aWYoY29kZVBvaW50Pj0xMjgpe3JldHVybiBjb2RlUG9pbnR9ZWxzZXt0aHJvdyBFcnJvcihcIkludmFsaWQgY29udGludWF0aW9uIGJ5dGVcIil9fWlmKChieXRlMSYyNDApPT0yMjQpe2J5dGUyPXJlYWRDb250aW51YXRpb25CeXRlKCk7Ynl0ZTM9cmVhZENvbnRpbnVhdGlvbkJ5dGUoKTtjb2RlUG9pbnQ9KGJ5dGUxJjE1KTw8MTJ8Ynl0ZTI8PDZ8Ynl0ZTM7aWYoY29kZVBvaW50Pj0yMDQ4KXtjaGVja1NjYWxhclZhbHVlKGNvZGVQb2ludCk7cmV0dXJuIGNvZGVQb2ludH1lbHNle3Rocm93IEVycm9yKFwiSW52YWxpZCBjb250aW51YXRpb24gYnl0ZVwiKX19aWYoKGJ5dGUxJjI0OCk9PTI0MCl7Ynl0ZTI9cmVhZENvbnRpbnVhdGlvbkJ5dGUoKTtieXRlMz1yZWFkQ29udGludWF0aW9uQnl0ZSgpO2J5dGU0PXJlYWRDb250aW51YXRpb25CeXRlKCk7Y29kZVBvaW50PShieXRlMSYxNSk8PDE4fGJ5dGUyPDwxMnxieXRlMzw8NnxieXRlNDtpZihjb2RlUG9pbnQ+PTY1NTM2JiZjb2RlUG9pbnQ8PTExMTQxMTEpe3JldHVybiBjb2RlUG9pbnR9fXRocm93IEVycm9yKFwiSW52YWxpZCBVVEYtOCBkZXRlY3RlZFwiKX12YXIgYnl0ZUFycmF5O3ZhciBieXRlQ291bnQ7dmFyIGJ5dGVJbmRleDtmdW5jdGlvbiB1dGY4ZGVjb2RlKGJ5dGVTdHJpbmcpe2J5dGVBcnJheT11Y3MyZGVjb2RlKGJ5dGVTdHJpbmcpO2J5dGVDb3VudD1ieXRlQXJyYXkubGVuZ3RoO2J5dGVJbmRleD0wO3ZhciBjb2RlUG9pbnRzPVtdO3ZhciB0bXA7d2hpbGUoKHRtcD1kZWNvZGVTeW1ib2woKSkhPT1mYWxzZSl7Y29kZVBvaW50cy5wdXNoKHRtcCl9cmV0dXJuIHVjczJlbmNvZGUoY29kZVBvaW50cyl9dmFyIHV0Zjg9e3ZlcnNpb246XCIyLjAuMFwiLGVuY29kZTp1dGY4ZW5jb2RlLGRlY29kZTp1dGY4ZGVjb2RlfTtpZih0eXBlb2YgZGVmaW5lPT1cImZ1bmN0aW9uXCImJnR5cGVvZiBkZWZpbmUuYW1kPT1cIm9iamVjdFwiJiZkZWZpbmUuYW1kKXtkZWZpbmUoZnVuY3Rpb24oKXtyZXR1cm4gdXRmOH0pfWVsc2UgaWYoZnJlZUV4cG9ydHMmJiFmcmVlRXhwb3J0cy5ub2RlVHlwZSl7aWYoZnJlZU1vZHVsZSl7ZnJlZU1vZHVsZS5leHBvcnRzPXV0Zjh9ZWxzZXt2YXIgb2JqZWN0PXt9O3ZhciBoYXNPd25Qcm9wZXJ0eT1vYmplY3QuaGFzT3duUHJvcGVydHk7Zm9yKHZhciBrZXkgaW4gdXRmOCl7aGFzT3duUHJvcGVydHkuY2FsbCh1dGY4LGtleSkmJihmcmVlRXhwb3J0c1trZXldPXV0Zjhba2V5XSl9fX1lbHNle3Jvb3QudXRmOD11dGY4fX0pKHRoaXMpfSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIj9zZWxmOnR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIj9nbG9iYWw6e30pfSx7fV0sMzA6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1widXNlIHN0cmljdFwiO3ZhciBhbHBoYWJldD1cIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LV9cIi5zcGxpdChcIlwiKSxsZW5ndGg9NjQsbWFwPXt9LHNlZWQ9MCxpPTAscHJldjtmdW5jdGlvbiBlbmNvZGUobnVtKXt2YXIgZW5jb2RlZD1cIlwiO2Rve2VuY29kZWQ9YWxwaGFiZXRbbnVtJWxlbmd0aF0rZW5jb2RlZDtudW09TWF0aC5mbG9vcihudW0vbGVuZ3RoKX13aGlsZShudW0+MCk7cmV0dXJuIGVuY29kZWR9ZnVuY3Rpb24gZGVjb2RlKHN0cil7dmFyIGRlY29kZWQ9MDtmb3IoaT0wO2k8c3RyLmxlbmd0aDtpKyspe2RlY29kZWQ9ZGVjb2RlZCpsZW5ndGgrbWFwW3N0ci5jaGFyQXQoaSldfXJldHVybiBkZWNvZGVkfWZ1bmN0aW9uIHllYXN0KCl7dmFyIG5vdz1lbmNvZGUoK25ldyBEYXRlKTtpZihub3chPT1wcmV2KXJldHVybiBzZWVkPTAscHJldj1ub3c7cmV0dXJuIG5vdytcIi5cIitlbmNvZGUoc2VlZCsrKX1mb3IoO2k8bGVuZ3RoO2krKyltYXBbYWxwaGFiZXRbaV1dPWk7eWVhc3QuZW5jb2RlPWVuY29kZTt5ZWFzdC5kZWNvZGU9ZGVjb2RlO21vZHVsZS5leHBvcnRzPXllYXN0fSx7fV0sMzE6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe3ZhciB1cmw9X2RlcmVxXyhcIi4vdXJsXCIpO3ZhciBwYXJzZXI9X2RlcmVxXyhcInNvY2tldC5pby1wYXJzZXJcIik7dmFyIE1hbmFnZXI9X2RlcmVxXyhcIi4vbWFuYWdlclwiKTt2YXIgZGVidWc9X2RlcmVxXyhcImRlYnVnXCIpKFwic29ja2V0LmlvLWNsaWVudFwiKTttb2R1bGUuZXhwb3J0cz1leHBvcnRzPWxvb2t1cDt2YXIgY2FjaGU9ZXhwb3J0cy5tYW5hZ2Vycz17fTtmdW5jdGlvbiBsb29rdXAodXJpLG9wdHMpe2lmKHR5cGVvZiB1cmk9PVwib2JqZWN0XCIpe29wdHM9dXJpO3VyaT11bmRlZmluZWR9b3B0cz1vcHRzfHx7fTt2YXIgcGFyc2VkPXVybCh1cmkpO3ZhciBzb3VyY2U9cGFyc2VkLnNvdXJjZTt2YXIgaWQ9cGFyc2VkLmlkO3ZhciBwYXRoPXBhcnNlZC5wYXRoO3ZhciBzYW1lTmFtZXNwYWNlPWNhY2hlW2lkXSYmcGF0aCBpbiBjYWNoZVtpZF0ubnNwczt2YXIgbmV3Q29ubmVjdGlvbj1vcHRzLmZvcmNlTmV3fHxvcHRzW1wiZm9yY2UgbmV3IGNvbm5lY3Rpb25cIl18fGZhbHNlPT09b3B0cy5tdWx0aXBsZXh8fHNhbWVOYW1lc3BhY2U7dmFyIGlvO2lmKG5ld0Nvbm5lY3Rpb24pe2RlYnVnKFwiaWdub3Jpbmcgc29ja2V0IGNhY2hlIGZvciAlc1wiLHNvdXJjZSk7aW89TWFuYWdlcihzb3VyY2Usb3B0cyl9ZWxzZXtpZighY2FjaGVbaWRdKXtkZWJ1ZyhcIm5ldyBpbyBpbnN0YW5jZSBmb3IgJXNcIixzb3VyY2UpO2NhY2hlW2lkXT1NYW5hZ2VyKHNvdXJjZSxvcHRzKX1pbz1jYWNoZVtpZF19cmV0dXJuIGlvLnNvY2tldChwYXJzZWQucGF0aCl9ZXhwb3J0cy5wcm90b2NvbD1wYXJzZXIucHJvdG9jb2w7ZXhwb3J0cy5jb25uZWN0PWxvb2t1cDtleHBvcnRzLk1hbmFnZXI9X2RlcmVxXyhcIi4vbWFuYWdlclwiKTtleHBvcnRzLlNvY2tldD1fZGVyZXFfKFwiLi9zb2NrZXRcIil9LHtcIi4vbWFuYWdlclwiOjMyLFwiLi9zb2NrZXRcIjozNCxcIi4vdXJsXCI6MzUsZGVidWc6MzksXCJzb2NrZXQuaW8tcGFyc2VyXCI6NDd9XSwzMjpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7dmFyIGVpbz1fZGVyZXFfKFwiZW5naW5lLmlvLWNsaWVudFwiKTt2YXIgU29ja2V0PV9kZXJlcV8oXCIuL3NvY2tldFwiKTt2YXIgRW1pdHRlcj1fZGVyZXFfKFwiY29tcG9uZW50LWVtaXR0ZXJcIik7dmFyIHBhcnNlcj1fZGVyZXFfKFwic29ja2V0LmlvLXBhcnNlclwiKTt2YXIgb249X2RlcmVxXyhcIi4vb25cIik7dmFyIGJpbmQ9X2RlcmVxXyhcImNvbXBvbmVudC1iaW5kXCIpO3ZhciBkZWJ1Zz1fZGVyZXFfKFwiZGVidWdcIikoXCJzb2NrZXQuaW8tY2xpZW50Om1hbmFnZXJcIik7dmFyIGluZGV4T2Y9X2RlcmVxXyhcImluZGV4b2ZcIik7dmFyIEJhY2tvZmY9X2RlcmVxXyhcImJhY2tvMlwiKTt2YXIgaGFzPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7bW9kdWxlLmV4cG9ydHM9TWFuYWdlcjtmdW5jdGlvbiBNYW5hZ2VyKHVyaSxvcHRzKXtpZighKHRoaXMgaW5zdGFuY2VvZiBNYW5hZ2VyKSlyZXR1cm4gbmV3IE1hbmFnZXIodXJpLG9wdHMpO2lmKHVyaSYmXCJvYmplY3RcIj09dHlwZW9mIHVyaSl7b3B0cz11cmk7dXJpPXVuZGVmaW5lZH1vcHRzPW9wdHN8fHt9O29wdHMucGF0aD1vcHRzLnBhdGh8fFwiL3NvY2tldC5pb1wiO3RoaXMubnNwcz17fTt0aGlzLnN1YnM9W107dGhpcy5vcHRzPW9wdHM7dGhpcy5yZWNvbm5lY3Rpb24ob3B0cy5yZWNvbm5lY3Rpb24hPT1mYWxzZSk7dGhpcy5yZWNvbm5lY3Rpb25BdHRlbXB0cyhvcHRzLnJlY29ubmVjdGlvbkF0dGVtcHRzfHxJbmZpbml0eSk7dGhpcy5yZWNvbm5lY3Rpb25EZWxheShvcHRzLnJlY29ubmVjdGlvbkRlbGF5fHwxZTMpO3RoaXMucmVjb25uZWN0aW9uRGVsYXlNYXgob3B0cy5yZWNvbm5lY3Rpb25EZWxheU1heHx8NWUzKTt0aGlzLnJhbmRvbWl6YXRpb25GYWN0b3Iob3B0cy5yYW5kb21pemF0aW9uRmFjdG9yfHwuNSk7dGhpcy5iYWNrb2ZmPW5ldyBCYWNrb2ZmKHttaW46dGhpcy5yZWNvbm5lY3Rpb25EZWxheSgpLG1heDp0aGlzLnJlY29ubmVjdGlvbkRlbGF5TWF4KCksaml0dGVyOnRoaXMucmFuZG9taXphdGlvbkZhY3RvcigpfSk7dGhpcy50aW1lb3V0KG51bGw9PW9wdHMudGltZW91dD8yZTQ6b3B0cy50aW1lb3V0KTt0aGlzLnJlYWR5U3RhdGU9XCJjbG9zZWRcIjt0aGlzLnVyaT11cmk7dGhpcy5jb25uZWN0aW5nPVtdO3RoaXMubGFzdFBpbmc9bnVsbDt0aGlzLmVuY29kaW5nPWZhbHNlO3RoaXMucGFja2V0QnVmZmVyPVtdO3RoaXMuZW5jb2Rlcj1uZXcgcGFyc2VyLkVuY29kZXI7dGhpcy5kZWNvZGVyPW5ldyBwYXJzZXIuRGVjb2Rlcjt0aGlzLmF1dG9Db25uZWN0PW9wdHMuYXV0b0Nvbm5lY3QhPT1mYWxzZTtpZih0aGlzLmF1dG9Db25uZWN0KXRoaXMub3BlbigpfU1hbmFnZXIucHJvdG90eXBlLmVtaXRBbGw9ZnVuY3Rpb24oKXt0aGlzLmVtaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO2Zvcih2YXIgbnNwIGluIHRoaXMubnNwcyl7aWYoaGFzLmNhbGwodGhpcy5uc3BzLG5zcCkpe3RoaXMubnNwc1tuc3BdLmVtaXQuYXBwbHkodGhpcy5uc3BzW25zcF0sYXJndW1lbnRzKX19fTtNYW5hZ2VyLnByb3RvdHlwZS51cGRhdGVTb2NrZXRJZHM9ZnVuY3Rpb24oKXtmb3IodmFyIG5zcCBpbiB0aGlzLm5zcHMpe2lmKGhhcy5jYWxsKHRoaXMubnNwcyxuc3ApKXt0aGlzLm5zcHNbbnNwXS5pZD10aGlzLmVuZ2luZS5pZH19fTtFbWl0dGVyKE1hbmFnZXIucHJvdG90eXBlKTtNYW5hZ2VyLnByb3RvdHlwZS5yZWNvbm5lY3Rpb249ZnVuY3Rpb24odil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbjt0aGlzLl9yZWNvbm5lY3Rpb249ISF2O3JldHVybiB0aGlzfTtNYW5hZ2VyLnByb3RvdHlwZS5yZWNvbm5lY3Rpb25BdHRlbXB0cz1mdW5jdGlvbih2KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fcmVjb25uZWN0aW9uQXR0ZW1wdHM7dGhpcy5fcmVjb25uZWN0aW9uQXR0ZW1wdHM9djtyZXR1cm4gdGhpc307TWFuYWdlci5wcm90b3R5cGUucmVjb25uZWN0aW9uRGVsYXk9ZnVuY3Rpb24odil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3JlY29ubmVjdGlvbkRlbGF5O3RoaXMuX3JlY29ubmVjdGlvbkRlbGF5PXY7dGhpcy5iYWNrb2ZmJiZ0aGlzLmJhY2tvZmYuc2V0TWluKHYpO3JldHVybiB0aGlzfTtNYW5hZ2VyLnByb3RvdHlwZS5yYW5kb21pemF0aW9uRmFjdG9yPWZ1bmN0aW9uKHYpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9yYW5kb21pemF0aW9uRmFjdG9yO3RoaXMuX3JhbmRvbWl6YXRpb25GYWN0b3I9djt0aGlzLmJhY2tvZmYmJnRoaXMuYmFja29mZi5zZXRKaXR0ZXIodik7cmV0dXJuIHRoaXN9O01hbmFnZXIucHJvdG90eXBlLnJlY29ubmVjdGlvbkRlbGF5TWF4PWZ1bmN0aW9uKHYpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9yZWNvbm5lY3Rpb25EZWxheU1heDt0aGlzLl9yZWNvbm5lY3Rpb25EZWxheU1heD12O3RoaXMuYmFja29mZiYmdGhpcy5iYWNrb2ZmLnNldE1heCh2KTtyZXR1cm4gdGhpc307TWFuYWdlci5wcm90b3R5cGUudGltZW91dD1mdW5jdGlvbih2KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fdGltZW91dDt0aGlzLl90aW1lb3V0PXY7cmV0dXJuIHRoaXN9O01hbmFnZXIucHJvdG90eXBlLm1heWJlUmVjb25uZWN0T25PcGVuPWZ1bmN0aW9uKCl7aWYoIXRoaXMucmVjb25uZWN0aW5nJiZ0aGlzLl9yZWNvbm5lY3Rpb24mJnRoaXMuYmFja29mZi5hdHRlbXB0cz09PTApe3RoaXMucmVjb25uZWN0KCl9fTtNYW5hZ2VyLnByb3RvdHlwZS5vcGVuPU1hbmFnZXIucHJvdG90eXBlLmNvbm5lY3Q9ZnVuY3Rpb24oZm4pe2RlYnVnKFwicmVhZHlTdGF0ZSAlc1wiLHRoaXMucmVhZHlTdGF0ZSk7aWYofnRoaXMucmVhZHlTdGF0ZS5pbmRleE9mKFwib3BlblwiKSlyZXR1cm4gdGhpcztkZWJ1ZyhcIm9wZW5pbmcgJXNcIix0aGlzLnVyaSk7dGhpcy5lbmdpbmU9ZWlvKHRoaXMudXJpLHRoaXMub3B0cyk7dmFyIHNvY2tldD10aGlzLmVuZ2luZTt2YXIgc2VsZj10aGlzO3RoaXMucmVhZHlTdGF0ZT1cIm9wZW5pbmdcIjt0aGlzLnNraXBSZWNvbm5lY3Q9ZmFsc2U7dmFyIG9wZW5TdWI9b24oc29ja2V0LFwib3BlblwiLGZ1bmN0aW9uKCl7c2VsZi5vbm9wZW4oKTtmbiYmZm4oKX0pO3ZhciBlcnJvclN1Yj1vbihzb2NrZXQsXCJlcnJvclwiLGZ1bmN0aW9uKGRhdGEpe2RlYnVnKFwiY29ubmVjdF9lcnJvclwiKTtzZWxmLmNsZWFudXAoKTtzZWxmLnJlYWR5U3RhdGU9XCJjbG9zZWRcIjtzZWxmLmVtaXRBbGwoXCJjb25uZWN0X2Vycm9yXCIsZGF0YSk7aWYoZm4pe3ZhciBlcnI9bmV3IEVycm9yKFwiQ29ubmVjdGlvbiBlcnJvclwiKTtlcnIuZGF0YT1kYXRhO2ZuKGVycil9ZWxzZXtzZWxmLm1heWJlUmVjb25uZWN0T25PcGVuKCl9fSk7aWYoZmFsc2UhPT10aGlzLl90aW1lb3V0KXt2YXIgdGltZW91dD10aGlzLl90aW1lb3V0O2RlYnVnKFwiY29ubmVjdCBhdHRlbXB0IHdpbGwgdGltZW91dCBhZnRlciAlZFwiLHRpbWVvdXQpO3ZhciB0aW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZGVidWcoXCJjb25uZWN0IGF0dGVtcHQgdGltZWQgb3V0IGFmdGVyICVkXCIsdGltZW91dCk7b3BlblN1Yi5kZXN0cm95KCk7c29ja2V0LmNsb3NlKCk7c29ja2V0LmVtaXQoXCJlcnJvclwiLFwidGltZW91dFwiKTtzZWxmLmVtaXRBbGwoXCJjb25uZWN0X3RpbWVvdXRcIix0aW1lb3V0KX0sdGltZW91dCk7dGhpcy5zdWJzLnB1c2goe2Rlc3Ryb3k6ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGltZXIpfX0pfXRoaXMuc3Vicy5wdXNoKG9wZW5TdWIpO3RoaXMuc3Vicy5wdXNoKGVycm9yU3ViKTtyZXR1cm4gdGhpc307TWFuYWdlci5wcm90b3R5cGUub25vcGVuPWZ1bmN0aW9uKCl7ZGVidWcoXCJvcGVuXCIpO3RoaXMuY2xlYW51cCgpO3RoaXMucmVhZHlTdGF0ZT1cIm9wZW5cIjt0aGlzLmVtaXQoXCJvcGVuXCIpO3ZhciBzb2NrZXQ9dGhpcy5lbmdpbmU7dGhpcy5zdWJzLnB1c2gob24oc29ja2V0LFwiZGF0YVwiLGJpbmQodGhpcyxcIm9uZGF0YVwiKSkpO3RoaXMuc3Vicy5wdXNoKG9uKHNvY2tldCxcInBpbmdcIixiaW5kKHRoaXMsXCJvbnBpbmdcIikpKTt0aGlzLnN1YnMucHVzaChvbihzb2NrZXQsXCJwb25nXCIsYmluZCh0aGlzLFwib25wb25nXCIpKSk7dGhpcy5zdWJzLnB1c2gob24oc29ja2V0LFwiZXJyb3JcIixiaW5kKHRoaXMsXCJvbmVycm9yXCIpKSk7dGhpcy5zdWJzLnB1c2gob24oc29ja2V0LFwiY2xvc2VcIixiaW5kKHRoaXMsXCJvbmNsb3NlXCIpKSk7dGhpcy5zdWJzLnB1c2gob24odGhpcy5kZWNvZGVyLFwiZGVjb2RlZFwiLGJpbmQodGhpcyxcIm9uZGVjb2RlZFwiKSkpfTtNYW5hZ2VyLnByb3RvdHlwZS5vbnBpbmc9ZnVuY3Rpb24oKXt0aGlzLmxhc3RQaW5nPW5ldyBEYXRlO3RoaXMuZW1pdEFsbChcInBpbmdcIil9O01hbmFnZXIucHJvdG90eXBlLm9ucG9uZz1mdW5jdGlvbigpe3RoaXMuZW1pdEFsbChcInBvbmdcIixuZXcgRGF0ZS10aGlzLmxhc3RQaW5nKX07TWFuYWdlci5wcm90b3R5cGUub25kYXRhPWZ1bmN0aW9uKGRhdGEpe3RoaXMuZGVjb2Rlci5hZGQoZGF0YSl9O01hbmFnZXIucHJvdG90eXBlLm9uZGVjb2RlZD1mdW5jdGlvbihwYWNrZXQpe3RoaXMuZW1pdChcInBhY2tldFwiLHBhY2tldCl9O01hbmFnZXIucHJvdG90eXBlLm9uZXJyb3I9ZnVuY3Rpb24oZXJyKXtkZWJ1ZyhcImVycm9yXCIsZXJyKTt0aGlzLmVtaXRBbGwoXCJlcnJvclwiLGVycil9O01hbmFnZXIucHJvdG90eXBlLnNvY2tldD1mdW5jdGlvbihuc3Ape3ZhciBzb2NrZXQ9dGhpcy5uc3BzW25zcF07aWYoIXNvY2tldCl7c29ja2V0PW5ldyBTb2NrZXQodGhpcyxuc3ApO3RoaXMubnNwc1tuc3BdPXNvY2tldDt2YXIgc2VsZj10aGlzO3NvY2tldC5vbihcImNvbm5lY3RpbmdcIixvbkNvbm5lY3RpbmcpO1xuc29ja2V0Lm9uKFwiY29ubmVjdFwiLGZ1bmN0aW9uKCl7c29ja2V0LmlkPXNlbGYuZW5naW5lLmlkfSk7aWYodGhpcy5hdXRvQ29ubmVjdCl7b25Db25uZWN0aW5nKCl9fWZ1bmN0aW9uIG9uQ29ubmVjdGluZygpe2lmKCF+aW5kZXhPZihzZWxmLmNvbm5lY3Rpbmcsc29ja2V0KSl7c2VsZi5jb25uZWN0aW5nLnB1c2goc29ja2V0KX19cmV0dXJuIHNvY2tldH07TWFuYWdlci5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbihzb2NrZXQpe3ZhciBpbmRleD1pbmRleE9mKHRoaXMuY29ubmVjdGluZyxzb2NrZXQpO2lmKH5pbmRleCl0aGlzLmNvbm5lY3Rpbmcuc3BsaWNlKGluZGV4LDEpO2lmKHRoaXMuY29ubmVjdGluZy5sZW5ndGgpcmV0dXJuO3RoaXMuY2xvc2UoKX07TWFuYWdlci5wcm90b3R5cGUucGFja2V0PWZ1bmN0aW9uKHBhY2tldCl7ZGVidWcoXCJ3cml0aW5nIHBhY2tldCAlalwiLHBhY2tldCk7dmFyIHNlbGY9dGhpcztpZighc2VsZi5lbmNvZGluZyl7c2VsZi5lbmNvZGluZz10cnVlO3RoaXMuZW5jb2Rlci5lbmNvZGUocGFja2V0LGZ1bmN0aW9uKGVuY29kZWRQYWNrZXRzKXtmb3IodmFyIGk9MDtpPGVuY29kZWRQYWNrZXRzLmxlbmd0aDtpKyspe3NlbGYuZW5naW5lLndyaXRlKGVuY29kZWRQYWNrZXRzW2ldLHBhY2tldC5vcHRpb25zKX1zZWxmLmVuY29kaW5nPWZhbHNlO3NlbGYucHJvY2Vzc1BhY2tldFF1ZXVlKCl9KX1lbHNle3NlbGYucGFja2V0QnVmZmVyLnB1c2gocGFja2V0KX19O01hbmFnZXIucHJvdG90eXBlLnByb2Nlc3NQYWNrZXRRdWV1ZT1mdW5jdGlvbigpe2lmKHRoaXMucGFja2V0QnVmZmVyLmxlbmd0aD4wJiYhdGhpcy5lbmNvZGluZyl7dmFyIHBhY2s9dGhpcy5wYWNrZXRCdWZmZXIuc2hpZnQoKTt0aGlzLnBhY2tldChwYWNrKX19O01hbmFnZXIucHJvdG90eXBlLmNsZWFudXA9ZnVuY3Rpb24oKXtkZWJ1ZyhcImNsZWFudXBcIik7dmFyIHN1Yjt3aGlsZShzdWI9dGhpcy5zdWJzLnNoaWZ0KCkpc3ViLmRlc3Ryb3koKTt0aGlzLnBhY2tldEJ1ZmZlcj1bXTt0aGlzLmVuY29kaW5nPWZhbHNlO3RoaXMubGFzdFBpbmc9bnVsbDt0aGlzLmRlY29kZXIuZGVzdHJveSgpfTtNYW5hZ2VyLnByb3RvdHlwZS5jbG9zZT1NYW5hZ2VyLnByb3RvdHlwZS5kaXNjb25uZWN0PWZ1bmN0aW9uKCl7ZGVidWcoXCJkaXNjb25uZWN0XCIpO3RoaXMuc2tpcFJlY29ubmVjdD10cnVlO3RoaXMucmVjb25uZWN0aW5nPWZhbHNlO2lmKFwib3BlbmluZ1wiPT10aGlzLnJlYWR5U3RhdGUpe3RoaXMuY2xlYW51cCgpfXRoaXMuYmFja29mZi5yZXNldCgpO3RoaXMucmVhZHlTdGF0ZT1cImNsb3NlZFwiO2lmKHRoaXMuZW5naW5lKXRoaXMuZW5naW5lLmNsb3NlKCl9O01hbmFnZXIucHJvdG90eXBlLm9uY2xvc2U9ZnVuY3Rpb24ocmVhc29uKXtkZWJ1ZyhcIm9uY2xvc2VcIik7dGhpcy5jbGVhbnVwKCk7dGhpcy5iYWNrb2ZmLnJlc2V0KCk7dGhpcy5yZWFkeVN0YXRlPVwiY2xvc2VkXCI7dGhpcy5lbWl0KFwiY2xvc2VcIixyZWFzb24pO2lmKHRoaXMuX3JlY29ubmVjdGlvbiYmIXRoaXMuc2tpcFJlY29ubmVjdCl7dGhpcy5yZWNvbm5lY3QoKX19O01hbmFnZXIucHJvdG90eXBlLnJlY29ubmVjdD1mdW5jdGlvbigpe2lmKHRoaXMucmVjb25uZWN0aW5nfHx0aGlzLnNraXBSZWNvbm5lY3QpcmV0dXJuIHRoaXM7dmFyIHNlbGY9dGhpcztpZih0aGlzLmJhY2tvZmYuYXR0ZW1wdHM+PXRoaXMuX3JlY29ubmVjdGlvbkF0dGVtcHRzKXtkZWJ1ZyhcInJlY29ubmVjdCBmYWlsZWRcIik7dGhpcy5iYWNrb2ZmLnJlc2V0KCk7dGhpcy5lbWl0QWxsKFwicmVjb25uZWN0X2ZhaWxlZFwiKTt0aGlzLnJlY29ubmVjdGluZz1mYWxzZX1lbHNle3ZhciBkZWxheT10aGlzLmJhY2tvZmYuZHVyYXRpb24oKTtkZWJ1ZyhcIndpbGwgd2FpdCAlZG1zIGJlZm9yZSByZWNvbm5lY3QgYXR0ZW1wdFwiLGRlbGF5KTt0aGlzLnJlY29ubmVjdGluZz10cnVlO3ZhciB0aW1lcj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoc2VsZi5za2lwUmVjb25uZWN0KXJldHVybjtkZWJ1ZyhcImF0dGVtcHRpbmcgcmVjb25uZWN0XCIpO3NlbGYuZW1pdEFsbChcInJlY29ubmVjdF9hdHRlbXB0XCIsc2VsZi5iYWNrb2ZmLmF0dGVtcHRzKTtzZWxmLmVtaXRBbGwoXCJyZWNvbm5lY3RpbmdcIixzZWxmLmJhY2tvZmYuYXR0ZW1wdHMpO2lmKHNlbGYuc2tpcFJlY29ubmVjdClyZXR1cm47c2VsZi5vcGVuKGZ1bmN0aW9uKGVycil7aWYoZXJyKXtkZWJ1ZyhcInJlY29ubmVjdCBhdHRlbXB0IGVycm9yXCIpO3NlbGYucmVjb25uZWN0aW5nPWZhbHNlO3NlbGYucmVjb25uZWN0KCk7c2VsZi5lbWl0QWxsKFwicmVjb25uZWN0X2Vycm9yXCIsZXJyLmRhdGEpfWVsc2V7ZGVidWcoXCJyZWNvbm5lY3Qgc3VjY2Vzc1wiKTtzZWxmLm9ucmVjb25uZWN0KCl9fSl9LGRlbGF5KTt0aGlzLnN1YnMucHVzaCh7ZGVzdHJveTpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aW1lcil9fSl9fTtNYW5hZ2VyLnByb3RvdHlwZS5vbnJlY29ubmVjdD1mdW5jdGlvbigpe3ZhciBhdHRlbXB0PXRoaXMuYmFja29mZi5hdHRlbXB0czt0aGlzLnJlY29ubmVjdGluZz1mYWxzZTt0aGlzLmJhY2tvZmYucmVzZXQoKTt0aGlzLnVwZGF0ZVNvY2tldElkcygpO3RoaXMuZW1pdEFsbChcInJlY29ubmVjdFwiLGF0dGVtcHQpfX0se1wiLi9vblwiOjMzLFwiLi9zb2NrZXRcIjozNCxiYWNrbzI6MzYsXCJjb21wb25lbnQtYmluZFwiOjM3LFwiY29tcG9uZW50LWVtaXR0ZXJcIjozOCxkZWJ1ZzozOSxcImVuZ2luZS5pby1jbGllbnRcIjoxLGluZGV4b2Y6NDIsXCJzb2NrZXQuaW8tcGFyc2VyXCI6NDd9XSwzMzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9b247ZnVuY3Rpb24gb24ob2JqLGV2LGZuKXtvYmoub24oZXYsZm4pO3JldHVybntkZXN0cm95OmZ1bmN0aW9uKCl7b2JqLnJlbW92ZUxpc3RlbmVyKGV2LGZuKX19fX0se31dLDM0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXt2YXIgcGFyc2VyPV9kZXJlcV8oXCJzb2NrZXQuaW8tcGFyc2VyXCIpO3ZhciBFbWl0dGVyPV9kZXJlcV8oXCJjb21wb25lbnQtZW1pdHRlclwiKTt2YXIgdG9BcnJheT1fZGVyZXFfKFwidG8tYXJyYXlcIik7dmFyIG9uPV9kZXJlcV8oXCIuL29uXCIpO3ZhciBiaW5kPV9kZXJlcV8oXCJjb21wb25lbnQtYmluZFwiKTt2YXIgZGVidWc9X2RlcmVxXyhcImRlYnVnXCIpKFwic29ja2V0LmlvLWNsaWVudDpzb2NrZXRcIik7dmFyIGhhc0Jpbj1fZGVyZXFfKFwiaGFzLWJpbmFyeVwiKTttb2R1bGUuZXhwb3J0cz1leHBvcnRzPVNvY2tldDt2YXIgZXZlbnRzPXtjb25uZWN0OjEsY29ubmVjdF9lcnJvcjoxLGNvbm5lY3RfdGltZW91dDoxLGNvbm5lY3Rpbmc6MSxkaXNjb25uZWN0OjEsZXJyb3I6MSxyZWNvbm5lY3Q6MSxyZWNvbm5lY3RfYXR0ZW1wdDoxLHJlY29ubmVjdF9mYWlsZWQ6MSxyZWNvbm5lY3RfZXJyb3I6MSxyZWNvbm5lY3Rpbmc6MSxwaW5nOjEscG9uZzoxfTt2YXIgZW1pdD1FbWl0dGVyLnByb3RvdHlwZS5lbWl0O2Z1bmN0aW9uIFNvY2tldChpbyxuc3Ape3RoaXMuaW89aW87dGhpcy5uc3A9bnNwO3RoaXMuanNvbj10aGlzO3RoaXMuaWRzPTA7dGhpcy5hY2tzPXt9O3RoaXMucmVjZWl2ZUJ1ZmZlcj1bXTt0aGlzLnNlbmRCdWZmZXI9W107dGhpcy5jb25uZWN0ZWQ9ZmFsc2U7dGhpcy5kaXNjb25uZWN0ZWQ9dHJ1ZTtpZih0aGlzLmlvLmF1dG9Db25uZWN0KXRoaXMub3BlbigpfUVtaXR0ZXIoU29ja2V0LnByb3RvdHlwZSk7U29ja2V0LnByb3RvdHlwZS5zdWJFdmVudHM9ZnVuY3Rpb24oKXtpZih0aGlzLnN1YnMpcmV0dXJuO3ZhciBpbz10aGlzLmlvO3RoaXMuc3Vicz1bb24oaW8sXCJvcGVuXCIsYmluZCh0aGlzLFwib25vcGVuXCIpKSxvbihpbyxcInBhY2tldFwiLGJpbmQodGhpcyxcIm9ucGFja2V0XCIpKSxvbihpbyxcImNsb3NlXCIsYmluZCh0aGlzLFwib25jbG9zZVwiKSldfTtTb2NrZXQucHJvdG90eXBlLm9wZW49U29ja2V0LnByb3RvdHlwZS5jb25uZWN0PWZ1bmN0aW9uKCl7aWYodGhpcy5jb25uZWN0ZWQpcmV0dXJuIHRoaXM7dGhpcy5zdWJFdmVudHMoKTt0aGlzLmlvLm9wZW4oKTtpZihcIm9wZW5cIj09dGhpcy5pby5yZWFkeVN0YXRlKXRoaXMub25vcGVuKCk7dGhpcy5lbWl0KFwiY29ubmVjdGluZ1wiKTtyZXR1cm4gdGhpc307U29ja2V0LnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKCl7dmFyIGFyZ3M9dG9BcnJheShhcmd1bWVudHMpO2FyZ3MudW5zaGlmdChcIm1lc3NhZ2VcIik7dGhpcy5lbWl0LmFwcGx5KHRoaXMsYXJncyk7cmV0dXJuIHRoaXN9O1NvY2tldC5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihldil7aWYoZXZlbnRzLmhhc093blByb3BlcnR5KGV2KSl7ZW1pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9dmFyIGFyZ3M9dG9BcnJheShhcmd1bWVudHMpO3ZhciBwYXJzZXJUeXBlPXBhcnNlci5FVkVOVDtpZihoYXNCaW4oYXJncykpe3BhcnNlclR5cGU9cGFyc2VyLkJJTkFSWV9FVkVOVH12YXIgcGFja2V0PXt0eXBlOnBhcnNlclR5cGUsZGF0YTphcmdzfTtwYWNrZXQub3B0aW9ucz17fTtwYWNrZXQub3B0aW9ucy5jb21wcmVzcz0hdGhpcy5mbGFnc3x8ZmFsc2UhPT10aGlzLmZsYWdzLmNvbXByZXNzO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGFyZ3NbYXJncy5sZW5ndGgtMV0pe2RlYnVnKFwiZW1pdHRpbmcgcGFja2V0IHdpdGggYWNrIGlkICVkXCIsdGhpcy5pZHMpO3RoaXMuYWNrc1t0aGlzLmlkc109YXJncy5wb3AoKTtwYWNrZXQuaWQ9dGhpcy5pZHMrK31pZih0aGlzLmNvbm5lY3RlZCl7dGhpcy5wYWNrZXQocGFja2V0KX1lbHNle3RoaXMuc2VuZEJ1ZmZlci5wdXNoKHBhY2tldCl9ZGVsZXRlIHRoaXMuZmxhZ3M7cmV0dXJuIHRoaXN9O1NvY2tldC5wcm90b3R5cGUucGFja2V0PWZ1bmN0aW9uKHBhY2tldCl7cGFja2V0Lm5zcD10aGlzLm5zcDt0aGlzLmlvLnBhY2tldChwYWNrZXQpfTtTb2NrZXQucHJvdG90eXBlLm9ub3Blbj1mdW5jdGlvbigpe2RlYnVnKFwidHJhbnNwb3J0IGlzIG9wZW4gLSBjb25uZWN0aW5nXCIpO2lmKFwiL1wiIT10aGlzLm5zcCl7dGhpcy5wYWNrZXQoe3R5cGU6cGFyc2VyLkNPTk5FQ1R9KX19O1NvY2tldC5wcm90b3R5cGUub25jbG9zZT1mdW5jdGlvbihyZWFzb24pe2RlYnVnKFwiY2xvc2UgKCVzKVwiLHJlYXNvbik7dGhpcy5jb25uZWN0ZWQ9ZmFsc2U7dGhpcy5kaXNjb25uZWN0ZWQ9dHJ1ZTtkZWxldGUgdGhpcy5pZDt0aGlzLmVtaXQoXCJkaXNjb25uZWN0XCIscmVhc29uKX07U29ja2V0LnByb3RvdHlwZS5vbnBhY2tldD1mdW5jdGlvbihwYWNrZXQpe2lmKHBhY2tldC5uc3AhPXRoaXMubnNwKXJldHVybjtzd2l0Y2gocGFja2V0LnR5cGUpe2Nhc2UgcGFyc2VyLkNPTk5FQ1Q6dGhpcy5vbmNvbm5lY3QoKTticmVhaztjYXNlIHBhcnNlci5FVkVOVDp0aGlzLm9uZXZlbnQocGFja2V0KTticmVhaztjYXNlIHBhcnNlci5CSU5BUllfRVZFTlQ6dGhpcy5vbmV2ZW50KHBhY2tldCk7YnJlYWs7Y2FzZSBwYXJzZXIuQUNLOnRoaXMub25hY2socGFja2V0KTticmVhaztjYXNlIHBhcnNlci5CSU5BUllfQUNLOnRoaXMub25hY2socGFja2V0KTticmVhaztjYXNlIHBhcnNlci5ESVNDT05ORUNUOnRoaXMub25kaXNjb25uZWN0KCk7YnJlYWs7Y2FzZSBwYXJzZXIuRVJST1I6dGhpcy5lbWl0KFwiZXJyb3JcIixwYWNrZXQuZGF0YSk7YnJlYWt9fTtTb2NrZXQucHJvdG90eXBlLm9uZXZlbnQ9ZnVuY3Rpb24ocGFja2V0KXt2YXIgYXJncz1wYWNrZXQuZGF0YXx8W107ZGVidWcoXCJlbWl0dGluZyBldmVudCAlalwiLGFyZ3MpO2lmKG51bGwhPXBhY2tldC5pZCl7ZGVidWcoXCJhdHRhY2hpbmcgYWNrIGNhbGxiYWNrIHRvIGV2ZW50XCIpO2FyZ3MucHVzaCh0aGlzLmFjayhwYWNrZXQuaWQpKX1pZih0aGlzLmNvbm5lY3RlZCl7ZW1pdC5hcHBseSh0aGlzLGFyZ3MpfWVsc2V7dGhpcy5yZWNlaXZlQnVmZmVyLnB1c2goYXJncyl9fTtTb2NrZXQucHJvdG90eXBlLmFjaz1mdW5jdGlvbihpZCl7dmFyIHNlbGY9dGhpczt2YXIgc2VudD1mYWxzZTtyZXR1cm4gZnVuY3Rpb24oKXtpZihzZW50KXJldHVybjtzZW50PXRydWU7dmFyIGFyZ3M9dG9BcnJheShhcmd1bWVudHMpO2RlYnVnKFwic2VuZGluZyBhY2sgJWpcIixhcmdzKTt2YXIgdHlwZT1oYXNCaW4oYXJncyk/cGFyc2VyLkJJTkFSWV9BQ0s6cGFyc2VyLkFDSztzZWxmLnBhY2tldCh7dHlwZTp0eXBlLGlkOmlkLGRhdGE6YXJnc30pfX07U29ja2V0LnByb3RvdHlwZS5vbmFjaz1mdW5jdGlvbihwYWNrZXQpe3ZhciBhY2s9dGhpcy5hY2tzW3BhY2tldC5pZF07aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgYWNrKXtkZWJ1ZyhcImNhbGxpbmcgYWNrICVzIHdpdGggJWpcIixwYWNrZXQuaWQscGFja2V0LmRhdGEpO2Fjay5hcHBseSh0aGlzLHBhY2tldC5kYXRhKTtkZWxldGUgdGhpcy5hY2tzW3BhY2tldC5pZF19ZWxzZXtkZWJ1ZyhcImJhZCBhY2sgJXNcIixwYWNrZXQuaWQpfX07U29ja2V0LnByb3RvdHlwZS5vbmNvbm5lY3Q9ZnVuY3Rpb24oKXt0aGlzLmNvbm5lY3RlZD10cnVlO3RoaXMuZGlzY29ubmVjdGVkPWZhbHNlO3RoaXMuZW1pdChcImNvbm5lY3RcIik7dGhpcy5lbWl0QnVmZmVyZWQoKX07U29ja2V0LnByb3RvdHlwZS5lbWl0QnVmZmVyZWQ9ZnVuY3Rpb24oKXt2YXIgaTtmb3IoaT0wO2k8dGhpcy5yZWNlaXZlQnVmZmVyLmxlbmd0aDtpKyspe2VtaXQuYXBwbHkodGhpcyx0aGlzLnJlY2VpdmVCdWZmZXJbaV0pfXRoaXMucmVjZWl2ZUJ1ZmZlcj1bXTtmb3IoaT0wO2k8dGhpcy5zZW5kQnVmZmVyLmxlbmd0aDtpKyspe3RoaXMucGFja2V0KHRoaXMuc2VuZEJ1ZmZlcltpXSl9dGhpcy5zZW5kQnVmZmVyPVtdfTtTb2NrZXQucHJvdG90eXBlLm9uZGlzY29ubmVjdD1mdW5jdGlvbigpe2RlYnVnKFwic2VydmVyIGRpc2Nvbm5lY3QgKCVzKVwiLHRoaXMubnNwKTt0aGlzLmRlc3Ryb3koKTt0aGlzLm9uY2xvc2UoXCJpbyBzZXJ2ZXIgZGlzY29ubmVjdFwiKX07U29ja2V0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7aWYodGhpcy5zdWJzKXtmb3IodmFyIGk9MDtpPHRoaXMuc3Vicy5sZW5ndGg7aSsrKXt0aGlzLnN1YnNbaV0uZGVzdHJveSgpfXRoaXMuc3Vicz1udWxsfXRoaXMuaW8uZGVzdHJveSh0aGlzKX07U29ja2V0LnByb3RvdHlwZS5jbG9zZT1Tb2NrZXQucHJvdG90eXBlLmRpc2Nvbm5lY3Q9ZnVuY3Rpb24oKXtpZih0aGlzLmNvbm5lY3RlZCl7ZGVidWcoXCJwZXJmb3JtaW5nIGRpc2Nvbm5lY3QgKCVzKVwiLHRoaXMubnNwKTt0aGlzLnBhY2tldCh7dHlwZTpwYXJzZXIuRElTQ09OTkVDVH0pfXRoaXMuZGVzdHJveSgpO2lmKHRoaXMuY29ubmVjdGVkKXt0aGlzLm9uY2xvc2UoXCJpbyBjbGllbnQgZGlzY29ubmVjdFwiKX1yZXR1cm4gdGhpc307U29ja2V0LnByb3RvdHlwZS5jb21wcmVzcz1mdW5jdGlvbihjb21wcmVzcyl7dGhpcy5mbGFncz10aGlzLmZsYWdzfHx7fTt0aGlzLmZsYWdzLmNvbXByZXNzPWNvbXByZXNzO3JldHVybiB0aGlzfX0se1wiLi9vblwiOjMzLFwiY29tcG9uZW50LWJpbmRcIjozNyxcImNvbXBvbmVudC1lbWl0dGVyXCI6MzgsZGVidWc6MzksXCJoYXMtYmluYXJ5XCI6NDEsXCJzb2NrZXQuaW8tcGFyc2VyXCI6NDcsXCJ0by1hcnJheVwiOjUxfV0sMzU6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpe3ZhciBwYXJzZXVyaT1fZGVyZXFfKFwicGFyc2V1cmlcIik7dmFyIGRlYnVnPV9kZXJlcV8oXCJkZWJ1Z1wiKShcInNvY2tldC5pby1jbGllbnQ6dXJsXCIpO21vZHVsZS5leHBvcnRzPXVybDtmdW5jdGlvbiB1cmwodXJpLGxvYyl7dmFyIG9iaj11cmk7dmFyIGxvYz1sb2N8fGdsb2JhbC5sb2NhdGlvbjtpZihudWxsPT11cmkpdXJpPWxvYy5wcm90b2NvbCtcIi8vXCIrbG9jLmhvc3Q7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHVyaSl7aWYoXCIvXCI9PXVyaS5jaGFyQXQoMCkpe2lmKFwiL1wiPT11cmkuY2hhckF0KDEpKXt1cmk9bG9jLnByb3RvY29sK3VyaX1lbHNle3VyaT1sb2MuaG9zdCt1cml9fWlmKCEvXihodHRwcz98d3NzPyk6XFwvXFwvLy50ZXN0KHVyaSkpe2RlYnVnKFwicHJvdG9jb2wtbGVzcyB1cmwgJXNcIix1cmkpO2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBsb2Mpe3VyaT1sb2MucHJvdG9jb2wrXCIvL1wiK3VyaX1lbHNle3VyaT1cImh0dHBzOi8vXCIrdXJpfX1kZWJ1ZyhcInBhcnNlICVzXCIsdXJpKTtvYmo9cGFyc2V1cmkodXJpKX1pZighb2JqLnBvcnQpe2lmKC9eKGh0dHB8d3MpJC8udGVzdChvYmoucHJvdG9jb2wpKXtvYmoucG9ydD1cIjgwXCJ9ZWxzZSBpZigvXihodHRwfHdzKXMkLy50ZXN0KG9iai5wcm90b2NvbCkpe29iai5wb3J0PVwiNDQzXCJ9fW9iai5wYXRoPW9iai5wYXRofHxcIi9cIjt2YXIgaXB2Nj1vYmouaG9zdC5pbmRleE9mKFwiOlwiKSE9PS0xO3ZhciBob3N0PWlwdjY/XCJbXCIrb2JqLmhvc3QrXCJdXCI6b2JqLmhvc3Q7b2JqLmlkPW9iai5wcm90b2NvbCtcIjovL1wiK2hvc3QrXCI6XCIrb2JqLnBvcnQ7b2JqLmhyZWY9b2JqLnByb3RvY29sK1wiOi8vXCIraG9zdCsobG9jJiZsb2MucG9ydD09b2JqLnBvcnQ/XCJcIjpcIjpcIitvYmoucG9ydCk7cmV0dXJuIG9ian19KS5jYWxsKHRoaXMsdHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiP3NlbGY6dHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCI/d2luZG93OnR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiP2dsb2JhbDp7fSl9LHtkZWJ1ZzozOSxwYXJzZXVyaTo0NX1dLDM2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1CYWNrb2ZmO2Z1bmN0aW9uIEJhY2tvZmYob3B0cyl7b3B0cz1vcHRzfHx7fTt0aGlzLm1zPW9wdHMubWlufHwxMDA7dGhpcy5tYXg9b3B0cy5tYXh8fDFlNDt0aGlzLmZhY3Rvcj1vcHRzLmZhY3Rvcnx8Mjt0aGlzLmppdHRlcj1vcHRzLmppdHRlcj4wJiZvcHRzLmppdHRlcjw9MT9vcHRzLmppdHRlcjowO3RoaXMuYXR0ZW1wdHM9MH1CYWNrb2ZmLnByb3RvdHlwZS5kdXJhdGlvbj1mdW5jdGlvbigpe3ZhciBtcz10aGlzLm1zKk1hdGgucG93KHRoaXMuZmFjdG9yLHRoaXMuYXR0ZW1wdHMrKyk7aWYodGhpcy5qaXR0ZXIpe3ZhciByYW5kPU1hdGgucmFuZG9tKCk7dmFyIGRldmlhdGlvbj1NYXRoLmZsb29yKHJhbmQqdGhpcy5qaXR0ZXIqbXMpO21zPShNYXRoLmZsb29yKHJhbmQqMTApJjEpPT0wP21zLWRldmlhdGlvbjptcytkZXZpYXRpb259cmV0dXJuIE1hdGgubWluKG1zLHRoaXMubWF4KXwwfTtCYWNrb2ZmLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3RoaXMuYXR0ZW1wdHM9MH07QmFja29mZi5wcm90b3R5cGUuc2V0TWluPWZ1bmN0aW9uKG1pbil7dGhpcy5tcz1taW59O0JhY2tvZmYucHJvdG90eXBlLnNldE1heD1mdW5jdGlvbihtYXgpe3RoaXMubWF4PW1heH07QmFja29mZi5wcm90b3R5cGUuc2V0Sml0dGVyPWZ1bmN0aW9uKGppdHRlcil7dGhpcy5qaXR0ZXI9aml0dGVyfX0se31dLDM3OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXt2YXIgc2xpY2U9W10uc2xpY2U7bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24ob2JqLGZuKXtpZihcInN0cmluZ1wiPT10eXBlb2YgZm4pZm49b2JqW2ZuXTtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBmbil0aHJvdyBuZXcgRXJyb3IoXCJiaW5kKCkgcmVxdWlyZXMgYSBmdW5jdGlvblwiKTt2YXIgYXJncz1zbGljZS5jYWxsKGFyZ3VtZW50cywyKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZm4uYXBwbHkob2JqLGFyZ3MuY29uY2F0KHNsaWNlLmNhbGwoYXJndW1lbnRzKSkpfX19LHt9XSwzODpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9RW1pdHRlcjtmdW5jdGlvbiBFbWl0dGVyKG9iail7aWYob2JqKXJldHVybiBtaXhpbihvYmopfWZ1bmN0aW9uIG1peGluKG9iail7Zm9yKHZhciBrZXkgaW4gRW1pdHRlci5wcm90b3R5cGUpe29ialtrZXldPUVtaXR0ZXIucHJvdG90eXBlW2tleV19cmV0dXJuIG9ian1FbWl0dGVyLnByb3RvdHlwZS5vbj1FbWl0dGVyLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGV2ZW50LGZuKXt0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fTsodGhpcy5fY2FsbGJhY2tzW1wiJFwiK2V2ZW50XT10aGlzLl9jYWxsYmFja3NbXCIkXCIrZXZlbnRdfHxbXSkucHVzaChmbik7cmV0dXJuIHRoaXN9O0VtaXR0ZXIucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24oZXZlbnQsZm4pe2Z1bmN0aW9uIG9uKCl7dGhpcy5vZmYoZXZlbnQsb24pO2ZuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1vbi5mbj1mbjt0aGlzLm9uKGV2ZW50LG9uKTtyZXR1cm4gdGhpc307RW1pdHRlci5wcm90b3R5cGUub2ZmPUVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPUVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1FbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGV2ZW50LGZuKXt0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fTtpZigwPT1hcmd1bWVudHMubGVuZ3RoKXt0aGlzLl9jYWxsYmFja3M9e307cmV0dXJuIHRoaXN9dmFyIGNhbGxiYWNrcz10aGlzLl9jYWxsYmFja3NbXCIkXCIrZXZlbnRdO2lmKCFjYWxsYmFja3MpcmV0dXJuIHRoaXM7aWYoMT09YXJndW1lbnRzLmxlbmd0aCl7ZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1tcIiRcIitldmVudF07cmV0dXJuIHRoaXN9dmFyIGNiO2Zvcih2YXIgaT0wO2k8Y2FsbGJhY2tzLmxlbmd0aDtpKyspe2NiPWNhbGxiYWNrc1tpXTtpZihjYj09PWZufHxjYi5mbj09PWZuKXtjYWxsYmFja3Muc3BsaWNlKGksMSk7YnJlYWt9fXJldHVybiB0aGlzfTtFbWl0dGVyLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKGV2ZW50KXt0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fTt2YXIgYXJncz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxjYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzW1wiJFwiK2V2ZW50XTtpZihjYWxsYmFja3Mpe2NhbGxiYWNrcz1jYWxsYmFja3Muc2xpY2UoMCk7Zm9yKHZhciBpPTAsbGVuPWNhbGxiYWNrcy5sZW5ndGg7aTxsZW47KytpKXtjYWxsYmFja3NbaV0uYXBwbHkodGhpcyxhcmdzKX19cmV0dXJuIHRoaXN9O0VtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbihldmVudCl7dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e307cmV0dXJuIHRoaXMuX2NhbGxiYWNrc1tcIiRcIitldmVudF18fFtdfTtFbWl0dGVyLnByb3RvdHlwZS5oYXNMaXN0ZW5lcnM9ZnVuY3Rpb24oZXZlbnQpe3JldHVybiEhdGhpcy5saXN0ZW5lcnMoZXZlbnQpLmxlbmd0aH19LHt9XSwzOTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7YXJndW1lbnRzWzRdWzE3XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cyl9LHtcIi4vZGVidWdcIjo0MCxkdXA6MTd9XSw0MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7YXJndW1lbnRzWzRdWzE4XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cyl9LHtkdXA6MTgsbXM6NDR9XSw0MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKGdsb2JhbCl7dmFyIGlzQXJyYXk9X2RlcmVxXyhcImlzYXJyYXlcIik7bW9kdWxlLmV4cG9ydHM9aGFzQmluYXJ5O2Z1bmN0aW9uIGhhc0JpbmFyeShkYXRhKXtmdW5jdGlvbiBfaGFzQmluYXJ5KG9iail7aWYoIW9iailyZXR1cm4gZmFsc2U7aWYoZ2xvYmFsLkJ1ZmZlciYmZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlciYmZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlcihvYmopfHxnbG9iYWwuQXJyYXlCdWZmZXImJm9iaiBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxnbG9iYWwuQmxvYiYmb2JqIGluc3RhbmNlb2YgQmxvYnx8Z2xvYmFsLkZpbGUmJm9iaiBpbnN0YW5jZW9mIEZpbGUpe3JldHVybiB0cnVlfWlmKGlzQXJyYXkob2JqKSl7Zm9yKHZhciBpPTA7aTxvYmoubGVuZ3RoO2krKyl7aWYoX2hhc0JpbmFyeShvYmpbaV0pKXtyZXR1cm4gdHJ1ZX19fWVsc2UgaWYob2JqJiZcIm9iamVjdFwiPT10eXBlb2Ygb2JqKXtpZihvYmoudG9KU09OJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBvYmoudG9KU09OKXtvYmo9b2JqLnRvSlNPTigpfWZvcih2YXIga2V5IGluIG9iail7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaixrZXkpJiZfaGFzQmluYXJ5KG9ialtrZXldKSl7cmV0dXJuIHRydWV9fX1yZXR1cm4gZmFsc2V9cmV0dXJuIF9oYXNCaW5hcnkoZGF0YSl9fSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIj9zZWxmOnR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIj9nbG9iYWw6e30pfSx7aXNhcnJheTo0M31dLDQyOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXthcmd1bWVudHNbNF1bMjNdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKX0se2R1cDoyM31dLDQzOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXthcmd1bWVudHNbNF1bMjRdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKX0se2R1cDoyNH1dLDQ0OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXthcmd1bWVudHNbNF1bMjVdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKX0se2R1cDoyNX1dLDQ1OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXthcmd1bWVudHNbNF1bMjhdWzBdLmFwcGx5KGV4cG9ydHMsYXJndW1lbnRzKX0se2R1cDoyOH1dLDQ2OltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXsoZnVuY3Rpb24oZ2xvYmFsKXt2YXIgaXNBcnJheT1fZGVyZXFfKFwiaXNhcnJheVwiKTt2YXIgaXNCdWY9X2RlcmVxXyhcIi4vaXMtYnVmZmVyXCIpO2V4cG9ydHMuZGVjb25zdHJ1Y3RQYWNrZXQ9ZnVuY3Rpb24ocGFja2V0KXt2YXIgYnVmZmVycz1bXTt2YXIgcGFja2V0RGF0YT1wYWNrZXQuZGF0YTtmdW5jdGlvbiBfZGVjb25zdHJ1Y3RQYWNrZXQoZGF0YSl7aWYoIWRhdGEpcmV0dXJuIGRhdGE7aWYoaXNCdWYoZGF0YSkpe3ZhciBwbGFjZWhvbGRlcj17X3BsYWNlaG9sZGVyOnRydWUsbnVtOmJ1ZmZlcnMubGVuZ3RofTtidWZmZXJzLnB1c2goZGF0YSk7cmV0dXJuIHBsYWNlaG9sZGVyfWVsc2UgaWYoaXNBcnJheShkYXRhKSl7dmFyIG5ld0RhdGE9bmV3IEFycmF5KGRhdGEubGVuZ3RoKTtmb3IodmFyIGk9MDtpPGRhdGEubGVuZ3RoO2krKyl7bmV3RGF0YVtpXT1fZGVjb25zdHJ1Y3RQYWNrZXQoZGF0YVtpXSl9cmV0dXJuIG5ld0RhdGF9ZWxzZSBpZihcIm9iamVjdFwiPT10eXBlb2YgZGF0YSYmIShkYXRhIGluc3RhbmNlb2YgRGF0ZSkpe3ZhciBuZXdEYXRhPXt9O2Zvcih2YXIga2V5IGluIGRhdGEpe25ld0RhdGFba2V5XT1fZGVjb25zdHJ1Y3RQYWNrZXQoZGF0YVtrZXldKX1yZXR1cm4gbmV3RGF0YX1yZXR1cm4gZGF0YX12YXIgcGFjaz1wYWNrZXQ7cGFjay5kYXRhPV9kZWNvbnN0cnVjdFBhY2tldChwYWNrZXREYXRhKTtwYWNrLmF0dGFjaG1lbnRzPWJ1ZmZlcnMubGVuZ3RoO3JldHVybntwYWNrZXQ6cGFjayxidWZmZXJzOmJ1ZmZlcnN9fTtleHBvcnRzLnJlY29uc3RydWN0UGFja2V0PWZ1bmN0aW9uKHBhY2tldCxidWZmZXJzKXt2YXIgY3VyUGxhY2VIb2xkZXI9MDtmdW5jdGlvbiBfcmVjb25zdHJ1Y3RQYWNrZXQoZGF0YSl7aWYoZGF0YSYmZGF0YS5fcGxhY2Vob2xkZXIpe3ZhciBidWY9YnVmZmVyc1tkYXRhLm51bV07cmV0dXJuIGJ1Zn1lbHNlIGlmKGlzQXJyYXkoZGF0YSkpe2Zvcih2YXIgaT0wO2k8ZGF0YS5sZW5ndGg7aSsrKXtkYXRhW2ldPV9yZWNvbnN0cnVjdFBhY2tldChkYXRhW2ldKX1yZXR1cm4gZGF0YX1lbHNlIGlmKGRhdGEmJlwib2JqZWN0XCI9PXR5cGVvZiBkYXRhKXtmb3IodmFyIGtleSBpbiBkYXRhKXtkYXRhW2tleV09X3JlY29uc3RydWN0UGFja2V0KGRhdGFba2V5XSl9cmV0dXJuIGRhdGF9cmV0dXJuIGRhdGF9cGFja2V0LmRhdGE9X3JlY29uc3RydWN0UGFja2V0KHBhY2tldC5kYXRhKTtwYWNrZXQuYXR0YWNobWVudHM9dW5kZWZpbmVkO3JldHVybiBwYWNrZXR9O2V4cG9ydHMucmVtb3ZlQmxvYnM9ZnVuY3Rpb24oZGF0YSxjYWxsYmFjayl7ZnVuY3Rpb24gX3JlbW92ZUJsb2JzKG9iaixjdXJLZXksY29udGFpbmluZ09iamVjdCl7aWYoIW9iailyZXR1cm4gb2JqO2lmKGdsb2JhbC5CbG9iJiZvYmogaW5zdGFuY2VvZiBCbG9ifHxnbG9iYWwuRmlsZSYmb2JqIGluc3RhbmNlb2YgRmlsZSl7cGVuZGluZ0Jsb2JzKys7dmFyIGZpbGVSZWFkZXI9bmV3IEZpbGVSZWFkZXI7ZmlsZVJlYWRlci5vbmxvYWQ9ZnVuY3Rpb24oKXtpZihjb250YWluaW5nT2JqZWN0KXtjb250YWluaW5nT2JqZWN0W2N1cktleV09dGhpcy5yZXN1bHR9ZWxzZXtibG9ibGVzc0RhdGE9dGhpcy5yZXN1bHR9aWYoIS0tcGVuZGluZ0Jsb2JzKXtjYWxsYmFjayhibG9ibGVzc0RhdGEpfX07ZmlsZVJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihvYmopfWVsc2UgaWYoaXNBcnJheShvYmopKXtmb3IodmFyIGk9MDtpPG9iai5sZW5ndGg7aSsrKXtfcmVtb3ZlQmxvYnMob2JqW2ldLGksb2JqKX19ZWxzZSBpZihvYmomJlwib2JqZWN0XCI9PXR5cGVvZiBvYmomJiFpc0J1ZihvYmopKXtmb3IodmFyIGtleSBpbiBvYmope19yZW1vdmVCbG9icyhvYmpba2V5XSxrZXksb2JqKX19fXZhciBwZW5kaW5nQmxvYnM9MDt2YXIgYmxvYmxlc3NEYXRhPWRhdGE7X3JlbW92ZUJsb2JzKGJsb2JsZXNzRGF0YSk7aWYoIXBlbmRpbmdCbG9icyl7Y2FsbGJhY2soYmxvYmxlc3NEYXRhKX19fSkuY2FsbCh0aGlzLHR5cGVvZiBzZWxmIT09XCJ1bmRlZmluZWRcIj9zZWxmOnR5cGVvZiB3aW5kb3chPT1cInVuZGVmaW5lZFwiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIj9nbG9iYWw6e30pfSx7XCIuL2lzLWJ1ZmZlclwiOjQ4LGlzYXJyYXk6NDN9XSw0NzpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7dmFyIGRlYnVnPV9kZXJlcV8oXCJkZWJ1Z1wiKShcInNvY2tldC5pby1wYXJzZXJcIik7dmFyIGpzb249X2RlcmVxXyhcImpzb24zXCIpO3ZhciBpc0FycmF5PV9kZXJlcV8oXCJpc2FycmF5XCIpO3ZhciBFbWl0dGVyPV9kZXJlcV8oXCJjb21wb25lbnQtZW1pdHRlclwiKTt2YXIgYmluYXJ5PV9kZXJlcV8oXCIuL2JpbmFyeVwiKTt2YXIgaXNCdWY9X2RlcmVxXyhcIi4vaXMtYnVmZmVyXCIpO2V4cG9ydHMucHJvdG9jb2w9NDtleHBvcnRzLnR5cGVzPVtcIkNPTk5FQ1RcIixcIkRJU0NPTk5FQ1RcIixcIkVWRU5UXCIsXCJCSU5BUllfRVZFTlRcIixcIkFDS1wiLFwiQklOQVJZX0FDS1wiLFwiRVJST1JcIl07ZXhwb3J0cy5DT05ORUNUPTA7ZXhwb3J0cy5ESVNDT05ORUNUPTE7ZXhwb3J0cy5FVkVOVD0yO2V4cG9ydHMuQUNLPTM7ZXhwb3J0cy5FUlJPUj00O2V4cG9ydHMuQklOQVJZX0VWRU5UPTU7ZXhwb3J0cy5CSU5BUllfQUNLPTY7ZXhwb3J0cy5FbmNvZGVyPUVuY29kZXI7ZXhwb3J0cy5EZWNvZGVyPURlY29kZXI7ZnVuY3Rpb24gRW5jb2Rlcigpe31FbmNvZGVyLnByb3RvdHlwZS5lbmNvZGU9ZnVuY3Rpb24ob2JqLGNhbGxiYWNrKXtkZWJ1ZyhcImVuY29kaW5nIHBhY2tldCAlalwiLG9iaik7aWYoZXhwb3J0cy5CSU5BUllfRVZFTlQ9PW9iai50eXBlfHxleHBvcnRzLkJJTkFSWV9BQ0s9PW9iai50eXBlKXtlbmNvZGVBc0JpbmFyeShvYmosY2FsbGJhY2spfWVsc2V7dmFyIGVuY29kaW5nPWVuY29kZUFzU3RyaW5nKG9iaik7Y2FsbGJhY2soW2VuY29kaW5nXSl9fTtmdW5jdGlvbiBlbmNvZGVBc1N0cmluZyhvYmope3ZhciBzdHI9XCJcIjt2YXIgbnNwPWZhbHNlO3N0cis9b2JqLnR5cGU7aWYoZXhwb3J0cy5CSU5BUllfRVZFTlQ9PW9iai50eXBlfHxleHBvcnRzLkJJTkFSWV9BQ0s9PW9iai50eXBlKXtzdHIrPW9iai5hdHRhY2htZW50cztzdHIrPVwiLVwifWlmKG9iai5uc3AmJlwiL1wiIT1vYmoubnNwKXtuc3A9dHJ1ZTtzdHIrPW9iai5uc3B9aWYobnVsbCE9b2JqLmlkKXtpZihuc3Ape3N0cis9XCIsXCI7bnNwPWZhbHNlfXN0cis9b2JqLmlkfWlmKG51bGwhPW9iai5kYXRhKXtpZihuc3Apc3RyKz1cIixcIjtzdHIrPWpzb24uc3RyaW5naWZ5KG9iai5kYXRhKX1kZWJ1ZyhcImVuY29kZWQgJWogYXMgJXNcIixvYmosc3RyKTtyZXR1cm4gc3RyfWZ1bmN0aW9uIGVuY29kZUFzQmluYXJ5KG9iaixjYWxsYmFjayl7ZnVuY3Rpb24gd3JpdGVFbmNvZGluZyhibG9ibGVzc0RhdGEpe3ZhciBkZWNvbnN0cnVjdGlvbj1iaW5hcnkuZGVjb25zdHJ1Y3RQYWNrZXQoYmxvYmxlc3NEYXRhKTt2YXIgcGFjaz1lbmNvZGVBc1N0cmluZyhkZWNvbnN0cnVjdGlvbi5wYWNrZXQpO3ZhciBidWZmZXJzPWRlY29uc3RydWN0aW9uLmJ1ZmZlcnM7YnVmZmVycy51bnNoaWZ0KHBhY2spO2NhbGxiYWNrKGJ1ZmZlcnMpfWJpbmFyeS5yZW1vdmVCbG9icyhvYmosd3JpdGVFbmNvZGluZyl9ZnVuY3Rpb24gRGVjb2Rlcigpe3RoaXMucmVjb25zdHJ1Y3Rvcj1udWxsfUVtaXR0ZXIoRGVjb2Rlci5wcm90b3R5cGUpO0RlY29kZXIucHJvdG90eXBlLmFkZD1mdW5jdGlvbihvYmope3ZhciBwYWNrZXQ7aWYoXCJzdHJpbmdcIj09dHlwZW9mIG9iail7cGFja2V0PWRlY29kZVN0cmluZyhvYmopO2lmKGV4cG9ydHMuQklOQVJZX0VWRU5UPT1wYWNrZXQudHlwZXx8ZXhwb3J0cy5CSU5BUllfQUNLPT1wYWNrZXQudHlwZSl7dGhpcy5yZWNvbnN0cnVjdG9yPW5ldyBCaW5hcnlSZWNvbnN0cnVjdG9yKHBhY2tldCk7aWYodGhpcy5yZWNvbnN0cnVjdG9yLnJlY29uUGFjay5hdHRhY2htZW50cz09PTApe3RoaXMuZW1pdChcImRlY29kZWRcIixwYWNrZXQpfX1lbHNle3RoaXMuZW1pdChcImRlY29kZWRcIixwYWNrZXQpfX1lbHNlIGlmKGlzQnVmKG9iail8fG9iai5iYXNlNjQpe2lmKCF0aGlzLnJlY29uc3RydWN0b3Ipe3Rocm93IG5ldyBFcnJvcihcImdvdCBiaW5hcnkgZGF0YSB3aGVuIG5vdCByZWNvbnN0cnVjdGluZyBhIHBhY2tldFwiKX1lbHNle3BhY2tldD10aGlzLnJlY29uc3RydWN0b3IudGFrZUJpbmFyeURhdGEob2JqKTtpZihwYWNrZXQpe3RoaXMucmVjb25zdHJ1Y3Rvcj1udWxsO3RoaXMuZW1pdChcImRlY29kZWRcIixwYWNrZXQpfX19ZWxzZXt0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHR5cGU6IFwiK29iail9fTtmdW5jdGlvbiBkZWNvZGVTdHJpbmcoc3RyKXt2YXIgcD17fTt2YXIgaT0wO3AudHlwZT1OdW1iZXIoc3RyLmNoYXJBdCgwKSk7aWYobnVsbD09ZXhwb3J0cy50eXBlc1twLnR5cGVdKXJldHVybiBlcnJvcigpO2lmKGV4cG9ydHMuQklOQVJZX0VWRU5UPT1wLnR5cGV8fGV4cG9ydHMuQklOQVJZX0FDSz09cC50eXBlKXt2YXIgYnVmPVwiXCI7d2hpbGUoc3RyLmNoYXJBdCgrK2kpIT1cIi1cIil7YnVmKz1zdHIuY2hhckF0KGkpO2lmKGk9PXN0ci5sZW5ndGgpYnJlYWt9aWYoYnVmIT1OdW1iZXIoYnVmKXx8c3RyLmNoYXJBdChpKSE9XCItXCIpe3Rocm93IG5ldyBFcnJvcihcIklsbGVnYWwgYXR0YWNobWVudHNcIil9cC5hdHRhY2htZW50cz1OdW1iZXIoYnVmKX1pZihcIi9cIj09c3RyLmNoYXJBdChpKzEpKXtwLm5zcD1cIlwiO3doaWxlKCsraSl7dmFyIGM9c3RyLmNoYXJBdChpKTtpZihcIixcIj09YylicmVhaztwLm5zcCs9YztpZihpPT1zdHIubGVuZ3RoKWJyZWFrfX1lbHNle3AubnNwPVwiL1wifXZhciBuZXh0PXN0ci5jaGFyQXQoaSsxKTtpZihcIlwiIT09bmV4dCYmTnVtYmVyKG5leHQpPT1uZXh0KXtwLmlkPVwiXCI7d2hpbGUoKytpKXt2YXIgYz1zdHIuY2hhckF0KGkpO2lmKG51bGw9PWN8fE51bWJlcihjKSE9Yyl7LS1pO2JyZWFrfXAuaWQrPXN0ci5jaGFyQXQoaSk7aWYoaT09c3RyLmxlbmd0aClicmVha31wLmlkPU51bWJlcihwLmlkKX1pZihzdHIuY2hhckF0KCsraSkpe3RyeXtwLmRhdGE9anNvbi5wYXJzZShzdHIuc3Vic3RyKGkpKX1jYXRjaChlKXtyZXR1cm4gZXJyb3IoKX19ZGVidWcoXCJkZWNvZGVkICVzIGFzICVqXCIsc3RyLHApO3JldHVybiBwfURlY29kZXIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtpZih0aGlzLnJlY29uc3RydWN0b3Ipe3RoaXMucmVjb25zdHJ1Y3Rvci5maW5pc2hlZFJlY29uc3RydWN0aW9uKCl9fTtmdW5jdGlvbiBCaW5hcnlSZWNvbnN0cnVjdG9yKHBhY2tldCl7dGhpcy5yZWNvblBhY2s9cGFja2V0O3RoaXMuYnVmZmVycz1bXX1CaW5hcnlSZWNvbnN0cnVjdG9yLnByb3RvdHlwZS50YWtlQmluYXJ5RGF0YT1mdW5jdGlvbihiaW5EYXRhKXt0aGlzLmJ1ZmZlcnMucHVzaChiaW5EYXRhKTtpZih0aGlzLmJ1ZmZlcnMubGVuZ3RoPT10aGlzLnJlY29uUGFjay5hdHRhY2htZW50cyl7dmFyIHBhY2tldD1iaW5hcnkucmVjb25zdHJ1Y3RQYWNrZXQodGhpcy5yZWNvblBhY2ssdGhpcy5idWZmZXJzKTt0aGlzLmZpbmlzaGVkUmVjb25zdHJ1Y3Rpb24oKTtyZXR1cm4gcGFja2V0fXJldHVybiBudWxsfTtCaW5hcnlSZWNvbnN0cnVjdG9yLnByb3RvdHlwZS5maW5pc2hlZFJlY29uc3RydWN0aW9uPWZ1bmN0aW9uKCl7dGhpcy5yZWNvblBhY2s9bnVsbDt0aGlzLmJ1ZmZlcnM9W119O2Z1bmN0aW9uIGVycm9yKGRhdGEpe3JldHVybnt0eXBlOmV4cG9ydHMuRVJST1IsZGF0YTpcInBhcnNlciBlcnJvclwifX19LHtcIi4vYmluYXJ5XCI6NDYsXCIuL2lzLWJ1ZmZlclwiOjQ4LFwiY29tcG9uZW50LWVtaXR0ZXJcIjo0OSxkZWJ1ZzozOSxpc2FycmF5OjQzLGpzb24zOjUwfV0sNDg6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpeyhmdW5jdGlvbihnbG9iYWwpe21vZHVsZS5leHBvcnRzPWlzQnVmO2Z1bmN0aW9uIGlzQnVmKG9iail7cmV0dXJuIGdsb2JhbC5CdWZmZXImJmdsb2JhbC5CdWZmZXIuaXNCdWZmZXIob2JqKXx8Z2xvYmFsLkFycmF5QnVmZmVyJiZvYmogaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcn19KS5jYWxsKHRoaXMsdHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiP3NlbGY6dHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCI/d2luZG93OnR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiP2dsb2JhbDp7fSl9LHt9XSw0OTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7YXJndW1lbnRzWzRdWzE1XVswXS5hcHBseShleHBvcnRzLGFyZ3VtZW50cyl9LHtkdXA6MTV9XSw1MDpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7KGZ1bmN0aW9uKGdsb2JhbCl7KGZ1bmN0aW9uKCl7dmFyIGlzTG9hZGVyPXR5cGVvZiBkZWZpbmU9PT1cImZ1bmN0aW9uXCImJmRlZmluZS5hbWQ7dmFyIG9iamVjdFR5cGVzPXtcImZ1bmN0aW9uXCI6dHJ1ZSxvYmplY3Q6dHJ1ZX07dmFyIGZyZWVFeHBvcnRzPW9iamVjdFR5cGVzW3R5cGVvZiBleHBvcnRzXSYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHM7dmFyIHJvb3Q9b2JqZWN0VHlwZXNbdHlwZW9mIHdpbmRvd10mJndpbmRvd3x8dGhpcyxmcmVlR2xvYmFsPWZyZWVFeHBvcnRzJiZvYmplY3RUeXBlc1t0eXBlb2YgbW9kdWxlXSYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZ0eXBlb2YgZ2xvYmFsPT1cIm9iamVjdFwiJiZnbG9iYWw7aWYoZnJlZUdsb2JhbCYmKGZyZWVHbG9iYWxbXCJnbG9iYWxcIl09PT1mcmVlR2xvYmFsfHxmcmVlR2xvYmFsW1wid2luZG93XCJdPT09ZnJlZUdsb2JhbHx8ZnJlZUdsb2JhbFtcInNlbGZcIl09PT1mcmVlR2xvYmFsKSl7cm9vdD1mcmVlR2xvYmFsfWZ1bmN0aW9uIHJ1bkluQ29udGV4dChjb250ZXh0LGV4cG9ydHMpe2NvbnRleHR8fChjb250ZXh0PXJvb3RbXCJPYmplY3RcIl0oKSk7ZXhwb3J0c3x8KGV4cG9ydHM9cm9vdFtcIk9iamVjdFwiXSgpKTt2YXIgTnVtYmVyPWNvbnRleHRbXCJOdW1iZXJcIl18fHJvb3RbXCJOdW1iZXJcIl0sU3RyaW5nPWNvbnRleHRbXCJTdHJpbmdcIl18fHJvb3RbXCJTdHJpbmdcIl0sT2JqZWN0PWNvbnRleHRbXCJPYmplY3RcIl18fHJvb3RbXCJPYmplY3RcIl0sRGF0ZT1jb250ZXh0W1wiRGF0ZVwiXXx8cm9vdFtcIkRhdGVcIl0sU3ludGF4RXJyb3I9Y29udGV4dFtcIlN5bnRheEVycm9yXCJdfHxyb290W1wiU3ludGF4RXJyb3JcIl0sVHlwZUVycm9yPWNvbnRleHRbXCJUeXBlRXJyb3JcIl18fHJvb3RbXCJUeXBlRXJyb3JcIl0sTWF0aD1jb250ZXh0W1wiTWF0aFwiXXx8cm9vdFtcIk1hdGhcIl0sbmF0aXZlSlNPTj1jb250ZXh0W1wiSlNPTlwiXXx8cm9vdFtcIkpTT05cIl07aWYodHlwZW9mIG5hdGl2ZUpTT049PVwib2JqZWN0XCImJm5hdGl2ZUpTT04pe2V4cG9ydHMuc3RyaW5naWZ5PW5hdGl2ZUpTT04uc3RyaW5naWZ5O2V4cG9ydHMucGFyc2U9bmF0aXZlSlNPTi5wYXJzZX12YXIgb2JqZWN0UHJvdG89T2JqZWN0LnByb3RvdHlwZSxnZXRDbGFzcz1vYmplY3RQcm90by50b1N0cmluZyxpc1Byb3BlcnR5LGZvckVhY2gsdW5kZWY7dmFyIGlzRXh0ZW5kZWQ9bmV3IERhdGUoLTB4Yzc4MmI1YjgwMGNlYyk7dHJ5e2lzRXh0ZW5kZWQ9aXNFeHRlbmRlZC5nZXRVVENGdWxsWWVhcigpPT0tMTA5MjUyJiZpc0V4dGVuZGVkLmdldFVUQ01vbnRoKCk9PT0wJiZpc0V4dGVuZGVkLmdldFVUQ0RhdGUoKT09PTEmJmlzRXh0ZW5kZWQuZ2V0VVRDSG91cnMoKT09MTAmJmlzRXh0ZW5kZWQuZ2V0VVRDTWludXRlcygpPT0zNyYmaXNFeHRlbmRlZC5nZXRVVENTZWNvbmRzKCk9PTYmJmlzRXh0ZW5kZWQuZ2V0VVRDTWlsbGlzZWNvbmRzKCk9PTcwOH1jYXRjaChleGNlcHRpb24pe31mdW5jdGlvbiBoYXMobmFtZSl7aWYoaGFzW25hbWVdIT09dW5kZWYpe3JldHVybiBoYXNbbmFtZV19dmFyIGlzU3VwcG9ydGVkO2lmKG5hbWU9PVwiYnVnLXN0cmluZy1jaGFyLWluZGV4XCIpe2lzU3VwcG9ydGVkPVwiYVwiWzBdIT1cImFcIn1lbHNlIGlmKG5hbWU9PVwianNvblwiKXtpc1N1cHBvcnRlZD1oYXMoXCJqc29uLXN0cmluZ2lmeVwiKSYmaGFzKFwianNvbi1wYXJzZVwiKX1lbHNle3ZhciB2YWx1ZSxzZXJpYWxpemVkPSd7XCJhXCI6WzEsdHJ1ZSxmYWxzZSxudWxsLFwiXFxcXHUwMDAwXFxcXGJcXFxcblxcXFxmXFxcXHJcXFxcdFwiXX0nO2lmKG5hbWU9PVwianNvbi1zdHJpbmdpZnlcIil7dmFyIHN0cmluZ2lmeT1leHBvcnRzLnN0cmluZ2lmeSxzdHJpbmdpZnlTdXBwb3J0ZWQ9dHlwZW9mIHN0cmluZ2lmeT09XCJmdW5jdGlvblwiJiZpc0V4dGVuZGVkO2lmKHN0cmluZ2lmeVN1cHBvcnRlZCl7KHZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIDF9KS50b0pTT049dmFsdWU7dHJ5e3N0cmluZ2lmeVN1cHBvcnRlZD1zdHJpbmdpZnkoMCk9PT1cIjBcIiYmc3RyaW5naWZ5KG5ldyBOdW1iZXIpPT09XCIwXCImJnN0cmluZ2lmeShuZXcgU3RyaW5nKT09J1wiXCInJiZzdHJpbmdpZnkoZ2V0Q2xhc3MpPT09dW5kZWYmJnN0cmluZ2lmeSh1bmRlZik9PT11bmRlZiYmc3RyaW5naWZ5KCk9PT11bmRlZiYmc3RyaW5naWZ5KHZhbHVlKT09PVwiMVwiJiZzdHJpbmdpZnkoW3ZhbHVlXSk9PVwiWzFdXCImJnN0cmluZ2lmeShbdW5kZWZdKT09XCJbbnVsbF1cIiYmc3RyaW5naWZ5KG51bGwpPT1cIm51bGxcIiYmc3RyaW5naWZ5KFt1bmRlZixnZXRDbGFzcyxudWxsXSk9PVwiW251bGwsbnVsbCxudWxsXVwiJiZzdHJpbmdpZnkoe2E6W3ZhbHVlLHRydWUsZmFsc2UsbnVsbCxcIlxceDAwXFxiXFxuXFxmXFxyXHRcIl19KT09c2VyaWFsaXplZCYmc3RyaW5naWZ5KG51bGwsdmFsdWUpPT09XCIxXCImJnN0cmluZ2lmeShbMSwyXSxudWxsLDEpPT1cIltcXG4gMSxcXG4gMlxcbl1cIiYmc3RyaW5naWZ5KG5ldyBEYXRlKC04NjRlMTMpKT09J1wiLTI3MTgyMS0wNC0yMFQwMDowMDowMC4wMDBaXCInJiZzdHJpbmdpZnkobmV3IERhdGUoODY0ZTEzKSk9PSdcIisyNzU3NjAtMDktMTNUMDA6MDA6MDAuMDAwWlwiJyYmc3RyaW5naWZ5KG5ldyBEYXRlKC02MjE5ODc1NTJlNSkpPT0nXCItMDAwMDAxLTAxLTAxVDAwOjAwOjAwLjAwMFpcIicmJnN0cmluZ2lmeShuZXcgRGF0ZSgtMSkpPT0nXCIxOTY5LTEyLTMxVDIzOjU5OjU5Ljk5OVpcIid9Y2F0Y2goZXhjZXB0aW9uKXtzdHJpbmdpZnlTdXBwb3J0ZWQ9ZmFsc2V9fWlzU3VwcG9ydGVkPXN0cmluZ2lmeVN1cHBvcnRlZH1pZihuYW1lPT1cImpzb24tcGFyc2VcIil7dmFyIHBhcnNlPWV4cG9ydHMucGFyc2U7aWYodHlwZW9mIHBhcnNlPT1cImZ1bmN0aW9uXCIpe3RyeXtpZihwYXJzZShcIjBcIik9PT0wJiYhcGFyc2UoZmFsc2UpKXt2YWx1ZT1wYXJzZShzZXJpYWxpemVkKTt2YXIgcGFyc2VTdXBwb3J0ZWQ9dmFsdWVbXCJhXCJdLmxlbmd0aD09NSYmdmFsdWVbXCJhXCJdWzBdPT09MTtpZihwYXJzZVN1cHBvcnRlZCl7dHJ5e3BhcnNlU3VwcG9ydGVkPSFwYXJzZSgnXCJcdFwiJyl9Y2F0Y2goZXhjZXB0aW9uKXt9aWYocGFyc2VTdXBwb3J0ZWQpe3RyeXtwYXJzZVN1cHBvcnRlZD1wYXJzZShcIjAxXCIpIT09MX1jYXRjaChleGNlcHRpb24pe319aWYocGFyc2VTdXBwb3J0ZWQpe3RyeXtwYXJzZVN1cHBvcnRlZD1wYXJzZShcIjEuXCIpIT09MX1jYXRjaChleGNlcHRpb24pe319fX19Y2F0Y2goZXhjZXB0aW9uKXtwYXJzZVN1cHBvcnRlZD1mYWxzZX19aXNTdXBwb3J0ZWQ9cGFyc2VTdXBwb3J0ZWR9fXJldHVybiBoYXNbbmFtZV09ISFpc1N1cHBvcnRlZH1pZighaGFzKFwianNvblwiKSl7dmFyIGZ1bmN0aW9uQ2xhc3M9XCJbb2JqZWN0IEZ1bmN0aW9uXVwiLGRhdGVDbGFzcz1cIltvYmplY3QgRGF0ZV1cIixudW1iZXJDbGFzcz1cIltvYmplY3QgTnVtYmVyXVwiLHN0cmluZ0NsYXNzPVwiW29iamVjdCBTdHJpbmddXCIsYXJyYXlDbGFzcz1cIltvYmplY3QgQXJyYXldXCIsYm9vbGVhbkNsYXNzPVwiW29iamVjdCBCb29sZWFuXVwiO3ZhciBjaGFySW5kZXhCdWdneT1oYXMoXCJidWctc3RyaW5nLWNoYXItaW5kZXhcIik7aWYoIWlzRXh0ZW5kZWQpe3ZhciBmbG9vcj1NYXRoLmZsb29yO3ZhciBNb250aHM9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF07dmFyIGdldERheT1mdW5jdGlvbih5ZWFyLG1vbnRoKXtyZXR1cm4gTW9udGhzW21vbnRoXSszNjUqKHllYXItMTk3MCkrZmxvb3IoKHllYXItMTk2OSsobW9udGg9Kyhtb250aD4xKSkpLzQpLWZsb29yKCh5ZWFyLTE5MDErbW9udGgpLzEwMCkrZmxvb3IoKHllYXItMTYwMSttb250aCkvNDAwKX19aWYoIShpc1Byb3BlcnR5PW9iamVjdFByb3RvLmhhc093blByb3BlcnR5KSl7aXNQcm9wZXJ0eT1mdW5jdGlvbihwcm9wZXJ0eSl7dmFyIG1lbWJlcnM9e30sY29uc3RydWN0b3I7aWYoKG1lbWJlcnMuX19wcm90b19fPW51bGwsbWVtYmVycy5fX3Byb3RvX189e3RvU3RyaW5nOjF9LG1lbWJlcnMpLnRvU3RyaW5nIT1nZXRDbGFzcyl7aXNQcm9wZXJ0eT1mdW5jdGlvbihwcm9wZXJ0eSl7dmFyIG9yaWdpbmFsPXRoaXMuX19wcm90b19fLHJlc3VsdD1wcm9wZXJ0eSBpbih0aGlzLl9fcHJvdG9fXz1udWxsLHRoaXMpO3RoaXMuX19wcm90b19fPW9yaWdpbmFsO3JldHVybiByZXN1bHR9fWVsc2V7Y29uc3RydWN0b3I9bWVtYmVycy5jb25zdHJ1Y3Rvcjtpc1Byb3BlcnR5PWZ1bmN0aW9uKHByb3BlcnR5KXt2YXIgcGFyZW50PSh0aGlzLmNvbnN0cnVjdG9yfHxjb25zdHJ1Y3RvcikucHJvdG90eXBlO3JldHVybiBwcm9wZXJ0eSBpbiB0aGlzJiYhKHByb3BlcnR5IGluIHBhcmVudCYmdGhpc1twcm9wZXJ0eV09PT1wYXJlbnRbcHJvcGVydHldKX19bWVtYmVycz1udWxsO3JldHVybiBpc1Byb3BlcnR5LmNhbGwodGhpcyxwcm9wZXJ0eSl9fWZvckVhY2g9ZnVuY3Rpb24ob2JqZWN0LGNhbGxiYWNrKXt2YXIgc2l6ZT0wLFByb3BlcnRpZXMsbWVtYmVycyxwcm9wZXJ0eTsoUHJvcGVydGllcz1mdW5jdGlvbigpe3RoaXMudmFsdWVPZj0wfSkucHJvdG90eXBlLnZhbHVlT2Y9MDttZW1iZXJzPW5ldyBQcm9wZXJ0aWVzO2Zvcihwcm9wZXJ0eSBpbiBtZW1iZXJzKXtpZihpc1Byb3BlcnR5LmNhbGwobWVtYmVycyxwcm9wZXJ0eSkpe3NpemUrK319UHJvcGVydGllcz1tZW1iZXJzPW51bGw7aWYoIXNpemUpe21lbWJlcnM9W1widmFsdWVPZlwiLFwidG9TdHJpbmdcIixcInRvTG9jYWxlU3RyaW5nXCIsXCJwcm9wZXJ0eUlzRW51bWVyYWJsZVwiLFwiaXNQcm90b3R5cGVPZlwiLFwiaGFzT3duUHJvcGVydHlcIixcImNvbnN0cnVjdG9yXCJdO2ZvckVhY2g9ZnVuY3Rpb24ob2JqZWN0LGNhbGxiYWNrKXt2YXIgaXNGdW5jdGlvbj1nZXRDbGFzcy5jYWxsKG9iamVjdCk9PWZ1bmN0aW9uQ2xhc3MscHJvcGVydHksbGVuZ3RoO3ZhciBoYXNQcm9wZXJ0eT0haXNGdW5jdGlvbiYmdHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciE9XCJmdW5jdGlvblwiJiZvYmplY3RUeXBlc1t0eXBlb2Ygb2JqZWN0Lmhhc093blByb3BlcnR5XSYmb2JqZWN0Lmhhc093blByb3BlcnR5fHxpc1Byb3BlcnR5O2Zvcihwcm9wZXJ0eSBpbiBvYmplY3Qpe2lmKCEoaXNGdW5jdGlvbiYmcHJvcGVydHk9PVwicHJvdG90eXBlXCIpJiZoYXNQcm9wZXJ0eS5jYWxsKG9iamVjdCxwcm9wZXJ0eSkpe2NhbGxiYWNrKHByb3BlcnR5KX19Zm9yKGxlbmd0aD1tZW1iZXJzLmxlbmd0aDtwcm9wZXJ0eT1tZW1iZXJzWy0tbGVuZ3RoXTtoYXNQcm9wZXJ0eS5jYWxsKG9iamVjdCxwcm9wZXJ0eSkmJmNhbGxiYWNrKHByb3BlcnR5KSk7fX1lbHNlIGlmKHNpemU9PTIpe2ZvckVhY2g9ZnVuY3Rpb24ob2JqZWN0LGNhbGxiYWNrKXt2YXIgbWVtYmVycz17fSxpc0Z1bmN0aW9uPWdldENsYXNzLmNhbGwob2JqZWN0KT09ZnVuY3Rpb25DbGFzcyxwcm9wZXJ0eTtmb3IocHJvcGVydHkgaW4gb2JqZWN0KXtpZighKGlzRnVuY3Rpb24mJnByb3BlcnR5PT1cInByb3RvdHlwZVwiKSYmIWlzUHJvcGVydHkuY2FsbChtZW1iZXJzLHByb3BlcnR5KSYmKG1lbWJlcnNbcHJvcGVydHldPTEpJiZpc1Byb3BlcnR5LmNhbGwob2JqZWN0LHByb3BlcnR5KSl7Y2FsbGJhY2socHJvcGVydHkpfX19fWVsc2V7Zm9yRWFjaD1mdW5jdGlvbihvYmplY3QsY2FsbGJhY2spe3ZhciBpc0Z1bmN0aW9uPWdldENsYXNzLmNhbGwob2JqZWN0KT09ZnVuY3Rpb25DbGFzcyxwcm9wZXJ0eSxpc0NvbnN0cnVjdG9yO2Zvcihwcm9wZXJ0eSBpbiBvYmplY3Qpe2lmKCEoaXNGdW5jdGlvbiYmcHJvcGVydHk9PVwicHJvdG90eXBlXCIpJiZpc1Byb3BlcnR5LmNhbGwob2JqZWN0LHByb3BlcnR5KSYmIShpc0NvbnN0cnVjdG9yPXByb3BlcnR5PT09XCJjb25zdHJ1Y3RvclwiKSl7Y2FsbGJhY2socHJvcGVydHkpfX1pZihpc0NvbnN0cnVjdG9yfHxpc1Byb3BlcnR5LmNhbGwob2JqZWN0LHByb3BlcnR5PVwiY29uc3RydWN0b3JcIikpe2NhbGxiYWNrKHByb3BlcnR5KX19fXJldHVybiBmb3JFYWNoKG9iamVjdCxjYWxsYmFjayl9O2lmKCFoYXMoXCJqc29uLXN0cmluZ2lmeVwiKSl7dmFyIEVzY2FwZXM9ezkyOlwiXFxcXFxcXFxcIiwzNDonXFxcXFwiJyw4OlwiXFxcXGJcIiwxMjpcIlxcXFxmXCIsMTA6XCJcXFxcblwiLDEzOlwiXFxcXHJcIiw5OlwiXFxcXHRcIn07dmFyIGxlYWRpbmdaZXJvZXM9XCIwMDAwMDBcIjt2YXIgdG9QYWRkZWRTdHJpbmc9ZnVuY3Rpb24od2lkdGgsdmFsdWUpe3JldHVybihsZWFkaW5nWmVyb2VzKyh2YWx1ZXx8MCkpLnNsaWNlKC13aWR0aCl9O3ZhciB1bmljb2RlUHJlZml4PVwiXFxcXHUwMFwiO3ZhciBxdW90ZT1mdW5jdGlvbih2YWx1ZSl7dmFyIHJlc3VsdD0nXCInLGluZGV4PTAsbGVuZ3RoPXZhbHVlLmxlbmd0aCx1c2VDaGFySW5kZXg9IWNoYXJJbmRleEJ1Z2d5fHxsZW5ndGg+MTA7dmFyIHN5bWJvbHM9dXNlQ2hhckluZGV4JiYoY2hhckluZGV4QnVnZ3k/dmFsdWUuc3BsaXQoXCJcIik6dmFsdWUpO2Zvcig7aW5kZXg8bGVuZ3RoO2luZGV4Kyspe3ZhciBjaGFyQ29kZT12YWx1ZS5jaGFyQ29kZUF0KGluZGV4KTtzd2l0Y2goY2hhckNvZGUpe2Nhc2UgODpjYXNlIDk6Y2FzZSAxMDpjYXNlIDEyOmNhc2UgMTM6Y2FzZSAzNDpjYXNlIDkyOnJlc3VsdCs9RXNjYXBlc1tjaGFyQ29kZV07YnJlYWs7ZGVmYXVsdDppZihjaGFyQ29kZTwzMil7cmVzdWx0Kz11bmljb2RlUHJlZml4K3RvUGFkZGVkU3RyaW5nKDIsY2hhckNvZGUudG9TdHJpbmcoMTYpKTticmVha31yZXN1bHQrPXVzZUNoYXJJbmRleD9zeW1ib2xzW2luZGV4XTp2YWx1ZS5jaGFyQXQoaW5kZXgpfX1yZXR1cm4gcmVzdWx0KydcIid9O3ZhciBzZXJpYWxpemU9ZnVuY3Rpb24ocHJvcGVydHksb2JqZWN0LGNhbGxiYWNrLHByb3BlcnRpZXMsd2hpdGVzcGFjZSxpbmRlbnRhdGlvbixzdGFjayl7dmFyIHZhbHVlLGNsYXNzTmFtZSx5ZWFyLG1vbnRoLGRhdGUsdGltZSxob3VycyxtaW51dGVzLHNlY29uZHMsbWlsbGlzZWNvbmRzLHJlc3VsdHMsZWxlbWVudCxpbmRleCxsZW5ndGgscHJlZml4LHJlc3VsdDt0cnl7dmFsdWU9b2JqZWN0W3Byb3BlcnR5XX1jYXRjaChleGNlcHRpb24pe31pZih0eXBlb2YgdmFsdWU9PVwib2JqZWN0XCImJnZhbHVlKXtjbGFzc05hbWU9Z2V0Q2xhc3MuY2FsbCh2YWx1ZSk7aWYoY2xhc3NOYW1lPT1kYXRlQ2xhc3MmJiFpc1Byb3BlcnR5LmNhbGwodmFsdWUsXCJ0b0pTT05cIikpe2lmKHZhbHVlPi0xLzAmJnZhbHVlPDEvMCl7aWYoZ2V0RGF5KXtkYXRlPWZsb29yKHZhbHVlLzg2NGU1KTtmb3IoeWVhcj1mbG9vcihkYXRlLzM2NS4yNDI1KSsxOTcwLTE7Z2V0RGF5KHllYXIrMSwwKTw9ZGF0ZTt5ZWFyKyspO2Zvcihtb250aD1mbG9vcigoZGF0ZS1nZXREYXkoeWVhciwwKSkvMzAuNDIpO2dldERheSh5ZWFyLG1vbnRoKzEpPD1kYXRlO21vbnRoKyspO2RhdGU9MStkYXRlLWdldERheSh5ZWFyLG1vbnRoKTt0aW1lPSh2YWx1ZSU4NjRlNSs4NjRlNSklODY0ZTU7aG91cnM9Zmxvb3IodGltZS8zNmU1KSUyNDttaW51dGVzPWZsb29yKHRpbWUvNmU0KSU2MDtzZWNvbmRzPWZsb29yKHRpbWUvMWUzKSU2MDttaWxsaXNlY29uZHM9dGltZSUxZTN9ZWxzZXt5ZWFyPXZhbHVlLmdldFVUQ0Z1bGxZZWFyKCk7bW9udGg9dmFsdWUuZ2V0VVRDTW9udGgoKTtkYXRlPXZhbHVlLmdldFVUQ0RhdGUoKTtob3Vycz12YWx1ZS5nZXRVVENIb3VycygpO21pbnV0ZXM9dmFsdWUuZ2V0VVRDTWludXRlcygpO3NlY29uZHM9dmFsdWUuZ2V0VVRDU2Vjb25kcygpO21pbGxpc2Vjb25kcz12YWx1ZS5nZXRVVENNaWxsaXNlY29uZHMoKX12YWx1ZT0oeWVhcjw9MHx8eWVhcj49MWU0Pyh5ZWFyPDA/XCItXCI6XCIrXCIpK3RvUGFkZGVkU3RyaW5nKDYseWVhcjwwPy15ZWFyOnllYXIpOnRvUGFkZGVkU3RyaW5nKDQseWVhcikpK1wiLVwiK3RvUGFkZGVkU3RyaW5nKDIsbW9udGgrMSkrXCItXCIrdG9QYWRkZWRTdHJpbmcoMixkYXRlKStcIlRcIit0b1BhZGRlZFN0cmluZygyLGhvdXJzKStcIjpcIit0b1BhZGRlZFN0cmluZygyLG1pbnV0ZXMpK1wiOlwiK3RvUGFkZGVkU3RyaW5nKDIsc2Vjb25kcykrXCIuXCIrdG9QYWRkZWRTdHJpbmcoMyxtaWxsaXNlY29uZHMpK1wiWlwifWVsc2V7dmFsdWU9bnVsbH19ZWxzZSBpZih0eXBlb2YgdmFsdWUudG9KU09OPT1cImZ1bmN0aW9uXCImJihjbGFzc05hbWUhPW51bWJlckNsYXNzJiZjbGFzc05hbWUhPXN0cmluZ0NsYXNzJiZjbGFzc05hbWUhPWFycmF5Q2xhc3N8fGlzUHJvcGVydHkuY2FsbCh2YWx1ZSxcInRvSlNPTlwiKSkpe3ZhbHVlPXZhbHVlLnRvSlNPTihwcm9wZXJ0eSl9fWlmKGNhbGxiYWNrKXt2YWx1ZT1jYWxsYmFjay5jYWxsKG9iamVjdCxwcm9wZXJ0eSx2YWx1ZSl9aWYodmFsdWU9PT1udWxsKXtyZXR1cm5cIm51bGxcIn1jbGFzc05hbWU9Z2V0Q2xhc3MuY2FsbCh2YWx1ZSk7aWYoY2xhc3NOYW1lPT1ib29sZWFuQ2xhc3Mpe3JldHVyblwiXCIrdmFsdWV9ZWxzZSBpZihjbGFzc05hbWU9PW51bWJlckNsYXNzKXtyZXR1cm4gdmFsdWU+LTEvMCYmdmFsdWU8MS8wP1wiXCIrdmFsdWU6XCJudWxsXCJ9ZWxzZSBpZihjbGFzc05hbWU9PXN0cmluZ0NsYXNzKXtyZXR1cm4gcXVvdGUoXCJcIit2YWx1ZSl9aWYodHlwZW9mIHZhbHVlPT1cIm9iamVjdFwiKXtmb3IobGVuZ3RoPXN0YWNrLmxlbmd0aDtsZW5ndGgtLTspe2lmKHN0YWNrW2xlbmd0aF09PT12YWx1ZSl7dGhyb3cgVHlwZUVycm9yKCl9fXN0YWNrLnB1c2godmFsdWUpO3Jlc3VsdHM9W107cHJlZml4PWluZGVudGF0aW9uO2luZGVudGF0aW9uKz13aGl0ZXNwYWNlO2lmKGNsYXNzTmFtZT09YXJyYXlDbGFzcyl7Zm9yKGluZGV4PTAsbGVuZ3RoPXZhbHVlLmxlbmd0aDtpbmRleDxsZW5ndGg7aW5kZXgrKyl7ZWxlbWVudD1zZXJpYWxpemUoaW5kZXgsdmFsdWUsY2FsbGJhY2sscHJvcGVydGllcyx3aGl0ZXNwYWNlLGluZGVudGF0aW9uLHN0YWNrKTtyZXN1bHRzLnB1c2goZWxlbWVudD09PXVuZGVmP1wibnVsbFwiOmVsZW1lbnQpfXJlc3VsdD1yZXN1bHRzLmxlbmd0aD93aGl0ZXNwYWNlP1wiW1xcblwiK2luZGVudGF0aW9uK3Jlc3VsdHMuam9pbihcIixcXG5cIitpbmRlbnRhdGlvbikrXCJcXG5cIitwcmVmaXgrXCJdXCI6XCJbXCIrcmVzdWx0cy5qb2luKFwiLFwiKStcIl1cIjpcIltdXCJ9ZWxzZXtmb3JFYWNoKHByb3BlcnRpZXN8fHZhbHVlLGZ1bmN0aW9uKHByb3BlcnR5KXt2YXIgZWxlbWVudD1zZXJpYWxpemUocHJvcGVydHksdmFsdWUsY2FsbGJhY2sscHJvcGVydGllcyx3aGl0ZXNwYWNlLGluZGVudGF0aW9uLHN0YWNrKTtpZihlbGVtZW50IT09dW5kZWYpe3Jlc3VsdHMucHVzaChxdW90ZShwcm9wZXJ0eSkrXCI6XCIrKHdoaXRlc3BhY2U/XCIgXCI6XCJcIikrZWxlbWVudCl9fSk7cmVzdWx0PXJlc3VsdHMubGVuZ3RoP3doaXRlc3BhY2U/XCJ7XFxuXCIraW5kZW50YXRpb24rcmVzdWx0cy5qb2luKFwiLFxcblwiK2luZGVudGF0aW9uKStcIlxcblwiK3ByZWZpeCtcIn1cIjpcIntcIityZXN1bHRzLmpvaW4oXCIsXCIpK1wifVwiOlwie31cIn1zdGFjay5wb3AoKTtyZXR1cm4gcmVzdWx0fX07ZXhwb3J0cy5zdHJpbmdpZnk9ZnVuY3Rpb24oc291cmNlLGZpbHRlcix3aWR0aCl7dmFyIHdoaXRlc3BhY2UsY2FsbGJhY2sscHJvcGVydGllcyxjbGFzc05hbWU7aWYob2JqZWN0VHlwZXNbdHlwZW9mIGZpbHRlcl0mJmZpbHRlcil7aWYoKGNsYXNzTmFtZT1nZXRDbGFzcy5jYWxsKGZpbHRlcikpPT1mdW5jdGlvbkNsYXNzKXtjYWxsYmFjaz1maWx0ZXJ9ZWxzZSBpZihjbGFzc05hbWU9PWFycmF5Q2xhc3Mpe3Byb3BlcnRpZXM9e307Zm9yKHZhciBpbmRleD0wLGxlbmd0aD1maWx0ZXIubGVuZ3RoLHZhbHVlO2luZGV4PGxlbmd0aDt2YWx1ZT1maWx0ZXJbaW5kZXgrK10sKGNsYXNzTmFtZT1nZXRDbGFzcy5jYWxsKHZhbHVlKSxjbGFzc05hbWU9PXN0cmluZ0NsYXNzfHxjbGFzc05hbWU9PW51bWJlckNsYXNzKSYmKHByb3BlcnRpZXNbdmFsdWVdPTEpKTt9fWlmKHdpZHRoKXtpZigoY2xhc3NOYW1lPWdldENsYXNzLmNhbGwod2lkdGgpKT09bnVtYmVyQ2xhc3Mpe2lmKCh3aWR0aC09d2lkdGglMSk+MCl7Zm9yKHdoaXRlc3BhY2U9XCJcIix3aWR0aD4xMCYmKHdpZHRoPTEwKTt3aGl0ZXNwYWNlLmxlbmd0aDx3aWR0aDt3aGl0ZXNwYWNlKz1cIiBcIik7fX1lbHNlIGlmKGNsYXNzTmFtZT09c3RyaW5nQ2xhc3Mpe3doaXRlc3BhY2U9d2lkdGgubGVuZ3RoPD0xMD93aWR0aDp3aWR0aC5zbGljZSgwLDEwKX19cmV0dXJuIHNlcmlhbGl6ZShcIlwiLCh2YWx1ZT17fSx2YWx1ZVtcIlwiXT1zb3VyY2UsdmFsdWUpLGNhbGxiYWNrLHByb3BlcnRpZXMsd2hpdGVzcGFjZSxcIlwiLFtdKX19aWYoIWhhcyhcImpzb24tcGFyc2VcIikpe3ZhciBmcm9tQ2hhckNvZGU9U3RyaW5nLmZyb21DaGFyQ29kZTt2YXIgVW5lc2NhcGVzPXs5MjpcIlxcXFxcIiwzNDonXCInLDQ3OlwiL1wiLDk4OlwiXFxiXCIsMTE2OlwiXHRcIiwxMTA6XCJcXG5cIiwxMDI6XCJcXGZcIiwxMTQ6XCJcXHJcIn07dmFyIEluZGV4LFNvdXJjZTt2YXIgYWJvcnQ9ZnVuY3Rpb24oKXtJbmRleD1Tb3VyY2U9bnVsbDt0aHJvdyBTeW50YXhFcnJvcigpfTt2YXIgbGV4PWZ1bmN0aW9uKCl7dmFyIHNvdXJjZT1Tb3VyY2UsbGVuZ3RoPXNvdXJjZS5sZW5ndGgsdmFsdWUsYmVnaW4scG9zaXRpb24saXNTaWduZWQsY2hhckNvZGU7d2hpbGUoSW5kZXg8bGVuZ3RoKXtjaGFyQ29kZT1zb3VyY2UuY2hhckNvZGVBdChJbmRleCk7c3dpdGNoKGNoYXJDb2RlKXtjYXNlIDk6Y2FzZSAxMDpjYXNlIDEzOmNhc2UgMzI6SW5kZXgrKzticmVhaztjYXNlIDEyMzpjYXNlIDEyNTpjYXNlIDkxOmNhc2UgOTM6Y2FzZSA1ODpjYXNlIDQ0OnZhbHVlPWNoYXJJbmRleEJ1Z2d5P3NvdXJjZS5jaGFyQXQoSW5kZXgpOnNvdXJjZVtJbmRleF07SW5kZXgrKztyZXR1cm4gdmFsdWU7Y2FzZSAzNDpmb3IodmFsdWU9XCJAXCIsSW5kZXgrKztJbmRleDxsZW5ndGg7KXtjaGFyQ29kZT1zb3VyY2UuY2hhckNvZGVBdChJbmRleCk7aWYoY2hhckNvZGU8MzIpe2Fib3J0KCl9ZWxzZSBpZihjaGFyQ29kZT09OTIpe2NoYXJDb2RlPXNvdXJjZS5jaGFyQ29kZUF0KCsrSW5kZXgpO3N3aXRjaChjaGFyQ29kZSl7Y2FzZSA5MjpjYXNlIDM0OmNhc2UgNDc6Y2FzZSA5ODpjYXNlIDExNjpjYXNlIDExMDpjYXNlIDEwMjpjYXNlIDExNDp2YWx1ZSs9VW5lc2NhcGVzW2NoYXJDb2RlXTtJbmRleCsrO2JyZWFrO2Nhc2UgMTE3OmJlZ2luPSsrSW5kZXg7Zm9yKHBvc2l0aW9uPUluZGV4KzQ7SW5kZXg8cG9zaXRpb247SW5kZXgrKyl7Y2hhckNvZGU9c291cmNlLmNoYXJDb2RlQXQoSW5kZXgpO2lmKCEoY2hhckNvZGU+PTQ4JiZjaGFyQ29kZTw9NTd8fGNoYXJDb2RlPj05NyYmY2hhckNvZGU8PTEwMnx8Y2hhckNvZGU+PTY1JiZjaGFyQ29kZTw9NzApKXthYm9ydCgpfX12YWx1ZSs9ZnJvbUNoYXJDb2RlKFwiMHhcIitzb3VyY2Uuc2xpY2UoYmVnaW4sSW5kZXgpKTticmVhaztkZWZhdWx0OmFib3J0KCl9fWVsc2V7aWYoY2hhckNvZGU9PTM0KXticmVha31jaGFyQ29kZT1zb3VyY2UuY2hhckNvZGVBdChJbmRleCk7YmVnaW49SW5kZXg7d2hpbGUoY2hhckNvZGU+PTMyJiZjaGFyQ29kZSE9OTImJmNoYXJDb2RlIT0zNCl7Y2hhckNvZGU9c291cmNlLmNoYXJDb2RlQXQoKytJbmRleCl9dmFsdWUrPXNvdXJjZS5zbGljZShiZWdpbixJbmRleCl9fWlmKHNvdXJjZS5jaGFyQ29kZUF0KEluZGV4KT09MzQpe0luZGV4Kys7cmV0dXJuIHZhbHVlfWFib3J0KCk7ZGVmYXVsdDpiZWdpbj1JbmRleDtpZihjaGFyQ29kZT09NDUpe2lzU2lnbmVkPXRydWU7Y2hhckNvZGU9c291cmNlLmNoYXJDb2RlQXQoKytJbmRleCl9aWYoY2hhckNvZGU+PTQ4JiZjaGFyQ29kZTw9NTcpe2lmKGNoYXJDb2RlPT00OCYmKGNoYXJDb2RlPXNvdXJjZS5jaGFyQ29kZUF0KEluZGV4KzEpLGNoYXJDb2RlPj00OCYmY2hhckNvZGU8PTU3KSl7YWJvcnQoKX1pc1NpZ25lZD1mYWxzZTtmb3IoO0luZGV4PGxlbmd0aCYmKGNoYXJDb2RlPXNvdXJjZS5jaGFyQ29kZUF0KEluZGV4KSxjaGFyQ29kZT49NDgmJmNoYXJDb2RlPD01Nyk7SW5kZXgrKyk7aWYoc291cmNlLmNoYXJDb2RlQXQoSW5kZXgpPT00Nil7cG9zaXRpb249KytJbmRleDtmb3IoO3Bvc2l0aW9uPGxlbmd0aCYmKGNoYXJDb2RlPXNvdXJjZS5jaGFyQ29kZUF0KHBvc2l0aW9uKSxjaGFyQ29kZT49NDgmJmNoYXJDb2RlPD01Nyk7cG9zaXRpb24rKyk7aWYocG9zaXRpb249PUluZGV4KXthYm9ydCgpfUluZGV4PXBvc2l0aW9ufWNoYXJDb2RlPXNvdXJjZS5jaGFyQ29kZUF0KEluZGV4KTtpZihjaGFyQ29kZT09MTAxfHxjaGFyQ29kZT09Njkpe2NoYXJDb2RlPXNvdXJjZS5jaGFyQ29kZUF0KCsrSW5kZXgpO2lmKGNoYXJDb2RlPT00M3x8Y2hhckNvZGU9PTQ1KXtJbmRleCsrfWZvcihwb3NpdGlvbj1JbmRleDtwb3NpdGlvbjxsZW5ndGgmJihjaGFyQ29kZT1zb3VyY2UuY2hhckNvZGVBdChwb3NpdGlvbiksY2hhckNvZGU+PTQ4JiZjaGFyQ29kZTw9NTcpO3Bvc2l0aW9uKyspO2lmKHBvc2l0aW9uPT1JbmRleCl7YWJvcnQoKX1JbmRleD1wb3NpdGlvbn1yZXR1cm4rc291cmNlLnNsaWNlKGJlZ2luLEluZGV4KX1pZihpc1NpZ25lZCl7YWJvcnQoKX1pZihzb3VyY2Uuc2xpY2UoSW5kZXgsSW5kZXgrNCk9PVwidHJ1ZVwiKXtJbmRleCs9NDtyZXR1cm4gdHJ1ZX1lbHNlIGlmKHNvdXJjZS5zbGljZShJbmRleCxJbmRleCs1KT09XCJmYWxzZVwiKXtJbmRleCs9NTtyZXR1cm4gZmFsc2V9ZWxzZSBpZihzb3VyY2Uuc2xpY2UoSW5kZXgsSW5kZXgrNCk9PVwibnVsbFwiKXtJbmRleCs9NDtyZXR1cm4gbnVsbH1hYm9ydCgpfX1yZXR1cm5cIiRcIn07dmFyIGdldD1mdW5jdGlvbih2YWx1ZSl7dmFyIHJlc3VsdHMsaGFzTWVtYmVycztpZih2YWx1ZT09XCIkXCIpe2Fib3J0KCl9aWYodHlwZW9mIHZhbHVlPT1cInN0cmluZ1wiKXtpZigoY2hhckluZGV4QnVnZ3k/dmFsdWUuY2hhckF0KDApOnZhbHVlWzBdKT09XCJAXCIpe3JldHVybiB2YWx1ZS5zbGljZSgxKX1pZih2YWx1ZT09XCJbXCIpe3Jlc3VsdHM9W107Zm9yKDs7aGFzTWVtYmVyc3x8KGhhc01lbWJlcnM9dHJ1ZSkpe3ZhbHVlPWxleCgpO2lmKHZhbHVlPT1cIl1cIil7YnJlYWt9aWYoaGFzTWVtYmVycyl7aWYodmFsdWU9PVwiLFwiKXt2YWx1ZT1sZXgoKTtpZih2YWx1ZT09XCJdXCIpe2Fib3J0KCl9fWVsc2V7YWJvcnQoKX19aWYodmFsdWU9PVwiLFwiKXthYm9ydCgpfXJlc3VsdHMucHVzaChnZXQodmFsdWUpKX1yZXR1cm4gcmVzdWx0c31lbHNlIGlmKHZhbHVlPT1cIntcIil7cmVzdWx0cz17fTtmb3IoOztoYXNNZW1iZXJzfHwoaGFzTWVtYmVycz10cnVlKSl7dmFsdWU9bGV4KCk7aWYodmFsdWU9PVwifVwiKXticmVha31pZihoYXNNZW1iZXJzKXtpZih2YWx1ZT09XCIsXCIpe3ZhbHVlPWxleCgpO2lmKHZhbHVlPT1cIn1cIil7YWJvcnQoKX19ZWxzZXthYm9ydCgpfX1pZih2YWx1ZT09XCIsXCJ8fHR5cGVvZiB2YWx1ZSE9XCJzdHJpbmdcInx8KGNoYXJJbmRleEJ1Z2d5P3ZhbHVlLmNoYXJBdCgwKTp2YWx1ZVswXSkhPVwiQFwifHxsZXgoKSE9XCI6XCIpe2Fib3J0KCl9cmVzdWx0c1t2YWx1ZS5zbGljZSgxKV09Z2V0KGxleCgpKVxufXJldHVybiByZXN1bHRzfWFib3J0KCl9cmV0dXJuIHZhbHVlfTt2YXIgdXBkYXRlPWZ1bmN0aW9uKHNvdXJjZSxwcm9wZXJ0eSxjYWxsYmFjayl7dmFyIGVsZW1lbnQ9d2Fsayhzb3VyY2UscHJvcGVydHksY2FsbGJhY2spO2lmKGVsZW1lbnQ9PT11bmRlZil7ZGVsZXRlIHNvdXJjZVtwcm9wZXJ0eV19ZWxzZXtzb3VyY2VbcHJvcGVydHldPWVsZW1lbnR9fTt2YXIgd2Fsaz1mdW5jdGlvbihzb3VyY2UscHJvcGVydHksY2FsbGJhY2spe3ZhciB2YWx1ZT1zb3VyY2VbcHJvcGVydHldLGxlbmd0aDtpZih0eXBlb2YgdmFsdWU9PVwib2JqZWN0XCImJnZhbHVlKXtpZihnZXRDbGFzcy5jYWxsKHZhbHVlKT09YXJyYXlDbGFzcyl7Zm9yKGxlbmd0aD12YWx1ZS5sZW5ndGg7bGVuZ3RoLS07KXt1cGRhdGUodmFsdWUsbGVuZ3RoLGNhbGxiYWNrKX19ZWxzZXtmb3JFYWNoKHZhbHVlLGZ1bmN0aW9uKHByb3BlcnR5KXt1cGRhdGUodmFsdWUscHJvcGVydHksY2FsbGJhY2spfSl9fXJldHVybiBjYWxsYmFjay5jYWxsKHNvdXJjZSxwcm9wZXJ0eSx2YWx1ZSl9O2V4cG9ydHMucGFyc2U9ZnVuY3Rpb24oc291cmNlLGNhbGxiYWNrKXt2YXIgcmVzdWx0LHZhbHVlO0luZGV4PTA7U291cmNlPVwiXCIrc291cmNlO3Jlc3VsdD1nZXQobGV4KCkpO2lmKGxleCgpIT1cIiRcIil7YWJvcnQoKX1JbmRleD1Tb3VyY2U9bnVsbDtyZXR1cm4gY2FsbGJhY2smJmdldENsYXNzLmNhbGwoY2FsbGJhY2spPT1mdW5jdGlvbkNsYXNzP3dhbGsoKHZhbHVlPXt9LHZhbHVlW1wiXCJdPXJlc3VsdCx2YWx1ZSksXCJcIixjYWxsYmFjayk6cmVzdWx0fX19ZXhwb3J0c1tcInJ1bkluQ29udGV4dFwiXT1ydW5JbkNvbnRleHQ7cmV0dXJuIGV4cG9ydHN9aWYoZnJlZUV4cG9ydHMmJiFpc0xvYWRlcil7cnVuSW5Db250ZXh0KHJvb3QsZnJlZUV4cG9ydHMpfWVsc2V7dmFyIG5hdGl2ZUpTT049cm9vdC5KU09OLHByZXZpb3VzSlNPTj1yb290W1wiSlNPTjNcIl0saXNSZXN0b3JlZD1mYWxzZTt2YXIgSlNPTjM9cnVuSW5Db250ZXh0KHJvb3Qscm9vdFtcIkpTT04zXCJdPXtub0NvbmZsaWN0OmZ1bmN0aW9uKCl7aWYoIWlzUmVzdG9yZWQpe2lzUmVzdG9yZWQ9dHJ1ZTtyb290LkpTT049bmF0aXZlSlNPTjtyb290W1wiSlNPTjNcIl09cHJldmlvdXNKU09OO25hdGl2ZUpTT049cHJldmlvdXNKU09OPW51bGx9cmV0dXJuIEpTT04zfX0pO3Jvb3QuSlNPTj17cGFyc2U6SlNPTjMucGFyc2Usc3RyaW5naWZ5OkpTT04zLnN0cmluZ2lmeX19aWYoaXNMb2FkZXIpe2RlZmluZShmdW5jdGlvbigpe3JldHVybiBKU09OM30pfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsdHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiP3NlbGY6dHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCI/d2luZG93OnR5cGVvZiBnbG9iYWwhPT1cInVuZGVmaW5lZFwiP2dsb2JhbDp7fSl9LHt9XSw1MTpbZnVuY3Rpb24oX2RlcmVxXyxtb2R1bGUsZXhwb3J0cyl7bW9kdWxlLmV4cG9ydHM9dG9BcnJheTtmdW5jdGlvbiB0b0FycmF5KGxpc3QsaW5kZXgpe3ZhciBhcnJheT1bXTtpbmRleD1pbmRleHx8MDtmb3IodmFyIGk9aW5kZXh8fDA7aTxsaXN0Lmxlbmd0aDtpKyspe2FycmF5W2ktaW5kZXhdPWxpc3RbaV19cmV0dXJuIGFycmF5fX0se31dfSx7fSxbMzFdKSgzMSl9KTtcbiIsIi8vIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXG52YXIgY2xpZW50U29ja2V0O1xudmFyIHNlcnZpY2VUb1BsdWdpbk1hcDtcbnZhciBwZW5kaW5nVGVsZW1ldHJ5RXZlbnRzID0gW107XG5cbmZ1bmN0aW9uIGluaXQoc29ja2V0KSB7XG4gICAgY2xpZW50U29ja2V0ID0gc29ja2V0O1xuICAgIHRyeVNlbmRQZW5kaW5nRXZlbnRzKCk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUGx1Z2luU2VydmljZXMocGx1Z2luU2VydmljZXMpIHtcbiAgICBzZXJ2aWNlVG9QbHVnaW5NYXAgPSBwbHVnaW5TZXJ2aWNlcztcbiAgICB0cnlTZW5kUGVuZGluZ0V2ZW50cygpO1xufVxuXG5mdW5jdGlvbiB0cnlTZW5kUGVuZGluZ0V2ZW50cygpIHtcbiAgICBpZiAoIWNsaWVudFNvY2tldCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHVuc2VudCA9IFtdO1xuXG4gICAgcGVuZGluZ1RlbGVtZXRyeUV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChldmVudERhdGEpIHtcbiAgICAgICAgaWYgKG11c3RNYXBTZXJ2aWNlVG9QbHVnaW4oZXZlbnREYXRhKSAmJiAhc2VydmljZVRvUGx1Z2luTWFwKSB7XG4gICAgICAgICAgICB1bnNlbnQucHVzaChldmVudERhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VuZENsaWVudFRlbGVtZXRyeShldmVudERhdGEpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgcGVuZGluZ1RlbGVtZXRyeUV2ZW50cyA9IHVuc2VudDtcbn1cblxuZnVuY3Rpb24gbXVzdE1hcFNlcnZpY2VUb1BsdWdpbihldmVudERhdGEpIHtcbiAgICByZXR1cm4gISFldmVudERhdGEucHJvcHMuc2VydmljZSAmJiAhZXZlbnREYXRhLnBsdWdpbjtcbn1cblxuZnVuY3Rpb24gc2VuZENsaWVudFRlbGVtZXRyeShldmVudCwgcHJvcHMsIHBpaVByb3BzKSB7XG4gICAgdmFyIGV2ZW50RGF0YSA9IHtcbiAgICAgICAgZXZlbnQ6IGV2ZW50LFxuICAgICAgICBwcm9wczogcHJvcHMsXG4gICAgICAgIHBpaVByb3BzOiBwaWlQcm9wc1xuICAgIH07XG5cbiAgICBpZiAoIWNsaWVudFNvY2tldCkge1xuICAgICAgICBwZW5kaW5nVGVsZW1ldHJ5RXZlbnRzLnB1c2goZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtdXN0TWFwU2VydmljZVRvUGx1Z2luKGV2ZW50RGF0YSkpIHtcbiAgICAgICAgaWYgKCFzZXJ2aWNlVG9QbHVnaW5NYXApIHtcbiAgICAgICAgICAgIHBlbmRpbmdUZWxlbWV0cnlFdmVudHMucHVzaChldmVudERhdGEpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnREYXRhLnByb3BzLnBsdWdpbiA9IHNlcnZpY2VUb1BsdWdpbk1hcFtldmVudERhdGEucHJvcHMuc2VydmljZV0gfHwgJ191bmtub3duJztcbiAgICB9XG5cbiAgICBjbGllbnRTb2NrZXQuZW1pdCgndGVsZW1ldHJ5JywgZXZlbnREYXRhKTtcbn1cblxuZnVuY3Rpb24gc2VuZFVJVGVsZW1ldHJ5KHVpQ29udHJvbERhdGEpIHtcbiAgICBzZW5kQ2xpZW50VGVsZW1ldHJ5KCdwbHVnaW4tdWktaW50ZXJhY3Rpb24nLCB1aUNvbnRyb2xEYXRhKTtcbn1cblxubW9kdWxlLmV4cG9ydHMuaW5pdCA9IGluaXQ7XG5tb2R1bGUuZXhwb3J0cy5yZWdpc3RlclBsdWdpblNlcnZpY2VzID0gcmVnaXN0ZXJQbHVnaW5TZXJ2aWNlcztcbm1vZHVsZS5leHBvcnRzLnNlbmRDbGllbnRUZWxlbWV0cnkgPSBzZW5kQ2xpZW50VGVsZW1ldHJ5O1xubW9kdWxlLmV4cG9ydHMuc2VuZFVJVGVsZW1ldHJ5ID0gc2VuZFVJVGVsZW1ldHJ5O1xuIiwiLy8gQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBCYXNlZCBpbiBwYXJ0IG9uIGNvZGUgZnJvbSBBcGFjaGUgUmlwcGxlLCBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1yaXBwbGVcblxudmFyIHNlbGYsXG4gICAgZXhjZXB0aW9uID0gcmVxdWlyZSgnZXhjZXB0aW9uJyk7XG5cbnNlbGYgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICB2YWxpZGF0ZUFyZ3VtZW50VHlwZTogZnVuY3Rpb24gKGFyZywgYXJnVHlwZSwgY3VzdG9tRXhjZXB0aW9uVHlwZSwgY3VzdG9tRXhjZXB0aW9uTWVzc2FnZSwgY3VzdG9tRXhjZXB0aW9uT2JqZWN0KSB7XG4gICAgICAgIHZhciBpbnZhbGlkQXJnID0gZmFsc2UsXG4gICAgICAgICAgICBtc2c7XG5cbiAgICAgICAgc3dpdGNoIChhcmdUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICdhcnJheSc6XG4gICAgICAgICAgICAgICAgaWYgKCEoYXJnIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGludmFsaWRBcmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIGlmICghKGFyZyBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGludmFsaWRBcmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2ludGVnZXInOlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJnICE9PSBNYXRoLmZsb29yKGFyZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRBcmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbnZhbGlkQXJnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnICE9PSBhcmdUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGludmFsaWRBcmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnZhbGlkQXJnKSB7XG4gICAgICAgICAgICBtc2cgPSBjdXN0b21FeGNlcHRpb25NZXNzYWdlICsgKCdcXG5cXG5JbnZhbGlkIEFyZ3VtZW50IHR5cGUuIGFyZ3VtZW50OiAnICsgYXJnICsgJyA9PT4gd2FzIGV4cGVjdGVkIHRvIGJlIG9mIHR5cGU6ICcgKyBhcmdUeXBlKTtcbiAgICAgICAgICAgIGV4Y2VwdGlvbi5yYWlzZSgoY3VzdG9tRXhjZXB0aW9uVHlwZSB8fCBleGNlcHRpb24udHlwZXMuQXJndW1lbnRUeXBlKSwgbXNnLCBjdXN0b21FeGNlcHRpb25PYmplY3QpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZvckVhY2g6IGZ1bmN0aW9uIChvYmosIGFjdGlvbiwgc2NvcGUpIHtcbiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqLmZvckVhY2goYWN0aW9uLCBzY29wZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLm1hcChvYmosIGFjdGlvbiwgc2NvcGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIG1hcDogZnVuY3Rpb24gKG9iaiwgZnVuYywgc2NvcGUpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICByZXR1cm5WYWwgPSBudWxsLFxuICAgICAgICAgICAgcmVzdWx0ICAgID0gW107XG5cbiAgICAgICAgLy9Nb3pIYWNrIGZvciBOYW1lZE5vZGVNYXBcbiAgICAgICAgLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuICAgICAgICBpZiAod2luZG93Lk1vek5hbWVkQXR0ck1hcCkge1xuICAgICAgICAgICAgTmFtZWROb2RlTWFwID0gd2luZG93Lk1vek5hbWVkQXR0ck1hcDtcbiAgICAgICAgfVxuICAgICAgICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgcmV0dXJuIG9iai5tYXAoZnVuYywgc2NvcGUpO1xuICAgICAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVkTm9kZU1hcCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHJldHVyblZhbCA9IGZ1bmMuYXBwbHkoc2NvcGUsIFtvYmpbaV0sIGldKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChyZXR1cm5WYWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChpIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsID0gZnVuYy5hcHBseShzY29wZSwgW29ialtpXSwgaV0pO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChyZXR1cm5WYWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIGJpbmRBdXRvU2F2ZUV2ZW50OiBmdW5jdGlvbiAoc2VsZWN0b3IsIHNhdmVDYWxsYmFjaykge1xuICAgICAgICB2YXIgb2xkU2V0VGltZW91dElkO1xuICAgICAgICB2YXIgbm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuXG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0FVVE8gU0FWRTogUkVJTlNUQVRFIE9OQ0UgV0UgSEFWRSAnICsgc2VsZWN0b3IgKyAnIEVMRU1FTlQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlICE9PSA5KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KG9sZFNldFRpbWVvdXRJZCk7XG4gICAgICAgICAgICAgICAgb2xkU2V0VGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBzYXZlQ2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgbWl4aW46IGZ1bmN0aW9uIChtaXhpbiwgdG8pIHtcbiAgICAgICAgZm9yICh2YXIgcHJvcCBpbiBtaXhpbikge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1peGluLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIHRvW3Byb3BdID0gbWl4aW5bcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY29weTogZnVuY3Rpb24gKG9iaikge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIG5ld09iaiA9IEFycmF5LmlzQXJyYXkob2JqKSA/IFtdIDoge307XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgdHlwZW9mIG9iaiA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICAgICBvYmogPT09IG51bGwgfHxcbiAgICAgICAgICAgIG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShvYmopO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAob2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgICAgICBpZiAob2JqW2ldICYmIHR5cGVvZiBvYmpbaV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvYmpbaV0gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdPYmpbaV0gPSBvYmpbaV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdPYmpbaV0gPSBzZWxmLmNvcHkob2JqW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3T2JqW2ldID0gb2JqW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdPYmo7XG4gICAgfSxcblxuICAgIG5hdkhlbHBlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgRGlyZWN0aW9uczoge1xuICAgICAgICAgICAgICAgIE46ICdOJyxcbiAgICAgICAgICAgICAgICBORTogJ05FJyxcbiAgICAgICAgICAgICAgICBFOiAnRScsXG4gICAgICAgICAgICAgICAgU0U6ICdTRScsXG4gICAgICAgICAgICAgICAgUzogJ1MnLFxuICAgICAgICAgICAgICAgIFNXOiAnU1cnLFxuICAgICAgICAgICAgICAgIFc6ICdXJyxcbiAgICAgICAgICAgICAgICBOVzogJ05XJ1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBHZXQgdGhlIGRpcmVjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGhlYWRpbmcgdmFsdWUuXG4gICAgICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGVhZGluZyBBIG51bWJlciBmcm9tIDAgdG8gMzU5Ljk5LlxuICAgICAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBkaXJlY3Rpb24gSXQgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBOLCBORSwgRSwgU0UsIFMsIFNXLCBXIG9yIE5XLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBnZXREaXJlY3Rpb246IGZ1bmN0aW9uIChoZWFkaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhlYWRpbmcgPiAzMzcuNSB8fCAoaGVhZGluZyA+PSAwICYmIGhlYWRpbmcgPD0gMjIuNSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGlyZWN0aW9ucy5OO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChoZWFkaW5nID4gMjIuNSAmJiBoZWFkaW5nIDw9IDY3LjUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGlyZWN0aW9ucy5ORTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaGVhZGluZyA+IDY3LjUgJiYgaGVhZGluZyA8PSAxMTIuNSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5EaXJlY3Rpb25zLkU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGhlYWRpbmcgPiAxMTIuNSAmJiBoZWFkaW5nIDw9IDE1Ny41KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkRpcmVjdGlvbnMuU0U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGhlYWRpbmcgPiAxNTcuNSAmJiBoZWFkaW5nIDw9IDIwMi41KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkRpcmVjdGlvbnMuUztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaGVhZGluZyA+IDIwMi41ICYmIGhlYWRpbmcgPD0gMjQ3LjUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGlyZWN0aW9ucy5TVztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaGVhZGluZyA+IDI0Ny41ICYmIGhlYWRpbmcgPD0gMjkyLjUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGlyZWN0aW9ucy5XO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGhlYWRpbmcgPiAyOTIuNSAmJiBoZWFkaW5nIDw9IDMzNy41XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGlyZWN0aW9ucy5OVztcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGdldEhlYWRpbmc6IGZ1bmN0aW9uIChsYXQxLCBsb24xLCBsYXQyLCBsb24yKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRMb24gID0gdGhpcy5yYWQobG9uMiAtIGxvbjEpLFxuICAgICAgICAgICAgICAgICAgICBsbGF0MSA9IHRoaXMucmFkKGxhdDEpLFxuICAgICAgICAgICAgICAgICAgICBsbGF0MiA9IHRoaXMucmFkKGxhdDIpLFxuICAgICAgICAgICAgICAgICAgICB5ICAgICA9IE1hdGguc2luKGRMb24pICogTWF0aC5jb3MobGxhdDIpLFxuICAgICAgICAgICAgICAgICAgICB4ICAgICA9IE1hdGguY29zKGxsYXQxKSAqIE1hdGguc2luKGxsYXQyKSAtIE1hdGguc2luKGxsYXQxKSAqIE1hdGguY29zKGxsYXQyKSAqIE1hdGguY29zKGRMb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5kZWcoTWF0aC5hdGFuMih5LCB4KSkgKyAzNjApICUgMzYwO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2V0RGlzdGFuY2U6IGZ1bmN0aW9uIChsYXQxLCBsb24xLCBsYXQyLCBsb24yKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRMYXQgPSB0aGlzLnJhZChsYXQyIC0gbGF0MSksXG4gICAgICAgICAgICAgICAgICAgIGRMb24gPSB0aGlzLnJhZChsb24yIC0gbG9uMSksXG4gICAgICAgICAgICAgICAgICAgIGEgICAgPSBNYXRoLnNpbihkTGF0IC8gMikgKiBNYXRoLnNpbihkTGF0IC8gMikgKyBNYXRoLmNvcyh0aGlzLnJhZChsYXQxKSkgKiBNYXRoLmNvcyh0aGlzLnJhZChsYXQyKSkgKiBNYXRoLnNpbihkTG9uIC8gMikgKiBNYXRoLnNpbihkTG9uIC8gMiksXG4gICAgICAgICAgICAgICAgICAgIGMgICAgPSAyICogTWF0aC5hc2luKE1hdGguc3FydChhKSksXG4gICAgICAgICAgICAgICAgICAgIGQgICAgPSA2Mzc4MTAwICogYztcbiAgICAgICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNpbXVsYXRlVHJhdmVsOiBmdW5jdGlvbiAobGF0LCBsb24sIGhkZywgZGlzdCkge1xuICAgICAgICAgICAgICAgIHZhciBsYXQxICAgICAgICAgICAgPSB0aGlzLnJhZChsYXQpLFxuICAgICAgICAgICAgICAgICAgICBsb24xICAgICAgICAgICAgPSB0aGlzLnJhZChsb24pLFxuICAgICAgICAgICAgICAgICAgICBicm5nICAgICAgICAgICAgPSB0aGlzLnJhZChoZGcpLFxuICAgICAgICAgICAgICAgICAgICBhbmd1bGFyRGlzdGFuY2UgPSBkaXN0IC8gNjM3ODEwMCxcbiAgICAgICAgICAgICAgICAgICAgbGF0MiAgICAgICAgICAgID0gTWF0aC5hc2luKE1hdGguc2luKGxhdDEpICogTWF0aC5jb3MoYW5ndWxhckRpc3RhbmNlKSArIE1hdGguY29zKGxhdDEpICogTWF0aC5zaW4oYW5ndWxhckRpc3RhbmNlKSAqIE1hdGguY29zKGJybmcpKSxcbiAgICAgICAgICAgICAgICAgICAgbG9uMiAgICAgICAgICAgID0gbG9uMSArIE1hdGguYXRhbjIoTWF0aC5zaW4oYnJuZykgKiBNYXRoLnNpbihhbmd1bGFyRGlzdGFuY2UpICogTWF0aC5jb3MobGF0MSksIE1hdGguY29zKGFuZ3VsYXJEaXN0YW5jZSkgLSBNYXRoLnNpbihsYXQxKSAqIE1hdGguc2luKGxhdDIpKTtcbiAgICAgICAgICAgICAgICBsb24yID0gKGxvbjIgKyAzICogTWF0aC5QSSkgJSAoMiAqIE1hdGguUEkpIC0gTWF0aC5QSTsgLy8gTm9ybWFsaXplIHRvIC0xODAuLisxODBcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlOiB0aGlzLmRlZyhsYXQyKSxcbiAgICAgICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiB0aGlzLmRlZyhsb24yKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBkZWc6IGZ1bmN0aW9uIChudW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtICogMTgwIC8gTWF0aC5QSTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHJhZDogZnVuY3Rpb24gKG51bSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW0gKiBNYXRoLlBJIC8gMTgwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICBjcmVhdGVVVUlEOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVVVUlEUGFydCg0KSArICctJyArXG4gICAgICAgICAgICBjcmVhdGVVVUlEUGFydCgyKSArICctJyArXG4gICAgICAgICAgICBjcmVhdGVVVUlEUGFydCgyKSArICctJyArXG4gICAgICAgICAgICBjcmVhdGVVVUlEUGFydCgyKSArICctJyArXG4gICAgICAgICAgICBjcmVhdGVVVUlEUGFydCg2KTtcbiAgICB9LFxuXG4gICAgdHlwZU5hbWU6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpLnNsaWNlKDgsIC0xKTtcbiAgICB9LFxuXG4gICAgcGFyc2VVcmw6IGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cbiAgICAgICAgYS5ocmVmID0gdXJsO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBocmVmOiBhLmhyZWYsXG4gICAgICAgICAgICBob3N0OiBhLmhvc3QsXG4gICAgICAgICAgICBvcmlnaW46IGEub3JpZ2luLFxuICAgICAgICAgICAgcG9ydDogYS5wb3J0LFxuICAgICAgICAgICAgcHJvdG9jb2w6IGEucHJvdG9jb2wsXG4gICAgICAgICAgICBzZWFyY2g6IGEuc2VhcmNoXG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIGlzU2FtZU9yaWdpblJlcXVlc3Q6IGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgdXJsID0gdGhpcy5wYXJzZVVybCh1cmwpO1xuXG4gICAgICAgIGlmICh1cmwucG9ydCAhPT0gbG9jYXRpb24ucG9ydCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNhbWVPcmlnaW4gPSB1cmwuaHJlZi5tYXRjaChsb2NhdGlvbi5vcmlnaW4ucmVwbGFjZSgvd3d3XFwuLywgJycpKSB8fFxuICAgICAgICAgICAgIXVybC5ocmVmLm1hdGNoKC9eaHR0cHM/OlxcL1xcL3xeZmlsZTpcXC9cXC8vKTtcblxuICAgICAgICByZXR1cm4gISFzYW1lT3JpZ2luO1xuICAgIH0sXG5cbiAgICBpc051bWJlcjogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG4gICAgICAgIHJldHVybiAodHlwZSA9PT0gJ251bWJlcicgfHwgdHlwZSA9PT0gJ3N0cmluZycpICYmICFpc05hTih2YWx1ZSAtIHBhcnNlRmxvYXQodmFsdWUpKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVVVUlEUGFydChsZW5ndGgpIHtcbiAgICB2YXIgdXVpZHBhcnQgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB1dWlkY2hhciA9IHBhcnNlSW50KChNYXRoLnJhbmRvbSgpICogMjU2KSwgMTApLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgaWYgKHV1aWRjaGFyLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICB1dWlkY2hhciA9ICcwJyArIHV1aWRjaGFyO1xuICAgICAgICB9XG4gICAgICAgIHV1aWRwYXJ0ICs9IHV1aWRjaGFyO1xuICAgIH1cbiAgICByZXR1cm4gdXVpZHBhcnQ7XG59XG4iLCIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dFxuICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHRcbiAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dFxuICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc29cbiAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0XG4gKi9cbi8vIEB2ZXJzaW9uIDAuNy4yMFxuIWZ1bmN0aW9uKCl7d2luZG93LldlYkNvbXBvbmVudHM9d2luZG93LldlYkNvbXBvbmVudHN8fHtmbGFnczp7fX07dmFyIGU9XCJ3ZWJjb21wb25lbnRzLmpzXCIsdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj1cIicrZSsnXCJdJyksbj17fTtpZighbi5ub09wdHMpe2lmKGxvY2F0aW9uLnNlYXJjaC5zbGljZSgxKS5zcGxpdChcIiZcIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdCxyPWUuc3BsaXQoXCI9XCIpO3JbMF0mJih0PXJbMF0ubWF0Y2goL3djLSguKykvKSkmJihuW3RbMV1dPXJbMV18fCEwKX0pLHQpZm9yKHZhciByLG89MDtyPXQuYXR0cmlidXRlc1tvXTtvKyspXCJzcmNcIiE9PXIubmFtZSYmKG5bci5uYW1lXT1yLnZhbHVlfHwhMCk7aWYobi5sb2cmJm4ubG9nLnNwbGl0KXt2YXIgaT1uLmxvZy5zcGxpdChcIixcIik7bi5sb2c9e30saS5mb3JFYWNoKGZ1bmN0aW9uKGUpe24ubG9nW2VdPSEwfSl9ZWxzZSBuLmxvZz17fX1uLnNoYWRvdz1uLnNoYWRvd3x8bi5zaGFkb3dkb218fG4ucG9seWZpbGwsXCJuYXRpdmVcIj09PW4uc2hhZG93P24uc2hhZG93PSExOm4uc2hhZG93PW4uc2hhZG93fHwhSFRNTEVsZW1lbnQucHJvdG90eXBlLmNyZWF0ZVNoYWRvd1Jvb3Qsbi5yZWdpc3RlciYmKHdpbmRvdy5DdXN0b21FbGVtZW50cz13aW5kb3cuQ3VzdG9tRWxlbWVudHN8fHtmbGFnczp7fX0sd2luZG93LkN1c3RvbUVsZW1lbnRzLmZsYWdzLnJlZ2lzdGVyPW4ucmVnaXN0ZXIpLFdlYkNvbXBvbmVudHMuZmxhZ3M9bn0oKSxXZWJDb21wb25lbnRzLmZsYWdzLnNoYWRvdyYmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBXZWFrTWFwJiYhZnVuY3Rpb24oKXt2YXIgZT1PYmplY3QuZGVmaW5lUHJvcGVydHksdD1EYXRlLm5vdygpJTFlOSxuPWZ1bmN0aW9uKCl7dGhpcy5uYW1lPVwiX19zdFwiKygxZTkqTWF0aC5yYW5kb20oKT4+PjApKyh0KysgK1wiX19cIil9O24ucHJvdG90eXBlPXtzZXQ6ZnVuY3Rpb24odCxuKXt2YXIgcj10W3RoaXMubmFtZV07cmV0dXJuIHImJnJbMF09PT10P3JbMV09bjplKHQsdGhpcy5uYW1lLHt2YWx1ZTpbdCxuXSx3cml0YWJsZTohMH0pLHRoaXN9LGdldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4odD1lW3RoaXMubmFtZV0pJiZ0WzBdPT09ZT90WzFdOnZvaWQgMH0sXCJkZWxldGVcIjpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMubmFtZV07cmV0dXJuIHQmJnRbMF09PT1lPyh0WzBdPXRbMV09dm9pZCAwLCEwKTohMX0saGFzOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5uYW1lXTtyZXR1cm4gdD90WzBdPT09ZTohMX19LHdpbmRvdy5XZWFrTWFwPW59KCksd2luZG93LlNoYWRvd0RPTVBvbHlmaWxsPXt9LGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoKXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgY2hyb21lJiZjaHJvbWUuYXBwJiZjaHJvbWUuYXBwLnJ1bnRpbWUpcmV0dXJuITE7aWYobmF2aWdhdG9yLmdldERldmljZVN0b3JhZ2UpcmV0dXJuITE7dHJ5e3ZhciBlPW5ldyBGdW5jdGlvbihcInJldHVybiB0cnVlO1wiKTtyZXR1cm4gZSgpfWNhdGNoKHQpe3JldHVybiExfX1mdW5jdGlvbiBuKGUpe2lmKCFlKXRocm93IG5ldyBFcnJvcihcIkFzc2VydGlvbiBmYWlsZWRcIil9ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbj1XKHQpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXTtBKGUsbyxGKHQsbykpfXJldHVybiBlfWZ1bmN0aW9uIG8oZSx0KXtmb3IodmFyIG49Vyh0KSxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl07c3dpdGNoKG8pe2Nhc2VcImFyZ3VtZW50c1wiOmNhc2VcImNhbGxlclwiOmNhc2VcImxlbmd0aFwiOmNhc2VcIm5hbWVcIjpjYXNlXCJwcm90b3R5cGVcIjpjYXNlXCJ0b1N0cmluZ1wiOmNvbnRpbnVlfUEoZSxvLEYodCxvKSl9cmV0dXJuIGV9ZnVuY3Rpb24gaShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWlmKHRbbl1pbiBlKXJldHVybiB0W25dfWZ1bmN0aW9uIGEoZSx0LG4pe1UudmFsdWU9bixBKGUsdCxVKX1mdW5jdGlvbiBzKGUsdCl7dmFyIG49ZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtpZihxKXRyeXtXKG4pfWNhdGNoKHIpe249bi5fX3Byb3RvX199dmFyIG89Ui5nZXQobik7aWYobylyZXR1cm4gbzt2YXIgaT1zKG4pLGE9RShpKTtyZXR1cm4gZyhuLGEsdCksYX1mdW5jdGlvbiBjKGUsdCl7dyhlLHQsITApfWZ1bmN0aW9uIGwoZSx0KXt3KHQsZSwhMSl9ZnVuY3Rpb24gdShlKXtyZXR1cm4vXm9uW2Etel0rJC8udGVzdChlKX1mdW5jdGlvbiBkKGUpe3JldHVybi9eW2EtekEtWl8kXVthLXpBLVpfJDAtOV0qJC8udGVzdChlKX1mdW5jdGlvbiBwKGUpe3JldHVybiBrJiZkKGUpP25ldyBGdW5jdGlvbihcInJldHVybiB0aGlzLl9faW1wbDRjZjFlNzgyaGdfXy5cIitlKTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9faW1wbDRjZjFlNzgyaGdfX1tlXX19ZnVuY3Rpb24gaChlKXtyZXR1cm4gayYmZChlKT9uZXcgRnVuY3Rpb24oXCJ2XCIsXCJ0aGlzLl9faW1wbDRjZjFlNzgyaGdfXy5cIitlK1wiID0gdlwiKTpmdW5jdGlvbih0KXt0aGlzLl9faW1wbDRjZjFlNzgyaGdfX1tlXT10fX1mdW5jdGlvbiBmKGUpe3JldHVybiBrJiZkKGUpP25ldyBGdW5jdGlvbihcInJldHVybiB0aGlzLl9faW1wbDRjZjFlNzgyaGdfXy5cIitlK1wiLmFwcGx5KHRoaXMuX19pbXBsNGNmMWU3ODJoZ19fLCBhcmd1bWVudHMpXCIpOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19pbXBsNGNmMWU3ODJoZ19fW2VdLmFwcGx5KHRoaXMuX19pbXBsNGNmMWU3ODJoZ19fLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIG0oZSx0KXt0cnl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KX1jYXRjaChuKXtyZXR1cm4gQn19ZnVuY3Rpb24gdyh0LG4scixvKXtmb3IodmFyIGk9Vyh0KSxhPTA7YTxpLmxlbmd0aDthKyspe3ZhciBzPWlbYV07aWYoXCJwb2x5bWVyQmxhY2tMaXN0X1wiIT09cyYmIShzIGluIG58fHQucG9seW1lckJsYWNrTGlzdF8mJnQucG9seW1lckJsYWNrTGlzdF9bc10pKXtxJiZ0Ll9fbG9va3VwR2V0dGVyX18ocyk7dmFyIGMsbCxkPW0odCxzKTtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBkLnZhbHVlKXt2YXIgdz11KHMpO2M9dz9lLmdldEV2ZW50SGFuZGxlckdldHRlcihzKTpwKHMpLChkLndyaXRhYmxlfHxkLnNldHx8VikmJihsPXc/ZS5nZXRFdmVudEhhbmRsZXJTZXR0ZXIocyk6aChzKSk7dmFyIHY9Vnx8ZC5jb25maWd1cmFibGU7QShuLHMse2dldDpjLHNldDpsLGNvbmZpZ3VyYWJsZTp2LGVudW1lcmFibGU6ZC5lbnVtZXJhYmxlfSl9ZWxzZSByJiYobltzXT1mKHMpKX19fWZ1bmN0aW9uIHYoZSx0LG4pe2lmKG51bGwhPWUpe3ZhciByPWUucHJvdG90eXBlO2cocix0LG4pLG8odCxlKX19ZnVuY3Rpb24gZyhlLHQscil7dmFyIG89dC5wcm90b3R5cGU7bih2b2lkIDA9PT1SLmdldChlKSksUi5zZXQoZSx0KSxJLnNldChvLGUpLGMoZSxvKSxyJiZsKG8sciksYShvLFwiY29uc3RydWN0b3JcIix0KSx0LnByb3RvdHlwZT1vfWZ1bmN0aW9uIGIoZSx0KXtyZXR1cm4gUi5nZXQodC5wcm90b3R5cGUpPT09ZX1mdW5jdGlvbiB5KGUpe3ZhciB0PU9iamVjdC5nZXRQcm90b3R5cGVPZihlKSxuPXModCkscj1FKG4pO3JldHVybiBnKHQscixlKSxyfWZ1bmN0aW9uIEUoZSl7ZnVuY3Rpb24gdCh0KXtlLmNhbGwodGhpcyx0KX12YXIgbj1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKTtyZXR1cm4gbi5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlPW4sdH1mdW5jdGlvbiBfKGUpe3JldHVybiBlJiZlLl9faW1wbDRjZjFlNzgyaGdfX31mdW5jdGlvbiBTKGUpe3JldHVybiFfKGUpfWZ1bmN0aW9uIFQoZSl7aWYobnVsbD09PWUpcmV0dXJuIG51bGw7bihTKGUpKTt2YXIgdD1lLl9fd3JhcHBlcjhlM2RkOTNhNjBfXztyZXR1cm4gbnVsbCE9dD90OmUuX193cmFwcGVyOGUzZGQ5M2E2MF9fPW5ldyhzKGUsZSkpKGUpfWZ1bmN0aW9uIE0oZSl7cmV0dXJuIG51bGw9PT1lP251bGw6KG4oXyhlKSksZS5fX2ltcGw0Y2YxZTc4MmhnX18pfWZ1bmN0aW9uIE8oZSl7cmV0dXJuIGUuX19pbXBsNGNmMWU3ODJoZ19ffWZ1bmN0aW9uIEwoZSx0KXt0Ll9faW1wbDRjZjFlNzgyaGdfXz1lLGUuX193cmFwcGVyOGUzZGQ5M2E2MF9fPXR9ZnVuY3Rpb24gTihlKXtyZXR1cm4gZSYmXyhlKT9NKGUpOmV9ZnVuY3Rpb24gQyhlKXtyZXR1cm4gZSYmIV8oZSk/VChlKTplfWZ1bmN0aW9uIGooZSx0KXtudWxsIT09dCYmKG4oUyhlKSksbih2b2lkIDA9PT10fHxfKHQpKSxlLl9fd3JhcHBlcjhlM2RkOTNhNjBfXz10KX1mdW5jdGlvbiBEKGUsdCxuKXtHLmdldD1uLEEoZS5wcm90b3R5cGUsdCxHKX1mdW5jdGlvbiBIKGUsdCl7RChlLHQsZnVuY3Rpb24oKXtyZXR1cm4gVCh0aGlzLl9faW1wbDRjZjFlNzgyaGdfX1t0XSl9KX1mdW5jdGlvbiB4KGUsdCl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuZm9yRWFjaChmdW5jdGlvbih0KXtlLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3ZhciBlPUModGhpcyk7cmV0dXJuIGVbdF0uYXBwbHkoZSxhcmd1bWVudHMpfX0pfSl9dmFyIFI9bmV3IFdlYWtNYXAsST1uZXcgV2Vha01hcCxQPU9iamVjdC5jcmVhdGUobnVsbCksaz10KCksQT1PYmplY3QuZGVmaW5lUHJvcGVydHksVz1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyxGPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsVT17dmFsdWU6dm9pZCAwLGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwfTtXKHdpbmRvdyk7dmFyIHE9L0ZpcmVmb3gvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksQj17Z2V0OmZ1bmN0aW9uKCl7fSxzZXQ6ZnVuY3Rpb24oZSl7fSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0sVj1mdW5jdGlvbigpe3ZhciBlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsXCJub2RlVHlwZVwiKTtyZXR1cm4gZSYmIWUuZ2V0JiYhZS5zZXR9KCksRz17Z2V0OnZvaWQgMCxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH07ZS5hZGRGb3J3YXJkaW5nUHJvcGVydGllcz1jLGUuYXNzZXJ0PW4sZS5jb25zdHJ1Y3RvclRhYmxlPVIsZS5kZWZpbmVHZXR0ZXI9RCxlLmRlZmluZVdyYXBHZXR0ZXI9SCxlLmZvcndhcmRNZXRob2RzVG9XcmFwcGVyPXgsZS5pc0lkZW50aWZpZXJOYW1lPWQsZS5pc1dyYXBwZXI9XyxlLmlzV3JhcHBlckZvcj1iLGUubWl4aW49cixlLm5hdGl2ZVByb3RvdHlwZVRhYmxlPUksZS5vbmVPZj1pLGUucmVnaXN0ZXJPYmplY3Q9eSxlLnJlZ2lzdGVyV3JhcHBlcj12LGUucmV3cmFwPWosZS5zZXRXcmFwcGVyPUwsZS51bnNhZmVVbndyYXA9TyxlLnVud3JhcD1NLGUudW53cmFwSWZOZWVkZWQ9TixlLndyYXA9VCxlLndyYXBJZk5lZWRlZD1DLGUud3JhcHBlcnM9UH0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUsdCxuKXtyZXR1cm57aW5kZXg6ZSxyZW1vdmVkOnQsYWRkZWRDb3VudDpufX1mdW5jdGlvbiBuKCl7fXZhciByPTAsbz0xLGk9MixhPTM7bi5wcm90b3R5cGU9e2NhbGNFZGl0RGlzdGFuY2VzOmZ1bmN0aW9uKGUsdCxuLHIsbyxpKXtmb3IodmFyIGE9aS1vKzEscz1uLXQrMSxjPW5ldyBBcnJheShhKSxsPTA7YT5sO2wrKyljW2xdPW5ldyBBcnJheShzKSxjW2xdWzBdPWw7Zm9yKHZhciB1PTA7cz51O3UrKyljWzBdW3VdPXU7Zm9yKHZhciBsPTE7YT5sO2wrKylmb3IodmFyIHU9MTtzPnU7dSsrKWlmKHRoaXMuZXF1YWxzKGVbdCt1LTFdLHJbbytsLTFdKSljW2xdW3VdPWNbbC0xXVt1LTFdO2Vsc2V7dmFyIGQ9Y1tsLTFdW3VdKzEscD1jW2xdW3UtMV0rMTtjW2xdW3VdPXA+ZD9kOnB9cmV0dXJuIGN9LHNwbGljZU9wZXJhdGlvbnNGcm9tRWRpdERpc3RhbmNlczpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5sZW5ndGgtMSxuPWVbMF0ubGVuZ3RoLTEscz1lW3RdW25dLGM9W107dD4wfHxuPjA7KWlmKDAhPXQpaWYoMCE9bil7dmFyIGwsdT1lW3QtMV1bbi0xXSxkPWVbdC0xXVtuXSxwPWVbdF1bbi0xXTtsPXA+ZD91PmQ/ZDp1OnU+cD9wOnUsbD09dT8odT09cz9jLnB1c2gocik6KGMucHVzaChvKSxzPXUpLHQtLSxuLS0pOmw9PWQ/KGMucHVzaChhKSx0LS0scz1kKTooYy5wdXNoKGkpLG4tLSxzPXApfWVsc2UgYy5wdXNoKGEpLHQtLTtlbHNlIGMucHVzaChpKSxuLS07cmV0dXJuIGMucmV2ZXJzZSgpLGN9LGNhbGNTcGxpY2VzOmZ1bmN0aW9uKGUsbixzLGMsbCx1KXt2YXIgZD0wLHA9MCxoPU1hdGgubWluKHMtbix1LWwpO2lmKDA9PW4mJjA9PWwmJihkPXRoaXMuc2hhcmVkUHJlZml4KGUsYyxoKSkscz09ZS5sZW5ndGgmJnU9PWMubGVuZ3RoJiYocD10aGlzLnNoYXJlZFN1ZmZpeChlLGMsaC1kKSksbis9ZCxsKz1kLHMtPXAsdS09cCxzLW49PTAmJnUtbD09MClyZXR1cm5bXTtpZihuPT1zKXtmb3IodmFyIGY9dChuLFtdLDApO3U+bDspZi5yZW1vdmVkLnB1c2goY1tsKytdKTtyZXR1cm5bZl19aWYobD09dSlyZXR1cm5bdChuLFtdLHMtbildO2Zvcih2YXIgbT10aGlzLnNwbGljZU9wZXJhdGlvbnNGcm9tRWRpdERpc3RhbmNlcyh0aGlzLmNhbGNFZGl0RGlzdGFuY2VzKGUsbixzLGMsbCx1KSksZj12b2lkIDAsdz1bXSx2PW4sZz1sLGI9MDtiPG0ubGVuZ3RoO2IrKylzd2l0Y2gobVtiXSl7Y2FzZSByOmYmJih3LnB1c2goZiksZj12b2lkIDApLHYrKyxnKys7YnJlYWs7Y2FzZSBvOmZ8fChmPXQodixbXSwwKSksZi5hZGRlZENvdW50KyssdisrLGYucmVtb3ZlZC5wdXNoKGNbZ10pLGcrKzticmVhaztjYXNlIGk6Znx8KGY9dCh2LFtdLDApKSxmLmFkZGVkQ291bnQrKyx2Kys7YnJlYWs7Y2FzZSBhOmZ8fChmPXQodixbXSwwKSksZi5yZW1vdmVkLnB1c2goY1tnXSksZysrfXJldHVybiBmJiZ3LnB1c2goZiksd30sc2hhcmVkUHJlZml4OmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9MDtuPnI7cisrKWlmKCF0aGlzLmVxdWFscyhlW3JdLHRbcl0pKXJldHVybiByO3JldHVybiBufSxzaGFyZWRTdWZmaXg6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1lLmxlbmd0aCxvPXQubGVuZ3RoLGk9MDtuPmkmJnRoaXMuZXF1YWxzKGVbLS1yXSx0Wy0tb10pOylpKys7cmV0dXJuIGl9LGNhbGN1bGF0ZVNwbGljZXM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5jYWxjU3BsaWNlcyhlLDAsZS5sZW5ndGgsdCwwLHQubGVuZ3RoKX0sZXF1YWxzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10fX0sZS5BcnJheVNwbGljZT1ufSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoKXthPSExO3ZhciBlPWkuc2xpY2UoMCk7aT1bXTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKykoMCxlW3RdKSgpfWZ1bmN0aW9uIG4oZSl7aS5wdXNoKGUpLGF8fChhPSEwLHIodCwwKSl9dmFyIHIsbz13aW5kb3cuTXV0YXRpb25PYnNlcnZlcixpPVtdLGE9ITE7aWYobyl7dmFyIHM9MSxjPW5ldyBvKHQpLGw9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocyk7Yy5vYnNlcnZlKGwse2NoYXJhY3RlckRhdGE6ITB9KSxyPWZ1bmN0aW9uKCl7cz0ocysxKSUyLGwuZGF0YT1zfX1lbHNlIHI9d2luZG93LnNldFRpbWVvdXQ7ZS5zZXRFbmRPZk1pY3JvdGFzaz1ufSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7ZS5zY2hlZHVsZWRffHwoZS5zY2hlZHVsZWRfPSEwLGYucHVzaChlKSxtfHwodShuKSxtPSEwKSl9ZnVuY3Rpb24gbigpe2ZvcihtPSExO2YubGVuZ3RoOyl7dmFyIGU9ZjtmPVtdLGUuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLnVpZF8tdC51aWRffSk7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF07bi5zY2hlZHVsZWRfPSExO3ZhciByPW4udGFrZVJlY29yZHMoKTtpKG4pLHIubGVuZ3RoJiZuLmNhbGxiYWNrXyhyLG4pfX19ZnVuY3Rpb24gcihlLHQpe3RoaXMudHlwZT1lLHRoaXMudGFyZ2V0PXQsdGhpcy5hZGRlZE5vZGVzPW5ldyBwLk5vZGVMaXN0LHRoaXMucmVtb3ZlZE5vZGVzPW5ldyBwLk5vZGVMaXN0LHRoaXMucHJldmlvdXNTaWJsaW5nPW51bGwsdGhpcy5uZXh0U2libGluZz1udWxsLHRoaXMuYXR0cmlidXRlTmFtZT1udWxsLHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlPW51bGwsdGhpcy5vbGRWYWx1ZT1udWxsfWZ1bmN0aW9uIG8oZSx0KXtmb3IoO2U7ZT1lLnBhcmVudE5vZGUpe3ZhciBuPWguZ2V0KGUpO2lmKG4pZm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl07by5vcHRpb25zLnN1YnRyZWUmJm8uYWRkVHJhbnNpZW50T2JzZXJ2ZXIodCl9fX1mdW5jdGlvbiBpKGUpe2Zvcih2YXIgdD0wO3Q8ZS5ub2Rlc18ubGVuZ3RoO3QrKyl7dmFyIG49ZS5ub2Rlc19bdF0scj1oLmdldChuKTtpZighcilyZXR1cm47Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107aS5vYnNlcnZlcj09PWUmJmkucmVtb3ZlVHJhbnNpZW50T2JzZXJ2ZXJzKCl9fX1mdW5jdGlvbiBhKGUsbixvKXtmb3IodmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKSxhPU9iamVjdC5jcmVhdGUobnVsbCkscz1lO3M7cz1zLnBhcmVudE5vZGUpe3ZhciBjPWguZ2V0KHMpO2lmKGMpZm9yKHZhciBsPTA7bDxjLmxlbmd0aDtsKyspe3ZhciB1PWNbbF0sZD11Lm9wdGlvbnM7aWYoKHM9PT1lfHxkLnN1YnRyZWUpJiYoXCJhdHRyaWJ1dGVzXCIhPT1ufHxkLmF0dHJpYnV0ZXMpJiYoXCJhdHRyaWJ1dGVzXCIhPT1ufHwhZC5hdHRyaWJ1dGVGaWx0ZXJ8fG51bGw9PT1vLm5hbWVzcGFjZSYmLTEhPT1kLmF0dHJpYnV0ZUZpbHRlci5pbmRleE9mKG8ubmFtZSkpJiYoXCJjaGFyYWN0ZXJEYXRhXCIhPT1ufHxkLmNoYXJhY3RlckRhdGEpJiYoXCJjaGlsZExpc3RcIiE9PW58fGQuY2hpbGRMaXN0KSl7dmFyIHA9dS5vYnNlcnZlcjtpW3AudWlkX109cCwoXCJhdHRyaWJ1dGVzXCI9PT1uJiZkLmF0dHJpYnV0ZU9sZFZhbHVlfHxcImNoYXJhY3RlckRhdGFcIj09PW4mJmQuY2hhcmFjdGVyRGF0YU9sZFZhbHVlKSYmKGFbcC51aWRfXT1vLm9sZFZhbHVlKX19fWZvcih2YXIgZiBpbiBpKXt2YXIgcD1pW2ZdLG09bmV3IHIobixlKTtcIm5hbWVcImluIG8mJlwibmFtZXNwYWNlXCJpbiBvJiYobS5hdHRyaWJ1dGVOYW1lPW8ubmFtZSxtLmF0dHJpYnV0ZU5hbWVzcGFjZT1vLm5hbWVzcGFjZSksby5hZGRlZE5vZGVzJiYobS5hZGRlZE5vZGVzPW8uYWRkZWROb2Rlcyksby5yZW1vdmVkTm9kZXMmJihtLnJlbW92ZWROb2Rlcz1vLnJlbW92ZWROb2Rlcyksby5wcmV2aW91c1NpYmxpbmcmJihtLnByZXZpb3VzU2libGluZz1vLnByZXZpb3VzU2libGluZyksby5uZXh0U2libGluZyYmKG0ubmV4dFNpYmxpbmc9by5uZXh0U2libGluZyksdm9pZCAwIT09YVtmXSYmKG0ub2xkVmFsdWU9YVtmXSksdChwKSxwLnJlY29yZHNfLnB1c2gobSl9fWZ1bmN0aW9uIHMoZSl7aWYodGhpcy5jaGlsZExpc3Q9ISFlLmNoaWxkTGlzdCx0aGlzLnN1YnRyZWU9ISFlLnN1YnRyZWUsXCJhdHRyaWJ1dGVzXCJpbiBlfHwhKFwiYXR0cmlidXRlT2xkVmFsdWVcImluIGV8fFwiYXR0cmlidXRlRmlsdGVyXCJpbiBlKT90aGlzLmF0dHJpYnV0ZXM9ISFlLmF0dHJpYnV0ZXM6dGhpcy5hdHRyaWJ1dGVzPSEwLFwiY2hhcmFjdGVyRGF0YU9sZFZhbHVlXCJpbiBlJiYhKFwiY2hhcmFjdGVyRGF0YVwiaW4gZSk/dGhpcy5jaGFyYWN0ZXJEYXRhPSEwOnRoaXMuY2hhcmFjdGVyRGF0YT0hIWUuY2hhcmFjdGVyRGF0YSwhdGhpcy5hdHRyaWJ1dGVzJiYoZS5hdHRyaWJ1dGVPbGRWYWx1ZXx8XCJhdHRyaWJ1dGVGaWx0ZXJcImluIGUpfHwhdGhpcy5jaGFyYWN0ZXJEYXRhJiZlLmNoYXJhY3RlckRhdGFPbGRWYWx1ZSl0aHJvdyBuZXcgVHlwZUVycm9yO2lmKHRoaXMuY2hhcmFjdGVyRGF0YT0hIWUuY2hhcmFjdGVyRGF0YSx0aGlzLmF0dHJpYnV0ZU9sZFZhbHVlPSEhZS5hdHRyaWJ1dGVPbGRWYWx1ZSx0aGlzLmNoYXJhY3RlckRhdGFPbGRWYWx1ZT0hIWUuY2hhcmFjdGVyRGF0YU9sZFZhbHVlLFwiYXR0cmlidXRlRmlsdGVyXCJpbiBlKXtpZihudWxsPT1lLmF0dHJpYnV0ZUZpbHRlcnx8XCJvYmplY3RcIiE9dHlwZW9mIGUuYXR0cmlidXRlRmlsdGVyKXRocm93IG5ldyBUeXBlRXJyb3I7dGhpcy5hdHRyaWJ1dGVGaWx0ZXI9dy5jYWxsKGUuYXR0cmlidXRlRmlsdGVyKX1lbHNlIHRoaXMuYXR0cmlidXRlRmlsdGVyPW51bGx9ZnVuY3Rpb24gYyhlKXt0aGlzLmNhbGxiYWNrXz1lLHRoaXMubm9kZXNfPVtdLHRoaXMucmVjb3Jkc189W10sdGhpcy51aWRfPSsrdix0aGlzLnNjaGVkdWxlZF89ITF9ZnVuY3Rpb24gbChlLHQsbil7dGhpcy5vYnNlcnZlcj1lLHRoaXMudGFyZ2V0PXQsdGhpcy5vcHRpb25zPW4sdGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzPVtdfXZhciB1PWUuc2V0RW5kT2ZNaWNyb3Rhc2ssZD1lLndyYXBJZk5lZWRlZCxwPWUud3JhcHBlcnMsaD1uZXcgV2Vha01hcCxmPVtdLG09ITEsdz1BcnJheS5wcm90b3R5cGUuc2xpY2Usdj0wO2MucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpjLG9ic2VydmU6ZnVuY3Rpb24oZSx0KXtlPWQoZSk7dmFyIG4scj1uZXcgcyh0KSxvPWguZ2V0KGUpO298fGguc2V0KGUsbz1bXSk7Zm9yKHZhciBpPTA7aTxvLmxlbmd0aDtpKyspb1tpXS5vYnNlcnZlcj09PXRoaXMmJihuPW9baV0sbi5yZW1vdmVUcmFuc2llbnRPYnNlcnZlcnMoKSxuLm9wdGlvbnM9cik7bnx8KG49bmV3IGwodGhpcyxlLHIpLG8ucHVzaChuKSx0aGlzLm5vZGVzXy5wdXNoKGUpKX0sZGlzY29ubmVjdDpmdW5jdGlvbigpe3RoaXMubm9kZXNfLmZvckVhY2goZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWguZ2V0KGUpLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtpZihyLm9ic2VydmVyPT09dGhpcyl7dC5zcGxpY2UobiwxKTticmVha319fSx0aGlzKSx0aGlzLnJlY29yZHNfPVtdfSx0YWtlUmVjb3JkczpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVjb3Jkc187cmV0dXJuIHRoaXMucmVjb3Jkc189W10sZX19LGwucHJvdG90eXBlPXthZGRUcmFuc2llbnRPYnNlcnZlcjpmdW5jdGlvbihlKXtpZihlIT09dGhpcy50YXJnZXQpe3QodGhpcy5vYnNlcnZlciksdGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzLnB1c2goZSk7dmFyIG49aC5nZXQoZSk7bnx8aC5zZXQoZSxuPVtdKSxuLnB1c2godGhpcyl9fSxyZW1vdmVUcmFuc2llbnRPYnNlcnZlcnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnRyYW5zaWVudE9ic2VydmVkTm9kZXM7dGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzPVtdO2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWZvcih2YXIgbj1lW3RdLHI9aC5nZXQobiksbz0wO288ci5sZW5ndGg7bysrKWlmKHJbb109PT10aGlzKXtyLnNwbGljZShvLDEpO2JyZWFrfX19LGUuZW5xdWV1ZU11dGF0aW9uPWEsZS5yZWdpc3RlclRyYW5zaWVudE9ic2VydmVycz1vLGUud3JhcHBlcnMuTXV0YXRpb25PYnNlcnZlcj1jLGUud3JhcHBlcnMuTXV0YXRpb25SZWNvcmQ9cn0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUsdCl7dGhpcy5yb290PWUsdGhpcy5wYXJlbnQ9dH1mdW5jdGlvbiBuKGUsdCl7aWYoZS50cmVlU2NvcGVfIT09dCl7ZS50cmVlU2NvcGVfPXQ7Zm9yKHZhciByPWUuc2hhZG93Um9vdDtyO3I9ci5vbGRlclNoYWRvd1Jvb3Qpci50cmVlU2NvcGVfLnBhcmVudD10O2Zvcih2YXIgbz1lLmZpcnN0Q2hpbGQ7bztvPW8ubmV4dFNpYmxpbmcpbihvLHQpfX1mdW5jdGlvbiByKG4pe2lmKG4gaW5zdGFuY2VvZiBlLndyYXBwZXJzLldpbmRvdyxuLnRyZWVTY29wZV8pcmV0dXJuIG4udHJlZVNjb3BlXzt2YXIgbyxpPW4ucGFyZW50Tm9kZTtyZXR1cm4gbz1pP3IoaSk6bmV3IHQobixudWxsKSxuLnRyZWVTY29wZV89b310LnByb3RvdHlwZT17Z2V0IHJlbmRlcmVyKCl7cmV0dXJuIHRoaXMucm9vdCBpbnN0YW5jZW9mIGUud3JhcHBlcnMuU2hhZG93Um9vdD9lLmdldFJlbmRlcmVyRm9ySG9zdCh0aGlzLnJvb3QuaG9zdCk6bnVsbH0sY29udGFpbnM6ZnVuY3Rpb24oZSl7Zm9yKDtlO2U9ZS5wYXJlbnQpaWYoZT09PXRoaXMpcmV0dXJuITA7cmV0dXJuITF9fSxlLlRyZWVTY29wZT10LGUuZ2V0VHJlZVNjb3BlPXIsZS5zZXRUcmVlU2NvcGU9bn0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe3JldHVybiBlIGluc3RhbmNlb2YgRy5TaGFkb3dSb290fWZ1bmN0aW9uIG4oZSl7cmV0dXJuIEEoZSkucm9vdH1mdW5jdGlvbiByKGUscil7dmFyIHM9W10sYz1lO2ZvcihzLnB1c2goYyk7Yzspe3ZhciBsPWEoYyk7aWYobCYmbC5sZW5ndGg+MCl7Zm9yKHZhciB1PTA7dTxsLmxlbmd0aDt1Kyspe3ZhciBwPWxbdV07aWYoaShwKSl7dmFyIGg9bihwKSxmPWgub2xkZXJTaGFkb3dSb290O2YmJnMucHVzaChmKX1zLnB1c2gocCl9Yz1sW2wubGVuZ3RoLTFdfWVsc2UgaWYodChjKSl7aWYoZChlLGMpJiZvKHIpKWJyZWFrO2M9Yy5ob3N0LHMucHVzaChjKX1lbHNlIGM9Yy5wYXJlbnROb2RlLGMmJnMucHVzaChjKX1yZXR1cm4gc31mdW5jdGlvbiBvKGUpe2lmKCFlKXJldHVybiExO3N3aXRjaChlLnR5cGUpe2Nhc2VcImFib3J0XCI6Y2FzZVwiZXJyb3JcIjpjYXNlXCJzZWxlY3RcIjpjYXNlXCJjaGFuZ2VcIjpjYXNlXCJsb2FkXCI6Y2FzZVwicmVzZXRcIjpjYXNlXCJyZXNpemVcIjpjYXNlXCJzY3JvbGxcIjpjYXNlXCJzZWxlY3RzdGFydFwiOnJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBIVE1MU2hhZG93RWxlbWVudH1mdW5jdGlvbiBhKHQpe3JldHVybiBlLmdldERlc3RpbmF0aW9uSW5zZXJ0aW9uUG9pbnRzKHQpfWZ1bmN0aW9uIHMoZSx0KXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHQ7dCBpbnN0YW5jZW9mIEcuV2luZG93JiYodD10LmRvY3VtZW50KTtmb3IodmFyIG49QSh0KSxyPWVbMF0sbz1BKHIpLGk9bChuLG8pLGE9MDthPGUubGVuZ3RoO2ErKyl7dmFyIHM9ZVthXTtpZihBKHMpPT09aSlyZXR1cm4gc31yZXR1cm4gZVtlLmxlbmd0aC0xXX1mdW5jdGlvbiBjKGUpe2Zvcih2YXIgdD1bXTtlO2U9ZS5wYXJlbnQpdC5wdXNoKGUpO3JldHVybiB0fWZ1bmN0aW9uIGwoZSx0KXtmb3IodmFyIG49YyhlKSxyPWModCksbz1udWxsO24ubGVuZ3RoPjAmJnIubGVuZ3RoPjA7KXt2YXIgaT1uLnBvcCgpLGE9ci5wb3AoKTtpZihpIT09YSlicmVhaztvPWl9cmV0dXJuIG99ZnVuY3Rpb24gdShlLHQsbil7dCBpbnN0YW5jZW9mIEcuV2luZG93JiYodD10LmRvY3VtZW50KTt2YXIgbyxpPUEodCksYT1BKG4pLHM9cihuLGUpLG89bChpLGEpO298fChvPWEucm9vdCk7Zm9yKHZhciBjPW87YztjPWMucGFyZW50KWZvcih2YXIgdT0wO3U8cy5sZW5ndGg7dSsrKXt2YXIgZD1zW3VdO2lmKEEoZCk9PT1jKXJldHVybiBkfXJldHVybiBudWxsfWZ1bmN0aW9uIGQoZSx0KXtyZXR1cm4gQShlKT09PUEodCl9ZnVuY3Rpb24gcChlKXtpZighSy5nZXQoZSkmJihLLnNldChlLCEwKSxmKFYoZSksVihlLnRhcmdldCkpLFApKXt2YXIgdD1QO3Rocm93IFA9bnVsbCx0fX1mdW5jdGlvbiBoKGUpe3N3aXRjaChlLnR5cGUpe2Nhc2VcImxvYWRcIjpjYXNlXCJiZWZvcmV1bmxvYWRcIjpjYXNlXCJ1bmxvYWRcIjpyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBmKHQsbil7aWYoJC5nZXQodCkpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZFN0YXRlRXJyb3JcIik7JC5zZXQodCwhMCksZS5yZW5kZXJBbGxQZW5kaW5nKCk7dmFyIG8saSxhO2lmKGgodCkmJiF0LmJ1YmJsZXMpe3ZhciBzPW47cyBpbnN0YW5jZW9mIEcuRG9jdW1lbnQmJihhPXMuZGVmYXVsdFZpZXcpJiYoaT1zLG89W10pfWlmKCFvKWlmKG4gaW5zdGFuY2VvZiBHLldpbmRvdylhPW4sbz1bXTtlbHNlIGlmKG89cihuLHQpLCFoKHQpKXt2YXIgcz1vW28ubGVuZ3RoLTFdO3MgaW5zdGFuY2VvZiBHLkRvY3VtZW50JiYoYT1zLmRlZmF1bHRWaWV3KX1yZXR1cm4gbmUuc2V0KHQsbyksbSh0LG8sYSxpKSYmdyh0LG8sYSxpKSYmdih0LG8sYSxpKSxKLnNldCh0LHJlKSxZW1wiZGVsZXRlXCJdKHQsbnVsbCksJFtcImRlbGV0ZVwiXSh0KSx0LmRlZmF1bHRQcmV2ZW50ZWR9ZnVuY3Rpb24gbShlLHQsbixyKXt2YXIgbz1vZTtpZihuJiYhZyhuLGUsbyx0LHIpKXJldHVybiExO2Zvcih2YXIgaT10Lmxlbmd0aC0xO2k+MDtpLS0paWYoIWcodFtpXSxlLG8sdCxyKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiB3KGUsdCxuLHIpe3ZhciBvPWllLGk9dFswXXx8bjtyZXR1cm4gZyhpLGUsbyx0LHIpfWZ1bmN0aW9uIHYoZSx0LG4scil7Zm9yKHZhciBvPWFlLGk9MTtpPHQubGVuZ3RoO2krKylpZighZyh0W2ldLGUsbyx0LHIpKXJldHVybjtuJiZ0Lmxlbmd0aD4wJiZnKG4sZSxvLHQscil9ZnVuY3Rpb24gZyhlLHQsbixyLG8pe3ZhciBpPXouZ2V0KGUpO2lmKCFpKXJldHVybiEwO3ZhciBhPW98fHMocixlKTtpZihhPT09ZSl7aWYobj09PW9lKXJldHVybiEwO249PT1hZSYmKG49aWUpfWVsc2UgaWYobj09PWFlJiYhdC5idWJibGVzKXJldHVybiEwO2lmKFwicmVsYXRlZFRhcmdldFwiaW4gdCl7dmFyIGM9Qih0KSxsPWMucmVsYXRlZFRhcmdldDtpZihsKXtpZihsIGluc3RhbmNlb2YgT2JqZWN0JiZsLmFkZEV2ZW50TGlzdGVuZXIpe3ZhciBkPVYobCkscD11KHQsZSxkKTtpZihwPT09YSlyZXR1cm4hMH1lbHNlIHA9bnVsbDtaLnNldCh0LHApfX1KLnNldCh0LG4pO3ZhciBoPXQudHlwZSxmPSExO1guc2V0KHQsYSksWS5zZXQodCxlKSxpLmRlcHRoKys7Zm9yKHZhciBtPTAsdz1pLmxlbmd0aDt3Pm07bSsrKXt2YXIgdj1pW21dO2lmKHYucmVtb3ZlZClmPSEwO2Vsc2UgaWYoISh2LnR5cGUhPT1ofHwhdi5jYXB0dXJlJiZuPT09b2V8fHYuY2FwdHVyZSYmbj09PWFlKSl0cnl7aWYoXCJmdW5jdGlvblwiPT10eXBlb2Ygdi5oYW5kbGVyP3YuaGFuZGxlci5jYWxsKGUsdCk6di5oYW5kbGVyLmhhbmRsZUV2ZW50KHQpLGVlLmdldCh0KSlyZXR1cm4hMX1jYXRjaChnKXtQfHwoUD1nKX19aWYoaS5kZXB0aC0tLGYmJjA9PT1pLmRlcHRoKXt2YXIgYj1pLnNsaWNlKCk7aS5sZW5ndGg9MDtmb3IodmFyIG09MDttPGIubGVuZ3RoO20rKyliW21dLnJlbW92ZWR8fGkucHVzaChiW21dKX1yZXR1cm4hUS5nZXQodCl9ZnVuY3Rpb24gYihlLHQsbil7dGhpcy50eXBlPWUsdGhpcy5oYW5kbGVyPXQsdGhpcy5jYXB0dXJlPUJvb2xlYW4obil9ZnVuY3Rpb24geShlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHNlKSlyZXR1cm4gVihUKHNlLFwiRXZlbnRcIixlLHQpKTt2YXIgbj1lO3JldHVybiBiZXx8XCJiZWZvcmV1bmxvYWRcIiE9PW4udHlwZXx8dGhpcyBpbnN0YW5jZW9mIE0/dm9pZCBVKG4sdGhpcyk6bmV3IE0obil9ZnVuY3Rpb24gRShlKXtyZXR1cm4gZSYmZS5yZWxhdGVkVGFyZ2V0P09iamVjdC5jcmVhdGUoZSx7cmVsYXRlZFRhcmdldDp7dmFsdWU6QihlLnJlbGF0ZWRUYXJnZXQpfX0pOmV9ZnVuY3Rpb24gXyhlLHQsbil7dmFyIHI9d2luZG93W2VdLG89ZnVuY3Rpb24odCxuKXtyZXR1cm4gdCBpbnN0YW5jZW9mIHI/dm9pZCBVKHQsdGhpcyk6VihUKHIsZSx0LG4pKX07aWYoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSksbiYmVyhvLnByb3RvdHlwZSxuKSxyKXRyeXtGKHIsbyxuZXcgcihcInRlbXBcIikpfWNhdGNoKGkpe0YocixvLGRvY3VtZW50LmNyZWF0ZUV2ZW50KGUpKX1yZXR1cm4gb31mdW5jdGlvbiBTKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7YXJndW1lbnRzW3RdPUIoYXJndW1lbnRzW3RdKTt2YXIgbj1CKHRoaXMpO25bZV0uYXBwbHkobixhcmd1bWVudHMpfX1mdW5jdGlvbiBUKGUsdCxuLHIpe2lmKHZlKXJldHVybiBuZXcgZShuLEUocikpO3ZhciBvPUIoZG9jdW1lbnQuY3JlYXRlRXZlbnQodCkpLGk9d2VbdF0sYT1bbl07cmV0dXJuIE9iamVjdC5rZXlzKGkpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bnVsbCE9ciYmZSBpbiByP3JbZV06aVtlXTtcInJlbGF0ZWRUYXJnZXRcIj09PWUmJih0PUIodCkpLGEucHVzaCh0KX0pLG9bXCJpbml0XCIrdF0uYXBwbHkobyxhKSxvfWZ1bmN0aW9uIE0oZSl7eS5jYWxsKHRoaXMsZSl9ZnVuY3Rpb24gTyhlKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBlPyEwOmUmJmUuaGFuZGxlRXZlbnR9ZnVuY3Rpb24gTChlKXtzd2l0Y2goZSl7Y2FzZVwiRE9NQXR0ck1vZGlmaWVkXCI6Y2FzZVwiRE9NQXR0cmlidXRlTmFtZUNoYW5nZWRcIjpjYXNlXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIjpjYXNlXCJET01FbGVtZW50TmFtZUNoYW5nZWRcIjpjYXNlXCJET01Ob2RlSW5zZXJ0ZWRcIjpjYXNlXCJET01Ob2RlSW5zZXJ0ZWRJbnRvRG9jdW1lbnRcIjpjYXNlXCJET01Ob2RlUmVtb3ZlZFwiOmNhc2VcIkRPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50XCI6Y2FzZVwiRE9NU3VidHJlZU1vZGlmaWVkXCI6cmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gTihlKXtVKGUsdGhpcyl9ZnVuY3Rpb24gQyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEcuU2hhZG93Um9vdCYmKGU9ZS5ob3N0KSxCKGUpfWZ1bmN0aW9uIGooZSx0KXt2YXIgbj16LmdldChlKTtpZihuKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKWlmKCFuW3JdLnJlbW92ZWQmJm5bcl0udHlwZT09PXQpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gRChlLHQpe2Zvcih2YXIgbj1CKGUpO247bj1uLnBhcmVudE5vZGUpaWYoaihWKG4pLHQpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIEgoZSl7ayhlLEVlKX1mdW5jdGlvbiB4KHQsbixvLGkpe2UucmVuZGVyQWxsUGVuZGluZygpO3ZhciBhPVYoX2UuY2FsbChxKG4pLG8saSkpO2lmKCFhKXJldHVybiBudWxsO3ZhciBjPXIoYSxudWxsKSxsPWMubGFzdEluZGV4T2YodCk7cmV0dXJuLTE9PWw/bnVsbDooYz1jLnNsaWNlKDAsbCkscyhjLHQpKX1mdW5jdGlvbiBSKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRlLmdldCh0aGlzKTtyZXR1cm4gdCYmdFtlXSYmdFtlXS52YWx1ZXx8bnVsbH19ZnVuY3Rpb24gSShlKXt2YXIgdD1lLnNsaWNlKDIpO3JldHVybiBmdW5jdGlvbihuKXt2YXIgcj10ZS5nZXQodGhpcyk7cnx8KHI9T2JqZWN0LmNyZWF0ZShudWxsKSx0ZS5zZXQodGhpcyxyKSk7dmFyIG89cltlXTtpZihvJiZ0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxvLndyYXBwZWQsITEpLFwiZnVuY3Rpb25cIj09dHlwZW9mIG4pe3ZhciBpPWZ1bmN0aW9uKHQpe3ZhciByPW4uY2FsbCh0aGlzLHQpO3I9PT0hMT90LnByZXZlbnREZWZhdWx0KCk6XCJvbmJlZm9yZXVubG9hZFwiPT09ZSYmXCJzdHJpbmdcIj09dHlwZW9mIHImJih0LnJldHVyblZhbHVlPXIpfTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIodCxpLCExKSxyW2VdPXt2YWx1ZTpuLHdyYXBwZWQ6aX19fX12YXIgUCxrPWUuZm9yd2FyZE1ldGhvZHNUb1dyYXBwZXIsQT1lLmdldFRyZWVTY29wZSxXPWUubWl4aW4sRj1lLnJlZ2lzdGVyV3JhcHBlcixVPWUuc2V0V3JhcHBlcixxPWUudW5zYWZlVW53cmFwLEI9ZS51bndyYXAsVj1lLndyYXAsRz1lLndyYXBwZXJzLHo9KG5ldyBXZWFrTWFwLG5ldyBXZWFrTWFwKSxLPW5ldyBXZWFrTWFwLCQ9bmV3IFdlYWtNYXAsWD1uZXcgV2Vha01hcCxZPW5ldyBXZWFrTWFwLFo9bmV3IFdlYWtNYXAsSj1uZXcgV2Vha01hcCxRPW5ldyBXZWFrTWFwLGVlPW5ldyBXZWFrTWFwLHRlPW5ldyBXZWFrTWFwLG5lPW5ldyBXZWFrTWFwLHJlPTAsb2U9MSxpZT0yLGFlPTM7Yi5wcm90b3R5cGU9e2VxdWFsczpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5oYW5kbGVyPT09ZS5oYW5kbGVyJiZ0aGlzLnR5cGU9PT1lLnR5cGUmJnRoaXMuY2FwdHVyZT09PWUuY2FwdHVyZX0sZ2V0IHJlbW92ZWQoKXtyZXR1cm4gbnVsbD09PXRoaXMuaGFuZGxlcn0scmVtb3ZlOmZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVyPW51bGx9fTt2YXIgc2U9d2luZG93LkV2ZW50O3NlLnByb3RvdHlwZS5wb2x5bWVyQmxhY2tMaXN0Xz17cmV0dXJuVmFsdWU6ITAsa2V5TG9jYXRpb246ITB9LHkucHJvdG90eXBlPXtnZXQgdGFyZ2V0KCl7cmV0dXJuIFguZ2V0KHRoaXMpfSxnZXQgY3VycmVudFRhcmdldCgpe3JldHVybiBZLmdldCh0aGlzKX0sZ2V0IGV2ZW50UGhhc2UoKXtyZXR1cm4gSi5nZXQodGhpcyl9LGdldCBwYXRoKCl7dmFyIGU9bmUuZ2V0KHRoaXMpO3JldHVybiBlP2Uuc2xpY2UoKTpbXX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7US5zZXQodGhpcywhMCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe1Euc2V0KHRoaXMsITApLGVlLnNldCh0aGlzLCEwKX19O3ZhciBjZT1mdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7cmV0dXJuIGUuaW5pdEV2ZW50KFwidGVzdFwiLCEwLCEwKSxlLnByZXZlbnREZWZhdWx0KCksZS5kZWZhdWx0UHJldmVudGVkfSgpO2NlfHwoeS5wcm90b3R5cGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbGFibGUmJihxKHRoaXMpLnByZXZlbnREZWZhdWx0KCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJkZWZhdWx0UHJldmVudGVkXCIse2dldDpmdW5jdGlvbigpe3JldHVybiEwfSxjb25maWd1cmFibGU6ITB9KSl9KSxGKHNlLHksZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKSk7dmFyIGxlPV8oXCJVSUV2ZW50XCIseSksdWU9XyhcIkN1c3RvbUV2ZW50XCIseSksZGU9e2dldCByZWxhdGVkVGFyZ2V0KCl7dmFyIGU9Wi5nZXQodGhpcyk7cmV0dXJuIHZvaWQgMCE9PWU/ZTpWKEIodGhpcykucmVsYXRlZFRhcmdldCl9fSxwZT1XKHtpbml0TW91c2VFdmVudDpTKFwiaW5pdE1vdXNlRXZlbnRcIiwxNCl9LGRlKSxoZT1XKHtpbml0Rm9jdXNFdmVudDpTKFwiaW5pdEZvY3VzRXZlbnRcIiw1KX0sZGUpLGZlPV8oXCJNb3VzZUV2ZW50XCIsbGUscGUpLG1lPV8oXCJGb2N1c0V2ZW50XCIsbGUsaGUpLHdlPU9iamVjdC5jcmVhdGUobnVsbCksdmU9ZnVuY3Rpb24oKXt0cnl7bmV3IHdpbmRvdy5Gb2N1c0V2ZW50KFwiZm9jdXNcIil9Y2F0Y2goZSl7cmV0dXJuITF9cmV0dXJuITB9KCk7aWYoIXZlKXt2YXIgZ2U9ZnVuY3Rpb24oZSx0LG4pe2lmKG4pe3ZhciByPXdlW25dO3Q9VyhXKHt9LHIpLHQpfXdlW2VdPXR9O2dlKFwiRXZlbnRcIix7YnViYmxlczohMSxjYW5jZWxhYmxlOiExfSksZ2UoXCJDdXN0b21FdmVudFwiLHtkZXRhaWw6bnVsbH0sXCJFdmVudFwiKSxnZShcIlVJRXZlbnRcIix7dmlldzpudWxsLGRldGFpbDowfSxcIkV2ZW50XCIpLGdlKFwiTW91c2VFdmVudFwiLHtzY3JlZW5YOjAsc2NyZWVuWTowLGNsaWVudFg6MCxjbGllbnRZOjAsY3RybEtleTohMSxhbHRLZXk6ITEsc2hpZnRLZXk6ITEsbWV0YUtleTohMSxidXR0b246MCxyZWxhdGVkVGFyZ2V0Om51bGx9LFwiVUlFdmVudFwiKSxnZShcIkZvY3VzRXZlbnRcIix7cmVsYXRlZFRhcmdldDpudWxsfSxcIlVJRXZlbnRcIil9dmFyIGJlPXdpbmRvdy5CZWZvcmVVbmxvYWRFdmVudDtNLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHkucHJvdG90eXBlKSxXKE0ucHJvdG90eXBlLHtnZXQgcmV0dXJuVmFsdWUoKXtyZXR1cm4gcSh0aGlzKS5yZXR1cm5WYWx1ZX0sc2V0IHJldHVyblZhbHVlKGUpe3EodGhpcykucmV0dXJuVmFsdWU9ZX19KSxiZSYmRihiZSxNKTt2YXIgeWU9d2luZG93LkV2ZW50VGFyZ2V0LEVlPVtcImFkZEV2ZW50TGlzdGVuZXJcIixcInJlbW92ZUV2ZW50TGlzdGVuZXJcIixcImRpc3BhdGNoRXZlbnRcIl07W05vZGUsV2luZG93XS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucHJvdG90eXBlO0VlLmZvckVhY2goZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZStcIl9cIix7dmFsdWU6dFtlXX0pfSl9KSxOLnByb3RvdHlwZT17YWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihlLHQsbil7aWYoTyh0KSYmIUwoZSkpe3ZhciByPW5ldyBiKGUsdCxuKSxvPXouZ2V0KHRoaXMpO2lmKG8pe2Zvcih2YXIgaT0wO2k8by5sZW5ndGg7aSsrKWlmKHIuZXF1YWxzKG9baV0pKXJldHVybn1lbHNlIG89W10sby5kZXB0aD0wLHouc2V0KHRoaXMsbyk7by5wdXNoKHIpO3ZhciBhPUModGhpcyk7YS5hZGRFdmVudExpc3RlbmVyXyhlLHAsITApfX0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihlLHQsbil7bj1Cb29sZWFuKG4pO3ZhciByPXouZ2V0KHRoaXMpO2lmKHIpe2Zvcih2YXIgbz0wLGk9ITEsYT0wO2E8ci5sZW5ndGg7YSsrKXJbYV0udHlwZT09PWUmJnJbYV0uY2FwdHVyZT09PW4mJihvKyssclthXS5oYW5kbGVyPT09dCYmKGk9ITAsclthXS5yZW1vdmUoKSkpO2lmKGkmJjE9PT1vKXt2YXIgcz1DKHRoaXMpO3MucmVtb3ZlRXZlbnRMaXN0ZW5lcl8oZSxwLCEwKX19fSxkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKHQpe3ZhciBuPUIodCkscj1uLnR5cGU7Sy5zZXQobiwhMSksZS5yZW5kZXJBbGxQZW5kaW5nKCk7dmFyIG87RCh0aGlzLHIpfHwobz1mdW5jdGlvbigpe30sdGhpcy5hZGRFdmVudExpc3RlbmVyKHIsbywhMCkpO3RyeXtyZXR1cm4gQih0aGlzKS5kaXNwYXRjaEV2ZW50XyhuKX1maW5hbGx5e28mJnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihyLG8sITApfX19LHllJiZGKHllLE4pO3ZhciBfZT1kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50O2UuZWxlbWVudEZyb21Qb2ludD14LGUuZ2V0RXZlbnRIYW5kbGVyR2V0dGVyPVIsZS5nZXRFdmVudEhhbmRsZXJTZXR0ZXI9SSxlLndyYXBFdmVudFRhcmdldE1ldGhvZHM9SCxlLndyYXBwZXJzLkJlZm9yZVVubG9hZEV2ZW50PU0sZS53cmFwcGVycy5DdXN0b21FdmVudD11ZSxlLndyYXBwZXJzLkV2ZW50PXksZS53cmFwcGVycy5FdmVudFRhcmdldD1OLGUud3JhcHBlcnMuRm9jdXNFdmVudD1tZSxlLndyYXBwZXJzLk1vdXNlRXZlbnQ9ZmUsZS53cmFwcGVycy5VSUV2ZW50PWxlfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LG0pfWZ1bmN0aW9uIG4oZSl7bChlLHRoaXMpfWZ1bmN0aW9uIHIoKXt0aGlzLmxlbmd0aD0wLHQodGhpcyxcImxlbmd0aFwiKX1mdW5jdGlvbiBvKGUpe2Zvcih2YXIgdD1uZXcgcixvPTA7bzxlLmxlbmd0aDtvKyspdFtvXT1uZXcgbihlW29dKTtyZXR1cm4gdC5sZW5ndGg9byx0fWZ1bmN0aW9uIGkoZSl7YS5jYWxsKHRoaXMsZSl9dmFyIGE9ZS53cmFwcGVycy5VSUV2ZW50LHM9ZS5taXhpbixjPWUucmVnaXN0ZXJXcmFwcGVyLGw9ZS5zZXRXcmFwcGVyLHU9ZS51bnNhZmVVbndyYXAsZD1lLndyYXAscD13aW5kb3cuVG91Y2hFdmVudDtpZihwKXt2YXIgaDt0cnl7aD1kb2N1bWVudC5jcmVhdGVFdmVudChcIlRvdWNoRXZlbnRcIil9Y2F0Y2goZil7cmV0dXJufXZhciBtPXtlbnVtZXJhYmxlOiExfTtuLnByb3RvdHlwZT17Z2V0IHRhcmdldCgpe3JldHVybiBkKHUodGhpcykudGFyZ2V0KX19O3ZhciB3PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6bnVsbH07W1wiY2xpZW50WFwiLFwiY2xpZW50WVwiLFwic2NyZWVuWFwiLFwic2NyZWVuWVwiLFwicGFnZVhcIixcInBhZ2VZXCIsXCJpZGVudGlmaWVyXCIsXCJ3ZWJraXRSYWRpdXNYXCIsXCJ3ZWJraXRSYWRpdXNZXCIsXCJ3ZWJraXRSb3RhdGlvbkFuZ2xlXCIsXCJ3ZWJraXRGb3JjZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3cuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHUodGhpcylbZV19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxlLHcpfSksci5wcm90b3R5cGU9e2l0ZW06ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXNbZV19fSxpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGEucHJvdG90eXBlKSxzKGkucHJvdG90eXBlLHtnZXQgdG91Y2hlcygpe3JldHVybiBvKHUodGhpcykudG91Y2hlcyl9LGdldCB0YXJnZXRUb3VjaGVzKCl7cmV0dXJuIG8odSh0aGlzKS50YXJnZXRUb3VjaGVzKX0sZ2V0IGNoYW5nZWRUb3VjaGVzKCl7cmV0dXJuIG8odSh0aGlzKS5jaGFuZ2VkVG91Y2hlcyl9LGluaXRUb3VjaEV2ZW50OmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpfX0pLGMocCxpLGgpLGUud3JhcHBlcnMuVG91Y2g9bixlLndyYXBwZXJzLlRvdWNoRXZlbnQ9aSxlLndyYXBwZXJzLlRvdWNoTGlzdD1yfX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxzKX1mdW5jdGlvbiBuKCl7dGhpcy5sZW5ndGg9MCx0KHRoaXMsXCJsZW5ndGhcIil9ZnVuY3Rpb24gcihlKXtpZihudWxsPT1lKXJldHVybiBlO2Zvcih2YXIgdD1uZXcgbixyPTAsbz1lLmxlbmd0aDtvPnI7cisrKXRbcl09YShlW3JdKTtyZXR1cm4gdC5sZW5ndGg9byx0fWZ1bmN0aW9uIG8oZSx0KXtlLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3JldHVybiByKGkodGhpcylbdF0uYXBwbHkoaSh0aGlzKSxhcmd1bWVudHMpKX19dmFyIGk9ZS51bnNhZmVVbndyYXAsYT1lLndyYXAscz17ZW51bWVyYWJsZTohMX07bi5wcm90b3R5cGU9e2l0ZW06ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXNbZV19fSx0KG4ucHJvdG90eXBlLFwiaXRlbVwiKSxlLndyYXBwZXJzLk5vZGVMaXN0PW4sZS5hZGRXcmFwTm9kZUxpc3RNZXRob2Q9byxlLndyYXBOb2RlTGlzdD1yfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Uud3JhcEhUTUxDb2xsZWN0aW9uPWUud3JhcE5vZGVMaXN0LGUud3JhcHBlcnMuSFRNTENvbGxlY3Rpb249ZS53cmFwcGVycy5Ob2RlTGlzdH0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe08oZSBpbnN0YW5jZW9mIF8pfWZ1bmN0aW9uIG4oZSl7dmFyIHQ9bmV3IFQ7cmV0dXJuIHRbMF09ZSx0Lmxlbmd0aD0xLHR9ZnVuY3Rpb24gcihlLHQsbil7Tih0LFwiY2hpbGRMaXN0XCIse3JlbW92ZWROb2RlczpuLHByZXZpb3VzU2libGluZzplLnByZXZpb3VzU2libGluZyxuZXh0U2libGluZzplLm5leHRTaWJsaW5nfSl9ZnVuY3Rpb24gbyhlLHQpe04oZSxcImNoaWxkTGlzdFwiLHtyZW1vdmVkTm9kZXM6dH0pfWZ1bmN0aW9uIGkoZSx0LHIsbyl7aWYoZSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBpPXMoZSk7VT0hMDtmb3IodmFyIGE9aS5sZW5ndGgtMTthPj0wO2EtLSllLnJlbW92ZUNoaWxkKGlbYV0pLGlbYV0ucGFyZW50Tm9kZV89dDtVPSExO2Zvcih2YXIgYT0wO2E8aS5sZW5ndGg7YSsrKWlbYV0ucHJldmlvdXNTaWJsaW5nXz1pW2EtMV18fHIsaVthXS5uZXh0U2libGluZ189aVthKzFdfHxvO3JldHVybiByJiYoci5uZXh0U2libGluZ189aVswXSksbyYmKG8ucHJldmlvdXNTaWJsaW5nXz1pW2kubGVuZ3RoLTFdKSxpfXZhciBpPW4oZSksYz1lLnBhcmVudE5vZGU7cmV0dXJuIGMmJmMucmVtb3ZlQ2hpbGQoZSksZS5wYXJlbnROb2RlXz10LGUucHJldmlvdXNTaWJsaW5nXz1yLGUubmV4dFNpYmxpbmdfPW8sciYmKHIubmV4dFNpYmxpbmdfPWUpLG8mJihvLnByZXZpb3VzU2libGluZ189ZSksaX1mdW5jdGlvbiBhKGUpe2lmKGUgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXJldHVybiBzKGUpO3ZhciB0PW4oZSksbz1lLnBhcmVudE5vZGU7cmV0dXJuIG8mJnIoZSxvLHQpLHR9ZnVuY3Rpb24gcyhlKXtmb3IodmFyIHQ9bmV3IFQsbj0wLHI9ZS5maXJzdENoaWxkO3I7cj1yLm5leHRTaWJsaW5nKXRbbisrXT1yO3JldHVybiB0Lmxlbmd0aD1uLG8oZSx0KSx0fWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gbChlLHQpe1IoZSx0KSxlLm5vZGVJc0luc2VydGVkXygpfWZ1bmN0aW9uIHUoZSx0KXtmb3IodmFyIG49Qyh0KSxyPTA7cjxlLmxlbmd0aDtyKyspbChlW3JdLG4pfWZ1bmN0aW9uIGQoZSl7UihlLG5ldyBNKGUsbnVsbCkpfWZ1bmN0aW9uIHAoZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspZChlW3RdKX1mdW5jdGlvbiBoKGUsdCl7dmFyIG49ZS5ub2RlVHlwZT09PV8uRE9DVU1FTlRfTk9ERT9lOmUub3duZXJEb2N1bWVudDtuIT09dC5vd25lckRvY3VtZW50JiZuLmFkb3B0Tm9kZSh0KX1mdW5jdGlvbiBmKHQsbil7aWYobi5sZW5ndGgpe3ZhciByPXQub3duZXJEb2N1bWVudDtpZihyIT09blswXS5vd25lckRvY3VtZW50KWZvcih2YXIgbz0wO288bi5sZW5ndGg7bysrKWUuYWRvcHROb2RlTm9SZW1vdmUobltvXSxyKX19ZnVuY3Rpb24gbShlLHQpe2YoZSx0KTt2YXIgbj10Lmxlbmd0aDtpZigxPT09bilyZXR1cm4gUCh0WzBdKTtmb3IodmFyIHI9UChlLm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKSxvPTA7bj5vO28rKylyLmFwcGVuZENoaWxkKFAodFtvXSkpO3JldHVybiByfWZ1bmN0aW9uIHcoZSl7aWYodm9pZCAwIT09ZS5maXJzdENoaWxkXylmb3IodmFyIHQ9ZS5maXJzdENoaWxkXzt0Oyl7dmFyIG49dDt0PXQubmV4dFNpYmxpbmdfLG4ucGFyZW50Tm9kZV89bi5wcmV2aW91c1NpYmxpbmdfPW4ubmV4dFNpYmxpbmdfPXZvaWQgMH1lLmZpcnN0Q2hpbGRfPWUubGFzdENoaWxkXz12b2lkIDB9ZnVuY3Rpb24gdihlKXtpZihlLmludmFsaWRhdGVTaGFkb3dSZW5kZXJlcigpKXtmb3IodmFyIHQ9ZS5maXJzdENoaWxkO3Q7KXtPKHQucGFyZW50Tm9kZT09PWUpO3ZhciBuPXQubmV4dFNpYmxpbmcscj1QKHQpLG89ci5wYXJlbnROb2RlO28mJlguY2FsbChvLHIpLHQucHJldmlvdXNTaWJsaW5nXz10Lm5leHRTaWJsaW5nXz10LnBhcmVudE5vZGVfPW51bGwsdD1ufWUuZmlyc3RDaGlsZF89ZS5sYXN0Q2hpbGRfPW51bGx9ZWxzZSBmb3IodmFyIG4saT1QKGUpLGE9aS5maXJzdENoaWxkO2E7KW49YS5uZXh0U2libGluZyxYLmNhbGwoaSxhKSxhPW59ZnVuY3Rpb24gZyhlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQuaW52YWxpZGF0ZVNoYWRvd1JlbmRlcmVyKCl9ZnVuY3Rpb24gYihlKXtmb3IodmFyIHQsbj0wO248ZS5sZW5ndGg7bisrKXQ9ZVtuXSx0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9ZnVuY3Rpb24geShlLHQsbil7dmFyIHI7aWYocj1BKG4/cS5jYWxsKG4sSShlKSwhMSk6Qi5jYWxsKEkoZSksITEpKSx0KXtmb3IodmFyIG89ZS5maXJzdENoaWxkO287bz1vLm5leHRTaWJsaW5nKXIuYXBwZW5kQ2hpbGQoeShvLCEwLG4pKTtpZihlIGluc3RhbmNlb2YgRi5IVE1MVGVtcGxhdGVFbGVtZW50KWZvcih2YXIgaT1yLmNvbnRlbnQsbz1lLmNvbnRlbnQuZmlyc3RDaGlsZDtvO289by5uZXh0U2libGluZylpLmFwcGVuZENoaWxkKHkobywhMCxuKSl9cmV0dXJuIHJ9ZnVuY3Rpb24gRShlLHQpe2lmKCF0fHxDKGUpIT09Qyh0KSlyZXR1cm4hMTtmb3IodmFyIG49dDtuO249bi5wYXJlbnROb2RlKWlmKG49PT1lKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIF8oZSl7TyhlIGluc3RhbmNlb2YgViksUy5jYWxsKHRoaXMsZSksdGhpcy5wYXJlbnROb2RlXz12b2lkIDAsdGhpcy5maXJzdENoaWxkXz12b2lkIDAsdGhpcy5sYXN0Q2hpbGRfPXZvaWQgMCx0aGlzLm5leHRTaWJsaW5nXz12b2lkIDAsdGhpcy5wcmV2aW91c1NpYmxpbmdfPXZvaWQgMCx0aGlzLnRyZWVTY29wZV89dm9pZCAwfXZhciBTPWUud3JhcHBlcnMuRXZlbnRUYXJnZXQsVD1lLndyYXBwZXJzLk5vZGVMaXN0LE09ZS5UcmVlU2NvcGUsTz1lLmFzc2VydCxMPWUuZGVmaW5lV3JhcEdldHRlcixOPWUuZW5xdWV1ZU11dGF0aW9uLEM9ZS5nZXRUcmVlU2NvcGUsaj1lLmlzV3JhcHBlcixEPWUubWl4aW4sSD1lLnJlZ2lzdGVyVHJhbnNpZW50T2JzZXJ2ZXJzLHg9ZS5yZWdpc3RlcldyYXBwZXIsUj1lLnNldFRyZWVTY29wZSxJPWUudW5zYWZlVW53cmFwLFA9ZS51bndyYXAsaz1lLnVud3JhcElmTmVlZGVkLEE9ZS53cmFwLFc9ZS53cmFwSWZOZWVkZWQsRj1lLndyYXBwZXJzLFU9ITEscT1kb2N1bWVudC5pbXBvcnROb2RlLEI9d2luZG93Lk5vZGUucHJvdG90eXBlLmNsb25lTm9kZSxWPXdpbmRvdy5Ob2RlLEc9d2luZG93LkRvY3VtZW50RnJhZ21lbnQsej0oVi5wcm90b3R5cGUuYXBwZW5kQ2hpbGQsVi5wcm90b3R5cGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24pLEs9Vi5wcm90b3R5cGUuaXNFcXVhbE5vZGUsJD1WLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUsWD1WLnByb3RvdHlwZS5yZW1vdmVDaGlsZCxZPVYucHJvdG90eXBlLnJlcGxhY2VDaGlsZCxaPS9UcmlkZW50fEVkZ2UvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksSj1aP2Z1bmN0aW9uKGUsdCl7dHJ5e1guY2FsbChlLHQpfWNhdGNoKG4pe2lmKCEoZSBpbnN0YW5jZW9mIEcpKXRocm93IG59fTpmdW5jdGlvbihlLHQpe1guY2FsbChlLHQpfTtfLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFMucHJvdG90eXBlKSxEKF8ucHJvdG90eXBlLHthcHBlbmRDaGlsZDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoZSxudWxsKX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGUsbil7dChlKTt2YXIgcjtuP2oobik/cj1QKG4pOihyPW4sbj1BKHIpKToobj1udWxsLHI9bnVsbCksbiYmTyhuLnBhcmVudE5vZGU9PT10aGlzKTt2YXIgbyxzPW4/bi5wcmV2aW91c1NpYmxpbmc6dGhpcy5sYXN0Q2hpbGQsYz0hdGhpcy5pbnZhbGlkYXRlU2hhZG93UmVuZGVyZXIoKSYmIWcoZSk7aWYobz1jP2EoZSk6aShlLHRoaXMscyxuKSxjKWgodGhpcyxlKSx3KHRoaXMpLCQuY2FsbChJKHRoaXMpLFAoZSkscik7ZWxzZXtzfHwodGhpcy5maXJzdENoaWxkXz1vWzBdKSxufHwodGhpcy5sYXN0Q2hpbGRfPW9bby5sZW5ndGgtMV0sdm9pZCAwPT09dGhpcy5maXJzdENoaWxkXyYmKHRoaXMuZmlyc3RDaGlsZF89dGhpcy5maXJzdENoaWxkKSk7dmFyIGw9cj9yLnBhcmVudE5vZGU6SSh0aGlzKTtsPyQuY2FsbChsLG0odGhpcyxvKSxyKTpmKHRoaXMsbyl9cmV0dXJuIE4odGhpcyxcImNoaWxkTGlzdFwiLHthZGRlZE5vZGVzOm8sbmV4dFNpYmxpbmc6bixwcmV2aW91c1NpYmxpbmc6c30pLHUobyx0aGlzKSxlfSxyZW1vdmVDaGlsZDpmdW5jdGlvbihlKXtpZih0KGUpLGUucGFyZW50Tm9kZSE9PXRoaXMpe2Zvcih2YXIgcj0hMSxvPSh0aGlzLmNoaWxkTm9kZXMsdGhpcy5maXJzdENoaWxkKTtvO289by5uZXh0U2libGluZylpZihvPT09ZSl7cj0hMDticmVha31pZighcil0aHJvdyBuZXcgRXJyb3IoXCJOb3RGb3VuZEVycm9yXCIpfXZhciBpPVAoZSksYT1lLm5leHRTaWJsaW5nLHM9ZS5wcmV2aW91c1NpYmxpbmc7aWYodGhpcy5pbnZhbGlkYXRlU2hhZG93UmVuZGVyZXIoKSl7dmFyIGM9dGhpcy5maXJzdENoaWxkLGw9dGhpcy5sYXN0Q2hpbGQsdT1pLnBhcmVudE5vZGU7dSYmSih1LGkpLGM9PT1lJiYodGhpcy5maXJzdENoaWxkXz1hKSxsPT09ZSYmKHRoaXMubGFzdENoaWxkXz1zKSxzJiYocy5uZXh0U2libGluZ189YSksYSYmKGEucHJldmlvdXNTaWJsaW5nXz1zKSxlLnByZXZpb3VzU2libGluZ189ZS5uZXh0U2libGluZ189ZS5wYXJlbnROb2RlXz12b2lkIDB9ZWxzZSB3KHRoaXMpLEooSSh0aGlzKSxpKTtyZXR1cm4gVXx8Tih0aGlzLFwiY2hpbGRMaXN0XCIse3JlbW92ZWROb2RlczpuKGUpLG5leHRTaWJsaW5nOmEscHJldmlvdXNTaWJsaW5nOnN9KSxIKHRoaXMsZSksZX0scmVwbGFjZUNoaWxkOmZ1bmN0aW9uKGUscil7dChlKTt2YXIgbztpZihqKHIpP289UChyKToobz1yLHI9QShvKSksci5wYXJlbnROb2RlIT09dGhpcyl0aHJvdyBuZXcgRXJyb3IoXCJOb3RGb3VuZEVycm9yXCIpO3ZhciBzLGM9ci5uZXh0U2libGluZyxsPXIucHJldmlvdXNTaWJsaW5nLHA9IXRoaXMuaW52YWxpZGF0ZVNoYWRvd1JlbmRlcmVyKCkmJiFnKGUpO3JldHVybiBwP3M9YShlKTooYz09PWUmJihjPWUubmV4dFNpYmxpbmcpLHM9aShlLHRoaXMsbCxjKSkscD8oaCh0aGlzLGUpLHcodGhpcyksWS5jYWxsKEkodGhpcyksUChlKSxvKSk6KHRoaXMuZmlyc3RDaGlsZD09PXImJih0aGlzLmZpcnN0Q2hpbGRfPXNbMF0pLHRoaXMubGFzdENoaWxkPT09ciYmKHRoaXMubGFzdENoaWxkXz1zW3MubGVuZ3RoLTFdKSxyLnByZXZpb3VzU2libGluZ189ci5uZXh0U2libGluZ189ci5wYXJlbnROb2RlXz12b2lkIDAsby5wYXJlbnROb2RlJiZZLmNhbGwoby5wYXJlbnROb2RlLG0odGhpcyxzKSxvKSksTih0aGlzLFwiY2hpbGRMaXN0XCIse2FkZGVkTm9kZXM6cyxyZW1vdmVkTm9kZXM6bihyKSxuZXh0U2libGluZzpjLHByZXZpb3VzU2libGluZzpsfSksZChyKSx1KHMsdGhpcykscn0sbm9kZUlzSW5zZXJ0ZWRfOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyllLm5vZGVJc0luc2VydGVkXygpfSxoYXNDaGlsZE5vZGVzOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT10aGlzLmZpcnN0Q2hpbGR9LGdldCBwYXJlbnROb2RlKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMucGFyZW50Tm9kZV8/dGhpcy5wYXJlbnROb2RlXzpBKEkodGhpcykucGFyZW50Tm9kZSl9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZmlyc3RDaGlsZF8/dGhpcy5maXJzdENoaWxkXzpBKEkodGhpcykuZmlyc3RDaGlsZCl9LGdldCBsYXN0Q2hpbGQoKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5sYXN0Q2hpbGRfP3RoaXMubGFzdENoaWxkXzpBKEkodGhpcykubGFzdENoaWxkKX0sZ2V0IG5leHRTaWJsaW5nKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMubmV4dFNpYmxpbmdfP3RoaXMubmV4dFNpYmxpbmdfOkEoSSh0aGlzKS5uZXh0U2libGluZyl9LGdldCBwcmV2aW91c1NpYmxpbmcoKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5wcmV2aW91c1NpYmxpbmdfP3RoaXMucHJldmlvdXNTaWJsaW5nXzpBKEkodGhpcykucHJldmlvdXNTaWJsaW5nKX0sZ2V0IHBhcmVudEVsZW1lbnQoKXtmb3IodmFyIGU9dGhpcy5wYXJlbnROb2RlO2UmJmUubm9kZVR5cGUhPT1fLkVMRU1FTlRfTk9ERTspZT1lLnBhcmVudE5vZGU7cmV0dXJuIGV9LGdldCB0ZXh0Q29udGVudCgpe2Zvcih2YXIgZT1cIlwiLHQ9dGhpcy5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKXQubm9kZVR5cGUhPV8uQ09NTUVOVF9OT0RFJiYoZSs9dC50ZXh0Q29udGVudCk7cmV0dXJuIGV9LHNldCB0ZXh0Q29udGVudChlKXtudWxsPT1lJiYoZT1cIlwiKTt2YXIgdD1jKHRoaXMuY2hpbGROb2Rlcyk7aWYodGhpcy5pbnZhbGlkYXRlU2hhZG93UmVuZGVyZXIoKSl7aWYodih0aGlzKSxcIlwiIT09ZSl7dmFyIG49SSh0aGlzKS5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGUpO3RoaXMuYXBwZW5kQ2hpbGQobil9fWVsc2Ugdyh0aGlzKSxJKHRoaXMpLnRleHRDb250ZW50PWU7dmFyIHI9Yyh0aGlzLmNoaWxkTm9kZXMpO04odGhpcyxcImNoaWxkTGlzdFwiLHthZGRlZE5vZGVzOnIscmVtb3ZlZE5vZGVzOnR9KSxwKHQpLHUocix0aGlzKX0sZ2V0IGNoaWxkTm9kZXMoKXtmb3IodmFyIGU9bmV3IFQsdD0wLG49dGhpcy5maXJzdENoaWxkO247bj1uLm5leHRTaWJsaW5nKWVbdCsrXT1uO3JldHVybiBlLmxlbmd0aD10LGV9LGNsb25lTm9kZTpmdW5jdGlvbihlKXtyZXR1cm4geSh0aGlzLGUpfSxjb250YWluczpmdW5jdGlvbihlKXtyZXR1cm4gRSh0aGlzLFcoZSkpfSxjb21wYXJlRG9jdW1lbnRQb3NpdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4gei5jYWxsKEkodGhpcyksayhlKSl9LGlzRXF1YWxOb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBLLmNhbGwoSSh0aGlzKSxrKGUpKX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQsbj1jKHRoaXMuY2hpbGROb2Rlcykscj1bXSxvPVwiXCIsaT0wO2k8bi5sZW5ndGg7aSsrKXQ9bltpXSx0Lm5vZGVUeXBlPT09Xy5URVhUX05PREU/ZXx8dC5kYXRhLmxlbmd0aD9lPyhvKz10LmRhdGEsci5wdXNoKHQpKTplPXQ6dGhpcy5yZW1vdmVDaGlsZCh0KTooZSYmci5sZW5ndGgmJihlLmRhdGErPW8sYihyKSkscj1bXSxvPVwiXCIsZT1udWxsLHQuY2hpbGROb2Rlcy5sZW5ndGgmJnQubm9ybWFsaXplKCkpO2UmJnIubGVuZ3RoJiYoZS5kYXRhKz1vLGIocikpfX0pLEwoXyxcIm93bmVyRG9jdW1lbnRcIikseChWLF8sZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKSxkZWxldGUgXy5wcm90b3R5cGUucXVlcnlTZWxlY3RvcixkZWxldGUgXy5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCxfLnByb3RvdHlwZT1EKE9iamVjdC5jcmVhdGUoUy5wcm90b3R5cGUpLF8ucHJvdG90eXBlKSxlLmNsb25lTm9kZT15LGUubm9kZVdhc0FkZGVkPWwsZS5ub2RlV2FzUmVtb3ZlZD1kLGUubm9kZXNXZXJlQWRkZWQ9dSxlLm5vZGVzV2VyZVJlbW92ZWQ9cCxlLm9yaWdpbmFsSW5zZXJ0QmVmb3JlPSQsZS5vcmlnaW5hbFJlbW92ZUNoaWxkPVgsZS5zbmFwc2hvdE5vZGVMaXN0PWMsZS53cmFwcGVycy5Ob2RlPV99KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdCh0LG4scixvKXtmb3IodmFyIGk9bnVsbCxhPW51bGwscz0wLGM9dC5sZW5ndGg7Yz5zO3MrKylpPWIodFtzXSksIW8mJihhPXYoaSkucm9vdCkmJmEgaW5zdGFuY2VvZiBlLndyYXBwZXJzLlNoYWRvd1Jvb3R8fChyW24rK109aSk7cmV0dXJuIG59ZnVuY3Rpb24gbihlKXtyZXR1cm4gU3RyaW5nKGUpLnJlcGxhY2UoL1xcL2RlZXBcXC98OjpzaGFkb3d8Pj4+L2csXCIgXCIpfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIFN0cmluZyhlKS5yZXBsYWNlKC86aG9zdFxcKChbXlxcc10rKVxcKS9nLFwiJDFcIikucmVwbGFjZSgvKFteXFxzXSk6aG9zdC9nLFwiJDFcIikucmVwbGFjZShcIjpob3N0XCIsXCIqXCIpLnJlcGxhY2UoL1xcXnxcXC9zaGFkb3dcXC98XFwvc2hhZG93LWRlZXBcXC98OjpzaGFkb3d8XFwvZGVlcFxcL3w6OmNvbnRlbnR8Pj4+L2csXCIgXCIpfWZ1bmN0aW9uIG8oZSx0KXtmb3IodmFyIG4scj1lLmZpcnN0RWxlbWVudENoaWxkO3I7KXtpZihyLm1hdGNoZXModCkpcmV0dXJuIHI7aWYobj1vKHIsdCkpcmV0dXJuIG47cj1yLm5leHRFbGVtZW50U2libGluZ31yZXR1cm4gbnVsbH1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuIGUubWF0Y2hlcyh0KX1mdW5jdGlvbiBhKGUsdCxuKXt2YXIgcj1lLmxvY2FsTmFtZTtyZXR1cm4gcj09PXR8fHI9PT1uJiZlLm5hbWVzcGFjZVVSST09PWp9ZnVuY3Rpb24gcygpe3JldHVybiEwfWZ1bmN0aW9uIGMoZSx0LG4pe3JldHVybiBlLmxvY2FsTmFtZT09PW59ZnVuY3Rpb24gbChlLHQpe3JldHVybiBlLm5hbWVzcGFjZVVSST09PXR9ZnVuY3Rpb24gdShlLHQsbil7cmV0dXJuIGUubmFtZXNwYWNlVVJJPT09dCYmZS5sb2NhbE5hbWU9PT1ufWZ1bmN0aW9uIGQoZSx0LG4scixvLGkpe2Zvcih2YXIgYT1lLmZpcnN0RWxlbWVudENoaWxkO2E7KXIoYSxvLGkpJiYoblt0KytdPWEpLHQ9ZChhLHQsbixyLG8saSksYT1hLm5leHRFbGVtZW50U2libGluZztyZXR1cm4gdH1mdW5jdGlvbiBwKG4scixvLGksYSl7dmFyIHMsYz1nKHRoaXMpLGw9dih0aGlzKS5yb290O2lmKGwgaW5zdGFuY2VvZiBlLndyYXBwZXJzLlNoYWRvd1Jvb3QpcmV0dXJuIGQodGhpcyxyLG8sbixpLG51bGwpO2lmKGMgaW5zdGFuY2VvZiBOKXM9Uy5jYWxsKGMsaSk7ZWxzZXtpZighKGMgaW5zdGFuY2VvZiBDKSlyZXR1cm4gZCh0aGlzLHIsbyxuLGksbnVsbCk7cz1fLmNhbGwoYyxpKX1yZXR1cm4gdChzLHIsbyxhKX1mdW5jdGlvbiBoKG4scixvLGksYSl7dmFyIHMsYz1nKHRoaXMpLGw9dih0aGlzKS5yb290O2lmKGwgaW5zdGFuY2VvZiBlLndyYXBwZXJzLlNoYWRvd1Jvb3QpcmV0dXJuIGQodGhpcyxyLG8sbixpLGEpO2lmKGMgaW5zdGFuY2VvZiBOKXM9TS5jYWxsKGMsaSxhKTtlbHNle2lmKCEoYyBpbnN0YW5jZW9mIEMpKXJldHVybiBkKHRoaXMscixvLG4saSxhKTtzPVQuY2FsbChjLGksYSl9cmV0dXJuIHQocyxyLG8sITEpfWZ1bmN0aW9uIGYobixyLG8saSxhKXt2YXIgcyxjPWcodGhpcyksbD12KHRoaXMpLnJvb3Q7aWYobCBpbnN0YW5jZW9mIGUud3JhcHBlcnMuU2hhZG93Um9vdClyZXR1cm4gZCh0aGlzLHIsbyxuLGksYSk7aWYoYyBpbnN0YW5jZW9mIE4pcz1MLmNhbGwoYyxpLGEpO2Vsc2V7aWYoIShjIGluc3RhbmNlb2YgQykpcmV0dXJuIGQodGhpcyxyLG8sbixpLGEpO3M9Ty5jYWxsKGMsaSxhKX1yZXR1cm4gdChzLHIsbywhMSl9dmFyIG09ZS53cmFwcGVycy5IVE1MQ29sbGVjdGlvbix3PWUud3JhcHBlcnMuTm9kZUxpc3Qsdj1lLmdldFRyZWVTY29wZSxnPWUudW5zYWZlVW53cmFwLGI9ZS53cmFwLHk9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcixFPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yLF89ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCxTPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsLFQ9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUsTT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUsTz1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TLEw9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMsTj13aW5kb3cuRWxlbWVudCxDPXdpbmRvdy5IVE1MRG9jdW1lbnR8fHdpbmRvdy5Eb2N1bWVudCxqPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiLEQ9e1xucXVlcnlTZWxlY3RvcjpmdW5jdGlvbih0KXt2YXIgcj1uKHQpLGk9ciE9PXQ7dD1yO3ZhciBhLHM9Zyh0aGlzKSxjPXYodGhpcykucm9vdDtpZihjIGluc3RhbmNlb2YgZS53cmFwcGVycy5TaGFkb3dSb290KXJldHVybiBvKHRoaXMsdCk7aWYocyBpbnN0YW5jZW9mIE4pYT1iKEUuY2FsbChzLHQpKTtlbHNle2lmKCEocyBpbnN0YW5jZW9mIEMpKXJldHVybiBvKHRoaXMsdCk7YT1iKHkuY2FsbChzLHQpKX1yZXR1cm4gYSYmIWkmJihjPXYoYSkucm9vdCkmJmMgaW5zdGFuY2VvZiBlLndyYXBwZXJzLlNoYWRvd1Jvb3Q/byh0aGlzLHQpOmF9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24oZSl7dmFyIHQ9bihlKSxyPXQhPT1lO2U9dDt2YXIgbz1uZXcgdztyZXR1cm4gby5sZW5ndGg9cC5jYWxsKHRoaXMsaSwwLG8sZSxyKSxvfX0sSD17bWF0Y2hlczpmdW5jdGlvbih0KXtyZXR1cm4gdD1yKHQpLGUub3JpZ2luYWxNYXRjaGVzLmNhbGwoZyh0aGlzKSx0KX19LHg9e2dldEVsZW1lbnRzQnlUYWdOYW1lOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBtLG49XCIqXCI9PT1lP3M6YTtyZXR1cm4gdC5sZW5ndGg9aC5jYWxsKHRoaXMsbiwwLHQsZSxlLnRvTG93ZXJDYXNlKCkpLHR9LGdldEVsZW1lbnRzQnlDbGFzc05hbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbChcIi5cIitlKX0sZ2V0RWxlbWVudHNCeVRhZ05hbWVOUzpmdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBtLHI9bnVsbDtyZXR1cm4gcj1cIipcIj09PWU/XCIqXCI9PT10P3M6YzpcIipcIj09PXQ/bDp1LG4ubGVuZ3RoPWYuY2FsbCh0aGlzLHIsMCxuLGV8fG51bGwsdCksbn19O2UuR2V0RWxlbWVudHNCeUludGVyZmFjZT14LGUuU2VsZWN0b3JzSW50ZXJmYWNlPUQsZS5NYXRjaGVzSW50ZXJmYWNlPUh9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtmb3IoO2UmJmUubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERTspZT1lLm5leHRTaWJsaW5nO3JldHVybiBlfWZ1bmN0aW9uIG4oZSl7Zm9yKDtlJiZlLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWU9ZS5wcmV2aW91c1NpYmxpbmc7cmV0dXJuIGV9dmFyIHI9ZS53cmFwcGVycy5Ob2RlTGlzdCxvPXtnZXQgZmlyc3RFbGVtZW50Q2hpbGQoKXtyZXR1cm4gdCh0aGlzLmZpcnN0Q2hpbGQpfSxnZXQgbGFzdEVsZW1lbnRDaGlsZCgpe3JldHVybiBuKHRoaXMubGFzdENoaWxkKX0sZ2V0IGNoaWxkRWxlbWVudENvdW50KCl7Zm9yKHZhciBlPTAsdD10aGlzLmZpcnN0RWxlbWVudENoaWxkO3Q7dD10Lm5leHRFbGVtZW50U2libGluZyllKys7cmV0dXJuIGV9LGdldCBjaGlsZHJlbigpe2Zvcih2YXIgZT1uZXcgcix0PTAsbj10aGlzLmZpcnN0RWxlbWVudENoaWxkO247bj1uLm5leHRFbGVtZW50U2libGluZyllW3QrK109bjtyZXR1cm4gZS5sZW5ndGg9dCxlfSxyZW1vdmU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBhcmVudE5vZGU7ZSYmZS5yZW1vdmVDaGlsZCh0aGlzKX19LGk9e2dldCBuZXh0RWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdCh0aGlzLm5leHRTaWJsaW5nKX0sZ2V0IHByZXZpb3VzRWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gbih0aGlzLnByZXZpb3VzU2libGluZyl9fSxhPXtnZXRFbGVtZW50QnlJZDpmdW5jdGlvbihlKXtyZXR1cm4vWyBcXHRcXG5cXHJcXGZdLy50ZXN0KGUpP251bGw6dGhpcy5xdWVyeVNlbGVjdG9yKCdbaWQ9XCInK2UrJ1wiXScpfX07ZS5DaGlsZE5vZGVJbnRlcmZhY2U9aSxlLk5vbkVsZW1lbnRQYXJlbnROb2RlSW50ZXJmYWNlPWEsZS5QYXJlbnROb2RlSW50ZXJmYWNlPW99KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtyLmNhbGwodGhpcyxlKX12YXIgbj1lLkNoaWxkTm9kZUludGVyZmFjZSxyPWUud3JhcHBlcnMuTm9kZSxvPWUuZW5xdWV1ZU11dGF0aW9uLGk9ZS5taXhpbixhPWUucmVnaXN0ZXJXcmFwcGVyLHM9ZS51bnNhZmVVbndyYXAsYz13aW5kb3cuQ2hhcmFjdGVyRGF0YTt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHIucHJvdG90eXBlKSxpKHQucHJvdG90eXBlLHtnZXQgbm9kZVZhbHVlKCl7cmV0dXJuIHRoaXMuZGF0YX0sc2V0IG5vZGVWYWx1ZShlKXt0aGlzLmRhdGE9ZX0sZ2V0IHRleHRDb250ZW50KCl7cmV0dXJuIHRoaXMuZGF0YX0sc2V0IHRleHRDb250ZW50KGUpe3RoaXMuZGF0YT1lfSxnZXQgZGF0YSgpe3JldHVybiBzKHRoaXMpLmRhdGF9LHNldCBkYXRhKGUpe3ZhciB0PXModGhpcykuZGF0YTtvKHRoaXMsXCJjaGFyYWN0ZXJEYXRhXCIse29sZFZhbHVlOnR9KSxzKHRoaXMpLmRhdGE9ZX19KSxpKHQucHJvdG90eXBlLG4pLGEoYyx0LGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpKSxlLndyYXBwZXJzLkNoYXJhY3RlckRhdGE9dH0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe3JldHVybiBlPj4+MH1mdW5jdGlvbiBuKGUpe3IuY2FsbCh0aGlzLGUpfXZhciByPWUud3JhcHBlcnMuQ2hhcmFjdGVyRGF0YSxvPShlLmVucXVldWVNdXRhdGlvbixlLm1peGluKSxpPWUucmVnaXN0ZXJXcmFwcGVyLGE9d2luZG93LlRleHQ7bi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSksbyhuLnByb3RvdHlwZSx7c3BsaXRUZXh0OmZ1bmN0aW9uKGUpe2U9dChlKTt2YXIgbj10aGlzLmRhdGE7aWYoZT5uLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJJbmRleFNpemVFcnJvclwiKTt2YXIgcj1uLnNsaWNlKDAsZSksbz1uLnNsaWNlKGUpO3RoaXMuZGF0YT1yO3ZhciBpPXRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShvKTtyZXR1cm4gdGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGksdGhpcy5uZXh0U2libGluZyksaX19KSxpKGEsbixkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKSksZS53cmFwcGVycy5UZXh0PW59KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtyZXR1cm4gaShlKS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKX1mdW5jdGlvbiBuKGUsdCl7YShlLFwiYXR0cmlidXRlc1wiLHtuYW1lOlwiY2xhc3NcIixuYW1lc3BhY2U6bnVsbCxvbGRWYWx1ZTp0fSl9ZnVuY3Rpb24gcih0KXtlLmludmFsaWRhdGVSZW5kZXJlckJhc2VkT25BdHRyaWJ1dGUodCxcImNsYXNzXCIpfWZ1bmN0aW9uIG8oZSxvLGkpe3ZhciBhPWUub3duZXJFbGVtZW50XztpZihudWxsPT1hKXJldHVybiBvLmFwcGx5KGUsaSk7dmFyIHM9dChhKSxjPW8uYXBwbHkoZSxpKTtyZXR1cm4gdChhKSE9PXMmJihuKGEscykscihhKSksY31pZighd2luZG93LkRPTVRva2VuTGlzdClyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oXCJNaXNzaW5nIERPTVRva2VuTGlzdCBwcm90b3R5cGUsIHBsZWFzZSBpbmNsdWRlIGEgY29tcGF0aWJsZSBjbGFzc0xpc3QgcG9seWZpbGwgc3VjaCBhcyBodHRwOi8vZ29vLmdsL3VUY2VwSC5cIik7dmFyIGk9ZS51bnNhZmVVbndyYXAsYT1lLmVucXVldWVNdXRhdGlvbixzPURPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkO0RPTVRva2VuTGlzdC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKCl7byh0aGlzLHMsYXJndW1lbnRzKX07dmFyIGM9RE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU7RE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXtvKHRoaXMsYyxhcmd1bWVudHMpfTt2YXIgbD1ET01Ub2tlbkxpc3QucHJvdG90eXBlLnRvZ2dsZTtET01Ub2tlbkxpc3QucHJvdG90eXBlLnRvZ2dsZT1mdW5jdGlvbigpe3JldHVybiBvKHRoaXMsbCxhcmd1bWVudHMpfX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KHQsbil7dmFyIHI9dC5wYXJlbnROb2RlO2lmKHImJnIuc2hhZG93Um9vdCl7dmFyIG89ZS5nZXRSZW5kZXJlckZvckhvc3Qocik7by5kZXBlbmRzT25BdHRyaWJ1dGUobikmJm8uaW52YWxpZGF0ZSgpfX1mdW5jdGlvbiBuKGUsdCxuKXt1KGUsXCJhdHRyaWJ1dGVzXCIse25hbWU6dCxuYW1lc3BhY2U6bnVsbCxvbGRWYWx1ZTpufSl9ZnVuY3Rpb24gcihlKXthLmNhbGwodGhpcyxlKX12YXIgbz1lLkNoaWxkTm9kZUludGVyZmFjZSxpPWUuR2V0RWxlbWVudHNCeUludGVyZmFjZSxhPWUud3JhcHBlcnMuTm9kZSxzPWUuUGFyZW50Tm9kZUludGVyZmFjZSxjPWUuU2VsZWN0b3JzSW50ZXJmYWNlLGw9ZS5NYXRjaGVzSW50ZXJmYWNlLHU9KGUuYWRkV3JhcE5vZGVMaXN0TWV0aG9kLGUuZW5xdWV1ZU11dGF0aW9uKSxkPWUubWl4aW4scD0oZS5vbmVPZixlLnJlZ2lzdGVyV3JhcHBlciksaD1lLnVuc2FmZVVud3JhcCxmPWUud3JhcHBlcnMsbT13aW5kb3cuRWxlbWVudCx3PVtcIm1hdGNoZXNcIixcIm1vek1hdGNoZXNTZWxlY3RvclwiLFwibXNNYXRjaGVzU2VsZWN0b3JcIixcIndlYmtpdE1hdGNoZXNTZWxlY3RvclwiXS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIG0ucHJvdG90eXBlW2VdfSksdj13WzBdLGc9bS5wcm90b3R5cGVbdl0sYj1uZXcgV2Vha01hcDtyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGEucHJvdG90eXBlKSxkKHIucHJvdG90eXBlLHtjcmVhdGVTaGFkb3dSb290OmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGYuU2hhZG93Um9vdCh0aGlzKTtoKHRoaXMpLnBvbHltZXJTaGFkb3dSb290Xz10O3ZhciBuPWUuZ2V0UmVuZGVyZXJGb3JIb3N0KHRoaXMpO3JldHVybiBuLmludmFsaWRhdGUoKSx0fSxnZXQgc2hhZG93Um9vdCgpe3JldHVybiBoKHRoaXMpLnBvbHltZXJTaGFkb3dSb290X3x8bnVsbH0sc2V0QXR0cmlidXRlOmZ1bmN0aW9uKGUscil7dmFyIG89aCh0aGlzKS5nZXRBdHRyaWJ1dGUoZSk7aCh0aGlzKS5zZXRBdHRyaWJ1dGUoZSxyKSxuKHRoaXMsZSxvKSx0KHRoaXMsZSl9LHJlbW92ZUF0dHJpYnV0ZTpmdW5jdGlvbihlKXt2YXIgcj1oKHRoaXMpLmdldEF0dHJpYnV0ZShlKTtoKHRoaXMpLnJlbW92ZUF0dHJpYnV0ZShlKSxuKHRoaXMsZSxyKSx0KHRoaXMsZSl9LGdldCBjbGFzc0xpc3QoKXt2YXIgZT1iLmdldCh0aGlzKTtpZighZSl7aWYoZT1oKHRoaXMpLmNsYXNzTGlzdCwhZSlyZXR1cm47ZS5vd25lckVsZW1lbnRfPXRoaXMsYi5zZXQodGhpcyxlKX1yZXR1cm4gZX0sZ2V0IGNsYXNzTmFtZSgpe3JldHVybiBoKHRoaXMpLmNsYXNzTmFtZX0sc2V0IGNsYXNzTmFtZShlKXt0aGlzLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsZSl9LGdldCBpZCgpe3JldHVybiBoKHRoaXMpLmlkfSxzZXQgaWQoZSl7dGhpcy5zZXRBdHRyaWJ1dGUoXCJpZFwiLGUpfX0pLHcuZm9yRWFjaChmdW5jdGlvbihlKXtcIm1hdGNoZXNcIiE9PWUmJihyLnByb3RvdHlwZVtlXT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5tYXRjaGVzKGUpfSl9KSxtLnByb3RvdHlwZS53ZWJraXRDcmVhdGVTaGFkb3dSb290JiYoci5wcm90b3R5cGUud2Via2l0Q3JlYXRlU2hhZG93Um9vdD1yLnByb3RvdHlwZS5jcmVhdGVTaGFkb3dSb290KSxkKHIucHJvdG90eXBlLG8pLGQoci5wcm90b3R5cGUsaSksZChyLnByb3RvdHlwZSxzKSxkKHIucHJvdG90eXBlLGMpLGQoci5wcm90b3R5cGUsbCkscChtLHIsZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG51bGwsXCJ4XCIpKSxlLmludmFsaWRhdGVSZW5kZXJlckJhc2VkT25BdHRyaWJ1dGU9dCxlLm1hdGNoZXNOYW1lcz13LGUub3JpZ2luYWxNYXRjaGVzPWcsZS53cmFwcGVycy5FbGVtZW50PXJ9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtzd2l0Y2goZSl7Y2FzZVwiJlwiOnJldHVyblwiJmFtcDtcIjtjYXNlXCI8XCI6cmV0dXJuXCImbHQ7XCI7Y2FzZVwiPlwiOnJldHVyblwiJmd0O1wiO2Nhc2UnXCInOnJldHVyblwiJnF1b3Q7XCI7Y2FzZVwiwqBcIjpyZXR1cm5cIiZuYnNwO1wifX1mdW5jdGlvbiBuKGUpe3JldHVybiBlLnJlcGxhY2UoTCx0KX1mdW5jdGlvbiByKGUpe3JldHVybiBlLnJlcGxhY2UoTix0KX1mdW5jdGlvbiBvKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspdFtlW25dXT0hMDtyZXR1cm4gdH1mdW5jdGlvbiBpKGUpe2lmKGUubmFtZXNwYWNlVVJJIT09RClyZXR1cm4hMDt2YXIgdD1lLm93bmVyRG9jdW1lbnQuZG9jdHlwZTtyZXR1cm4gdCYmdC5wdWJsaWNJZCYmdC5zeXN0ZW1JZH1mdW5jdGlvbiBhKGUsdCl7c3dpdGNoKGUubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Zm9yKHZhciBvLGE9ZS50YWdOYW1lLnRvTG93ZXJDYXNlKCksYz1cIjxcIithLGw9ZS5hdHRyaWJ1dGVzLHU9MDtvPWxbdV07dSsrKWMrPVwiIFwiK28ubmFtZSsnPVwiJytuKG8udmFsdWUpKydcIic7cmV0dXJuIENbYV0/KGkoZSkmJihjKz1cIi9cIiksYytcIj5cIik6YytcIj5cIitzKGUpK1wiPC9cIithK1wiPlwiO2Nhc2UgTm9kZS5URVhUX05PREU6dmFyIGQ9ZS5kYXRhO3JldHVybiB0JiZqW3QubG9jYWxOYW1lXT9kOnIoZCk7Y2FzZSBOb2RlLkNPTU1FTlRfTk9ERTpyZXR1cm5cIjwhLS1cIitlLmRhdGErXCItLT5cIjtkZWZhdWx0OnRocm93IGNvbnNvbGUuZXJyb3IoZSksbmV3IEVycm9yKFwibm90IGltcGxlbWVudGVkXCIpfX1mdW5jdGlvbiBzKGUpe2UgaW5zdGFuY2VvZiBPLkhUTUxUZW1wbGF0ZUVsZW1lbnQmJihlPWUuY29udGVudCk7Zm9yKHZhciB0PVwiXCIsbj1lLmZpcnN0Q2hpbGQ7bjtuPW4ubmV4dFNpYmxpbmcpdCs9YShuLGUpO3JldHVybiB0fWZ1bmN0aW9uIGMoZSx0LG4pe3ZhciByPW58fFwiZGl2XCI7ZS50ZXh0Q29udGVudD1cIlwiO3ZhciBvPVQoZS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocikpO28uaW5uZXJIVE1MPXQ7Zm9yKHZhciBpO2k9by5maXJzdENoaWxkOyllLmFwcGVuZENoaWxkKE0oaSkpfWZ1bmN0aW9uIGwoZSl7bS5jYWxsKHRoaXMsZSl9ZnVuY3Rpb24gdShlLHQpe3ZhciBuPVQoZS5jbG9uZU5vZGUoITEpKTtuLmlubmVySFRNTD10O2Zvcih2YXIgcixvPVQoZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtyPW4uZmlyc3RDaGlsZDspby5hcHBlbmRDaGlsZChyKTtyZXR1cm4gTShvKX1mdW5jdGlvbiBkKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLnJlbmRlckFsbFBlbmRpbmcoKSxTKHRoaXMpW3RdfX1mdW5jdGlvbiBwKGUpe3cobCxlLGQoZSkpfWZ1bmN0aW9uIGgodCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGwucHJvdG90eXBlLHQse2dldDpkKHQpLHNldDpmdW5jdGlvbihuKXtlLnJlbmRlckFsbFBlbmRpbmcoKSxTKHRoaXMpW3RdPW59LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSl9ZnVuY3Rpb24gZih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkobC5wcm90b3R5cGUsdCx7dmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZW5kZXJBbGxQZW5kaW5nKCksUyh0aGlzKVt0XS5hcHBseShTKHRoaXMpLGFyZ3VtZW50cyl9LGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwfSl9dmFyIG09ZS53cmFwcGVycy5FbGVtZW50LHc9ZS5kZWZpbmVHZXR0ZXIsdj1lLmVucXVldWVNdXRhdGlvbixnPWUubWl4aW4sYj1lLm5vZGVzV2VyZUFkZGVkLHk9ZS5ub2Rlc1dlcmVSZW1vdmVkLEU9ZS5yZWdpc3RlcldyYXBwZXIsXz1lLnNuYXBzaG90Tm9kZUxpc3QsUz1lLnVuc2FmZVVud3JhcCxUPWUudW53cmFwLE09ZS53cmFwLE89ZS53cmFwcGVycyxMPS9bJlxcdTAwQTBcIl0vZyxOPS9bJlxcdTAwQTA8Pl0vZyxDPW8oW1wiYXJlYVwiLFwiYmFzZVwiLFwiYnJcIixcImNvbFwiLFwiY29tbWFuZFwiLFwiZW1iZWRcIixcImhyXCIsXCJpbWdcIixcImlucHV0XCIsXCJrZXlnZW5cIixcImxpbmtcIixcIm1ldGFcIixcInBhcmFtXCIsXCJzb3VyY2VcIixcInRyYWNrXCIsXCJ3YnJcIl0pLGo9byhbXCJzdHlsZVwiLFwic2NyaXB0XCIsXCJ4bXBcIixcImlmcmFtZVwiLFwibm9lbWJlZFwiLFwibm9mcmFtZXNcIixcInBsYWludGV4dFwiLFwibm9zY3JpcHRcIl0pLEQ9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIsSD0vTVNJRS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx4PXdpbmRvdy5IVE1MRWxlbWVudCxSPXdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50O2wucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobS5wcm90b3R5cGUpLGcobC5wcm90b3R5cGUse2dldCBpbm5lckhUTUwoKXtyZXR1cm4gcyh0aGlzKX0sc2V0IGlubmVySFRNTChlKXtpZihIJiZqW3RoaXMubG9jYWxOYW1lXSlyZXR1cm4gdm9pZCh0aGlzLnRleHRDb250ZW50PWUpO3ZhciB0PV8odGhpcy5jaGlsZE5vZGVzKTt0aGlzLmludmFsaWRhdGVTaGFkb3dSZW5kZXJlcigpP3RoaXMgaW5zdGFuY2VvZiBPLkhUTUxUZW1wbGF0ZUVsZW1lbnQ/Yyh0aGlzLmNvbnRlbnQsZSk6Yyh0aGlzLGUsdGhpcy50YWdOYW1lKTohUiYmdGhpcyBpbnN0YW5jZW9mIE8uSFRNTFRlbXBsYXRlRWxlbWVudD9jKHRoaXMuY29udGVudCxlKTpTKHRoaXMpLmlubmVySFRNTD1lO3ZhciBuPV8odGhpcy5jaGlsZE5vZGVzKTt2KHRoaXMsXCJjaGlsZExpc3RcIix7YWRkZWROb2RlczpuLHJlbW92ZWROb2Rlczp0fSkseSh0KSxiKG4sdGhpcyl9LGdldCBvdXRlckhUTUwoKXtyZXR1cm4gYSh0aGlzLHRoaXMucGFyZW50Tm9kZSl9LHNldCBvdXRlckhUTUwoZSl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO2lmKHQpe3QuaW52YWxpZGF0ZVNoYWRvd1JlbmRlcmVyKCk7dmFyIG49dSh0LGUpO3QucmVwbGFjZUNoaWxkKG4sdGhpcyl9fSxpbnNlcnRBZGphY2VudEhUTUw6ZnVuY3Rpb24oZSx0KXt2YXIgbixyO3N3aXRjaChTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSl7Y2FzZVwiYmVmb3JlYmVnaW5cIjpuPXRoaXMucGFyZW50Tm9kZSxyPXRoaXM7YnJlYWs7Y2FzZVwiYWZ0ZXJlbmRcIjpuPXRoaXMucGFyZW50Tm9kZSxyPXRoaXMubmV4dFNpYmxpbmc7YnJlYWs7Y2FzZVwiYWZ0ZXJiZWdpblwiOm49dGhpcyxyPXRoaXMuZmlyc3RDaGlsZDticmVhaztjYXNlXCJiZWZvcmVlbmRcIjpuPXRoaXMscj1udWxsO2JyZWFrO2RlZmF1bHQ6cmV0dXJufXZhciBvPXUobix0KTtuLmluc2VydEJlZm9yZShvLHIpfSxnZXQgaGlkZGVuKCl7cmV0dXJuIHRoaXMuaGFzQXR0cmlidXRlKFwiaGlkZGVuXCIpfSxzZXQgaGlkZGVuKGUpe2U/dGhpcy5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIixcIlwiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKX19KSxbXCJjbGllbnRIZWlnaHRcIixcImNsaWVudExlZnRcIixcImNsaWVudFRvcFwiLFwiY2xpZW50V2lkdGhcIixcIm9mZnNldEhlaWdodFwiLFwib2Zmc2V0TGVmdFwiLFwib2Zmc2V0VG9wXCIsXCJvZmZzZXRXaWR0aFwiLFwic2Nyb2xsSGVpZ2h0XCIsXCJzY3JvbGxXaWR0aFwiXS5mb3JFYWNoKHApLFtcInNjcm9sbExlZnRcIixcInNjcm9sbFRvcFwiXS5mb3JFYWNoKGgpLFtcImZvY3VzXCIsXCJnZXRCb3VuZGluZ0NsaWVudFJlY3RcIixcImdldENsaWVudFJlY3RzXCIsXCJzY3JvbGxJbnRvVmlld1wiXS5mb3JFYWNoKGYpLEUoeCxsLGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiXCIpKSxlLndyYXBwZXJzLkhUTUxFbGVtZW50PWwsZS5nZXRJbm5lckhUTUw9cyxlLnNldElubmVySFRNTD1jfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7bi5jYWxsKHRoaXMsZSl9dmFyIG49ZS53cmFwcGVycy5IVE1MRWxlbWVudCxyPWUubWl4aW4sbz1lLnJlZ2lzdGVyV3JhcHBlcixpPWUudW5zYWZlVW53cmFwLGE9ZS53cmFwLHM9d2luZG93LkhUTUxDYW52YXNFbGVtZW50O3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLHIodC5wcm90b3R5cGUse2dldENvbnRleHQ6ZnVuY3Rpb24oKXt2YXIgZT1pKHRoaXMpLmdldENvbnRleHQuYXBwbHkoaSh0aGlzKSxhcmd1bWVudHMpO3JldHVybiBlJiZhKGUpfX0pLG8ocyx0LGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikpLGUud3JhcHBlcnMuSFRNTENhbnZhc0VsZW1lbnQ9dH0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe24uY2FsbCh0aGlzLGUpfXZhciBuPWUud3JhcHBlcnMuSFRNTEVsZW1lbnQscj1lLm1peGluLG89ZS5yZWdpc3RlcldyYXBwZXIsaT13aW5kb3cuSFRNTENvbnRlbnRFbGVtZW50O3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLHIodC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnQsZ2V0IHNlbGVjdCgpe3JldHVybiB0aGlzLmdldEF0dHJpYnV0ZShcInNlbGVjdFwiKX0sc2V0IHNlbGVjdChlKXt0aGlzLnNldEF0dHJpYnV0ZShcInNlbGVjdFwiLGUpfSxzZXRBdHRyaWJ1dGU6ZnVuY3Rpb24oZSx0KXtuLnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUuY2FsbCh0aGlzLGUsdCksXCJzZWxlY3RcIj09PVN0cmluZyhlKS50b0xvd2VyQ2FzZSgpJiZ0aGlzLmludmFsaWRhdGVTaGFkb3dSZW5kZXJlcighMCl9fSksaSYmbyhpLHQpLGUud3JhcHBlcnMuSFRNTENvbnRlbnRFbGVtZW50PXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtuLmNhbGwodGhpcyxlKX12YXIgbj1lLndyYXBwZXJzLkhUTUxFbGVtZW50LHI9ZS5taXhpbixvPWUucmVnaXN0ZXJXcmFwcGVyLGk9ZS53cmFwSFRNTENvbGxlY3Rpb24sYT1lLnVud3JhcCxzPXdpbmRvdy5IVE1MRm9ybUVsZW1lbnQ7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkscih0LnByb3RvdHlwZSx7Z2V0IGVsZW1lbnRzKCl7cmV0dXJuIGkoYSh0aGlzKS5lbGVtZW50cyl9fSksbyhzLHQsZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIikpLGUud3JhcHBlcnMuSFRNTEZvcm1FbGVtZW50PXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtyLmNhbGwodGhpcyxlKX1mdW5jdGlvbiBuKGUsdCl7aWYoISh0aGlzIGluc3RhbmNlb2YgbikpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRPTSBvYmplY3QgY29uc3RydWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLlwiKTt2YXIgbz1pKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIikpO3IuY2FsbCh0aGlzLG8pLGEobyx0aGlzKSx2b2lkIDAhPT1lJiYoby53aWR0aD1lKSx2b2lkIDAhPT10JiYoby5oZWlnaHQ9dCl9dmFyIHI9ZS53cmFwcGVycy5IVE1MRWxlbWVudCxvPWUucmVnaXN0ZXJXcmFwcGVyLGk9ZS51bndyYXAsYT1lLnJld3JhcCxzPXdpbmRvdy5IVE1MSW1hZ2VFbGVtZW50O3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpLG8ocyx0LGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIikpLG4ucHJvdG90eXBlPXQucHJvdG90eXBlLGUud3JhcHBlcnMuSFRNTEltYWdlRWxlbWVudD10LGUud3JhcHBlcnMuSW1hZ2U9bn0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe24uY2FsbCh0aGlzLGUpfXZhciBuPWUud3JhcHBlcnMuSFRNTEVsZW1lbnQscj0oZS5taXhpbixlLndyYXBwZXJzLk5vZGVMaXN0LGUucmVnaXN0ZXJXcmFwcGVyKSxvPXdpbmRvdy5IVE1MU2hhZG93RWxlbWVudDt0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LG8mJnIobyx0KSxlLndyYXBwZXJzLkhUTUxTaGFkb3dFbGVtZW50PXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtpZighZS5kZWZhdWx0VmlldylyZXR1cm4gZTt2YXIgdD1kLmdldChlKTtpZighdCl7Zm9yKHQ9ZS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoXCJcIik7dC5sYXN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5sYXN0Q2hpbGQpO2Quc2V0KGUsdCl9cmV0dXJuIHR9ZnVuY3Rpb24gbihlKXtmb3IodmFyIG4scj10KGUub3duZXJEb2N1bWVudCksbz1jKHIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtuPWUuZmlyc3RDaGlsZDspby5hcHBlbmRDaGlsZChuKTtyZXR1cm4gb31mdW5jdGlvbiByKGUpe2lmKG8uY2FsbCh0aGlzLGUpLCFwKXt2YXIgdD1uKGUpO3Uuc2V0KHRoaXMsbCh0KSl9fXZhciBvPWUud3JhcHBlcnMuSFRNTEVsZW1lbnQsaT1lLm1peGluLGE9ZS5yZWdpc3RlcldyYXBwZXIscz1lLnVuc2FmZVVud3JhcCxjPWUudW53cmFwLGw9ZS53cmFwLHU9bmV3IFdlYWtNYXAsZD1uZXcgV2Vha01hcCxwPXdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50O3IucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLGkoci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnIsZ2V0IGNvbnRlbnQoKXtyZXR1cm4gcD9sKHModGhpcykuY29udGVudCk6dS5nZXQodGhpcyl9fSkscCYmYShwLHIpLGUud3JhcHBlcnMuSFRNTFRlbXBsYXRlRWxlbWVudD1yfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7bi5jYWxsKHRoaXMsZSl9dmFyIG49ZS53cmFwcGVycy5IVE1MRWxlbWVudCxyPWUucmVnaXN0ZXJXcmFwcGVyLG89d2luZG93LkhUTUxNZWRpYUVsZW1lbnQ7byYmKHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLHIobyx0LGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhdWRpb1wiKSksZS53cmFwcGVycy5IVE1MTWVkaWFFbGVtZW50PXQpfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7ci5jYWxsKHRoaXMsZSl9ZnVuY3Rpb24gbihlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBuKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO3ZhciB0PWkoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImF1ZGlvXCIpKTtyLmNhbGwodGhpcyx0KSxhKHQsdGhpcyksdC5zZXRBdHRyaWJ1dGUoXCJwcmVsb2FkXCIsXCJhdXRvXCIpLHZvaWQgMCE9PWUmJnQuc2V0QXR0cmlidXRlKFwic3JjXCIsZSl9dmFyIHI9ZS53cmFwcGVycy5IVE1MTWVkaWFFbGVtZW50LG89ZS5yZWdpc3RlcldyYXBwZXIsaT1lLnVud3JhcCxhPWUucmV3cmFwLHM9d2luZG93LkhUTUxBdWRpb0VsZW1lbnQ7cyYmKHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpLG8ocyx0LGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJhdWRpb1wiKSksbi5wcm90b3R5cGU9dC5wcm90b3R5cGUsZS53cmFwcGVycy5IVE1MQXVkaW9FbGVtZW50PXQsZS53cmFwcGVycy5BdWRpbz1uKX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe3JldHVybiBlLnJlcGxhY2UoL1xccysvZyxcIiBcIikudHJpbSgpfWZ1bmN0aW9uIG4oZSl7by5jYWxsKHRoaXMsZSl9ZnVuY3Rpb24gcihlLHQsbixpKXtpZighKHRoaXMgaW5zdGFuY2VvZiByKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiRE9NIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uXCIpO3ZhciBhPWMoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKSk7by5jYWxsKHRoaXMsYSkscyhhLHRoaXMpLHZvaWQgMCE9PWUmJihhLnRleHQ9ZSksdm9pZCAwIT09dCYmYS5zZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiLHQpLG49PT0hMCYmYS5zZXRBdHRyaWJ1dGUoXCJzZWxlY3RlZFwiLFwiXCIpLGEuc2VsZWN0ZWQ9aT09PSEwfXZhciBvPWUud3JhcHBlcnMuSFRNTEVsZW1lbnQsaT1lLm1peGluLGE9ZS5yZWdpc3RlcldyYXBwZXIscz1lLnJld3JhcCxjPWUudW53cmFwLGw9ZS53cmFwLHU9d2luZG93LkhUTUxPcHRpb25FbGVtZW50O24ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLGkobi5wcm90b3R5cGUse2dldCB0ZXh0KCl7cmV0dXJuIHQodGhpcy50ZXh0Q29udGVudCl9LHNldCB0ZXh0KGUpe3RoaXMudGV4dENvbnRlbnQ9dChTdHJpbmcoZSkpfSxnZXQgZm9ybSgpe3JldHVybiBsKGModGhpcykuZm9ybSl9fSksYSh1LG4sZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKSksci5wcm90b3R5cGU9bi5wcm90b3R5cGUsZS53cmFwcGVycy5IVE1MT3B0aW9uRWxlbWVudD1uLGUud3JhcHBlcnMuT3B0aW9uPXJ9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtuLmNhbGwodGhpcyxlKX12YXIgbj1lLndyYXBwZXJzLkhUTUxFbGVtZW50LHI9ZS5taXhpbixvPWUucmVnaXN0ZXJXcmFwcGVyLGk9ZS51bndyYXAsYT1lLndyYXAscz13aW5kb3cuSFRNTFNlbGVjdEVsZW1lbnQ7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkscih0LnByb3RvdHlwZSx7YWRkOmZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIHQmJih0PWkodCkpLGkodGhpcykuYWRkKGkoZSksdCl9LHJlbW92ZTpmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT92b2lkIG4ucHJvdG90eXBlLnJlbW92ZS5jYWxsKHRoaXMpOihcIm9iamVjdFwiPT10eXBlb2YgZSYmKGU9aShlKSksdm9pZCBpKHRoaXMpLnJlbW92ZShlKSl9LGdldCBmb3JtKCl7cmV0dXJuIGEoaSh0aGlzKS5mb3JtKX19KSxvKHMsdCxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpKSxlLndyYXBwZXJzLkhUTUxTZWxlY3RFbGVtZW50PXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtuLmNhbGwodGhpcyxlKX12YXIgbj1lLndyYXBwZXJzLkhUTUxFbGVtZW50LHI9ZS5taXhpbixvPWUucmVnaXN0ZXJXcmFwcGVyLGk9ZS51bndyYXAsYT1lLndyYXAscz1lLndyYXBIVE1MQ29sbGVjdGlvbixjPXdpbmRvdy5IVE1MVGFibGVFbGVtZW50O3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLHIodC5wcm90b3R5cGUse2dldCBjYXB0aW9uKCl7cmV0dXJuIGEoaSh0aGlzKS5jYXB0aW9uKX0sY3JlYXRlQ2FwdGlvbjpmdW5jdGlvbigpe3JldHVybiBhKGkodGhpcykuY3JlYXRlQ2FwdGlvbigpKX0sZ2V0IHRIZWFkKCl7cmV0dXJuIGEoaSh0aGlzKS50SGVhZCl9LGNyZWF0ZVRIZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIGEoaSh0aGlzKS5jcmVhdGVUSGVhZCgpKX0sY3JlYXRlVEZvb3Q6ZnVuY3Rpb24oKXtyZXR1cm4gYShpKHRoaXMpLmNyZWF0ZVRGb290KCkpfSxnZXQgdEZvb3QoKXtyZXR1cm4gYShpKHRoaXMpLnRGb290KX0sZ2V0IHRCb2RpZXMoKXtyZXR1cm4gcyhpKHRoaXMpLnRCb2RpZXMpfSxjcmVhdGVUQm9keTpmdW5jdGlvbigpe3JldHVybiBhKGkodGhpcykuY3JlYXRlVEJvZHkoKSl9LGdldCByb3dzKCl7cmV0dXJuIHMoaSh0aGlzKS5yb3dzKX0saW5zZXJ0Um93OmZ1bmN0aW9uKGUpe3JldHVybiBhKGkodGhpcykuaW5zZXJ0Um93KGUpKX19KSxvKGMsdCxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGFibGVcIikpLGUud3JhcHBlcnMuSFRNTFRhYmxlRWxlbWVudD10fSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7bi5jYWxsKHRoaXMsZSl9dmFyIG49ZS53cmFwcGVycy5IVE1MRWxlbWVudCxyPWUubWl4aW4sbz1lLnJlZ2lzdGVyV3JhcHBlcixpPWUud3JhcEhUTUxDb2xsZWN0aW9uLGE9ZS51bndyYXAscz1lLndyYXAsYz13aW5kb3cuSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnQ7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkscih0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6dCxnZXQgcm93cygpe3JldHVybiBpKGEodGhpcykucm93cyl9LGluc2VydFJvdzpmdW5jdGlvbihlKXtyZXR1cm4gcyhhKHRoaXMpLmluc2VydFJvdyhlKSl9fSksbyhjLHQsZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRoZWFkXCIpKSxlLndyYXBwZXJzLkhUTUxUYWJsZVNlY3Rpb25FbGVtZW50PXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtuLmNhbGwodGhpcyxlKX12YXIgbj1lLndyYXBwZXJzLkhUTUxFbGVtZW50LHI9ZS5taXhpbixvPWUucmVnaXN0ZXJXcmFwcGVyLGk9ZS53cmFwSFRNTENvbGxlY3Rpb24sYT1lLnVud3JhcCxzPWUud3JhcCxjPXdpbmRvdy5IVE1MVGFibGVSb3dFbGVtZW50O3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLHIodC5wcm90b3R5cGUse2dldCBjZWxscygpe3JldHVybiBpKGEodGhpcykuY2VsbHMpfSxpbnNlcnRDZWxsOmZ1bmN0aW9uKGUpe3JldHVybiBzKGEodGhpcykuaW5zZXJ0Q2VsbChlKSl9fSksbyhjLHQsZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRyXCIpKSxlLndyYXBwZXJzLkhUTUxUYWJsZVJvd0VsZW1lbnQ9dH0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe3N3aXRjaChlLmxvY2FsTmFtZSl7Y2FzZVwiY29udGVudFwiOnJldHVybiBuZXcgbihlKTtjYXNlXCJzaGFkb3dcIjpyZXR1cm4gbmV3IG8oZSk7Y2FzZVwidGVtcGxhdGVcIjpyZXR1cm4gbmV3IGkoZSl9ci5jYWxsKHRoaXMsZSl9dmFyIG49ZS53cmFwcGVycy5IVE1MQ29udGVudEVsZW1lbnQscj1lLndyYXBwZXJzLkhUTUxFbGVtZW50LG89ZS53cmFwcGVycy5IVE1MU2hhZG93RWxlbWVudCxpPWUud3JhcHBlcnMuSFRNTFRlbXBsYXRlRWxlbWVudCxhPShlLm1peGluLGUucmVnaXN0ZXJXcmFwcGVyKSxzPXdpbmRvdy5IVE1MVW5rbm93bkVsZW1lbnQ7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSksYShzLHQpLGUud3JhcHBlcnMuSFRNTFVua25vd25FbGVtZW50PXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtuLmNhbGwodGhpcyxlKX12YXIgbj1lLndyYXBwZXJzLkVsZW1lbnQscj1lLndyYXBwZXJzLkhUTUxFbGVtZW50LG89ZS5yZWdpc3RlcldyYXBwZXIsaT0oZS5kZWZpbmVXcmFwR2V0dGVyLGUudW5zYWZlVW53cmFwKSxhPWUud3JhcCxzPWUubWl4aW4sYz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsbD13aW5kb3cuU1ZHRWxlbWVudCx1PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhjLFwidGl0bGVcIik7aWYoIShcImNsYXNzTGlzdFwiaW4gdSkpe3ZhciBkPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobi5wcm90b3R5cGUsXCJjbGFzc0xpc3RcIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIucHJvdG90eXBlLFwiY2xhc3NMaXN0XCIsZCksZGVsZXRlIG4ucHJvdG90eXBlLmNsYXNzTGlzdH10LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSxzKHQucHJvdG90eXBlLHtnZXQgb3duZXJTVkdFbGVtZW50KCl7cmV0dXJuIGEoaSh0aGlzKS5vd25lclNWR0VsZW1lbnQpfX0pLG8obCx0LGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhjLFwidGl0bGVcIikpLGUud3JhcHBlcnMuU1ZHRWxlbWVudD10fSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7cC5jYWxsKHRoaXMsZSl9dmFyIG49ZS5taXhpbixyPWUucmVnaXN0ZXJXcmFwcGVyLG89ZS51bndyYXAsaT1lLndyYXAsYT13aW5kb3cuU1ZHVXNlRWxlbWVudCxzPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixjPWkoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHMsXCJnXCIpKSxsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzLFwidXNlXCIpLHU9Yy5jb25zdHJ1Y3RvcixkPU9iamVjdC5nZXRQcm90b3R5cGVPZih1LnByb3RvdHlwZSkscD1kLmNvbnN0cnVjdG9yO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZCksXCJpbnN0YW5jZVJvb3RcImluIGwmJm4odC5wcm90b3R5cGUse2dldCBpbnN0YW5jZVJvb3QoKXtyZXR1cm4gaShvKHRoaXMpLmluc3RhbmNlUm9vdCl9LGdldCBhbmltYXRlZEluc3RhbmNlUm9vdCgpe3JldHVybiBpKG8odGhpcykuYW5pbWF0ZWRJbnN0YW5jZVJvb3QpfX0pLHIoYSx0LGwpLGUud3JhcHBlcnMuU1ZHVXNlRWxlbWVudD10fSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7bi5jYWxsKHRoaXMsZSl9dmFyIG49ZS53cmFwcGVycy5FdmVudFRhcmdldCxyPWUubWl4aW4sbz1lLnJlZ2lzdGVyV3JhcHBlcixpPWUudW5zYWZlVW53cmFwLGE9ZS53cmFwLHM9d2luZG93LlNWR0VsZW1lbnRJbnN0YW5jZTtzJiYodC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSkscih0LnByb3RvdHlwZSx7Z2V0IGNvcnJlc3BvbmRpbmdFbGVtZW50KCl7cmV0dXJuIGEoaSh0aGlzKS5jb3JyZXNwb25kaW5nRWxlbWVudCl9LGdldCBjb3JyZXNwb25kaW5nVXNlRWxlbWVudCgpe3JldHVybiBhKGkodGhpcykuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpfSxnZXQgcGFyZW50Tm9kZSgpe3JldHVybiBhKGkodGhpcykucGFyZW50Tm9kZSl9LGdldCBjaGlsZE5vZGVzKCl7dGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpfSxnZXQgZmlyc3RDaGlsZCgpe3JldHVybiBhKGkodGhpcykuZmlyc3RDaGlsZCl9LGdldCBsYXN0Q2hpbGQoKXtyZXR1cm4gYShpKHRoaXMpLmxhc3RDaGlsZCl9LGdldCBwcmV2aW91c1NpYmxpbmcoKXtyZXR1cm4gYShpKHRoaXMpLnByZXZpb3VzU2libGluZyl9LGdldCBuZXh0U2libGluZygpe3JldHVybiBhKGkodGhpcykubmV4dFNpYmxpbmcpfX0pLG8ocyx0KSxlLndyYXBwZXJzLlNWR0VsZW1lbnRJbnN0YW5jZT10KX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe28oZSx0aGlzKX12YXIgbj1lLm1peGluLHI9ZS5yZWdpc3RlcldyYXBwZXIsbz1lLnNldFdyYXBwZXIsaT1lLnVuc2FmZVVud3JhcCxhPWUudW53cmFwLHM9ZS51bndyYXBJZk5lZWRlZCxjPWUud3JhcCxsPXdpbmRvdy5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7bih0LnByb3RvdHlwZSx7Z2V0IGNhbnZhcygpe3JldHVybiBjKGkodGhpcykuY2FudmFzKX0sZHJhd0ltYWdlOmZ1bmN0aW9uKCl7YXJndW1lbnRzWzBdPXMoYXJndW1lbnRzWzBdKSxpKHRoaXMpLmRyYXdJbWFnZS5hcHBseShpKHRoaXMpLGFyZ3VtZW50cyl9LGNyZWF0ZVBhdHRlcm46ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzWzBdPWEoYXJndW1lbnRzWzBdKSxpKHRoaXMpLmNyZWF0ZVBhdHRlcm4uYXBwbHkoaSh0aGlzKSxhcmd1bWVudHMpfX0pLHIobCx0LGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIikuZ2V0Q29udGV4dChcIjJkXCIpKSxlLndyYXBwZXJzLkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD10fSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7aShlLHRoaXMpfXZhciBuPWUuYWRkRm9yd2FyZGluZ1Byb3BlcnRpZXMscj1lLm1peGluLG89ZS5yZWdpc3RlcldyYXBwZXIsaT1lLnNldFdyYXBwZXIsYT1lLnVuc2FmZVVud3JhcCxzPWUudW53cmFwSWZOZWVkZWQsYz1lLndyYXAsbD13aW5kb3cuV2ViR0xSZW5kZXJpbmdDb250ZXh0O2lmKGwpe3IodC5wcm90b3R5cGUse2dldCBjYW52YXMoKXtyZXR1cm4gYyhhKHRoaXMpLmNhbnZhcyl9LHRleEltYWdlMkQ6ZnVuY3Rpb24oKXthcmd1bWVudHNbNV09cyhhcmd1bWVudHNbNV0pLGEodGhpcykudGV4SW1hZ2UyRC5hcHBseShhKHRoaXMpLGFyZ3VtZW50cyl9LHRleFN1YkltYWdlMkQ6ZnVuY3Rpb24oKXthcmd1bWVudHNbNl09cyhhcmd1bWVudHNbNl0pLGEodGhpcykudGV4U3ViSW1hZ2UyRC5hcHBseShhKHRoaXMpLGFyZ3VtZW50cyl9fSk7dmFyIHU9T2JqZWN0LmdldFByb3RvdHlwZU9mKGwucHJvdG90eXBlKTt1IT09T2JqZWN0LnByb3RvdHlwZSYmbih1LHQucHJvdG90eXBlKTt2YXIgZD0vV2ViS2l0Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpP3tkcmF3aW5nQnVmZmVySGVpZ2h0Om51bGwsZHJhd2luZ0J1ZmZlcldpZHRoOm51bGx9Ont9O28obCx0LGQpLGUud3JhcHBlcnMuV2ViR0xSZW5kZXJpbmdDb250ZXh0PXR9fSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7bi5jYWxsKHRoaXMsZSl9dmFyIG49ZS53cmFwcGVycy5Ob2RlLHI9ZS5HZXRFbGVtZW50c0J5SW50ZXJmYWNlLG89ZS5Ob25FbGVtZW50UGFyZW50Tm9kZUludGVyZmFjZSxpPWUuUGFyZW50Tm9kZUludGVyZmFjZSxhPWUuU2VsZWN0b3JzSW50ZXJmYWNlLHM9ZS5taXhpbixjPWUucmVnaXN0ZXJPYmplY3QsbD1lLnJlZ2lzdGVyV3JhcHBlcix1PXdpbmRvdy5Eb2N1bWVudEZyYWdtZW50O3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLHModC5wcm90b3R5cGUsaSkscyh0LnByb3RvdHlwZSxhKSxzKHQucHJvdG90eXBlLHIpLHModC5wcm90b3R5cGUsbyksbCh1LHQsZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKSxlLndyYXBwZXJzLkRvY3VtZW50RnJhZ21lbnQ9dDt2YXIgZD1jKGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoXCJcIikpO2Uud3JhcHBlcnMuQ29tbWVudD1kfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7dmFyIHQ9ZCh1KGUpLm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtuLmNhbGwodGhpcyx0KSxjKHQsdGhpcyk7dmFyIG89ZS5zaGFkb3dSb290O2Yuc2V0KHRoaXMsbyksdGhpcy50cmVlU2NvcGVfPW5ldyByKHRoaXMsYShvfHxlKSksaC5zZXQodGhpcyxlKX12YXIgbj1lLndyYXBwZXJzLkRvY3VtZW50RnJhZ21lbnQscj1lLlRyZWVTY29wZSxvPWUuZWxlbWVudEZyb21Qb2ludCxpPWUuZ2V0SW5uZXJIVE1MLGE9ZS5nZXRUcmVlU2NvcGUscz1lLm1peGluLGM9ZS5yZXdyYXAsbD1lLnNldElubmVySFRNTCx1PWUudW5zYWZlVW53cmFwLGQ9ZS51bndyYXAscD1lLndyYXAsaD1uZXcgV2Vha01hcCxmPW5ldyBXZWFrTWFwO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLHModC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnQsZ2V0IGlubmVySFRNTCgpe3JldHVybiBpKHRoaXMpfSxzZXQgaW5uZXJIVE1MKGUpe2wodGhpcyxlKSx0aGlzLmludmFsaWRhdGVTaGFkb3dSZW5kZXJlcigpfSxnZXQgb2xkZXJTaGFkb3dSb290KCl7cmV0dXJuIGYuZ2V0KHRoaXMpfHxudWxsfSxnZXQgaG9zdCgpe3JldHVybiBoLmdldCh0aGlzKXx8bnVsbH0saW52YWxpZGF0ZVNoYWRvd1JlbmRlcmVyOmZ1bmN0aW9uKCl7cmV0dXJuIGguZ2V0KHRoaXMpLmludmFsaWRhdGVTaGFkb3dSZW5kZXJlcigpfSxlbGVtZW50RnJvbVBvaW50OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG8odGhpcyx0aGlzLm93bmVyRG9jdW1lbnQsZSx0KX0sZ2V0U2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmdldFNlbGVjdGlvbigpfSxnZXQgYWN0aXZlRWxlbWVudCgpe3ZhciBlPWQodGhpcykub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKCFlfHwhZS5ub2RlVHlwZSlyZXR1cm4gbnVsbDt2YXIgdD1wKGUpO2lmKHQ9PT10aGlzLmhvc3QpcmV0dXJuIG51bGw7Zm9yKDshdGhpcy5jb250YWlucyh0KSYmIXRoaXMuaG9zdC5jb250YWlucyh0KTspe2Zvcig7dC5wYXJlbnROb2RlOyl0PXQucGFyZW50Tm9kZTtpZighdC5ob3N0KXJldHVybiBudWxsO3Q9dC5ob3N0fXJldHVybiB0fX0pLGUud3JhcHBlcnMuU2hhZG93Um9vdD10fSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7dmFyIHQ9ZChlKS5yb290O3JldHVybiB0IGluc3RhbmNlb2YgaD90Lmhvc3Q6bnVsbH1mdW5jdGlvbiBuKHQsbil7aWYodC5zaGFkb3dSb290KXtuPU1hdGgubWluKHQuY2hpbGROb2Rlcy5sZW5ndGgtMSxuKTt2YXIgcj10LmNoaWxkTm9kZXNbbl07aWYocil7dmFyIG89ZS5nZXREZXN0aW5hdGlvbkluc2VydGlvblBvaW50cyhyKTtpZihvLmxlbmd0aD4wKXt2YXIgaT1vWzBdLnBhcmVudE5vZGU7aS5ub2RlVHlwZT09Tm9kZS5FTEVNRU5UX05PREUmJih0PWkpfX19cmV0dXJuIHR9ZnVuY3Rpb24gcihlKXtyZXR1cm4gZT11KGUpLHQoZSl8fGV9ZnVuY3Rpb24gbyhlKXthKGUsdGhpcyl9dmFyIGk9ZS5yZWdpc3RlcldyYXBwZXIsYT1lLnNldFdyYXBwZXIscz1lLnVuc2FmZVVud3JhcCxjPWUudW53cmFwLGw9ZS51bndyYXBJZk5lZWRlZCx1PWUud3JhcCxkPWUuZ2V0VHJlZVNjb3BlLHA9d2luZG93LlJhbmdlLGg9ZS53cmFwcGVycy5TaGFkb3dSb290O28ucHJvdG90eXBlPXtnZXQgc3RhcnRDb250YWluZXIoKXtyZXR1cm4gcihzKHRoaXMpLnN0YXJ0Q29udGFpbmVyKX0sZ2V0IGVuZENvbnRhaW5lcigpe3JldHVybiByKHModGhpcykuZW5kQ29udGFpbmVyKX0sZ2V0IGNvbW1vbkFuY2VzdG9yQ29udGFpbmVyKCl7cmV0dXJuIHIocyh0aGlzKS5jb21tb25BbmNlc3RvckNvbnRhaW5lcil9LHNldFN0YXJ0OmZ1bmN0aW9uKGUsdCl7ZT1uKGUsdCkscyh0aGlzKS5zZXRTdGFydChsKGUpLHQpfSxzZXRFbmQ6ZnVuY3Rpb24oZSx0KXtlPW4oZSx0KSxzKHRoaXMpLnNldEVuZChsKGUpLHQpfSxzZXRTdGFydEJlZm9yZTpmdW5jdGlvbihlKXtzKHRoaXMpLnNldFN0YXJ0QmVmb3JlKGwoZSkpfSxzZXRTdGFydEFmdGVyOmZ1bmN0aW9uKGUpe3ModGhpcykuc2V0U3RhcnRBZnRlcihsKGUpKX0sc2V0RW5kQmVmb3JlOmZ1bmN0aW9uKGUpe3ModGhpcykuc2V0RW5kQmVmb3JlKGwoZSkpfSxzZXRFbmRBZnRlcjpmdW5jdGlvbihlKXtzKHRoaXMpLnNldEVuZEFmdGVyKGwoZSkpfSxzZWxlY3ROb2RlOmZ1bmN0aW9uKGUpe3ModGhpcykuc2VsZWN0Tm9kZShsKGUpKX0sc2VsZWN0Tm9kZUNvbnRlbnRzOmZ1bmN0aW9uKGUpe3ModGhpcykuc2VsZWN0Tm9kZUNvbnRlbnRzKGwoZSkpfSxjb21wYXJlQm91bmRhcnlQb2ludHM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcyh0aGlzKS5jb21wYXJlQm91bmRhcnlQb2ludHMoZSxjKHQpKX0sZXh0cmFjdENvbnRlbnRzOmZ1bmN0aW9uKCl7cmV0dXJuIHUocyh0aGlzKS5leHRyYWN0Q29udGVudHMoKSl9LGNsb25lQ29udGVudHM6ZnVuY3Rpb24oKXtyZXR1cm4gdShzKHRoaXMpLmNsb25lQ29udGVudHMoKSl9LGluc2VydE5vZGU6ZnVuY3Rpb24oZSl7cyh0aGlzKS5pbnNlcnROb2RlKGwoZSkpfSxzdXJyb3VuZENvbnRlbnRzOmZ1bmN0aW9uKGUpe3ModGhpcykuc3Vycm91bmRDb250ZW50cyhsKGUpKX0sY2xvbmVSYW5nZTpmdW5jdGlvbigpe3JldHVybiB1KHModGhpcykuY2xvbmVSYW5nZSgpKX0saXNQb2ludEluUmFuZ2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcyh0aGlzKS5pc1BvaW50SW5SYW5nZShsKGUpLHQpfSxjb21wYXJlUG9pbnQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcyh0aGlzKS5jb21wYXJlUG9pbnQobChlKSx0KX0saW50ZXJzZWN0c05vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHModGhpcykuaW50ZXJzZWN0c05vZGUobChlKSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHModGhpcykudG9TdHJpbmcoKX19LHAucHJvdG90eXBlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCYmKG8ucHJvdG90eXBlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gdShzKHRoaXMpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChlKSl9KSxpKHdpbmRvdy5SYW5nZSxvLGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkpLGUud3JhcHBlcnMuUmFuZ2U9b30od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe2UucHJldmlvdXNTaWJsaW5nXz1lLnByZXZpb3VzU2libGluZyxlLm5leHRTaWJsaW5nXz1lLm5leHRTaWJsaW5nLGUucGFyZW50Tm9kZV89ZS5wYXJlbnROb2RlfWZ1bmN0aW9uIG4obixvLGkpe3ZhciBhPXgobikscz14KG8pLGM9aT94KGkpOm51bGw7aWYocihvKSx0KG8pLGkpbi5maXJzdENoaWxkPT09aSYmKG4uZmlyc3RDaGlsZF89aSksaS5wcmV2aW91c1NpYmxpbmdfPWkucHJldmlvdXNTaWJsaW5nO2Vsc2V7bi5sYXN0Q2hpbGRfPW4ubGFzdENoaWxkLG4ubGFzdENoaWxkPT09bi5maXJzdENoaWxkJiYobi5maXJzdENoaWxkXz1uLmZpcnN0Q2hpbGQpO3ZhciBsPVIoYS5sYXN0Q2hpbGQpO2wmJihsLm5leHRTaWJsaW5nXz1sLm5leHRTaWJsaW5nKX1lLm9yaWdpbmFsSW5zZXJ0QmVmb3JlLmNhbGwoYSxzLGMpfWZ1bmN0aW9uIHIobil7dmFyIHI9eChuKSxvPXIucGFyZW50Tm9kZTtpZihvKXt2YXIgaT1SKG8pO3Qobiksbi5wcmV2aW91c1NpYmxpbmcmJihuLnByZXZpb3VzU2libGluZy5uZXh0U2libGluZ189biksbi5uZXh0U2libGluZyYmKG4ubmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nXz1uKSxpLmxhc3RDaGlsZD09PW4mJihpLmxhc3RDaGlsZF89biksaS5maXJzdENoaWxkPT09biYmKGkuZmlyc3RDaGlsZF89biksZS5vcmlnaW5hbFJlbW92ZUNoaWxkLmNhbGwobyxyKX19ZnVuY3Rpb24gbyhlKXtQLnNldChlLFtdKX1mdW5jdGlvbiBpKGUpe3ZhciB0PVAuZ2V0KGUpO3JldHVybiB0fHxQLnNldChlLHQ9W10pLHR9ZnVuY3Rpb24gYShlKXtmb3IodmFyIHQ9W10sbj0wLHI9ZS5maXJzdENoaWxkO3I7cj1yLm5leHRTaWJsaW5nKXRbbisrXT1yO3JldHVybiB0fWZ1bmN0aW9uIHMoKXtmb3IodmFyIGU9MDtlPEYubGVuZ3RoO2UrKyl7dmFyIHQ9RltlXSxuPXQucGFyZW50UmVuZGVyZXI7biYmbi5kaXJ0eXx8dC5yZW5kZXIoKX1GPVtdfWZ1bmN0aW9uIGMoKXtUPW51bGwscygpfWZ1bmN0aW9uIGwoZSl7dmFyIHQ9QS5nZXQoZSk7cmV0dXJuIHR8fCh0PW5ldyBoKGUpLEEuc2V0KGUsdCkpLHR9ZnVuY3Rpb24gdShlKXt2YXIgdD1qKGUpLnJvb3Q7cmV0dXJuIHQgaW5zdGFuY2VvZiBDP3Q6bnVsbH1mdW5jdGlvbiBkKGUpe3JldHVybiBsKGUuaG9zdCl9ZnVuY3Rpb24gcChlKXt0aGlzLnNraXA9ITEsdGhpcy5ub2RlPWUsdGhpcy5jaGlsZE5vZGVzPVtdfWZ1bmN0aW9uIGgoZSl7dGhpcy5ob3N0PWUsdGhpcy5kaXJ0eT0hMSx0aGlzLmludmFsaWRhdGVBdHRyaWJ1dGVzKCksdGhpcy5hc3NvY2lhdGVOb2RlKGUpfWZ1bmN0aW9uIGYoZSl7Zm9yKHZhciB0PVtdLG49ZS5maXJzdENoaWxkO247bj1uLm5leHRTaWJsaW5nKUUobik/dC5wdXNoLmFwcGx5KHQsaShuKSk6dC5wdXNoKG4pO3JldHVybiB0fWZ1bmN0aW9uIG0oZSl7aWYoZSBpbnN0YW5jZW9mIEwpcmV0dXJuIGU7aWYoZSBpbnN0YW5jZW9mIE8pcmV0dXJuIG51bGw7Zm9yKHZhciB0PWUuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZyl7dmFyIG49bSh0KTtpZihuKXJldHVybiBufXJldHVybiBudWxsfWZ1bmN0aW9uIHcoZSx0KXtpKHQpLnB1c2goZSk7dmFyIG49ay5nZXQoZSk7bj9uLnB1c2godCk6ay5zZXQoZSxbdF0pfWZ1bmN0aW9uIHYoZSl7cmV0dXJuIGsuZ2V0KGUpfWZ1bmN0aW9uIGcoZSl7ay5zZXQoZSx2b2lkIDApfWZ1bmN0aW9uIGIoZSx0KXt2YXIgbj10LmdldEF0dHJpYnV0ZShcInNlbGVjdFwiKTtpZighbilyZXR1cm4hMDtpZihuPW4udHJpbSgpLCFuKXJldHVybiEwO2lmKCEoZSBpbnN0YW5jZW9mIE0pKXJldHVybiExO2lmKCFxLnRlc3QobikpcmV0dXJuITE7dHJ5e3JldHVybiBlLm1hdGNoZXMobil9Y2F0Y2gocil7cmV0dXJuITF9fWZ1bmN0aW9uIHkoZSx0KXt2YXIgbj12KHQpO3JldHVybiBuJiZuW24ubGVuZ3RoLTFdPT09ZX1mdW5jdGlvbiBFKGUpe3JldHVybiBlIGluc3RhbmNlb2YgT3x8ZSBpbnN0YW5jZW9mIEx9ZnVuY3Rpb24gXyhlKXtyZXR1cm4gZS5zaGFkb3dSb290fWZ1bmN0aW9uIFMoZSl7Zm9yKHZhciB0PVtdLG49ZS5zaGFkb3dSb290O247bj1uLm9sZGVyU2hhZG93Um9vdCl0LnB1c2gobik7cmV0dXJuIHR9dmFyIFQsTT1lLndyYXBwZXJzLkVsZW1lbnQsTz1lLndyYXBwZXJzLkhUTUxDb250ZW50RWxlbWVudCxMPWUud3JhcHBlcnMuSFRNTFNoYWRvd0VsZW1lbnQsTj1lLndyYXBwZXJzLk5vZGUsQz1lLndyYXBwZXJzLlNoYWRvd1Jvb3Qsaj0oZS5hc3NlcnQsZS5nZXRUcmVlU2NvcGUpLEQ9KGUubWl4aW4sZS5vbmVPZiksSD1lLnVuc2FmZVVud3JhcCx4PWUudW53cmFwLFI9ZS53cmFwLEk9ZS5BcnJheVNwbGljZSxQPW5ldyBXZWFrTWFwLGs9bmV3IFdlYWtNYXAsQT1uZXcgV2Vha01hcCxXPUQod2luZG93LFtcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiLFwibW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIsXCJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIixcInNldFRpbWVvdXRcIl0pLEY9W10sVT1uZXcgSTtVLmVxdWFscz1mdW5jdGlvbihlLHQpe3JldHVybiB4KGUubm9kZSk9PT10fSxwLnByb3RvdHlwZT17YXBwZW5kOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBwKGUpO3JldHVybiB0aGlzLmNoaWxkTm9kZXMucHVzaCh0KSx0fSxzeW5jOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLnNraXApe2Zvcih2YXIgdD10aGlzLm5vZGUsbz10aGlzLmNoaWxkTm9kZXMsaT1hKHgodCkpLHM9ZXx8bmV3IFdlYWtNYXAsYz1VLmNhbGN1bGF0ZVNwbGljZXMobyxpKSxsPTAsdT0wLGQ9MCxwPTA7cDxjLmxlbmd0aDtwKyspe2Zvcih2YXIgaD1jW3BdO2Q8aC5pbmRleDtkKyspdSsrLG9bbCsrXS5zeW5jKHMpO2Zvcih2YXIgZj1oLnJlbW92ZWQubGVuZ3RoLG09MDtmPm07bSsrKXt2YXIgdz1SKGlbdSsrXSk7cy5nZXQodyl8fHIodyl9Zm9yKHZhciB2PWguYWRkZWRDb3VudCxnPWlbdV0mJlIoaVt1XSksbT0wO3Y+bTttKyspe3ZhciBiPW9bbCsrXSx5PWIubm9kZTtuKHQseSxnKSxzLnNldCh5LCEwKSxiLnN5bmMocyl9ZCs9dn1mb3IodmFyIHA9ZDtwPG8ubGVuZ3RoO3ArKylvW3BdLnN5bmMocyl9fX0saC5wcm90b3R5cGU9e3JlbmRlcjpmdW5jdGlvbihlKXtpZih0aGlzLmRpcnR5KXt0aGlzLmludmFsaWRhdGVBdHRyaWJ1dGVzKCk7dmFyIHQ9dGhpcy5ob3N0O3RoaXMuZGlzdHJpYnV0aW9uKHQpO3ZhciBuPWV8fG5ldyBwKHQpO3RoaXMuYnVpbGRSZW5kZXJUcmVlKG4sdCk7dmFyIHI9IWU7ciYmbi5zeW5jKCksdGhpcy5kaXJ0eT0hMX19LGdldCBwYXJlbnRSZW5kZXJlcigpe3JldHVybiBqKHRoaXMuaG9zdCkucmVuZGVyZXJ9LGludmFsaWRhdGU6ZnVuY3Rpb24oKXtpZighdGhpcy5kaXJ0eSl7dGhpcy5kaXJ0eT0hMDt2YXIgZT10aGlzLnBhcmVudFJlbmRlcmVyO2lmKGUmJmUuaW52YWxpZGF0ZSgpLEYucHVzaCh0aGlzKSxUKXJldHVybjtUPXdpbmRvd1tXXShjLDApfX0sZGlzdHJpYnV0aW9uOmZ1bmN0aW9uKGUpe3RoaXMucmVzZXRBbGxTdWJ0cmVlcyhlKSx0aGlzLmRpc3RyaWJ1dGlvblJlc29sdXRpb24oZSl9LHJlc2V0QWxsOmZ1bmN0aW9uKGUpe0UoZSk/byhlKTpnKGUpLHRoaXMucmVzZXRBbGxTdWJ0cmVlcyhlKX0scmVzZXRBbGxTdWJ0cmVlczpmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKXRoaXMucmVzZXRBbGwodCk7ZS5zaGFkb3dSb290JiZ0aGlzLnJlc2V0QWxsKGUuc2hhZG93Um9vdCksZS5vbGRlclNoYWRvd1Jvb3QmJnRoaXMucmVzZXRBbGwoZS5vbGRlclNoYWRvd1Jvb3QpfSxkaXN0cmlidXRpb25SZXNvbHV0aW9uOmZ1bmN0aW9uKGUpe2lmKF8oZSkpe2Zvcih2YXIgdD1lLG49Zih0KSxyPVModCksbz0wO288ci5sZW5ndGg7bysrKXRoaXMucG9vbERpc3RyaWJ1dGlvbihyW29dLG4pO2Zvcih2YXIgbz1yLmxlbmd0aC0xO28+PTA7by0tKXt2YXIgaT1yW29dLGE9bShpKTtpZihhKXt2YXIgcz1pLm9sZGVyU2hhZG93Um9vdDtzJiYobj1mKHMpKTtmb3IodmFyIGM9MDtjPG4ubGVuZ3RoO2MrKyl3KG5bY10sYSl9dGhpcy5kaXN0cmlidXRpb25SZXNvbHV0aW9uKGkpfX1mb3IodmFyIGw9ZS5maXJzdENoaWxkO2w7bD1sLm5leHRTaWJsaW5nKXRoaXMuZGlzdHJpYnV0aW9uUmVzb2x1dGlvbihsKX0scG9vbERpc3RyaWJ1dGlvbjpmdW5jdGlvbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIEwpKWlmKGUgaW5zdGFuY2VvZiBPKXt2YXIgbj1lO3RoaXMudXBkYXRlRGVwZW5kZW50QXR0cmlidXRlcyhuLmdldEF0dHJpYnV0ZShcInNlbGVjdFwiKSk7Zm9yKHZhciByPSExLG89MDtvPHQubGVuZ3RoO28rKyl7dmFyIGU9dFtvXTtlJiZiKGUsbikmJih3KGUsbiksdFtvXT12b2lkIDAscj0hMCl9aWYoIXIpZm9yKHZhciBpPW4uZmlyc3RDaGlsZDtpO2k9aS5uZXh0U2libGluZyl3KGksbil9ZWxzZSBmb3IodmFyIGk9ZS5maXJzdENoaWxkO2k7aT1pLm5leHRTaWJsaW5nKXRoaXMucG9vbERpc3RyaWJ1dGlvbihpLHQpfSxidWlsZFJlbmRlclRyZWU6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dGhpcy5jb21wb3NlKHQpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIG89bltyXSxpPWUuYXBwZW5kKG8pO3RoaXMuYnVpbGRSZW5kZXJUcmVlKGksbyl9aWYoXyh0KSl7dmFyIGE9bCh0KTthLmRpcnR5PSExfX0sY29tcG9zZTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj1lLnNoYWRvd1Jvb3R8fGUscj1uLmZpcnN0Q2hpbGQ7cjtyPXIubmV4dFNpYmxpbmcpaWYoRShyKSl7dGhpcy5hc3NvY2lhdGVOb2RlKG4pO2Zvcih2YXIgbz1pKHIpLGE9MDthPG8ubGVuZ3RoO2ErKyl7dmFyIHM9b1thXTt5KHIscykmJnQucHVzaChzKX19ZWxzZSB0LnB1c2gocik7cmV0dXJuIHR9LGludmFsaWRhdGVBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7dGhpcy5hdHRyaWJ1dGVzPU9iamVjdC5jcmVhdGUobnVsbCl9LHVwZGF0ZURlcGVuZGVudEF0dHJpYnV0ZXM6ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9dGhpcy5hdHRyaWJ1dGVzOy9cXC5cXHcrLy50ZXN0KGUpJiYodFtcImNsYXNzXCJdPSEwKSwvI1xcdysvLnRlc3QoZSkmJih0LmlkPSEwKSxlLnJlcGxhY2UoL1xcW1xccyooW15cXHM9XFx8flxcXV0rKS9nLGZ1bmN0aW9uKGUsbil7dFtuXT0hMH0pfX0sZGVwZW5kc09uQXR0cmlidXRlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbZV19LGFzc29jaWF0ZU5vZGU6ZnVuY3Rpb24oZSl7SChlKS5wb2x5bWVyU2hhZG93UmVuZGVyZXJfPXRoaXN9fTt2YXIgcT0vXig6bm90XFwoKT9bKi4jW2EtekEtWl98XS87Ti5wcm90b3R5cGUuaW52YWxpZGF0ZVNoYWRvd1JlbmRlcmVyPWZ1bmN0aW9uKGUpe3ZhciB0PUgodGhpcykucG9seW1lclNoYWRvd1JlbmRlcmVyXztyZXR1cm4gdD8odC5pbnZhbGlkYXRlKCksITApOiExfSxPLnByb3RvdHlwZS5nZXREaXN0cmlidXRlZE5vZGVzPUwucHJvdG90eXBlLmdldERpc3RyaWJ1dGVkTm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gcygpLGkodGhpcyl9LE0ucHJvdG90eXBlLmdldERlc3RpbmF0aW9uSW5zZXJ0aW9uUG9pbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHMoKSx2KHRoaXMpfHxbXX0sTy5wcm90b3R5cGUubm9kZUlzSW5zZXJ0ZWRfPUwucHJvdG90eXBlLm5vZGVJc0luc2VydGVkXz1mdW5jdGlvbigpe3RoaXMuaW52YWxpZGF0ZVNoYWRvd1JlbmRlcmVyKCk7dmFyIGUsdD11KHRoaXMpO3QmJihlPWQodCkpLEgodGhpcykucG9seW1lclNoYWRvd1JlbmRlcmVyXz1lLGUmJmUuaW52YWxpZGF0ZSgpfSxlLmdldFJlbmRlcmVyRm9ySG9zdD1sLGUuZ2V0U2hhZG93VHJlZXM9UyxlLnJlbmRlckFsbFBlbmRpbmc9cyxlLmdldERlc3RpbmF0aW9uSW5zZXJ0aW9uUG9pbnRzPXYsZS52aXN1YWw9e2luc2VydEJlZm9yZTpuLHJlbW92ZTpyfX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KHQpe2lmKHdpbmRvd1t0XSl7cighZS53cmFwcGVyc1t0XSk7dmFyIGM9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMsZSl9O2MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpLG8oYy5wcm90b3R5cGUse2dldCBmb3JtKCl7cmV0dXJuIHMoYSh0aGlzKS5mb3JtKX19KSxpKHdpbmRvd1t0XSxjLGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodC5zbGljZSg0LC03KSkpLGUud3JhcHBlcnNbdF09Y319dmFyIG49ZS53cmFwcGVycy5IVE1MRWxlbWVudCxyPWUuYXNzZXJ0LG89ZS5taXhpbixpPWUucmVnaXN0ZXJXcmFwcGVyLGE9ZS51bndyYXAscz1lLndyYXAsYz1bXCJIVE1MQnV0dG9uRWxlbWVudFwiLFwiSFRNTEZpZWxkU2V0RWxlbWVudFwiLFwiSFRNTElucHV0RWxlbWVudFwiLFwiSFRNTEtleWdlbkVsZW1lbnRcIixcIkhUTUxMYWJlbEVsZW1lbnRcIixcIkhUTUxMZWdlbmRFbGVtZW50XCIsXCJIVE1MT2JqZWN0RWxlbWVudFwiLFwiSFRNTE91dHB1dEVsZW1lbnRcIixcIkhUTUxUZXh0QXJlYUVsZW1lbnRcIl07Yy5mb3JFYWNoKHQpfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7cihlLHRoaXMpfXZhciBuPWUucmVnaXN0ZXJXcmFwcGVyLHI9ZS5zZXRXcmFwcGVyLG89ZS51bnNhZmVVbndyYXAsaT1lLnVud3JhcCxhPWUudW53cmFwSWZOZWVkZWQscz1lLndyYXAsYz13aW5kb3cuU2VsZWN0aW9uO3QucHJvdG90eXBlPXtnZXQgYW5jaG9yTm9kZSgpe3JldHVybiBzKG8odGhpcykuYW5jaG9yTm9kZSl9LGdldCBmb2N1c05vZGUoKXtyZXR1cm4gcyhvKHRoaXMpLmZvY3VzTm9kZSl9LGFkZFJhbmdlOmZ1bmN0aW9uKGUpe28odGhpcykuYWRkUmFuZ2UoYShlKSl9LGNvbGxhcHNlOmZ1bmN0aW9uKGUsdCl7byh0aGlzKS5jb2xsYXBzZShhKGUpLHQpfSxjb250YWluc05vZGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbyh0aGlzKS5jb250YWluc05vZGUoYShlKSx0KX0sZ2V0UmFuZ2VBdDpmdW5jdGlvbihlKXtyZXR1cm4gcyhvKHRoaXMpLmdldFJhbmdlQXQoZSkpfSxyZW1vdmVSYW5nZTpmdW5jdGlvbihlKXtvKHRoaXMpLnJlbW92ZVJhbmdlKGkoZSkpfSxzZWxlY3RBbGxDaGlsZHJlbjpmdW5jdGlvbihlKXtvKHRoaXMpLnNlbGVjdEFsbENoaWxkcmVuKGUgaW5zdGFuY2VvZiBTaGFkb3dSb290P28oZS5ob3N0KTphKGUpKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzKS50b1N0cmluZygpfX0sYy5wcm90b3R5cGUuZXh0ZW5kJiYodC5wcm90b3R5cGUuZXh0ZW5kPWZ1bmN0aW9uKGUsdCl7byh0aGlzKS5leHRlbmQoYShlKSx0KX0pLG4od2luZG93LlNlbGVjdGlvbix0LHdpbmRvdy5nZXRTZWxlY3Rpb24oKSksZS53cmFwcGVycy5TZWxlY3Rpb249dH0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe3IoZSx0aGlzKX12YXIgbj1lLnJlZ2lzdGVyV3JhcHBlcixyPWUuc2V0V3JhcHBlcixvPWUudW5zYWZlVW53cmFwLGk9ZS51bndyYXBJZk5lZWRlZCxhPWUud3JhcCxzPXdpbmRvdy5UcmVlV2Fsa2VyO3QucHJvdG90eXBlPXtnZXQgcm9vdCgpe3JldHVybiBhKG8odGhpcykucm9vdCl9LGdldCBjdXJyZW50Tm9kZSgpe3JldHVybiBhKG8odGhpcykuY3VycmVudE5vZGUpfSxzZXQgY3VycmVudE5vZGUoZSl7byh0aGlzKS5jdXJyZW50Tm9kZT1pKGUpfSxnZXQgZmlsdGVyKCl7cmV0dXJuIG8odGhpcykuZmlsdGVyfSxwYXJlbnROb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIGEobyh0aGlzKS5wYXJlbnROb2RlKCkpfSxmaXJzdENoaWxkOmZ1bmN0aW9uKCl7cmV0dXJuIGEobyh0aGlzKS5maXJzdENoaWxkKCkpfSxsYXN0Q2hpbGQ6ZnVuY3Rpb24oKXtyZXR1cm4gYShvKHRoaXMpLmxhc3RDaGlsZCgpKX0scHJldmlvdXNTaWJsaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIGEobyh0aGlzKS5wcmV2aW91c1NpYmxpbmcoKSl9LHByZXZpb3VzTm9kZTpmdW5jdGlvbigpe3JldHVybiBhKG8odGhpcykucHJldmlvdXNOb2RlKCkpfSxuZXh0Tm9kZTpmdW5jdGlvbigpe3JldHVybiBhKG8odGhpcykubmV4dE5vZGUoKSl9fSxuKHMsdCksZS53cmFwcGVycy5UcmVlV2Fsa2VyPXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXt1LmNhbGwodGhpcyxlKSx0aGlzLnRyZWVTY29wZV89bmV3IHcodGhpcyxudWxsKX1mdW5jdGlvbiBuKGUpe3ZhciBuPWRvY3VtZW50W2VdO3QucHJvdG90eXBlW2VdPWZ1bmN0aW9uKCl7cmV0dXJuIGoobi5hcHBseShOKHRoaXMpLGFyZ3VtZW50cykpfX1mdW5jdGlvbiByKGUsdCl7eC5jYWxsKE4odCksQyhlKSksbyhlLHQpfWZ1bmN0aW9uIG8oZSx0KXtlLnNoYWRvd1Jvb3QmJnQuYWRvcHROb2RlKGUuc2hhZG93Um9vdCksZSBpbnN0YW5jZW9mIG0mJmkoZSx0KTtmb3IodmFyIG49ZS5maXJzdENoaWxkO247bj1uLm5leHRTaWJsaW5nKW8obix0KX1mdW5jdGlvbiBpKGUsdCl7dmFyIG49ZS5vbGRlclNoYWRvd1Jvb3Q7biYmdC5hZG9wdE5vZGUobil9ZnVuY3Rpb24gYShlKXtMKGUsdGhpcyl9ZnVuY3Rpb24gcyhlLHQpe1xudmFyIG49ZG9jdW1lbnQuaW1wbGVtZW50YXRpb25bdF07ZS5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXtyZXR1cm4gaihuLmFwcGx5KE4odGhpcyksYXJndW1lbnRzKSl9fWZ1bmN0aW9uIGMoZSx0KXt2YXIgbj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvblt0XTtlLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3JldHVybiBuLmFwcGx5KE4odGhpcyksYXJndW1lbnRzKX19dmFyIGw9ZS5HZXRFbGVtZW50c0J5SW50ZXJmYWNlLHU9ZS53cmFwcGVycy5Ob2RlLGQ9ZS5QYXJlbnROb2RlSW50ZXJmYWNlLHA9ZS5Ob25FbGVtZW50UGFyZW50Tm9kZUludGVyZmFjZSxoPWUud3JhcHBlcnMuU2VsZWN0aW9uLGY9ZS5TZWxlY3RvcnNJbnRlcmZhY2UsbT1lLndyYXBwZXJzLlNoYWRvd1Jvb3Qsdz1lLlRyZWVTY29wZSx2PWUuY2xvbmVOb2RlLGc9ZS5kZWZpbmVHZXR0ZXIsYj1lLmRlZmluZVdyYXBHZXR0ZXIseT1lLmVsZW1lbnRGcm9tUG9pbnQsRT1lLmZvcndhcmRNZXRob2RzVG9XcmFwcGVyLF89ZS5tYXRjaGVzTmFtZXMsUz1lLm1peGluLFQ9ZS5yZWdpc3RlcldyYXBwZXIsTT1lLnJlbmRlckFsbFBlbmRpbmcsTz1lLnJld3JhcCxMPWUuc2V0V3JhcHBlcixOPWUudW5zYWZlVW53cmFwLEM9ZS51bndyYXAsaj1lLndyYXAsRD1lLndyYXBFdmVudFRhcmdldE1ldGhvZHMsSD0oZS53cmFwTm9kZUxpc3QsbmV3IFdlYWtNYXApO3QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodS5wcm90b3R5cGUpLGIodCxcImRvY3VtZW50RWxlbWVudFwiKSxiKHQsXCJib2R5XCIpLGIodCxcImhlYWRcIiksZyh0LFwiYWN0aXZlRWxlbWVudFwiLGZ1bmN0aW9uKCl7dmFyIGU9Qyh0aGlzKS5hY3RpdmVFbGVtZW50O2lmKCFlfHwhZS5ub2RlVHlwZSlyZXR1cm4gbnVsbDtmb3IodmFyIHQ9aihlKTshdGhpcy5jb250YWlucyh0KTspe2Zvcig7dC5wYXJlbnROb2RlOyl0PXQucGFyZW50Tm9kZTtpZighdC5ob3N0KXJldHVybiBudWxsO3Q9dC5ob3N0fXJldHVybiB0fSksW1wiY3JlYXRlQ29tbWVudFwiLFwiY3JlYXRlRG9jdW1lbnRGcmFnbWVudFwiLFwiY3JlYXRlRWxlbWVudFwiLFwiY3JlYXRlRWxlbWVudE5TXCIsXCJjcmVhdGVFdmVudFwiLFwiY3JlYXRlRXZlbnROU1wiLFwiY3JlYXRlUmFuZ2VcIixcImNyZWF0ZVRleHROb2RlXCJdLmZvckVhY2gobik7dmFyIHg9ZG9jdW1lbnQuYWRvcHROb2RlLFI9ZG9jdW1lbnQuZ2V0U2VsZWN0aW9uO1ModC5wcm90b3R5cGUse2Fkb3B0Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSkscihlLHRoaXMpLGV9LGVsZW1lbnRGcm9tUG9pbnQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geSh0aGlzLHRoaXMsZSx0KX0saW1wb3J0Tm9kZTpmdW5jdGlvbihlLHQpe3JldHVybiB2KGUsdCxOKHRoaXMpKX0sZ2V0U2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIE0oKSxuZXcgaChSLmNhbGwoQyh0aGlzKSkpfSxnZXRFbGVtZW50c0J5TmFtZTpmdW5jdGlvbihlKXtyZXR1cm4gZi5xdWVyeVNlbGVjdG9yQWxsLmNhbGwodGhpcyxcIltuYW1lPVwiK0pTT04uc3RyaW5naWZ5KFN0cmluZyhlKSkrXCJdXCIpfX0pO3ZhciBJPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIsUD1lLndyYXBwZXJzLlRyZWVXYWxrZXI7aWYodC5wcm90b3R5cGUuY3JlYXRlVHJlZVdhbGtlcj1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz1udWxsO3JldHVybiBuJiYobi5hY2NlcHROb2RlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBuLmFjY2VwdE5vZGU/bz17YWNjZXB0Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gbi5hY2NlcHROb2RlKGooZSkpfX06XCJmdW5jdGlvblwiPT10eXBlb2YgbiYmKG89ZnVuY3Rpb24oZSl7cmV0dXJuIG4oaihlKSl9KSksbmV3IFAoSS5jYWxsKEModGhpcyksQyhlKSx0LG8scikpfSxkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQpe3ZhciBrPWRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudDt0LnByb3RvdHlwZS5yZWdpc3RlckVsZW1lbnQ9ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiByKGUpe3JldHVybiBlP3ZvaWQgTChlLHRoaXMpOmk/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpLHQpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCl9dmFyIG8saTtpZih2b2lkIDAhPT1uJiYobz1uLnByb3RvdHlwZSxpPW5bXCJleHRlbmRzXCJdKSxvfHwobz1PYmplY3QuY3JlYXRlKEhUTUxFbGVtZW50LnByb3RvdHlwZSkpLGUubmF0aXZlUHJvdG90eXBlVGFibGUuZ2V0KG8pKXRocm93IG5ldyBFcnJvcihcIk5vdFN1cHBvcnRlZEVycm9yXCIpO2Zvcih2YXIgYSxzPU9iamVjdC5nZXRQcm90b3R5cGVPZihvKSxjPVtdO3MmJiEoYT1lLm5hdGl2ZVByb3RvdHlwZVRhYmxlLmdldChzKSk7KWMucHVzaChzKSxzPU9iamVjdC5nZXRQcm90b3R5cGVPZihzKTtpZighYSl0aHJvdyBuZXcgRXJyb3IoXCJOb3RTdXBwb3J0ZWRFcnJvclwiKTtmb3IodmFyIGw9T2JqZWN0LmNyZWF0ZShhKSx1PWMubGVuZ3RoLTE7dT49MDt1LS0pbD1PYmplY3QuY3JlYXRlKGwpO1tcImNyZWF0ZWRDYWxsYmFja1wiLFwiYXR0YWNoZWRDYWxsYmFja1wiLFwiZGV0YWNoZWRDYWxsYmFja1wiLFwiYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrXCJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9b1tlXTt0JiYobFtlXT1mdW5jdGlvbigpe2oodGhpcylpbnN0YW5jZW9mIHJ8fE8odGhpcyksdC5hcHBseShqKHRoaXMpLGFyZ3VtZW50cyl9KX0pO3ZhciBkPXtwcm90b3R5cGU6bH07aSYmKGRbXCJleHRlbmRzXCJdPWkpLHIucHJvdG90eXBlPW8sci5wcm90b3R5cGUuY29uc3RydWN0b3I9cixlLmNvbnN0cnVjdG9yVGFibGUuc2V0KGwsciksZS5uYXRpdmVQcm90b3R5cGVUYWJsZS5zZXQobyxsKTtrLmNhbGwoQyh0aGlzKSx0LGQpO3JldHVybiByfSxFKFt3aW5kb3cuSFRNTERvY3VtZW50fHx3aW5kb3cuRG9jdW1lbnRdLFtcInJlZ2lzdGVyRWxlbWVudFwiXSl9RShbd2luZG93LkhUTUxCb2R5RWxlbWVudCx3aW5kb3cuSFRNTERvY3VtZW50fHx3aW5kb3cuRG9jdW1lbnQsd2luZG93LkhUTUxIZWFkRWxlbWVudCx3aW5kb3cuSFRNTEh0bWxFbGVtZW50XSxbXCJhcHBlbmRDaGlsZFwiLFwiY29tcGFyZURvY3VtZW50UG9zaXRpb25cIixcImNvbnRhaW5zXCIsXCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lXCIsXCJnZXRFbGVtZW50c0J5VGFnTmFtZVwiLFwiZ2V0RWxlbWVudHNCeVRhZ05hbWVOU1wiLFwiaW5zZXJ0QmVmb3JlXCIsXCJxdWVyeVNlbGVjdG9yXCIsXCJxdWVyeVNlbGVjdG9yQWxsXCIsXCJyZW1vdmVDaGlsZFwiLFwicmVwbGFjZUNoaWxkXCJdKSxFKFt3aW5kb3cuSFRNTEJvZHlFbGVtZW50LHdpbmRvdy5IVE1MSGVhZEVsZW1lbnQsd2luZG93LkhUTUxIdG1sRWxlbWVudF0sXyksRShbd2luZG93LkhUTUxEb2N1bWVudHx8d2luZG93LkRvY3VtZW50XSxbXCJhZG9wdE5vZGVcIixcImltcG9ydE5vZGVcIixcImNvbnRhaW5zXCIsXCJjcmVhdGVDb21tZW50XCIsXCJjcmVhdGVEb2N1bWVudEZyYWdtZW50XCIsXCJjcmVhdGVFbGVtZW50XCIsXCJjcmVhdGVFbGVtZW50TlNcIixcImNyZWF0ZUV2ZW50XCIsXCJjcmVhdGVFdmVudE5TXCIsXCJjcmVhdGVSYW5nZVwiLFwiY3JlYXRlVGV4dE5vZGVcIixcImNyZWF0ZVRyZWVXYWxrZXJcIixcImVsZW1lbnRGcm9tUG9pbnRcIixcImdldEVsZW1lbnRCeUlkXCIsXCJnZXRFbGVtZW50c0J5TmFtZVwiLFwiZ2V0U2VsZWN0aW9uXCJdKSxTKHQucHJvdG90eXBlLGwpLFModC5wcm90b3R5cGUsZCksUyh0LnByb3RvdHlwZSxmKSxTKHQucHJvdG90eXBlLHApLFModC5wcm90b3R5cGUse2dldCBpbXBsZW1lbnRhdGlvbigpe3ZhciBlPUguZ2V0KHRoaXMpO3JldHVybiBlP2U6KGU9bmV3IGEoQyh0aGlzKS5pbXBsZW1lbnRhdGlvbiksSC5zZXQodGhpcyxlKSxlKX0sZ2V0IGRlZmF1bHRWaWV3KCl7cmV0dXJuIGooQyh0aGlzKS5kZWZhdWx0Vmlldyl9fSksVCh3aW5kb3cuRG9jdW1lbnQsdCxkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoXCJcIikpLHdpbmRvdy5IVE1MRG9jdW1lbnQmJlQod2luZG93LkhUTUxEb2N1bWVudCx0KSxEKFt3aW5kb3cuSFRNTEJvZHlFbGVtZW50LHdpbmRvdy5IVE1MRG9jdW1lbnR8fHdpbmRvdy5Eb2N1bWVudCx3aW5kb3cuSFRNTEhlYWRFbGVtZW50XSk7dmFyIEE9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQ7YS5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzWzJdPUMoYXJndW1lbnRzWzJdKSxqKEEuYXBwbHkoTih0aGlzKSxhcmd1bWVudHMpKX0scyhhLFwiY3JlYXRlRG9jdW1lbnRUeXBlXCIpLHMoYSxcImNyZWF0ZUhUTUxEb2N1bWVudFwiKSxjKGEsXCJoYXNGZWF0dXJlXCIpLFQod2luZG93LkRPTUltcGxlbWVudGF0aW9uLGEpLEUoW3dpbmRvdy5ET01JbXBsZW1lbnRhdGlvbl0sW1wiY3JlYXRlRG9jdW1lbnRcIixcImNyZWF0ZURvY3VtZW50VHlwZVwiLFwiY3JlYXRlSFRNTERvY3VtZW50XCIsXCJoYXNGZWF0dXJlXCJdKSxlLmFkb3B0Tm9kZU5vUmVtb3ZlPXIsZS53cmFwcGVycy5ET01JbXBsZW1lbnRhdGlvbj1hLGUud3JhcHBlcnMuRG9jdW1lbnQ9dH0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe24uY2FsbCh0aGlzLGUpfXZhciBuPWUud3JhcHBlcnMuRXZlbnRUYXJnZXQscj1lLndyYXBwZXJzLlNlbGVjdGlvbixvPWUubWl4aW4saT1lLnJlZ2lzdGVyV3JhcHBlcixhPWUucmVuZGVyQWxsUGVuZGluZyxzPWUudW53cmFwLGM9ZS51bndyYXBJZk5lZWRlZCxsPWUud3JhcCx1PXdpbmRvdy5XaW5kb3csZD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxwPXdpbmRvdy5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSxoPXdpbmRvdy5nZXRTZWxlY3Rpb247dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSksdS5wcm90b3R5cGUuZ2V0Q29tcHV0ZWRTdHlsZT1mdW5jdGlvbihlLHQpe3JldHVybiBsKHRoaXN8fHdpbmRvdykuZ2V0Q29tcHV0ZWRTdHlsZShjKGUpLHQpfSxwJiYodS5wcm90b3R5cGUuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbCh0aGlzfHx3aW5kb3cpLmdldERlZmF1bHRDb21wdXRlZFN0eWxlKGMoZSksdCl9KSx1LnByb3RvdHlwZS5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gbCh0aGlzfHx3aW5kb3cpLmdldFNlbGVjdGlvbigpfSxkZWxldGUgd2luZG93LmdldENvbXB1dGVkU3R5bGUsZGVsZXRlIHdpbmRvdy5nZXREZWZhdWx0Q29tcHV0ZWRTdHlsZSxkZWxldGUgd2luZG93LmdldFNlbGVjdGlvbixbXCJhZGRFdmVudExpc3RlbmVyXCIsXCJyZW1vdmVFdmVudExpc3RlbmVyXCIsXCJkaXNwYXRjaEV2ZW50XCJdLmZvckVhY2goZnVuY3Rpb24oZSl7dS5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXt2YXIgdD1sKHRoaXN8fHdpbmRvdyk7cmV0dXJuIHRbZV0uYXBwbHkodCxhcmd1bWVudHMpfSxkZWxldGUgd2luZG93W2VdfSksbyh0LnByb3RvdHlwZSx7Z2V0Q29tcHV0ZWRTdHlsZTpmdW5jdGlvbihlLHQpe3JldHVybiBhKCksZC5jYWxsKHModGhpcyksYyhlKSx0KX0sZ2V0U2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIGEoKSxuZXcgcihoLmNhbGwocyh0aGlzKSkpfSxnZXQgZG9jdW1lbnQoKXtyZXR1cm4gbChzKHRoaXMpLmRvY3VtZW50KX19KSxwJiYodC5wcm90b3R5cGUuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYSgpLHAuY2FsbChzKHRoaXMpLGMoZSksdCl9KSxpKHUsdCx3aW5kb3cpLGUud3JhcHBlcnMuV2luZG93PXR9KHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7dmFyIHQ9ZS51bndyYXAsbj13aW5kb3cuRGF0YVRyYW5zZmVyfHx3aW5kb3cuQ2xpcGJvYXJkLHI9bi5wcm90b3R5cGUuc2V0RHJhZ0ltYWdlO3ImJihuLnByb3RvdHlwZS5zZXREcmFnSW1hZ2U9ZnVuY3Rpb24oZSxuLG8pe3IuY2FsbCh0aGlzLHQoZSksbixvKX0pfSh3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQoZSl7dmFyIHQ7dD1lIGluc3RhbmNlb2YgaT9lOm5ldyBpKGUmJm8oZSkpLHIodCx0aGlzKX12YXIgbj1lLnJlZ2lzdGVyV3JhcHBlcixyPWUuc2V0V3JhcHBlcixvPWUudW53cmFwLGk9d2luZG93LkZvcm1EYXRhO2kmJihuKGksdCxuZXcgaSksZS53cmFwcGVycy5Gb3JtRGF0YT10KX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjt2YXIgdD1lLnVud3JhcElmTmVlZGVkLG49WE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLnNlbmQ7WE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLnNlbmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uY2FsbCh0aGlzLHQoZSkpfX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiB0KGUpe3ZhciB0PW5bZV0scj13aW5kb3dbdF07aWYocil7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlKSxpPW8uY29uc3RydWN0b3I7d2luZG93W3RdPWl9fXZhciBuPShlLmlzV3JhcHBlckZvcix7YTpcIkhUTUxBbmNob3JFbGVtZW50XCIsYXJlYTpcIkhUTUxBcmVhRWxlbWVudFwiLGF1ZGlvOlwiSFRNTEF1ZGlvRWxlbWVudFwiLGJhc2U6XCJIVE1MQmFzZUVsZW1lbnRcIixib2R5OlwiSFRNTEJvZHlFbGVtZW50XCIsYnI6XCJIVE1MQlJFbGVtZW50XCIsYnV0dG9uOlwiSFRNTEJ1dHRvbkVsZW1lbnRcIixjYW52YXM6XCJIVE1MQ2FudmFzRWxlbWVudFwiLGNhcHRpb246XCJIVE1MVGFibGVDYXB0aW9uRWxlbWVudFwiLGNvbDpcIkhUTUxUYWJsZUNvbEVsZW1lbnRcIixjb250ZW50OlwiSFRNTENvbnRlbnRFbGVtZW50XCIsZGF0YTpcIkhUTUxEYXRhRWxlbWVudFwiLGRhdGFsaXN0OlwiSFRNTERhdGFMaXN0RWxlbWVudFwiLGRlbDpcIkhUTUxNb2RFbGVtZW50XCIsZGlyOlwiSFRNTERpcmVjdG9yeUVsZW1lbnRcIixkaXY6XCJIVE1MRGl2RWxlbWVudFwiLGRsOlwiSFRNTERMaXN0RWxlbWVudFwiLGVtYmVkOlwiSFRNTEVtYmVkRWxlbWVudFwiLGZpZWxkc2V0OlwiSFRNTEZpZWxkU2V0RWxlbWVudFwiLGZvbnQ6XCJIVE1MRm9udEVsZW1lbnRcIixmb3JtOlwiSFRNTEZvcm1FbGVtZW50XCIsZnJhbWU6XCJIVE1MRnJhbWVFbGVtZW50XCIsZnJhbWVzZXQ6XCJIVE1MRnJhbWVTZXRFbGVtZW50XCIsaDE6XCJIVE1MSGVhZGluZ0VsZW1lbnRcIixoZWFkOlwiSFRNTEhlYWRFbGVtZW50XCIsaHI6XCJIVE1MSFJFbGVtZW50XCIsaHRtbDpcIkhUTUxIdG1sRWxlbWVudFwiLGlmcmFtZTpcIkhUTUxJRnJhbWVFbGVtZW50XCIsaW1nOlwiSFRNTEltYWdlRWxlbWVudFwiLGlucHV0OlwiSFRNTElucHV0RWxlbWVudFwiLGtleWdlbjpcIkhUTUxLZXlnZW5FbGVtZW50XCIsbGFiZWw6XCJIVE1MTGFiZWxFbGVtZW50XCIsbGVnZW5kOlwiSFRNTExlZ2VuZEVsZW1lbnRcIixsaTpcIkhUTUxMSUVsZW1lbnRcIixsaW5rOlwiSFRNTExpbmtFbGVtZW50XCIsbWFwOlwiSFRNTE1hcEVsZW1lbnRcIixtYXJxdWVlOlwiSFRNTE1hcnF1ZWVFbGVtZW50XCIsbWVudTpcIkhUTUxNZW51RWxlbWVudFwiLG1lbnVpdGVtOlwiSFRNTE1lbnVJdGVtRWxlbWVudFwiLG1ldGE6XCJIVE1MTWV0YUVsZW1lbnRcIixtZXRlcjpcIkhUTUxNZXRlckVsZW1lbnRcIixvYmplY3Q6XCJIVE1MT2JqZWN0RWxlbWVudFwiLG9sOlwiSFRNTE9MaXN0RWxlbWVudFwiLG9wdGdyb3VwOlwiSFRNTE9wdEdyb3VwRWxlbWVudFwiLG9wdGlvbjpcIkhUTUxPcHRpb25FbGVtZW50XCIsb3V0cHV0OlwiSFRNTE91dHB1dEVsZW1lbnRcIixwOlwiSFRNTFBhcmFncmFwaEVsZW1lbnRcIixwYXJhbTpcIkhUTUxQYXJhbUVsZW1lbnRcIixwcmU6XCJIVE1MUHJlRWxlbWVudFwiLHByb2dyZXNzOlwiSFRNTFByb2dyZXNzRWxlbWVudFwiLHE6XCJIVE1MUXVvdGVFbGVtZW50XCIsc2NyaXB0OlwiSFRNTFNjcmlwdEVsZW1lbnRcIixzZWxlY3Q6XCJIVE1MU2VsZWN0RWxlbWVudFwiLHNoYWRvdzpcIkhUTUxTaGFkb3dFbGVtZW50XCIsc291cmNlOlwiSFRNTFNvdXJjZUVsZW1lbnRcIixzcGFuOlwiSFRNTFNwYW5FbGVtZW50XCIsc3R5bGU6XCJIVE1MU3R5bGVFbGVtZW50XCIsdGFibGU6XCJIVE1MVGFibGVFbGVtZW50XCIsdGJvZHk6XCJIVE1MVGFibGVTZWN0aW9uRWxlbWVudFwiLHRlbXBsYXRlOlwiSFRNTFRlbXBsYXRlRWxlbWVudFwiLHRleHRhcmVhOlwiSFRNTFRleHRBcmVhRWxlbWVudFwiLHRoZWFkOlwiSFRNTFRhYmxlU2VjdGlvbkVsZW1lbnRcIix0aW1lOlwiSFRNTFRpbWVFbGVtZW50XCIsdGl0bGU6XCJIVE1MVGl0bGVFbGVtZW50XCIsdHI6XCJIVE1MVGFibGVSb3dFbGVtZW50XCIsdHJhY2s6XCJIVE1MVHJhY2tFbGVtZW50XCIsdWw6XCJIVE1MVUxpc3RFbGVtZW50XCIsdmlkZW86XCJIVE1MVmlkZW9FbGVtZW50XCJ9KTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKHQpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUud3JhcHBlcnMpLmZvckVhY2goZnVuY3Rpb24odCl7d2luZG93W3RdPWUud3JhcHBlcnNbdF19KX0od2luZG93LlNoYWRvd0RPTVBvbHlmaWxsKSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsdCl7dmFyIG49XCJcIjtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLGZ1bmN0aW9uKGUpe24rPWUudGV4dENvbnRlbnQrXCJcXG5cXG5cIn0pLHR8fChuPW4ucmVwbGFjZShkLFwiXCIpKSxufWZ1bmN0aW9uIG4oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO3JldHVybiB0LnRleHRDb250ZW50PWUsdH1mdW5jdGlvbiByKGUpe3ZhciB0PW4oZSk7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0KTt2YXIgcj1bXTtpZih0LnNoZWV0KXRyeXtyPXQuc2hlZXQuY3NzUnVsZXN9Y2F0Y2gobyl7fWVsc2UgY29uc29sZS53YXJuKFwic2hlZXQgbm90IGZvdW5kXCIsdCk7cmV0dXJuIHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSxyfWZ1bmN0aW9uIG8oKXtDLmluaXRpYWxpemVkPSEwLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoQyk7dmFyIGU9Qy5jb250ZW50RG9jdW1lbnQsdD1lLmNyZWF0ZUVsZW1lbnQoXCJiYXNlXCIpO3QuaHJlZj1kb2N1bWVudC5iYXNlVVJJLGUuaGVhZC5hcHBlbmRDaGlsZCh0KX1mdW5jdGlvbiBpKGUpe0MuaW5pdGlhbGl6ZWR8fG8oKSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEMpLGUoQy5jb250ZW50RG9jdW1lbnQpLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoQyl9ZnVuY3Rpb24gYShlLHQpe2lmKHQpe3ZhciBvO2lmKGUubWF0Y2goXCJAaW1wb3J0XCIpJiZEKXt2YXIgYT1uKGUpO2koZnVuY3Rpb24oZSl7ZS5oZWFkLmFwcGVuZENoaWxkKGEuaW1wbCksbz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLnNoZWV0LmNzc1J1bGVzLDApLHQobyl9KX1lbHNlIG89cihlKSx0KG8pfX1mdW5jdGlvbiBzKGUpe2UmJmwoKS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKSl9ZnVuY3Rpb24gYyhlLHQpe3ZhciByPW4oZSk7ci5zZXRBdHRyaWJ1dGUodCxcIlwiKSxyLnNldEF0dHJpYnV0ZSh4LFwiXCIpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQocil9ZnVuY3Rpb24gbCgpe3JldHVybiBqfHwoaj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIiksai5zZXRBdHRyaWJ1dGUoeCxcIlwiKSxqW3hdPSEwKSxqfXZhciB1PXtzdHJpY3RTdHlsaW5nOiExLHJlZ2lzdHJ5Ont9LHNoaW1TdHlsaW5nOmZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLnByZXBhcmVSb290KGUsbixyKSxpPXRoaXMuaXNUeXBlRXh0ZW5zaW9uKHIpLGE9dGhpcy5tYWtlU2NvcGVTZWxlY3RvcihuLGkpLHM9dChvLCEwKTtzPXRoaXMuc2NvcGVDc3NUZXh0KHMsYSksZSYmKGUuc2hpbW1lZFN0eWxlPXMpLHRoaXMuYWRkQ3NzVG9Eb2N1bWVudChzLG4pfSxzaGltU3R5bGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zaGltQ3NzVGV4dChlLnRleHRDb250ZW50LHQpfSxzaGltQ3NzVGV4dDpmdW5jdGlvbihlLHQpe3JldHVybiBlPXRoaXMuaW5zZXJ0RGlyZWN0aXZlcyhlKSx0aGlzLnNjb3BlQ3NzVGV4dChlLHQpfSxtYWtlU2NvcGVTZWxlY3RvcjpmdW5jdGlvbihlLHQpe3JldHVybiBlP3Q/XCJbaXM9XCIrZStcIl1cIjplOlwiXCJ9LGlzVHlwZUV4dGVuc2lvbjpmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5pbmRleE9mKFwiLVwiKTwwfSxwcmVwYXJlUm9vdDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5yZWdpc3RlclJvb3QoZSx0LG4pO3JldHVybiB0aGlzLnJlcGxhY2VUZXh0SW5TdHlsZXMoci5yb290U3R5bGVzLHRoaXMuaW5zZXJ0RGlyZWN0aXZlcyksdGhpcy5yZW1vdmVTdHlsZXMoZSxyLnJvb3RTdHlsZXMpLHRoaXMuc3RyaWN0U3R5bGluZyYmdGhpcy5hcHBseVNjb3BlVG9Db250ZW50KGUsdCksci5zY29wZVN0eWxlc30scmVtb3ZlU3R5bGVzOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHI9MCxvPXQubGVuZ3RoO28+ciYmKG49dFtyXSk7cisrKW4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKX0scmVnaXN0ZXJSb290OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLnJlZ2lzdHJ5W3RdPXtyb290OmUsbmFtZTp0LGV4dGVuZHNOYW1lOm59LG89dGhpcy5maW5kU3R5bGVzKGUpO3Iucm9vdFN0eWxlcz1vLHIuc2NvcGVTdHlsZXM9ci5yb290U3R5bGVzO3ZhciBpPXRoaXMucmVnaXN0cnlbci5leHRlbmRzTmFtZV07cmV0dXJuIGkmJihyLnNjb3BlU3R5bGVzPWkuc2NvcGVTdHlsZXMuY29uY2F0KHIuc2NvcGVTdHlsZXMpKSxyfSxmaW5kU3R5bGVzOmZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybltdO3ZhciB0PWUucXVlcnlTZWxlY3RvckFsbChcInN0eWxlXCIpO3JldHVybiBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodCxmdW5jdGlvbihlKXtyZXR1cm4hZS5oYXNBdHRyaWJ1dGUoUil9KX0sYXBwbHlTY29wZVRvQ29udGVudDpmdW5jdGlvbihlLHQpe2UmJihBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGUucXVlcnlTZWxlY3RvckFsbChcIipcIiksZnVuY3Rpb24oZSl7ZS5zZXRBdHRyaWJ1dGUodCxcIlwiKX0pLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZS5xdWVyeVNlbGVjdG9yQWxsKFwidGVtcGxhdGVcIiksZnVuY3Rpb24oZSl7dGhpcy5hcHBseVNjb3BlVG9Db250ZW50KGUuY29udGVudCx0KX0sdGhpcykpfSxpbnNlcnREaXJlY3RpdmVzOmZ1bmN0aW9uKGUpe3JldHVybiBlPXRoaXMuaW5zZXJ0UG9seWZpbGxEaXJlY3RpdmVzSW5Dc3NUZXh0KGUpLHRoaXMuaW5zZXJ0UG9seWZpbGxSdWxlc0luQ3NzVGV4dChlKX0saW5zZXJ0UG9seWZpbGxEaXJlY3RpdmVzSW5Dc3NUZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBlPWUucmVwbGFjZShwLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuc2xpY2UoMCwtMikrXCJ7XCJ9KSxlLnJlcGxhY2UoaCxmdW5jdGlvbihlLHQpe3JldHVybiB0K1wiIHtcIn0pfSxpbnNlcnRQb2x5ZmlsbFJ1bGVzSW5Dc3NUZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBlPWUucmVwbGFjZShmLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuc2xpY2UoMCwtMSl9KSxlLnJlcGxhY2UobSxmdW5jdGlvbihlLHQsbixyKXt2YXIgbz1lLnJlcGxhY2UodCxcIlwiKS5yZXBsYWNlKG4sXCJcIik7cmV0dXJuIHIrb30pfSxzY29wZUNzc1RleHQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmV4dHJhY3RVbnNjb3BlZFJ1bGVzRnJvbUNzc1RleHQoZSk7aWYoZT10aGlzLmluc2VydFBvbHlmaWxsSG9zdEluQ3NzVGV4dChlKSxlPXRoaXMuY29udmVydENvbG9uSG9zdChlKSxlPXRoaXMuY29udmVydENvbG9uSG9zdENvbnRleHQoZSksZT10aGlzLmNvbnZlcnRTaGFkb3dET01TZWxlY3RvcnMoZSksdCl7dmFyIGUscj10aGlzO2EoZSxmdW5jdGlvbihuKXtlPXIuc2NvcGVSdWxlcyhuLHQpfSl9cmV0dXJuIGU9ZStcIlxcblwiK24sZS50cmltKCl9LGV4dHJhY3RVbnNjb3BlZFJ1bGVzRnJvbUNzc1RleHQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49XCJcIjt0PXcuZXhlYyhlKTspbis9dFsxXS5zbGljZSgwLC0xKStcIlxcblxcblwiO2Zvcig7dD12LmV4ZWMoZSk7KW4rPXRbMF0ucmVwbGFjZSh0WzJdLFwiXCIpLnJlcGxhY2UodFsxXSx0WzNdKStcIlxcblxcblwiO3JldHVybiBufSxjb252ZXJ0Q29sb25Ib3N0OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbnZlcnRDb2xvblJ1bGUoZSxFLHRoaXMuY29sb25Ib3N0UGFydFJlcGxhY2VyKX0sY29udmVydENvbG9uSG9zdENvbnRleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29udmVydENvbG9uUnVsZShlLF8sdGhpcy5jb2xvbkhvc3RDb250ZXh0UGFydFJlcGxhY2VyKX0sY29udmVydENvbG9uUnVsZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUucmVwbGFjZSh0LGZ1bmN0aW9uKGUsdCxyLG8pe2lmKHQ9TyxyKXtmb3IodmFyIGksYT1yLnNwbGl0KFwiLFwiKSxzPVtdLGM9MCxsPWEubGVuZ3RoO2w+YyYmKGk9YVtjXSk7YysrKWk9aS50cmltKCkscy5wdXNoKG4odCxpLG8pKTtyZXR1cm4gcy5qb2luKFwiLFwiKX1yZXR1cm4gdCtvfSl9LGNvbG9uSG9zdENvbnRleHRQYXJ0UmVwbGFjZXI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0Lm1hdGNoKGcpP3RoaXMuY29sb25Ib3N0UGFydFJlcGxhY2VyKGUsdCxuKTplK3QrbitcIiwgXCIrdCtcIiBcIitlK259LGNvbG9uSG9zdFBhcnRSZXBsYWNlcjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUrdC5yZXBsYWNlKGcsXCJcIikrbn0sY29udmVydFNoYWRvd0RPTVNlbGVjdG9yczpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PE4ubGVuZ3RoO3QrKyllPWUucmVwbGFjZShOW3RdLFwiIFwiKTtyZXR1cm4gZX0sc2NvcGVSdWxlczpmdW5jdGlvbihlLHQpe3ZhciBuPVwiXCI7cmV0dXJuIGUmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZSxmdW5jdGlvbihlKXtpZihlLnNlbGVjdG9yVGV4dCYmZS5zdHlsZSYmdm9pZCAwIT09ZS5zdHlsZS5jc3NUZXh0KW4rPXRoaXMuc2NvcGVTZWxlY3RvcihlLnNlbGVjdG9yVGV4dCx0LHRoaXMuc3RyaWN0U3R5bGluZykrXCIge1xcblx0XCIsbis9dGhpcy5wcm9wZXJ0aWVzRnJvbVJ1bGUoZSkrXCJcXG59XFxuXFxuXCI7ZWxzZSBpZihlLnR5cGU9PT1DU1NSdWxlLk1FRElBX1JVTEUpbis9XCJAbWVkaWEgXCIrZS5tZWRpYS5tZWRpYVRleHQrXCIge1xcblwiLG4rPXRoaXMuc2NvcGVSdWxlcyhlLmNzc1J1bGVzLHQpLG4rPVwiXFxufVxcblxcblwiO2Vsc2UgdHJ5e2UuY3NzVGV4dCYmKG4rPWUuY3NzVGV4dCtcIlxcblxcblwiKX1jYXRjaChyKXtlLnR5cGU9PT1DU1NSdWxlLktFWUZSQU1FU19SVUxFJiZlLmNzc1J1bGVzJiYobis9dGhpcy5pZVNhZmVDc3NUZXh0RnJvbUtleUZyYW1lUnVsZShlKSl9fSx0aGlzKSxufSxpZVNhZmVDc3NUZXh0RnJvbUtleUZyYW1lUnVsZTpmdW5jdGlvbihlKXt2YXIgdD1cIkBrZXlmcmFtZXMgXCIrZS5uYW1lK1wiIHtcIjtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLmNzc1J1bGVzLGZ1bmN0aW9uKGUpe3QrPVwiIFwiK2Uua2V5VGV4dCtcIiB7XCIrZS5zdHlsZS5jc3NUZXh0K1wifVwifSksdCs9XCIgfVwifSxzY29wZVNlbGVjdG9yOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxvPWUuc3BsaXQoXCIsXCIpO3JldHVybiBvLmZvckVhY2goZnVuY3Rpb24oZSl7ZT1lLnRyaW0oKSx0aGlzLnNlbGVjdG9yTmVlZHNTY29waW5nKGUsdCkmJihlPW4mJiFlLm1hdGNoKE8pP3RoaXMuYXBwbHlTdHJpY3RTZWxlY3RvclNjb3BlKGUsdCk6dGhpcy5hcHBseVNlbGVjdG9yU2NvcGUoZSx0KSksci5wdXNoKGUpfSx0aGlzKSxyLmpvaW4oXCIsIFwiKX0sc2VsZWN0b3JOZWVkc1Njb3Bpbmc6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiEwO3ZhciBuPXRoaXMubWFrZVNjb3BlTWF0Y2hlcih0KTtyZXR1cm4hZS5tYXRjaChuKX0sbWFrZVNjb3BlTWF0Y2hlcjpmdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoL1xcWy9nLFwiXFxcXFtcIikucmVwbGFjZSgvXFxdL2csXCJcXFxcXVwiKSxuZXcgUmVnRXhwKFwiXihcIitlK1wiKVwiK1MsXCJtXCIpfSxhcHBseVNlbGVjdG9yU2NvcGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90aGlzLmFwcGx5U2VsZWN0b3JTY29wZUxpc3QoZSx0KTp0aGlzLmFwcGx5U2ltcGxlU2VsZWN0b3JTY29wZShlLHQpfSxhcHBseVNlbGVjdG9yU2NvcGVMaXN0OmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHI9W10sbz0wO249dFtvXTtvKyspci5wdXNoKHRoaXMuYXBwbHlTaW1wbGVTZWxlY3RvclNjb3BlKGUsbikpO3JldHVybiByLmpvaW4oXCIsIFwiKX0sYXBwbHlTaW1wbGVTZWxlY3RvclNjb3BlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubWF0Y2goTCk/KGU9ZS5yZXBsYWNlKE8sdCksZS5yZXBsYWNlKEwsdCtcIiBcIikpOnQrXCIgXCIrZX0sYXBwbHlTdHJpY3RTZWxlY3RvclNjb3BlOmZ1bmN0aW9uKGUsdCl7dD10LnJlcGxhY2UoL1xcW2lzPShbXlxcXV0qKVxcXS9nLFwiJDFcIik7dmFyIG49W1wiIFwiLFwiPlwiLFwiK1wiLFwiflwiXSxyPWUsbz1cIltcIit0K1wiXVwiO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ci5zcGxpdChlKTtyPXQubWFwKGZ1bmN0aW9uKGUpe3ZhciB0PWUudHJpbSgpLnJlcGxhY2UoTCxcIlwiKTtyZXR1cm4gdCYmbi5pbmRleE9mKHQpPDAmJnQuaW5kZXhPZihvKTwwJiYoZT10LnJlcGxhY2UoLyhbXjpdKikoOiopKC4qKS8sXCIkMVwiK28rXCIkMiQzXCIpKSxlfSkuam9pbihlKX0pLHJ9LGluc2VydFBvbHlmaWxsSG9zdEluQ3NzVGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKE0sYikucmVwbGFjZShULGcpfSxwcm9wZXJ0aWVzRnJvbVJ1bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdHlsZS5jc3NUZXh0O2Uuc3R5bGUuY29udGVudCYmIWUuc3R5bGUuY29udGVudC5tYXRjaCgvWydcIl0rfGF0dHIvKSYmKHQ9dC5yZXBsYWNlKC9jb250ZW50OlteO10qOy9nLFwiY29udGVudDogJ1wiK2Uuc3R5bGUuY29udGVudCtcIic7XCIpKTt2YXIgbj1lLnN0eWxlO2Zvcih2YXIgciBpbiBuKVwiaW5pdGlhbFwiPT09bltyXSYmKHQrPXIrXCI6IGluaXRpYWw7IFwiKTtyZXR1cm4gdH0scmVwbGFjZVRleHRJblN0eWxlczpmdW5jdGlvbihlLHQpe2UmJnQmJihlIGluc3RhbmNlb2YgQXJyYXl8fChlPVtlXSksQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlLGZ1bmN0aW9uKGUpe2UudGV4dENvbnRlbnQ9dC5jYWxsKHRoaXMsZS50ZXh0Q29udGVudCl9LHRoaXMpKX0sYWRkQ3NzVG9Eb2N1bWVudDpmdW5jdGlvbihlLHQpe2UubWF0Y2goXCJAaW1wb3J0XCIpP2MoZSx0KTpzKGUpfX0sZD0vXFwvXFwqW14qXSpcXCorKFteXFwvKl1bXipdKlxcKispKlxcLy9naW0scD0vXFwvXFwqXFxzKkBwb2x5ZmlsbCAoW14qXSpcXCorKFteXFwvKl1bXipdKlxcKispKlxcLykoW157XSo/KXsvZ2ltLGg9L3BvbHlmaWxsLW5leHQtc2VsZWN0b3JbXn1dKmNvbnRlbnRcXDpbXFxzXSo/WydcIl0oLio/KVsnXCJdWztcXHNdKn0oW157XSo/KXsvZ2ltLGY9L1xcL1xcKlxcc0Bwb2x5ZmlsbC1ydWxlKFteKl0qXFwqKyhbXlxcLypdW14qXSpcXCorKSopXFwvL2dpbSxtPS8ocG9seWZpbGwtcnVsZSlbXn1dKihjb250ZW50XFw6W1xcc10qWydcIl0oLio/KVsnXCJdKVs7XFxzXSpbXn1dKn0vZ2ltLHc9L1xcL1xcKlxcc0Bwb2x5ZmlsbC11bnNjb3BlZC1ydWxlKFteKl0qXFwqKyhbXlxcLypdW14qXSpcXCorKSopXFwvL2dpbSx2PS8ocG9seWZpbGwtdW5zY29wZWQtcnVsZSlbXn1dKihjb250ZW50XFw6W1xcc10qWydcIl0oLio/KVsnXCJdKVs7XFxzXSpbXn1dKn0vZ2ltLGc9XCItc2hhZG93Y3NzaG9zdFwiLGI9XCItc2hhZG93Y3NzY29udGV4dFwiLHk9XCIpKD86XFxcXCgoKD86XFxcXChbXikoXSpcXFxcKXxbXikoXSopKz8pXFxcXCkpPyhbXix7XSopXCIsRT1uZXcgUmVnRXhwKFwiKFwiK2creSxcImdpbVwiKSxfPW5ldyBSZWdFeHAoXCIoXCIrYit5LFwiZ2ltXCIpLFM9XCIoWz5cXFxcc34rWy4sezpdW1xcXFxzXFxcXFNdKik/JFwiLFQ9L1xcOmhvc3QvZ2ltLE09L1xcOmhvc3QtY29udGV4dC9naW0sTz1nK1wiLW5vLWNvbWJpbmF0b3JcIixMPW5ldyBSZWdFeHAoZyxcImdpbVwiKSxOPShuZXcgUmVnRXhwKGIsXCJnaW1cIiksWy8+Pj4vZywvOjpzaGFkb3cvZywvOjpjb250ZW50L2csL1xcL2RlZXBcXC8vZywvXFwvc2hhZG93XFwvL2csL1xcL3NoYWRvdy1kZWVwXFwvL2csL1xcXlxcXi9nLC9cXF4vZ10pLEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtDLnN0eWxlLmRpc3BsYXk9XCJub25lXCI7dmFyIGosRD1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKFwiQ2hyb21lXCIpLEg9XCJzaGltLXNoYWRvd2RvbVwiLHg9XCJzaGltLXNoYWRvd2RvbS1jc3NcIixSPVwibm8tc2hpbVwiO2lmKHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCl7cyhcInN0eWxlIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9XFxuXCIpO3ZhciBJPVNoYWRvd0RPTVBvbHlmaWxsLndyYXAoZG9jdW1lbnQpLFA9SS5xdWVyeVNlbGVjdG9yKFwiaGVhZFwiKTtQLmluc2VydEJlZm9yZShsKCksUC5jaGlsZE5vZGVzWzBdKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLGZ1bmN0aW9uKCl7ZS51cmxSZXNvbHZlcjtpZih3aW5kb3cuSFRNTEltcG9ydHMmJiFIVE1MSW1wb3J0cy51c2VOYXRpdmUpe3ZhciB0PVwibGlua1tyZWw9c3R5bGVzaGVldF1bXCIrSCtcIl1cIixuPVwic3R5bGVbXCIrSCtcIl1cIjtIVE1MSW1wb3J0cy5pbXBvcnRlci5kb2N1bWVudFByZWxvYWRTZWxlY3RvcnMrPVwiLFwiK3QsSFRNTEltcG9ydHMuaW1wb3J0ZXIuaW1wb3J0c1ByZWxvYWRTZWxlY3RvcnMrPVwiLFwiK3QsSFRNTEltcG9ydHMucGFyc2VyLmRvY3VtZW50U2VsZWN0b3JzPVtIVE1MSW1wb3J0cy5wYXJzZXIuZG9jdW1lbnRTZWxlY3RvcnMsdCxuXS5qb2luKFwiLFwiKTt2YXIgcj1IVE1MSW1wb3J0cy5wYXJzZXIucGFyc2VHZW5lcmljO0hUTUxJbXBvcnRzLnBhcnNlci5wYXJzZUdlbmVyaWM9ZnVuY3Rpb24oZSl7aWYoIWVbeF0pe3ZhciB0PWUuX19pbXBvcnRFbGVtZW50fHxlO2lmKCF0Lmhhc0F0dHJpYnV0ZShIKSlyZXR1cm4gdm9pZCByLmNhbGwodGhpcyxlKTtlLl9fcmVzb3VyY2UmJih0PWUub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIiksdC50ZXh0Q29udGVudD1lLl9fcmVzb3VyY2UpLEhUTUxJbXBvcnRzLnBhdGgucmVzb2x2ZVVybHNJblN0eWxlKHQsZS5ocmVmKSx0LnRleHRDb250ZW50PXUuc2hpbVN0eWxlKHQpLHQucmVtb3ZlQXR0cmlidXRlKEgsXCJcIiksdC5zZXRBdHRyaWJ1dGUoeCxcIlwiKSx0W3hdPSEwLHQucGFyZW50Tm9kZSE9PVAmJihlLnBhcmVudE5vZGU9PT1QP1AucmVwbGFjZUNoaWxkKHQsZSk6dGhpcy5hZGRFbGVtZW50VG9Eb2N1bWVudCh0KSksdC5fX2ltcG9ydFBhcnNlZD0hMCx0aGlzLm1hcmtQYXJzaW5nQ29tcGxldGUoZSksdGhpcy5wYXJzZU5leHQoKX19O3ZhciBvPUhUTUxJbXBvcnRzLnBhcnNlci5oYXNSZXNvdXJjZTtIVE1MSW1wb3J0cy5wYXJzZXIuaGFzUmVzb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuXCJsaW5rXCI9PT1lLmxvY2FsTmFtZSYmXCJzdHlsZXNoZWV0XCI9PT1lLnJlbCYmZS5oYXNBdHRyaWJ1dGUoSCk/ZS5fX3Jlc291cmNlOm8uY2FsbCh0aGlzLGUpfX19KX1lLlNoYWRvd0NTUz11fSh3aW5kb3cuV2ViQ29tcG9uZW50cykpLGZ1bmN0aW9uKGUpe3dpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbD8od2luZG93LndyYXA9U2hhZG93RE9NUG9seWZpbGwud3JhcElmTmVlZGVkLHdpbmRvdy51bndyYXA9U2hhZG93RE9NUG9seWZpbGwudW53cmFwSWZOZWVkZWQpOndpbmRvdy53cmFwPXdpbmRvdy51bndyYXA9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9fSh3aW5kb3cuV2ViQ29tcG9uZW50cyksZnVuY3Rpb24oZSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdChlKXtyZXR1cm4gdm9pZCAwIT09cFtlXX1mdW5jdGlvbiBuKCl7cy5jYWxsKHRoaXMpLHRoaXMuX2lzSW52YWxpZD0hMH1mdW5jdGlvbiByKGUpe3JldHVyblwiXCI9PWUmJm4uY2FsbCh0aGlzKSxlLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gbyhlKXt2YXIgdD1lLmNoYXJDb2RlQXQoMCk7cmV0dXJuIHQ+MzImJjEyNz50JiYtMT09WzM0LDM1LDYwLDYyLDYzLDk2XS5pbmRleE9mKHQpP2U6ZW5jb2RlVVJJQ29tcG9uZW50KGUpfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9ZS5jaGFyQ29kZUF0KDApO3JldHVybiB0PjMyJiYxMjc+dCYmLTE9PVszNCwzNSw2MCw2Miw5Nl0uaW5kZXhPZih0KT9lOmVuY29kZVVSSUNvbXBvbmVudChlKX1mdW5jdGlvbiBhKGUsYSxzKXtmdW5jdGlvbiBjKGUpe2IucHVzaChlKX12YXIgbD1hfHxcInNjaGVtZSBzdGFydFwiLHU9MCxkPVwiXCIsdj0hMSxnPSExLGI9W107ZTpmb3IoOyhlW3UtMV0hPWZ8fDA9PXUpJiYhdGhpcy5faXNJbnZhbGlkOyl7dmFyIHk9ZVt1XTtzd2l0Y2gobCl7Y2FzZVwic2NoZW1lIHN0YXJ0XCI6aWYoIXl8fCFtLnRlc3QoeSkpe2lmKGEpe2MoXCJJbnZhbGlkIHNjaGVtZS5cIik7YnJlYWsgZX1kPVwiXCIsbD1cIm5vIHNjaGVtZVwiO2NvbnRpbnVlfWQrPXkudG9Mb3dlckNhc2UoKSxsPVwic2NoZW1lXCI7YnJlYWs7Y2FzZVwic2NoZW1lXCI6aWYoeSYmdy50ZXN0KHkpKWQrPXkudG9Mb3dlckNhc2UoKTtlbHNle2lmKFwiOlwiIT15KXtpZihhKXtpZihmPT15KWJyZWFrIGU7YyhcIkNvZGUgcG9pbnQgbm90IGFsbG93ZWQgaW4gc2NoZW1lOiBcIit5KTticmVhayBlfWQ9XCJcIix1PTAsbD1cIm5vIHNjaGVtZVwiO2NvbnRpbnVlfWlmKHRoaXMuX3NjaGVtZT1kLGQ9XCJcIixhKWJyZWFrIGU7dCh0aGlzLl9zY2hlbWUpJiYodGhpcy5faXNSZWxhdGl2ZT0hMCksbD1cImZpbGVcIj09dGhpcy5fc2NoZW1lP1wicmVsYXRpdmVcIjp0aGlzLl9pc1JlbGF0aXZlJiZzJiZzLl9zY2hlbWU9PXRoaXMuX3NjaGVtZT9cInJlbGF0aXZlIG9yIGF1dGhvcml0eVwiOnRoaXMuX2lzUmVsYXRpdmU/XCJhdXRob3JpdHkgZmlyc3Qgc2xhc2hcIjpcInNjaGVtZSBkYXRhXCJ9YnJlYWs7Y2FzZVwic2NoZW1lIGRhdGFcIjpcIj9cIj09eT8odGhpcy5fcXVlcnk9XCI/XCIsbD1cInF1ZXJ5XCIpOlwiI1wiPT15Pyh0aGlzLl9mcmFnbWVudD1cIiNcIixsPVwiZnJhZ21lbnRcIik6ZiE9eSYmXCJcdFwiIT15JiZcIlxcblwiIT15JiZcIlxcclwiIT15JiYodGhpcy5fc2NoZW1lRGF0YSs9byh5KSk7YnJlYWs7Y2FzZVwibm8gc2NoZW1lXCI6aWYocyYmdChzLl9zY2hlbWUpKXtsPVwicmVsYXRpdmVcIjtjb250aW51ZX1jKFwiTWlzc2luZyBzY2hlbWUuXCIpLG4uY2FsbCh0aGlzKTticmVhaztjYXNlXCJyZWxhdGl2ZSBvciBhdXRob3JpdHlcIjppZihcIi9cIiE9eXx8XCIvXCIhPWVbdSsxXSl7YyhcIkV4cGVjdGVkIC8sIGdvdDogXCIreSksbD1cInJlbGF0aXZlXCI7Y29udGludWV9bD1cImF1dGhvcml0eSBpZ25vcmUgc2xhc2hlc1wiO2JyZWFrO2Nhc2VcInJlbGF0aXZlXCI6aWYodGhpcy5faXNSZWxhdGl2ZT0hMCxcImZpbGVcIiE9dGhpcy5fc2NoZW1lJiYodGhpcy5fc2NoZW1lPXMuX3NjaGVtZSksZj09eSl7dGhpcy5faG9zdD1zLl9ob3N0LHRoaXMuX3BvcnQ9cy5fcG9ydCx0aGlzLl9wYXRoPXMuX3BhdGguc2xpY2UoKSx0aGlzLl9xdWVyeT1zLl9xdWVyeSx0aGlzLl91c2VybmFtZT1zLl91c2VybmFtZSx0aGlzLl9wYXNzd29yZD1zLl9wYXNzd29yZDticmVhayBlfWlmKFwiL1wiPT15fHxcIlxcXFxcIj09eSlcIlxcXFxcIj09eSYmYyhcIlxcXFwgaXMgYW4gaW52YWxpZCBjb2RlIHBvaW50LlwiKSxsPVwicmVsYXRpdmUgc2xhc2hcIjtlbHNlIGlmKFwiP1wiPT15KXRoaXMuX2hvc3Q9cy5faG9zdCx0aGlzLl9wb3J0PXMuX3BvcnQsdGhpcy5fcGF0aD1zLl9wYXRoLnNsaWNlKCksdGhpcy5fcXVlcnk9XCI/XCIsdGhpcy5fdXNlcm5hbWU9cy5fdXNlcm5hbWUsdGhpcy5fcGFzc3dvcmQ9cy5fcGFzc3dvcmQsbD1cInF1ZXJ5XCI7ZWxzZXtpZihcIiNcIiE9eSl7dmFyIEU9ZVt1KzFdLF89ZVt1KzJdOyhcImZpbGVcIiE9dGhpcy5fc2NoZW1lfHwhbS50ZXN0KHkpfHxcIjpcIiE9RSYmXCJ8XCIhPUV8fGYhPV8mJlwiL1wiIT1fJiZcIlxcXFxcIiE9XyYmXCI/XCIhPV8mJlwiI1wiIT1fKSYmKHRoaXMuX2hvc3Q9cy5faG9zdCx0aGlzLl9wb3J0PXMuX3BvcnQsdGhpcy5fdXNlcm5hbWU9cy5fdXNlcm5hbWUsdGhpcy5fcGFzc3dvcmQ9cy5fcGFzc3dvcmQsdGhpcy5fcGF0aD1zLl9wYXRoLnNsaWNlKCksdGhpcy5fcGF0aC5wb3AoKSksbD1cInJlbGF0aXZlIHBhdGhcIjtjb250aW51ZX10aGlzLl9ob3N0PXMuX2hvc3QsdGhpcy5fcG9ydD1zLl9wb3J0LHRoaXMuX3BhdGg9cy5fcGF0aC5zbGljZSgpLHRoaXMuX3F1ZXJ5PXMuX3F1ZXJ5LHRoaXMuX2ZyYWdtZW50PVwiI1wiLHRoaXMuX3VzZXJuYW1lPXMuX3VzZXJuYW1lLHRoaXMuX3Bhc3N3b3JkPXMuX3Bhc3N3b3JkLGw9XCJmcmFnbWVudFwifWJyZWFrO2Nhc2VcInJlbGF0aXZlIHNsYXNoXCI6aWYoXCIvXCIhPXkmJlwiXFxcXFwiIT15KXtcImZpbGVcIiE9dGhpcy5fc2NoZW1lJiYodGhpcy5faG9zdD1zLl9ob3N0LHRoaXMuX3BvcnQ9cy5fcG9ydCx0aGlzLl91c2VybmFtZT1zLl91c2VybmFtZSx0aGlzLl9wYXNzd29yZD1zLl9wYXNzd29yZCksbD1cInJlbGF0aXZlIHBhdGhcIjtjb250aW51ZX1cIlxcXFxcIj09eSYmYyhcIlxcXFwgaXMgYW4gaW52YWxpZCBjb2RlIHBvaW50LlwiKSxsPVwiZmlsZVwiPT10aGlzLl9zY2hlbWU/XCJmaWxlIGhvc3RcIjpcImF1dGhvcml0eSBpZ25vcmUgc2xhc2hlc1wiO2JyZWFrO2Nhc2VcImF1dGhvcml0eSBmaXJzdCBzbGFzaFwiOmlmKFwiL1wiIT15KXtjKFwiRXhwZWN0ZWQgJy8nLCBnb3Q6IFwiK3kpLGw9XCJhdXRob3JpdHkgaWdub3JlIHNsYXNoZXNcIjtjb250aW51ZX1sPVwiYXV0aG9yaXR5IHNlY29uZCBzbGFzaFwiO2JyZWFrO2Nhc2VcImF1dGhvcml0eSBzZWNvbmQgc2xhc2hcIjppZihsPVwiYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzXCIsXCIvXCIhPXkpe2MoXCJFeHBlY3RlZCAnLycsIGdvdDogXCIreSk7Y29udGludWV9YnJlYWs7Y2FzZVwiYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzXCI6aWYoXCIvXCIhPXkmJlwiXFxcXFwiIT15KXtsPVwiYXV0aG9yaXR5XCI7Y29udGludWV9YyhcIkV4cGVjdGVkIGF1dGhvcml0eSwgZ290OiBcIit5KTticmVhaztjYXNlXCJhdXRob3JpdHlcIjppZihcIkBcIj09eSl7diYmKGMoXCJAIGFscmVhZHkgc2Vlbi5cIiksZCs9XCIlNDBcIiksdj0hMDtmb3IodmFyIFM9MDtTPGQubGVuZ3RoO1MrKyl7dmFyIFQ9ZFtTXTtpZihcIlx0XCIhPVQmJlwiXFxuXCIhPVQmJlwiXFxyXCIhPVQpaWYoXCI6XCIhPVR8fG51bGwhPT10aGlzLl9wYXNzd29yZCl7dmFyIE09byhUKTtudWxsIT09dGhpcy5fcGFzc3dvcmQ/dGhpcy5fcGFzc3dvcmQrPU06dGhpcy5fdXNlcm5hbWUrPU19ZWxzZSB0aGlzLl9wYXNzd29yZD1cIlwiO2Vsc2UgYyhcIkludmFsaWQgd2hpdGVzcGFjZSBpbiBhdXRob3JpdHkuXCIpfWQ9XCJcIn1lbHNle2lmKGY9PXl8fFwiL1wiPT15fHxcIlxcXFxcIj09eXx8XCI/XCI9PXl8fFwiI1wiPT15KXt1LT1kLmxlbmd0aCxkPVwiXCIsbD1cImhvc3RcIjtjb250aW51ZX1kKz15fWJyZWFrO2Nhc2VcImZpbGUgaG9zdFwiOmlmKGY9PXl8fFwiL1wiPT15fHxcIlxcXFxcIj09eXx8XCI/XCI9PXl8fFwiI1wiPT15KXsyIT1kLmxlbmd0aHx8IW0udGVzdChkWzBdKXx8XCI6XCIhPWRbMV0mJlwifFwiIT1kWzFdPzA9PWQubGVuZ3RoP2w9XCJyZWxhdGl2ZSBwYXRoIHN0YXJ0XCI6KHRoaXMuX2hvc3Q9ci5jYWxsKHRoaXMsZCksZD1cIlwiLGw9XCJyZWxhdGl2ZSBwYXRoIHN0YXJ0XCIpOmw9XCJyZWxhdGl2ZSBwYXRoXCI7Y29udGludWV9XCJcdFwiPT15fHxcIlxcblwiPT15fHxcIlxcclwiPT15P2MoXCJJbnZhbGlkIHdoaXRlc3BhY2UgaW4gZmlsZSBob3N0LlwiKTpkKz15O2JyZWFrO2Nhc2VcImhvc3RcIjpjYXNlXCJob3N0bmFtZVwiOmlmKFwiOlwiIT15fHxnKXtpZihmPT15fHxcIi9cIj09eXx8XCJcXFxcXCI9PXl8fFwiP1wiPT15fHxcIiNcIj09eSl7aWYodGhpcy5faG9zdD1yLmNhbGwodGhpcyxkKSxkPVwiXCIsbD1cInJlbGF0aXZlIHBhdGggc3RhcnRcIixhKWJyZWFrIGU7Y29udGludWV9XCJcdFwiIT15JiZcIlxcblwiIT15JiZcIlxcclwiIT15PyhcIltcIj09eT9nPSEwOlwiXVwiPT15JiYoZz0hMSksZCs9eSk6YyhcIkludmFsaWQgY29kZSBwb2ludCBpbiBob3N0L2hvc3RuYW1lOiBcIit5KX1lbHNlIGlmKHRoaXMuX2hvc3Q9ci5jYWxsKHRoaXMsZCksZD1cIlwiLGw9XCJwb3J0XCIsXCJob3N0bmFtZVwiPT1hKWJyZWFrIGU7YnJlYWs7Y2FzZVwicG9ydFwiOmlmKC9bMC05XS8udGVzdCh5KSlkKz15O2Vsc2V7aWYoZj09eXx8XCIvXCI9PXl8fFwiXFxcXFwiPT15fHxcIj9cIj09eXx8XCIjXCI9PXl8fGEpe2lmKFwiXCIhPWQpe3ZhciBPPXBhcnNlSW50KGQsMTApO08hPXBbdGhpcy5fc2NoZW1lXSYmKHRoaXMuX3BvcnQ9TytcIlwiKSxkPVwiXCJ9aWYoYSlicmVhayBlO2w9XCJyZWxhdGl2ZSBwYXRoIHN0YXJ0XCI7Y29udGludWV9XCJcdFwiPT15fHxcIlxcblwiPT15fHxcIlxcclwiPT15P2MoXCJJbnZhbGlkIGNvZGUgcG9pbnQgaW4gcG9ydDogXCIreSk6bi5jYWxsKHRoaXMpfWJyZWFrO2Nhc2VcInJlbGF0aXZlIHBhdGggc3RhcnRcIjppZihcIlxcXFxcIj09eSYmYyhcIidcXFxcJyBub3QgYWxsb3dlZCBpbiBwYXRoLlwiKSxsPVwicmVsYXRpdmUgcGF0aFwiLFwiL1wiIT15JiZcIlxcXFxcIiE9eSljb250aW51ZTticmVhaztjYXNlXCJyZWxhdGl2ZSBwYXRoXCI6aWYoZiE9eSYmXCIvXCIhPXkmJlwiXFxcXFwiIT15JiYoYXx8XCI/XCIhPXkmJlwiI1wiIT15KSlcIlx0XCIhPXkmJlwiXFxuXCIhPXkmJlwiXFxyXCIhPXkmJihkKz1vKHkpKTtlbHNle1wiXFxcXFwiPT15JiZjKFwiXFxcXCBub3QgYWxsb3dlZCBpbiByZWxhdGl2ZSBwYXRoLlwiKTt2YXIgTDsoTD1oW2QudG9Mb3dlckNhc2UoKV0pJiYoZD1MKSxcIi4uXCI9PWQ/KHRoaXMuX3BhdGgucG9wKCksXCIvXCIhPXkmJlwiXFxcXFwiIT15JiZ0aGlzLl9wYXRoLnB1c2goXCJcIikpOlwiLlwiPT1kJiZcIi9cIiE9eSYmXCJcXFxcXCIhPXk/dGhpcy5fcGF0aC5wdXNoKFwiXCIpOlwiLlwiIT1kJiYoXCJmaWxlXCI9PXRoaXMuX3NjaGVtZSYmMD09dGhpcy5fcGF0aC5sZW5ndGgmJjI9PWQubGVuZ3RoJiZtLnRlc3QoZFswXSkmJlwifFwiPT1kWzFdJiYoZD1kWzBdK1wiOlwiKSx0aGlzLl9wYXRoLnB1c2goZCkpLGQ9XCJcIixcIj9cIj09eT8odGhpcy5fcXVlcnk9XCI/XCIsbD1cInF1ZXJ5XCIpOlwiI1wiPT15JiYodGhpcy5fZnJhZ21lbnQ9XCIjXCIsbD1cImZyYWdtZW50XCIpfWJyZWFrO2Nhc2VcInF1ZXJ5XCI6YXx8XCIjXCIhPXk/ZiE9eSYmXCJcdFwiIT15JiZcIlxcblwiIT15JiZcIlxcclwiIT15JiYodGhpcy5fcXVlcnkrPWkoeSkpOih0aGlzLl9mcmFnbWVudD1cIiNcIixsPVwiZnJhZ21lbnRcIik7YnJlYWs7Y2FzZVwiZnJhZ21lbnRcIjpmIT15JiZcIlx0XCIhPXkmJlwiXFxuXCIhPXkmJlwiXFxyXCIhPXkmJih0aGlzLl9mcmFnbWVudCs9eSl9dSsrfX1mdW5jdGlvbiBzKCl7dGhpcy5fc2NoZW1lPVwiXCIsdGhpcy5fc2NoZW1lRGF0YT1cIlwiLHRoaXMuX3VzZXJuYW1lPVwiXCIsdGhpcy5fcGFzc3dvcmQ9bnVsbCx0aGlzLl9ob3N0PVwiXCIsdGhpcy5fcG9ydD1cIlwiLHRoaXMuX3BhdGg9W10sdGhpcy5fcXVlcnk9XCJcIix0aGlzLl9mcmFnbWVudD1cIlwiLHRoaXMuX2lzSW52YWxpZD0hMSx0aGlzLl9pc1JlbGF0aXZlPSExfWZ1bmN0aW9uIGMoZSx0KXt2b2lkIDA9PT10fHx0IGluc3RhbmNlb2YgY3x8KHQ9bmV3IGMoU3RyaW5nKHQpKSksdGhpcy5fdXJsPWUscy5jYWxsKHRoaXMpO3ZhciBuPWUucmVwbGFjZSgvXlsgXFx0XFxyXFxuXFxmXSt8WyBcXHRcXHJcXG5cXGZdKyQvZyxcIlwiKTthLmNhbGwodGhpcyxuLG51bGwsdCl9dmFyIGw9ITE7aWYoIWUuZm9yY2VKVVJMKXRyeXt2YXIgdT1uZXcgVVJMKFwiYlwiLFwiaHR0cDovL2FcIik7dS5wYXRobmFtZT1cImMlMjBkXCIsbD1cImh0dHA6Ly9hL2MlMjBkXCI9PT11LmhyZWZ9Y2F0Y2goZCl7fWlmKCFsKXt2YXIgcD1PYmplY3QuY3JlYXRlKG51bGwpO3AuZnRwPTIxLHAuZmlsZT0wLHAuZ29waGVyPTcwLHAuaHR0cD04MCxwLmh0dHBzPTQ0MyxwLndzPTgwLHAud3NzPTQ0Mzt2YXIgaD1PYmplY3QuY3JlYXRlKG51bGwpO2hbXCIlMmVcIl09XCIuXCIsaFtcIi4lMmVcIl09XCIuLlwiLGhbXCIlMmUuXCJdPVwiLi5cIixoW1wiJTJlJTJlXCJdPVwiLi5cIjt2YXIgZj12b2lkIDAsbT0vW2EtekEtWl0vLHc9L1thLXpBLVowLTlcXCtcXC1cXC5dLztjLnByb3RvdHlwZT17dG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ocmVmfSxnZXQgaHJlZigpe2lmKHRoaXMuX2lzSW52YWxpZClyZXR1cm4gdGhpcy5fdXJsO3ZhciBlPVwiXCI7cmV0dXJuKFwiXCIhPXRoaXMuX3VzZXJuYW1lfHxudWxsIT10aGlzLl9wYXNzd29yZCkmJihlPXRoaXMuX3VzZXJuYW1lKyhudWxsIT10aGlzLl9wYXNzd29yZD9cIjpcIit0aGlzLl9wYXNzd29yZDpcIlwiKStcIkBcIiksdGhpcy5wcm90b2NvbCsodGhpcy5faXNSZWxhdGl2ZT9cIi8vXCIrZSt0aGlzLmhvc3Q6XCJcIikrdGhpcy5wYXRobmFtZSt0aGlzLl9xdWVyeSt0aGlzLl9mcmFnbWVudH0sc2V0IGhyZWYoZSl7cy5jYWxsKHRoaXMpLGEuY2FsbCh0aGlzLGUpfSxnZXQgcHJvdG9jb2woKXtyZXR1cm4gdGhpcy5fc2NoZW1lK1wiOlwifSxzZXQgcHJvdG9jb2woZSl7dGhpcy5faXNJbnZhbGlkfHxhLmNhbGwodGhpcyxlK1wiOlwiLFwic2NoZW1lIHN0YXJ0XCIpfSxnZXQgaG9zdCgpe3JldHVybiB0aGlzLl9pc0ludmFsaWQ/XCJcIjp0aGlzLl9wb3J0P3RoaXMuX2hvc3QrXCI6XCIrdGhpcy5fcG9ydDp0aGlzLl9ob3N0fSxzZXQgaG9zdChlKXshdGhpcy5faXNJbnZhbGlkJiZ0aGlzLl9pc1JlbGF0aXZlJiZhLmNhbGwodGhpcyxlLFwiaG9zdFwiKX0sZ2V0IGhvc3RuYW1lKCl7cmV0dXJuIHRoaXMuX2hvc3R9LHNldCBob3N0bmFtZShlKXshdGhpcy5faXNJbnZhbGlkJiZ0aGlzLl9pc1JlbGF0aXZlJiZhLmNhbGwodGhpcyxlLFwiaG9zdG5hbWVcIil9LGdldCBwb3J0KCl7cmV0dXJuIHRoaXMuX3BvcnR9LHNldCBwb3J0KGUpeyF0aGlzLl9pc0ludmFsaWQmJnRoaXMuX2lzUmVsYXRpdmUmJmEuY2FsbCh0aGlzLGUsXCJwb3J0XCIpfSxnZXQgcGF0aG5hbWUoKXtyZXR1cm4gdGhpcy5faXNJbnZhbGlkP1wiXCI6dGhpcy5faXNSZWxhdGl2ZT9cIi9cIit0aGlzLl9wYXRoLmpvaW4oXCIvXCIpOnRoaXMuX3NjaGVtZURhdGF9LHNldCBwYXRobmFtZShlKXshdGhpcy5faXNJbnZhbGlkJiZ0aGlzLl9pc1JlbGF0aXZlJiYodGhpcy5fcGF0aD1bXSxhLmNhbGwodGhpcyxlLFwicmVsYXRpdmUgcGF0aCBzdGFydFwiKSl9LGdldCBzZWFyY2goKXtyZXR1cm4gdGhpcy5faXNJbnZhbGlkfHwhdGhpcy5fcXVlcnl8fFwiP1wiPT10aGlzLl9xdWVyeT9cIlwiOnRoaXMuX3F1ZXJ5fSxzZXQgc2VhcmNoKGUpeyF0aGlzLl9pc0ludmFsaWQmJnRoaXMuX2lzUmVsYXRpdmUmJih0aGlzLl9xdWVyeT1cIj9cIixcIj9cIj09ZVswXSYmKGU9ZS5zbGljZSgxKSksYS5jYWxsKHRoaXMsZSxcInF1ZXJ5XCIpKX0sZ2V0IGhhc2goKXtyZXR1cm4gdGhpcy5faXNJbnZhbGlkfHwhdGhpcy5fZnJhZ21lbnR8fFwiI1wiPT10aGlzLl9mcmFnbWVudD9cIlwiOnRoaXMuX2ZyYWdtZW50fSxzZXQgaGFzaChlKXt0aGlzLl9pc0ludmFsaWR8fCh0aGlzLl9mcmFnbWVudD1cIiNcIixcIiNcIj09ZVswXSYmKGU9ZS5zbGljZSgxKSksYS5jYWxsKHRoaXMsZSxcImZyYWdtZW50XCIpKX0sZ2V0IG9yaWdpbigpe3ZhciBlO2lmKHRoaXMuX2lzSW52YWxpZHx8IXRoaXMuX3NjaGVtZSlyZXR1cm5cIlwiO3N3aXRjaCh0aGlzLl9zY2hlbWUpe2Nhc2VcImRhdGFcIjpjYXNlXCJmaWxlXCI6Y2FzZVwiamF2YXNjcmlwdFwiOmNhc2VcIm1haWx0b1wiOnJldHVyblwibnVsbFwifXJldHVybiBlPXRoaXMuaG9zdCxlP3RoaXMuX3NjaGVtZStcIjovL1wiK2U6XCJcIn19O3ZhciB2PWUuVVJMO3YmJihjLmNyZWF0ZU9iamVjdFVSTD1mdW5jdGlvbihlKXtyZXR1cm4gdi5jcmVhdGVPYmplY3RVUkwuYXBwbHkodixhcmd1bWVudHMpfSxjLnJldm9rZU9iamVjdFVSTD1mdW5jdGlvbihlKXt2LnJldm9rZU9iamVjdFVSTChlKX0pLGUuVVJMPWN9fShzZWxmKSxmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3kucHVzaChlKSxifHwoYj0hMCxtKHIpKX1mdW5jdGlvbiBuKGUpe3JldHVybiB3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwmJndpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbC53cmFwSWZOZWVkZWQoZSl8fGV9ZnVuY3Rpb24gcigpe2I9ITE7dmFyIGU9eTt5PVtdLGUuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLnVpZF8tdC51aWRffSk7dmFyIHQ9ITE7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPWUudGFrZVJlY29yZHMoKTtvKGUpLG4ubGVuZ3RoJiYoZS5jYWxsYmFja18obixlKSx0PSEwKX0pLHQmJnIoKX1mdW5jdGlvbiBvKGUpe2Uubm9kZXNfLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49dy5nZXQodCk7biYmbi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Qub2JzZXJ2ZXI9PT1lJiZ0LnJlbW92ZVRyYW5zaWVudE9ic2VydmVycygpfSl9KX1mdW5jdGlvbiBpKGUsdCl7Zm9yKHZhciBuPWU7bjtuPW4ucGFyZW50Tm9kZSl7dmFyIHI9dy5nZXQobik7aWYocilmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKyl7dmFyIGk9cltvXSxhPWkub3B0aW9ucztpZihuPT09ZXx8YS5zdWJ0cmVlKXt2YXIgcz10KGEpO3MmJmkuZW5xdWV1ZShzKX19fX1mdW5jdGlvbiBhKGUpe3RoaXMuY2FsbGJhY2tfPWUsdGhpcy5ub2Rlc189W10sdGhpcy5yZWNvcmRzXz1bXSx0aGlzLnVpZF89KytFfWZ1bmN0aW9uIHMoZSx0KXt0aGlzLnR5cGU9ZSx0aGlzLnRhcmdldD10LHRoaXMuYWRkZWROb2Rlcz1bXSx0aGlzLnJlbW92ZWROb2Rlcz1bXSx0aGlzLnByZXZpb3VzU2libGluZz1udWxsLHRoaXMubmV4dFNpYmxpbmc9bnVsbCx0aGlzLmF0dHJpYnV0ZU5hbWU9bnVsbCx0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZT1udWxsLHRoaXMub2xkVmFsdWU9bnVsbH1mdW5jdGlvbiBjKGUpe3ZhciB0PW5ldyBzKGUudHlwZSxlLnRhcmdldCk7cmV0dXJuIHQuYWRkZWROb2Rlcz1lLmFkZGVkTm9kZXMuc2xpY2UoKSx0LnJlbW92ZWROb2Rlcz1lLnJlbW92ZWROb2Rlcy5zbGljZSgpLHQucHJldmlvdXNTaWJsaW5nPWUucHJldmlvdXNTaWJsaW5nLHQubmV4dFNpYmxpbmc9ZS5uZXh0U2libGluZyx0LmF0dHJpYnV0ZU5hbWU9ZS5hdHRyaWJ1dGVOYW1lLHQuYXR0cmlidXRlTmFtZXNwYWNlPWUuYXR0cmlidXRlTmFtZXNwYWNlLHQub2xkVmFsdWU9ZS5vbGRWYWx1ZSx0fWZ1bmN0aW9uIGwoZSx0KXtyZXR1cm4gXz1uZXcgcyhlLHQpfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIFM/UzooUz1jKF8pLFMub2xkVmFsdWU9ZSxTKX1mdW5jdGlvbiBkKCl7Xz1TPXZvaWQgMH1mdW5jdGlvbiBwKGUpe3JldHVybiBlPT09U3x8ZT09PV99ZnVuY3Rpb24gaChlLHQpe3JldHVybiBlPT09dD9lOlMmJnAoZSk/UzpudWxsfWZ1bmN0aW9uIGYoZSx0LG4pe3RoaXMub2JzZXJ2ZXI9ZSx0aGlzLnRhcmdldD10LHRoaXMub3B0aW9ucz1uLHRoaXMudHJhbnNpZW50T2JzZXJ2ZWROb2Rlcz1bXX1pZighZS5Kc011dGF0aW9uT2JzZXJ2ZXIpe3ZhciBtLHc9bmV3IFdlYWtNYXA7aWYoL1RyaWRlbnR8RWRnZS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSltPXNldFRpbWVvdXQ7ZWxzZSBpZih3aW5kb3cuc2V0SW1tZWRpYXRlKW09d2luZG93LnNldEltbWVkaWF0ZTtlbHNle3ZhciB2PVtdLGc9U3RyaW5nKE1hdGgucmFuZG9tKCkpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLGZ1bmN0aW9uKGUpe2lmKGUuZGF0YT09PWcpe3ZhciB0PXY7dj1bXSx0LmZvckVhY2goZnVuY3Rpb24oZSl7ZSgpfSl9fSksbT1mdW5jdGlvbihlKXt2LnB1c2goZSksd2luZG93LnBvc3RNZXNzYWdlKGcsXCIqXCIpfX12YXIgYj0hMSx5PVtdLEU9MDthLnByb3RvdHlwZT17b2JzZXJ2ZTpmdW5jdGlvbihlLHQpe2lmKGU9bihlKSwhdC5jaGlsZExpc3QmJiF0LmF0dHJpYnV0ZXMmJiF0LmNoYXJhY3RlckRhdGF8fHQuYXR0cmlidXRlT2xkVmFsdWUmJiF0LmF0dHJpYnV0ZXN8fHQuYXR0cmlidXRlRmlsdGVyJiZ0LmF0dHJpYnV0ZUZpbHRlci5sZW5ndGgmJiF0LmF0dHJpYnV0ZXN8fHQuY2hhcmFjdGVyRGF0YU9sZFZhbHVlJiYhdC5jaGFyYWN0ZXJEYXRhKXRocm93IG5ldyBTeW50YXhFcnJvcjt2YXIgcj13LmdldChlKTtyfHx3LnNldChlLHI9W10pO2Zvcih2YXIgbyxpPTA7aTxyLmxlbmd0aDtpKyspaWYocltpXS5vYnNlcnZlcj09PXRoaXMpe289cltpXSxvLnJlbW92ZUxpc3RlbmVycygpLG8ub3B0aW9ucz10O2JyZWFrfW98fChvPW5ldyBmKHRoaXMsZSx0KSxyLnB1c2gobyksdGhpcy5ub2Rlc18ucHVzaChlKSksby5hZGRMaXN0ZW5lcnMoKX0sZGlzY29ubmVjdDpmdW5jdGlvbigpe3RoaXMubm9kZXNfLmZvckVhY2goZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXcuZ2V0KGUpLG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtpZihyLm9ic2VydmVyPT09dGhpcyl7ci5yZW1vdmVMaXN0ZW5lcnMoKSx0LnNwbGljZShuLDEpO2JyZWFrfX19LHRoaXMpLHRoaXMucmVjb3Jkc189W119LHRha2VSZWNvcmRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yZWNvcmRzXztyZXR1cm4gdGhpcy5yZWNvcmRzXz1bXSxlfX07dmFyIF8sUztmLnByb3RvdHlwZT17ZW5xdWV1ZTpmdW5jdGlvbihlKXt2YXIgbj10aGlzLm9ic2VydmVyLnJlY29yZHNfLHI9bi5sZW5ndGg7aWYobi5sZW5ndGg+MCl7dmFyIG89bltyLTFdLGk9aChvLGUpO2lmKGkpcmV0dXJuIHZvaWQobltyLTFdPWkpfWVsc2UgdCh0aGlzLm9ic2VydmVyKTtuW3JdPWV9LGFkZExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuYWRkTGlzdGVuZXJzXyh0aGlzLnRhcmdldCl9LGFkZExpc3RlbmVyc186ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5vcHRpb25zO3QuYXR0cmlidXRlcyYmZS5hZGRFdmVudExpc3RlbmVyKFwiRE9NQXR0ck1vZGlmaWVkXCIsdGhpcywhMCksdC5jaGFyYWN0ZXJEYXRhJiZlLmFkZEV2ZW50TGlzdGVuZXIoXCJET01DaGFyYWN0ZXJEYXRhTW9kaWZpZWRcIix0aGlzLCEwKSx0LmNoaWxkTGlzdCYmZS5hZGRFdmVudExpc3RlbmVyKFwiRE9NTm9kZUluc2VydGVkXCIsdGhpcywhMCksKHQuY2hpbGRMaXN0fHx0LnN1YnRyZWUpJiZlLmFkZEV2ZW50TGlzdGVuZXIoXCJET01Ob2RlUmVtb3ZlZFwiLHRoaXMsITApfSxyZW1vdmVMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUxpc3RlbmVyc18odGhpcy50YXJnZXQpfSxyZW1vdmVMaXN0ZW5lcnNfOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMub3B0aW9uczt0LmF0dHJpYnV0ZXMmJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUF0dHJNb2RpZmllZFwiLHRoaXMsITApLHQuY2hhcmFjdGVyRGF0YSYmZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkXCIsdGhpcywhMCksdC5jaGlsZExpc3QmJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTU5vZGVJbnNlcnRlZFwiLHRoaXMsITApLCh0LmNoaWxkTGlzdHx8dC5zdWJ0cmVlKSYmZS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NTm9kZVJlbW92ZWRcIix0aGlzLCEwKX0sYWRkVHJhbnNpZW50T2JzZXJ2ZXI6ZnVuY3Rpb24oZSl7aWYoZSE9PXRoaXMudGFyZ2V0KXt0aGlzLmFkZExpc3RlbmVyc18oZSksdGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzLnB1c2goZSk7dmFyIHQ9dy5nZXQoZSk7dHx8dy5zZXQoZSx0PVtdKSx0LnB1c2godGhpcyl9fSxyZW1vdmVUcmFuc2llbnRPYnNlcnZlcnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnRyYW5zaWVudE9ic2VydmVkTm9kZXM7dGhpcy50cmFuc2llbnRPYnNlcnZlZE5vZGVzPVtdLGUuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzLnJlbW92ZUxpc3RlbmVyc18oZSk7Zm9yKHZhciB0PXcuZ2V0KGUpLG49MDtuPHQubGVuZ3RoO24rKylpZih0W25dPT09dGhpcyl7dC5zcGxpY2UobiwxKTticmVha319LHRoaXMpfSxoYW5kbGVFdmVudDpmdW5jdGlvbihlKXtzd2l0Y2goZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxlLnR5cGUpe2Nhc2VcIkRPTUF0dHJNb2RpZmllZFwiOnZhciB0PWUuYXR0ck5hbWUsbj1lLnJlbGF0ZWROb2RlLm5hbWVzcGFjZVVSSSxyPWUudGFyZ2V0LG89bmV3IGwoXCJhdHRyaWJ1dGVzXCIscik7by5hdHRyaWJ1dGVOYW1lPXQsby5hdHRyaWJ1dGVOYW1lc3BhY2U9bjt2YXIgYT1lLmF0dHJDaGFuZ2U9PT1NdXRhdGlvbkV2ZW50LkFERElUSU9OP251bGw6ZS5wcmV2VmFsdWU7aShyLGZ1bmN0aW9uKGUpe3JldHVybiFlLmF0dHJpYnV0ZXN8fGUuYXR0cmlidXRlRmlsdGVyJiZlLmF0dHJpYnV0ZUZpbHRlci5sZW5ndGgmJi0xPT09ZS5hdHRyaWJ1dGVGaWx0ZXIuaW5kZXhPZih0KSYmLTE9PT1lLmF0dHJpYnV0ZUZpbHRlci5pbmRleE9mKG4pP3ZvaWQgMDplLmF0dHJpYnV0ZU9sZFZhbHVlP3UoYSk6b30pO2JyZWFrO2Nhc2VcIkRPTUNoYXJhY3RlckRhdGFNb2RpZmllZFwiOnZhciByPWUudGFyZ2V0LG89bChcImNoYXJhY3RlckRhdGFcIixyKSxhPWUucHJldlZhbHVlO2kocixmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyYWN0ZXJEYXRhP2UuY2hhcmFjdGVyRGF0YU9sZFZhbHVlP3UoYSk6bzp2b2lkIDB9KTticmVhaztjYXNlXCJET01Ob2RlUmVtb3ZlZFwiOnRoaXMuYWRkVHJhbnNpZW50T2JzZXJ2ZXIoZS50YXJnZXQpO2Nhc2VcIkRPTU5vZGVJbnNlcnRlZFwiOnZhciBzLGMscD1lLnRhcmdldDtcIkRPTU5vZGVJbnNlcnRlZFwiPT09ZS50eXBlPyhzPVtwXSxjPVtdKToocz1bXSxjPVtwXSk7dmFyIGg9cC5wcmV2aW91c1NpYmxpbmcsZj1wLm5leHRTaWJsaW5nLG89bChcImNoaWxkTGlzdFwiLGUudGFyZ2V0LnBhcmVudE5vZGUpO28uYWRkZWROb2Rlcz1zLG8ucmVtb3ZlZE5vZGVzPWMsby5wcmV2aW91c1NpYmxpbmc9aCxvLm5leHRTaWJsaW5nPWYsaShlLnJlbGF0ZWROb2RlLGZ1bmN0aW9uKGUpe3JldHVybiBlLmNoaWxkTGlzdD9vOnZvaWQgMH0pfWQoKX19LGUuSnNNdXRhdGlvbk9ic2VydmVyPWEsZS5NdXRhdGlvbk9ic2VydmVyfHwoZS5NdXRhdGlvbk9ic2VydmVyPWEsYS5faXNQb2x5ZmlsbGVkPSEwKX19KHNlbGYpLGZ1bmN0aW9uKGUpe1widXNlIHN0cmljdFwiO2lmKCF3aW5kb3cucGVyZm9ybWFuY2Upe3ZhciB0PURhdGUubm93KCk7d2luZG93LnBlcmZvcm1hbmNlPXtub3c6ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKS10fX19d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZXx8KHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oKXt2YXIgZT13aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lO3JldHVybiBlP2Z1bmN0aW9uKHQpe3JldHVybiBlKGZ1bmN0aW9uKCl7dChwZXJmb3JtYW5jZS5ub3coKSl9KX06ZnVuY3Rpb24oZSl7cmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGUsMWUzLzYwKX19KCkpLHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZXx8KHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZT1mdW5jdGlvbigpe3JldHVybiB3aW5kb3cud2Via2l0Q2FuY2VsQW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pDYW5jZWxBbmltYXRpb25GcmFtZXx8ZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KGUpfX0oKSk7dmFyIG49ZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpO3JldHVybiBlLmluaXRFdmVudChcImZvb1wiLCEwLCEwKSxlLnByZXZlbnREZWZhdWx0KCksZS5kZWZhdWx0UHJldmVudGVkfSgpO2lmKCFuKXt2YXIgcj1FdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQ7RXZlbnQucHJvdG90eXBlLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxhYmxlJiYoci5jYWxsKHRoaXMpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiZGVmYXVsdFByZXZlbnRlZFwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sY29uZmlndXJhYmxlOiEwfSkpfX12YXIgbz0vVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZigoIXdpbmRvdy5DdXN0b21FdmVudHx8byYmXCJmdW5jdGlvblwiIT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50KSYmKHdpbmRvdy5DdXN0b21FdmVudD1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIG49ZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKTtyZXR1cm4gbi5pbml0Q3VzdG9tRXZlbnQoZSxCb29sZWFuKHQuYnViYmxlcyksQm9vbGVhbih0LmNhbmNlbGFibGUpLHQuZGV0YWlsKSxufSx3aW5kb3cuQ3VzdG9tRXZlbnQucHJvdG90eXBlPXdpbmRvdy5FdmVudC5wcm90b3R5cGUpLCF3aW5kb3cuRXZlbnR8fG8mJlwiZnVuY3Rpb25cIiE9dHlwZW9mIHdpbmRvdy5FdmVudCl7dmFyIGk9d2luZG93LkV2ZW50O3dpbmRvdy5FdmVudD1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIG49ZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtyZXR1cm4gbi5pbml0RXZlbnQoZSxCb29sZWFuKHQuYnViYmxlcyksQm9vbGVhbih0LmNhbmNlbGFibGUpKSxufSx3aW5kb3cuRXZlbnQucHJvdG90eXBlPWkucHJvdG90eXBlfX0od2luZG93LldlYkNvbXBvbmVudHMpLHdpbmRvdy5IVE1MSW1wb3J0cz13aW5kb3cuSFRNTEltcG9ydHN8fHtmbGFnczp7fX0sZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQpe3Q9dHx8ZixyKGZ1bmN0aW9uKCl7aShlLHQpfSx0KX1mdW5jdGlvbiBuKGUpe3JldHVyblwiY29tcGxldGVcIj09PWUucmVhZHlTdGF0ZXx8ZS5yZWFkeVN0YXRlPT09dn1mdW5jdGlvbiByKGUsdCl7aWYobih0KSllJiZlKCk7ZWxzZXt2YXIgbz1mdW5jdGlvbigpeyhcImNvbXBsZXRlXCI9PT10LnJlYWR5U3RhdGV8fHQucmVhZHlTdGF0ZT09PXYpJiYodC5yZW1vdmVFdmVudExpc3RlbmVyKGcsbykscihlLHQpKX07dC5hZGRFdmVudExpc3RlbmVyKGcsbyl9fWZ1bmN0aW9uIG8oZSl7ZS50YXJnZXQuX19sb2FkZWQ9ITB9ZnVuY3Rpb24gaShlLHQpe2Z1bmN0aW9uIG4oKXtjPT1sJiZlJiZlKHthbGxJbXBvcnRzOnMsbG9hZGVkSW1wb3J0czp1LGVycm9ySW1wb3J0czpkfSl9ZnVuY3Rpb24gcihlKXtvKGUpLHUucHVzaCh0aGlzKSxcbmMrKyxuKCl9ZnVuY3Rpb24gaShlKXtkLnB1c2godGhpcyksYysrLG4oKX12YXIgcz10LnF1ZXJ5U2VsZWN0b3JBbGwoXCJsaW5rW3JlbD1pbXBvcnRdXCIpLGM9MCxsPXMubGVuZ3RoLHU9W10sZD1bXTtpZihsKWZvcih2YXIgcCxoPTA7bD5oJiYocD1zW2hdKTtoKyspYShwKT8odS5wdXNoKHRoaXMpLGMrKyxuKCkpOihwLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIscikscC5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIixpKSk7ZWxzZSBuKCl9ZnVuY3Rpb24gYShlKXtyZXR1cm4gZD9lLl9fbG9hZGVkfHxlW1wiaW1wb3J0XCJdJiZcImxvYWRpbmdcIiE9PWVbXCJpbXBvcnRcIl0ucmVhZHlTdGF0ZTplLl9faW1wb3J0UGFyc2VkfWZ1bmN0aW9uIHMoZSl7Zm9yKHZhciB0LG49MCxyPWUubGVuZ3RoO3I+biYmKHQ9ZVtuXSk7bisrKWModCkmJmwodCl9ZnVuY3Rpb24gYyhlKXtyZXR1cm5cImxpbmtcIj09PWUubG9jYWxOYW1lJiZcImltcG9ydFwiPT09ZS5yZWx9ZnVuY3Rpb24gbChlKXt2YXIgdD1lW1wiaW1wb3J0XCJdO3Q/byh7dGFyZ2V0OmV9KTooZS5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLG8pLGUuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsbykpfXZhciB1PVwiaW1wb3J0XCIsZD1Cb29sZWFuKHUgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIikpLHA9Qm9vbGVhbih3aW5kb3cuU2hhZG93RE9NUG9seWZpbGwpLGg9ZnVuY3Rpb24oZSl7cmV0dXJuIHA/d2luZG93LlNoYWRvd0RPTVBvbHlmaWxsLndyYXBJZk5lZWRlZChlKTplfSxmPWgoZG9jdW1lbnQpLG09e2dldDpmdW5jdGlvbigpe3ZhciBlPXdpbmRvdy5IVE1MSW1wb3J0cy5jdXJyZW50U2NyaXB0fHxkb2N1bWVudC5jdXJyZW50U2NyaXB0fHwoXCJjb21wbGV0ZVwiIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9kb2N1bWVudC5zY3JpcHRzW2RvY3VtZW50LnNjcmlwdHMubGVuZ3RoLTFdOm51bGwpO3JldHVybiBoKGUpfSxjb25maWd1cmFibGU6ITB9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCxcIl9jdXJyZW50U2NyaXB0XCIsbSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsXCJfY3VycmVudFNjcmlwdFwiLG0pO3ZhciB3PS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHY9dz9cImNvbXBsZXRlXCI6XCJpbnRlcmFjdGl2ZVwiLGc9XCJyZWFkeXN0YXRlY2hhbmdlXCI7ZCYmKG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPTAscj1lLmxlbmd0aDtyPm4mJih0PWVbbl0pO24rKyl0LmFkZGVkTm9kZXMmJnModC5hZGRlZE5vZGVzKX0pLm9ic2VydmUoZG9jdW1lbnQuaGVhZCx7Y2hpbGRMaXN0OiEwfSksZnVuY3Rpb24oKXtpZihcImxvYWRpbmdcIj09PWRvY3VtZW50LnJlYWR5U3RhdGUpZm9yKHZhciBlLHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcImxpbmtbcmVsPWltcG9ydF1cIiksbj0wLHI9dC5sZW5ndGg7cj5uJiYoZT10W25dKTtuKyspbChlKX0oKSksdChmdW5jdGlvbihlKXt3aW5kb3cuSFRNTEltcG9ydHMucmVhZHk9ITAsd2luZG93LkhUTUxJbXBvcnRzLnJlYWR5VGltZT0obmV3IERhdGUpLmdldFRpbWUoKTt2YXIgdD1mLmNyZWF0ZUV2ZW50KFwiQ3VzdG9tRXZlbnRcIik7dC5pbml0Q3VzdG9tRXZlbnQoXCJIVE1MSW1wb3J0c0xvYWRlZFwiLCEwLCEwLGUpLGYuZGlzcGF0Y2hFdmVudCh0KX0pLGUuSU1QT1JUX0xJTktfVFlQRT11LGUudXNlTmF0aXZlPWQsZS5yb290RG9jdW1lbnQ9ZixlLndoZW5SZWFkeT10LGUuaXNJRT13fSh3aW5kb3cuSFRNTEltcG9ydHMpLGZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49ZnVuY3Rpb24oZSl7dC5wdXNoKGUpfSxyPWZ1bmN0aW9uKCl7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QoZSl9KX07ZS5hZGRNb2R1bGU9bixlLmluaXRpYWxpemVNb2R1bGVzPXJ9KHdpbmRvdy5IVE1MSW1wb3J0cyksd2luZG93LkhUTUxJbXBvcnRzLmFkZE1vZHVsZShmdW5jdGlvbihlKXt2YXIgdD0vKHVybFxcKCkoW14pXSopKFxcKSkvZyxuPS8oQGltcG9ydFtcXHNdKyg/IXVybFxcKCkpKFteO10qKSg7KS9nLHI9e3Jlc29sdmVVcmxzSW5TdHlsZTpmdW5jdGlvbihlLHQpe3ZhciBuPWUub3duZXJEb2N1bWVudCxyPW4uY3JlYXRlRWxlbWVudChcImFcIik7cmV0dXJuIGUudGV4dENvbnRlbnQ9dGhpcy5yZXNvbHZlVXJsc0luQ3NzVGV4dChlLnRleHRDb250ZW50LHQsciksZX0scmVzb2x2ZVVybHNJbkNzc1RleHQ6ZnVuY3Rpb24oZSxyLG8pe3ZhciBpPXRoaXMucmVwbGFjZVVybHMoZSxvLHIsdCk7cmV0dXJuIGk9dGhpcy5yZXBsYWNlVXJscyhpLG8scixuKX0scmVwbGFjZVVybHM6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIGUucmVwbGFjZShyLGZ1bmN0aW9uKGUscixvLGkpe3ZhciBhPW8ucmVwbGFjZSgvW1wiJ10vZyxcIlwiKTtyZXR1cm4gbiYmKGE9bmV3IFVSTChhLG4pLmhyZWYpLHQuaHJlZj1hLGE9dC5ocmVmLHIrXCInXCIrYStcIidcIitpfSl9fTtlLnBhdGg9cn0pLHdpbmRvdy5IVE1MSW1wb3J0cy5hZGRNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIHQ9e2FzeW5jOiEwLG9rOmZ1bmN0aW9uKGUpe3JldHVybiBlLnN0YXR1cz49MjAwJiZlLnN0YXR1czwzMDB8fDMwND09PWUuc3RhdHVzfHwwPT09ZS5zdGF0dXN9LGxvYWQ6ZnVuY3Rpb24obixyLG8pe3ZhciBpPW5ldyBYTUxIdHRwUmVxdWVzdDtyZXR1cm4oZS5mbGFncy5kZWJ1Z3x8ZS5mbGFncy5idXN0KSYmKG4rPVwiP1wiK01hdGgucmFuZG9tKCkpLGkub3BlbihcIkdFVFwiLG4sdC5hc3luYyksaS5hZGRFdmVudExpc3RlbmVyKFwicmVhZHlzdGF0ZWNoYW5nZVwiLGZ1bmN0aW9uKGUpe2lmKDQ9PT1pLnJlYWR5U3RhdGUpe3ZhciBuPW51bGw7dHJ5e3ZhciBhPWkuZ2V0UmVzcG9uc2VIZWFkZXIoXCJMb2NhdGlvblwiKTthJiYobj1cIi9cIj09PWEuc3Vic3RyKDAsMSk/bG9jYXRpb24ub3JpZ2luK2E6YSl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlLm1lc3NhZ2UpfXIuY2FsbChvLCF0Lm9rKGkpJiZpLGkucmVzcG9uc2V8fGkucmVzcG9uc2VUZXh0LG4pfX0pLGkuc2VuZCgpLGl9LGxvYWREb2N1bWVudDpmdW5jdGlvbihlLHQsbil7dGhpcy5sb2FkKGUsdCxuKS5yZXNwb25zZVR5cGU9XCJkb2N1bWVudFwifX07ZS54aHI9dH0pLHdpbmRvdy5IVE1MSW1wb3J0cy5hZGRNb2R1bGUoZnVuY3Rpb24oZSl7dmFyIHQ9ZS54aHIsbj1lLmZsYWdzLHI9ZnVuY3Rpb24oZSx0KXt0aGlzLmNhY2hlPXt9LHRoaXMub25sb2FkPWUsdGhpcy5vbmNvbXBsZXRlPXQsdGhpcy5pbmZsaWdodD0wLHRoaXMucGVuZGluZz17fX07ci5wcm90b3R5cGU9e2FkZE5vZGVzOmZ1bmN0aW9uKGUpe3RoaXMuaW5mbGlnaHQrPWUubGVuZ3RoO2Zvcih2YXIgdCxuPTAscj1lLmxlbmd0aDtyPm4mJih0PWVbbl0pO24rKyl0aGlzLnJlcXVpcmUodCk7dGhpcy5jaGVja0RvbmUoKX0sYWRkTm9kZTpmdW5jdGlvbihlKXt0aGlzLmluZmxpZ2h0KyssdGhpcy5yZXF1aXJlKGUpLHRoaXMuY2hlY2tEb25lKCl9LHJlcXVpcmU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zcmN8fGUuaHJlZjtlLl9fbm9kZVVybD10LHRoaXMuZGVkdXBlKHQsZSl8fHRoaXMuZmV0Y2godCxlKX0sZGVkdXBlOmZ1bmN0aW9uKGUsdCl7aWYodGhpcy5wZW5kaW5nW2VdKXJldHVybiB0aGlzLnBlbmRpbmdbZV0ucHVzaCh0KSwhMDtyZXR1cm4gdGhpcy5jYWNoZVtlXT8odGhpcy5vbmxvYWQoZSx0LHRoaXMuY2FjaGVbZV0pLHRoaXMudGFpbCgpLCEwKToodGhpcy5wZW5kaW5nW2VdPVt0XSwhMSl9LGZldGNoOmZ1bmN0aW9uKGUscil7aWYobi5sb2FkJiZjb25zb2xlLmxvZyhcImZldGNoXCIsZSxyKSxlKWlmKGUubWF0Y2goL15kYXRhOi8pKXt2YXIgbz1lLnNwbGl0KFwiLFwiKSxpPW9bMF0sYT1vWzFdO2E9aS5pbmRleE9mKFwiO2Jhc2U2NFwiKT4tMT9hdG9iKGEpOmRlY29kZVVSSUNvbXBvbmVudChhKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yZWNlaXZlKGUscixudWxsLGEpfS5iaW5kKHRoaXMpLDApfWVsc2V7dmFyIHM9ZnVuY3Rpb24odCxuLG8pe3RoaXMucmVjZWl2ZShlLHIsdCxuLG8pfS5iaW5kKHRoaXMpO3QubG9hZChlLHMpfWVsc2Ugc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmVjZWl2ZShlLHIse2Vycm9yOlwiaHJlZiBtdXN0IGJlIHNwZWNpZmllZFwifSxudWxsKX0uYmluZCh0aGlzKSwwKX0scmVjZWl2ZTpmdW5jdGlvbihlLHQsbixyLG8pe3RoaXMuY2FjaGVbZV09cjtmb3IodmFyIGksYT10aGlzLnBlbmRpbmdbZV0scz0wLGM9YS5sZW5ndGg7Yz5zJiYoaT1hW3NdKTtzKyspdGhpcy5vbmxvYWQoZSxpLHIsbixvKSx0aGlzLnRhaWwoKTt0aGlzLnBlbmRpbmdbZV09bnVsbH0sdGFpbDpmdW5jdGlvbigpey0tdGhpcy5pbmZsaWdodCx0aGlzLmNoZWNrRG9uZSgpfSxjaGVja0RvbmU6ZnVuY3Rpb24oKXt0aGlzLmluZmxpZ2h0fHx0aGlzLm9uY29tcGxldGUoKX19LGUuTG9hZGVyPXJ9KSx3aW5kb3cuSFRNTEltcG9ydHMuYWRkTW9kdWxlKGZ1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKGUpe3RoaXMuYWRkQ2FsbGJhY2s9ZSx0aGlzLm1vPW5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMuaGFuZGxlci5iaW5kKHRoaXMpKX07dC5wcm90b3R5cGU9e2hhbmRsZXI6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MCxyPWUubGVuZ3RoO3I+biYmKHQ9ZVtuXSk7bisrKVwiY2hpbGRMaXN0XCI9PT10LnR5cGUmJnQuYWRkZWROb2Rlcy5sZW5ndGgmJnRoaXMuYWRkZWROb2Rlcyh0LmFkZGVkTm9kZXMpfSxhZGRlZE5vZGVzOmZ1bmN0aW9uKGUpe3RoaXMuYWRkQ2FsbGJhY2smJnRoaXMuYWRkQ2FsbGJhY2soZSk7Zm9yKHZhciB0LG49MCxyPWUubGVuZ3RoO3I+biYmKHQ9ZVtuXSk7bisrKXQuY2hpbGRyZW4mJnQuY2hpbGRyZW4ubGVuZ3RoJiZ0aGlzLmFkZGVkTm9kZXModC5jaGlsZHJlbil9LG9ic2VydmU6ZnVuY3Rpb24oZSl7dGhpcy5tby5vYnNlcnZlKGUse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9fSxlLk9ic2VydmVyPXR9KSx3aW5kb3cuSFRNTEltcG9ydHMuYWRkTW9kdWxlKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuXCJsaW5rXCI9PT1lLmxvY2FsTmFtZSYmZS5yZWw9PT11fWZ1bmN0aW9uIG4oZSl7dmFyIHQ9cihlKTtyZXR1cm5cImRhdGE6dGV4dC9qYXZhc2NyaXB0O2NoYXJzZXQ9dXRmLTgsXCIrZW5jb2RlVVJJQ29tcG9uZW50KHQpfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIGUudGV4dENvbnRlbnQrbyhlKX1mdW5jdGlvbiBvKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudDt0Ll9faW1wb3J0ZWRTY3JpcHRzPXQuX19pbXBvcnRlZFNjcmlwdHN8fDA7dmFyIG49ZS5vd25lckRvY3VtZW50LmJhc2VVUkkscj10Ll9faW1wb3J0ZWRTY3JpcHRzP1wiLVwiK3QuX19pbXBvcnRlZFNjcmlwdHM6XCJcIjtyZXR1cm4gdC5fX2ltcG9ydGVkU2NyaXB0cysrLFwiXFxuLy8jIHNvdXJjZVVSTD1cIituK3IrXCIuanNcXG5cIn1mdW5jdGlvbiBpKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7cmV0dXJuIHQudGV4dENvbnRlbnQ9ZS50ZXh0Q29udGVudCxhLnJlc29sdmVVcmxzSW5TdHlsZSh0KSx0fXZhciBhPWUucGF0aCxzPWUucm9vdERvY3VtZW50LGM9ZS5mbGFncyxsPWUuaXNJRSx1PWUuSU1QT1JUX0xJTktfVFlQRSxkPVwibGlua1tyZWw9XCIrdStcIl1cIixwPXtkb2N1bWVudFNlbGVjdG9yczpkLGltcG9ydHNTZWxlY3RvcnM6W2QsXCJsaW5rW3JlbD1zdHlsZXNoZWV0XTpub3QoW3R5cGVdKVwiLFwic3R5bGU6bm90KFt0eXBlXSlcIixcInNjcmlwdDpub3QoW3R5cGVdKVwiLCdzY3JpcHRbdHlwZT1cImFwcGxpY2F0aW9uL2phdmFzY3JpcHRcIl0nLCdzY3JpcHRbdHlwZT1cInRleHQvamF2YXNjcmlwdFwiXSddLmpvaW4oXCIsXCIpLG1hcDp7bGluazpcInBhcnNlTGlua1wiLHNjcmlwdDpcInBhcnNlU2NyaXB0XCIsc3R5bGU6XCJwYXJzZVN0eWxlXCJ9LGR5bmFtaWNFbGVtZW50czpbXSxwYXJzZU5leHQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm5leHRUb1BhcnNlKCk7ZSYmdGhpcy5wYXJzZShlKX0scGFyc2U6ZnVuY3Rpb24oZSl7aWYodGhpcy5pc1BhcnNlZChlKSlyZXR1cm4gdm9pZChjLnBhcnNlJiZjb25zb2xlLmxvZyhcIlslc10gaXMgYWxyZWFkeSBwYXJzZWRcIixlLmxvY2FsTmFtZSkpO3ZhciB0PXRoaXNbdGhpcy5tYXBbZS5sb2NhbE5hbWVdXTt0JiYodGhpcy5tYXJrUGFyc2luZyhlKSx0LmNhbGwodGhpcyxlKSl9LHBhcnNlRHluYW1pYzpmdW5jdGlvbihlLHQpe3RoaXMuZHluYW1pY0VsZW1lbnRzLnB1c2goZSksdHx8dGhpcy5wYXJzZU5leHQoKX0sbWFya1BhcnNpbmc6ZnVuY3Rpb24oZSl7Yy5wYXJzZSYmY29uc29sZS5sb2coXCJwYXJzaW5nXCIsZSksdGhpcy5wYXJzaW5nRWxlbWVudD1lfSxtYXJrUGFyc2luZ0NvbXBsZXRlOmZ1bmN0aW9uKGUpe2UuX19pbXBvcnRQYXJzZWQ9ITAsdGhpcy5tYXJrRHluYW1pY1BhcnNpbmdDb21wbGV0ZShlKSxlLl9faW1wb3J0RWxlbWVudCYmKGUuX19pbXBvcnRFbGVtZW50Ll9faW1wb3J0UGFyc2VkPSEwLHRoaXMubWFya0R5bmFtaWNQYXJzaW5nQ29tcGxldGUoZS5fX2ltcG9ydEVsZW1lbnQpKSx0aGlzLnBhcnNpbmdFbGVtZW50PW51bGwsYy5wYXJzZSYmY29uc29sZS5sb2coXCJjb21wbGV0ZWRcIixlKX0sbWFya0R5bmFtaWNQYXJzaW5nQ29tcGxldGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5keW5hbWljRWxlbWVudHMuaW5kZXhPZihlKTt0Pj0wJiZ0aGlzLmR5bmFtaWNFbGVtZW50cy5zcGxpY2UodCwxKX0scGFyc2VJbXBvcnQ6ZnVuY3Rpb24oZSl7aWYoZVtcImltcG9ydFwiXT1lLl9fZG9jLHdpbmRvdy5IVE1MSW1wb3J0cy5fX2ltcG9ydHNQYXJzaW5nSG9vayYmd2luZG93LkhUTUxJbXBvcnRzLl9faW1wb3J0c1BhcnNpbmdIb29rKGUpLGVbXCJpbXBvcnRcIl0mJihlW1wiaW1wb3J0XCJdLl9faW1wb3J0UGFyc2VkPSEwKSx0aGlzLm1hcmtQYXJzaW5nQ29tcGxldGUoZSksZS5fX3Jlc291cmNlJiYhZS5fX2Vycm9yP2UuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJsb2FkXCIse2J1YmJsZXM6ITF9KSk6ZS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImVycm9yXCIse2J1YmJsZXM6ITF9KSksZS5fX3BlbmRpbmcpZm9yKHZhciB0O2UuX19wZW5kaW5nLmxlbmd0aDspdD1lLl9fcGVuZGluZy5zaGlmdCgpLHQmJnQoe3RhcmdldDplfSk7dGhpcy5wYXJzZU5leHQoKX0scGFyc2VMaW5rOmZ1bmN0aW9uKGUpe3QoZSk/dGhpcy5wYXJzZUltcG9ydChlKTooZS5ocmVmPWUuaHJlZix0aGlzLnBhcnNlR2VuZXJpYyhlKSl9LHBhcnNlU3R5bGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZTtlPWkoZSksdC5fX2FwcGxpZWRFbGVtZW50PWUsZS5fX2ltcG9ydEVsZW1lbnQ9dCx0aGlzLnBhcnNlR2VuZXJpYyhlKX0scGFyc2VHZW5lcmljOmZ1bmN0aW9uKGUpe3RoaXMudHJhY2tFbGVtZW50KGUpLHRoaXMuYWRkRWxlbWVudFRvRG9jdW1lbnQoZSl9LHJvb3RJbXBvcnRGb3JFbGVtZW50OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lO3Qub3duZXJEb2N1bWVudC5fX2ltcG9ydExpbms7KXQ9dC5vd25lckRvY3VtZW50Ll9faW1wb3J0TGluaztyZXR1cm4gdH0sYWRkRWxlbWVudFRvRG9jdW1lbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5yb290SW1wb3J0Rm9yRWxlbWVudChlLl9faW1wb3J0RWxlbWVudHx8ZSk7dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHQpfSx0cmFja0VsZW1lbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLHI9ZnVuY3Rpb24obyl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKFwibG9hZFwiLHIpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsciksdCYmdChvKSxuLm1hcmtQYXJzaW5nQ29tcGxldGUoZSksbi5wYXJzZU5leHQoKX07aWYoZS5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLHIpLGUuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsciksbCYmXCJzdHlsZVwiPT09ZS5sb2NhbE5hbWUpe3ZhciBvPSExO2lmKC0xPT1lLnRleHRDb250ZW50LmluZGV4T2YoXCJAaW1wb3J0XCIpKW89ITA7ZWxzZSBpZihlLnNoZWV0KXtvPSEwO2Zvcih2YXIgaSxhPWUuc2hlZXQuY3NzUnVsZXMscz1hP2EubGVuZ3RoOjAsYz0wO3M+YyYmKGk9YVtjXSk7YysrKWkudHlwZT09PUNTU1J1bGUuSU1QT1JUX1JVTEUmJihvPW8mJkJvb2xlYW4oaS5zdHlsZVNoZWV0KSl9byYmc2V0VGltZW91dChmdW5jdGlvbigpe2UuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJsb2FkXCIse2J1YmJsZXM6ITF9KSl9KX19LHBhcnNlU2NyaXB0OmZ1bmN0aW9uKHQpe3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7ci5fX2ltcG9ydEVsZW1lbnQ9dCxyLnNyYz10LnNyYz90LnNyYzpuKHQpLGUuY3VycmVudFNjcmlwdD10LHRoaXMudHJhY2tFbGVtZW50KHIsZnVuY3Rpb24odCl7ci5wYXJlbnROb2RlJiZyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQociksZS5jdXJyZW50U2NyaXB0PW51bGx9KSx0aGlzLmFkZEVsZW1lbnRUb0RvY3VtZW50KHIpfSxuZXh0VG9QYXJzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXlQYXJzZT1bXSwhdGhpcy5wYXJzaW5nRWxlbWVudCYmKHRoaXMubmV4dFRvUGFyc2VJbkRvYyhzKXx8dGhpcy5uZXh0VG9QYXJzZUR5bmFtaWMoKSl9LG5leHRUb1BhcnNlSW5Eb2M6ZnVuY3Rpb24oZSxuKXtpZihlJiZ0aGlzLl9tYXlQYXJzZS5pbmRleE9mKGUpPDApe3RoaXMuX21heVBhcnNlLnB1c2goZSk7Zm9yKHZhciByLG89ZS5xdWVyeVNlbGVjdG9yQWxsKHRoaXMucGFyc2VTZWxlY3RvcnNGb3JOb2RlKGUpKSxpPTAsYT1vLmxlbmd0aDthPmkmJihyPW9baV0pO2krKylpZighdGhpcy5pc1BhcnNlZChyKSlyZXR1cm4gdGhpcy5oYXNSZXNvdXJjZShyKT90KHIpP3RoaXMubmV4dFRvUGFyc2VJbkRvYyhyLl9fZG9jLHIpOnI6dm9pZCAwfXJldHVybiBufSxuZXh0VG9QYXJzZUR5bmFtaWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5keW5hbWljRWxlbWVudHNbMF19LHBhcnNlU2VsZWN0b3JzRm9yTm9kZTpmdW5jdGlvbihlKXt2YXIgdD1lLm93bmVyRG9jdW1lbnR8fGU7cmV0dXJuIHQ9PT1zP3RoaXMuZG9jdW1lbnRTZWxlY3RvcnM6dGhpcy5pbXBvcnRzU2VsZWN0b3JzfSxpc1BhcnNlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5fX2ltcG9ydFBhcnNlZH0sbmVlZHNEeW5hbWljUGFyc2luZzpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5keW5hbWljRWxlbWVudHMuaW5kZXhPZihlKT49MH0saGFzUmVzb3VyY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSkmJnZvaWQgMD09PWUuX19kb2M/ITE6ITB9fTtlLnBhcnNlcj1wLGUuSU1QT1JUX1NFTEVDVE9SPWR9KSx3aW5kb3cuSFRNTEltcG9ydHMuYWRkTW9kdWxlKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG4oZSxhKX1mdW5jdGlvbiBuKGUsdCl7cmV0dXJuXCJsaW5rXCI9PT1lLmxvY2FsTmFtZSYmZS5nZXRBdHRyaWJ1dGUoXCJyZWxcIik9PT10fWZ1bmN0aW9uIHIoZSl7cmV0dXJuISFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsXCJiYXNlVVJJXCIpfWZ1bmN0aW9uIG8oZSx0KXt2YXIgbj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoYSk7bi5fVVJMPXQ7dmFyIG89bi5jcmVhdGVFbGVtZW50KFwiYmFzZVwiKTtvLnNldEF0dHJpYnV0ZShcImhyZWZcIix0KSxuLmJhc2VVUkl8fHIobil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLFwiYmFzZVVSSVwiLHt2YWx1ZTp0fSk7dmFyIGk9bi5jcmVhdGVFbGVtZW50KFwibWV0YVwiKTtyZXR1cm4gaS5zZXRBdHRyaWJ1dGUoXCJjaGFyc2V0XCIsXCJ1dGYtOFwiKSxuLmhlYWQuYXBwZW5kQ2hpbGQoaSksbi5oZWFkLmFwcGVuZENoaWxkKG8pLG4uYm9keS5pbm5lckhUTUw9ZSx3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudCYmSFRNTFRlbXBsYXRlRWxlbWVudC5ib290c3RyYXAmJkhUTUxUZW1wbGF0ZUVsZW1lbnQuYm9vdHN0cmFwKG4pLG59dmFyIGk9ZS5mbGFncyxhPWUuSU1QT1JUX0xJTktfVFlQRSxzPWUuSU1QT1JUX1NFTEVDVE9SLGM9ZS5yb290RG9jdW1lbnQsbD1lLkxvYWRlcix1PWUuT2JzZXJ2ZXIsZD1lLnBhcnNlcixwPXtkb2N1bWVudHM6e30sZG9jdW1lbnRQcmVsb2FkU2VsZWN0b3JzOnMsaW1wb3J0c1ByZWxvYWRTZWxlY3RvcnM6W3NdLmpvaW4oXCIsXCIpLGxvYWROb2RlOmZ1bmN0aW9uKGUpe2guYWRkTm9kZShlKX0sbG9hZFN1YnRyZWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5tYXJzaGFsTm9kZXMoZSk7aC5hZGROb2Rlcyh0KX0sbWFyc2hhbE5vZGVzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5sb2FkU2VsZWN0b3JzRm9yTm9kZShlKSl9LGxvYWRTZWxlY3RvcnNGb3JOb2RlOmZ1bmN0aW9uKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudHx8ZTtyZXR1cm4gdD09PWM/dGhpcy5kb2N1bWVudFByZWxvYWRTZWxlY3RvcnM6dGhpcy5pbXBvcnRzUHJlbG9hZFNlbGVjdG9yc30sbG9hZGVkOmZ1bmN0aW9uKGUsbixyLGEscyl7aWYoaS5sb2FkJiZjb25zb2xlLmxvZyhcImxvYWRlZFwiLGUsbiksbi5fX3Jlc291cmNlPXIsbi5fX2Vycm9yPWEsdChuKSl7dmFyIGM9dGhpcy5kb2N1bWVudHNbZV07dm9pZCAwPT09YyYmKGM9YT9udWxsOm8ocixzfHxlKSxjJiYoYy5fX2ltcG9ydExpbms9bix0aGlzLmJvb3REb2N1bWVudChjKSksdGhpcy5kb2N1bWVudHNbZV09Yyksbi5fX2RvYz1jfWQucGFyc2VOZXh0KCl9LGJvb3REb2N1bWVudDpmdW5jdGlvbihlKXt0aGlzLmxvYWRTdWJ0cmVlKGUpLHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShlKSxkLnBhcnNlTmV4dCgpfSxsb2FkZWRBbGw6ZnVuY3Rpb24oKXtkLnBhcnNlTmV4dCgpfX0saD1uZXcgbChwLmxvYWRlZC5iaW5kKHApLHAubG9hZGVkQWxsLmJpbmQocCkpO2lmKHAub2JzZXJ2ZXI9bmV3IHUsIWRvY3VtZW50LmJhc2VVUkkpe3ZhciBmPXtnZXQ6ZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiYmFzZVwiKTtyZXR1cm4gZT9lLmhyZWY6d2luZG93LmxvY2F0aW9uLmhyZWZ9LGNvbmZpZ3VyYWJsZTohMH07T2JqZWN0LmRlZmluZVByb3BlcnR5KGRvY3VtZW50LFwiYmFzZVVSSVwiLGYpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLFwiYmFzZVVSSVwiLGYpfWUuaW1wb3J0ZXI9cCxlLmltcG9ydExvYWRlcj1ofSksd2luZG93LkhUTUxJbXBvcnRzLmFkZE1vZHVsZShmdW5jdGlvbihlKXt2YXIgdD1lLnBhcnNlcixuPWUuaW1wb3J0ZXIscj17YWRkZWQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciByLG8saSxhLHM9MCxjPWUubGVuZ3RoO2M+cyYmKGE9ZVtzXSk7cysrKXJ8fChyPWEub3duZXJEb2N1bWVudCxvPXQuaXNQYXJzZWQocikpLGk9dGhpcy5zaG91bGRMb2FkTm9kZShhKSxpJiZuLmxvYWROb2RlKGEpLHRoaXMuc2hvdWxkUGFyc2VOb2RlKGEpJiZvJiZ0LnBhcnNlRHluYW1pYyhhLGkpfSxzaG91bGRMb2FkTm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGUmJm8uY2FsbChlLG4ubG9hZFNlbGVjdG9yc0Zvck5vZGUoZSkpfSxzaG91bGRQYXJzZU5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlJiZvLmNhbGwoZSx0LnBhcnNlU2VsZWN0b3JzRm9yTm9kZShlKSl9fTtuLm9ic2VydmVyLmFkZENhbGxiYWNrPXIuYWRkZWQuYmluZChyKTt2YXIgbz1IVE1MRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlc3x8SFRNTEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXNTZWxlY3Rvcnx8SFRNTEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8SFRNTEVsZW1lbnQucHJvdG90eXBlLm1vek1hdGNoZXNTZWxlY3Rvcnx8SFRNTEVsZW1lbnQucHJvdG90eXBlLm1zTWF0Y2hlc1NlbGVjdG9yfSksZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3dpbmRvdy5IVE1MSW1wb3J0cy5pbXBvcnRlci5ib290RG9jdW1lbnQocil9dmFyIG49ZS5pbml0aWFsaXplTW9kdWxlcztlLmlzSUU7aWYoIWUudXNlTmF0aXZlKXtuKCk7dmFyIHI9ZS5yb290RG9jdW1lbnQ7XCJjb21wbGV0ZVwiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZXx8XCJpbnRlcmFjdGl2ZVwiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSYmIXdpbmRvdy5hdHRhY2hFdmVudD90KCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIix0KX19KHdpbmRvdy5IVE1MSW1wb3J0cyksd2luZG93LkN1c3RvbUVsZW1lbnRzPXdpbmRvdy5DdXN0b21FbGVtZW50c3x8e2ZsYWdzOnt9fSxmdW5jdGlvbihlKXt2YXIgdD1lLmZsYWdzLG49W10scj1mdW5jdGlvbihlKXtuLnB1c2goZSl9LG89ZnVuY3Rpb24oKXtuLmZvckVhY2goZnVuY3Rpb24odCl7dChlKX0pfTtlLmFkZE1vZHVsZT1yLGUuaW5pdGlhbGl6ZU1vZHVsZXM9byxlLmhhc05hdGl2ZT1Cb29sZWFuKGRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudCksZS5pc0lFPS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGUudXNlTmF0aXZlPSF0LnJlZ2lzdGVyJiZlLmhhc05hdGl2ZSYmIXdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCYmKCF3aW5kb3cuSFRNTEltcG9ydHN8fHdpbmRvdy5IVE1MSW1wb3J0cy51c2VOYXRpdmUpfSh3aW5kb3cuQ3VzdG9tRWxlbWVudHMpLHdpbmRvdy5DdXN0b21FbGVtZW50cy5hZGRNb2R1bGUoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQpe24oZSxmdW5jdGlvbihlKXtyZXR1cm4gdChlKT8hMDp2b2lkIHIoZSx0KX0pLHIoZSx0KX1mdW5jdGlvbiBuKGUsdCxyKXt2YXIgbz1lLmZpcnN0RWxlbWVudENoaWxkO2lmKCFvKWZvcihvPWUuZmlyc3RDaGlsZDtvJiZvLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KW89by5uZXh0U2libGluZztmb3IoO287KXQobyxyKSE9PSEwJiZuKG8sdCxyKSxvPW8ubmV4dEVsZW1lbnRTaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIHIoZSxuKXtmb3IodmFyIHI9ZS5zaGFkb3dSb290O3I7KXQocixuKSxyPXIub2xkZXJTaGFkb3dSb290fWZ1bmN0aW9uIG8oZSx0KXtpKGUsdCxbXSl9ZnVuY3Rpb24gaShlLHQsbil7aWYoZT13aW5kb3cud3JhcChlKSwhKG4uaW5kZXhPZihlKT49MCkpe24ucHVzaChlKTtmb3IodmFyIHIsbz1lLnF1ZXJ5U2VsZWN0b3JBbGwoXCJsaW5rW3JlbD1cIithK1wiXVwiKSxzPTAsYz1vLmxlbmd0aDtjPnMmJihyPW9bc10pO3MrKylyW1wiaW1wb3J0XCJdJiZpKHJbXCJpbXBvcnRcIl0sdCxuKTt0KGUpfX12YXIgYT13aW5kb3cuSFRNTEltcG9ydHM/d2luZG93LkhUTUxJbXBvcnRzLklNUE9SVF9MSU5LX1RZUEU6XCJub25lXCI7ZS5mb3JEb2N1bWVudFRyZWU9byxlLmZvclN1YnRyZWU9dH0pLHdpbmRvdy5DdXN0b21FbGVtZW50cy5hZGRNb2R1bGUoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQpe3JldHVybiBuKGUsdCl8fHIoZSx0KX1mdW5jdGlvbiBuKHQsbil7cmV0dXJuIGUudXBncmFkZSh0LG4pPyEwOnZvaWQobiYmYSh0KSl9ZnVuY3Rpb24gcihlLHQpe2IoZSxmdW5jdGlvbihlKXtyZXR1cm4gbihlLHQpPyEwOnZvaWQgMH0pfWZ1bmN0aW9uIG8oZSl7Uy5wdXNoKGUpLF98fChfPSEwLHNldFRpbWVvdXQoaSkpfWZ1bmN0aW9uIGkoKXtfPSExO2Zvcih2YXIgZSx0PVMsbj0wLHI9dC5sZW5ndGg7cj5uJiYoZT10W25dKTtuKyspZSgpO1M9W119ZnVuY3Rpb24gYShlKXtFP28oZnVuY3Rpb24oKXtzKGUpfSk6cyhlKX1mdW5jdGlvbiBzKGUpe2UuX191cGdyYWRlZF9fJiYhZS5fX2F0dGFjaGVkJiYoZS5fX2F0dGFjaGVkPSEwLGUuYXR0YWNoZWRDYWxsYmFjayYmZS5hdHRhY2hlZENhbGxiYWNrKCkpfWZ1bmN0aW9uIGMoZSl7bChlKSxiKGUsZnVuY3Rpb24oZSl7bChlKX0pfWZ1bmN0aW9uIGwoZSl7RT9vKGZ1bmN0aW9uKCl7dShlKX0pOnUoZSl9ZnVuY3Rpb24gdShlKXtlLl9fdXBncmFkZWRfXyYmZS5fX2F0dGFjaGVkJiYoZS5fX2F0dGFjaGVkPSExLGUuZGV0YWNoZWRDYWxsYmFjayYmZS5kZXRhY2hlZENhbGxiYWNrKCkpfWZ1bmN0aW9uIGQoZSl7Zm9yKHZhciB0PWUsbj13aW5kb3cud3JhcChkb2N1bWVudCk7dDspe2lmKHQ9PW4pcmV0dXJuITA7dD10LnBhcmVudE5vZGV8fHQubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJnQuaG9zdH19ZnVuY3Rpb24gcChlKXtpZihlLnNoYWRvd1Jvb3QmJiFlLnNoYWRvd1Jvb3QuX193YXRjaGVkKXtnLmRvbSYmY29uc29sZS5sb2coXCJ3YXRjaGluZyBzaGFkb3ctcm9vdCBmb3I6IFwiLGUubG9jYWxOYW1lKTtmb3IodmFyIHQ9ZS5zaGFkb3dSb290O3Q7KW0odCksdD10Lm9sZGVyU2hhZG93Um9vdH19ZnVuY3Rpb24gaChlLG4pe2lmKGcuZG9tKXt2YXIgcj1uWzBdO2lmKHImJlwiY2hpbGRMaXN0XCI9PT1yLnR5cGUmJnIuYWRkZWROb2RlcyYmci5hZGRlZE5vZGVzKXtmb3IodmFyIG89ci5hZGRlZE5vZGVzWzBdO28mJm8hPT1kb2N1bWVudCYmIW8uaG9zdDspbz1vLnBhcmVudE5vZGU7dmFyIGk9byYmKG8uVVJMfHxvLl9VUkx8fG8uaG9zdCYmby5ob3N0LmxvY2FsTmFtZSl8fFwiXCI7aT1pLnNwbGl0KFwiLz9cIikuc2hpZnQoKS5zcGxpdChcIi9cIikucG9wKCl9Y29uc29sZS5ncm91cChcIm11dGF0aW9ucyAoJWQpIFslc11cIixuLmxlbmd0aCxpfHxcIlwiKX12YXIgYT1kKGUpO24uZm9yRWFjaChmdW5jdGlvbihlKXtcImNoaWxkTGlzdFwiPT09ZS50eXBlJiYoVChlLmFkZGVkTm9kZXMsZnVuY3Rpb24oZSl7ZS5sb2NhbE5hbWUmJnQoZSxhKX0pLFQoZS5yZW1vdmVkTm9kZXMsZnVuY3Rpb24oZSl7ZS5sb2NhbE5hbWUmJmMoZSl9KSl9KSxnLmRvbSYmY29uc29sZS5ncm91cEVuZCgpfWZ1bmN0aW9uIGYoZSl7Zm9yKGU9d2luZG93LndyYXAoZSksZXx8KGU9d2luZG93LndyYXAoZG9jdW1lbnQpKTtlLnBhcmVudE5vZGU7KWU9ZS5wYXJlbnROb2RlO3ZhciB0PWUuX19vYnNlcnZlcjt0JiYoaChlLHQudGFrZVJlY29yZHMoKSksaSgpKX1mdW5jdGlvbiBtKGUpe2lmKCFlLl9fb2JzZXJ2ZXIpe3ZhciB0PW5ldyBNdXRhdGlvbk9ic2VydmVyKGguYmluZCh0aGlzLGUpKTt0Lm9ic2VydmUoZSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxlLl9fb2JzZXJ2ZXI9dH19ZnVuY3Rpb24gdyhlKXtlPXdpbmRvdy53cmFwKGUpLGcuZG9tJiZjb25zb2xlLmdyb3VwKFwidXBncmFkZURvY3VtZW50OiBcIixlLmJhc2VVUkkuc3BsaXQoXCIvXCIpLnBvcCgpKTt2YXIgbj1lPT09d2luZG93LndyYXAoZG9jdW1lbnQpO3QoZSxuKSxtKGUpLGcuZG9tJiZjb25zb2xlLmdyb3VwRW5kKCl9ZnVuY3Rpb24gdihlKXt5KGUsdyl9dmFyIGc9ZS5mbGFncyxiPWUuZm9yU3VidHJlZSx5PWUuZm9yRG9jdW1lbnRUcmVlLEU9d2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIuX2lzUG9seWZpbGxlZCYmZ1tcInRocm90dGxlLWF0dGFjaGVkXCJdO2UuaGFzUG9seWZpbGxNdXRhdGlvbnM9RSxlLmhhc1Rocm90dGxlZEF0dGFjaGVkPUU7dmFyIF89ITEsUz1bXSxUPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUuZm9yRWFjaCksTT1FbGVtZW50LnByb3RvdHlwZS5jcmVhdGVTaGFkb3dSb290O00mJihFbGVtZW50LnByb3RvdHlwZS5jcmVhdGVTaGFkb3dSb290PWZ1bmN0aW9uKCl7dmFyIGU9TS5jYWxsKHRoaXMpO3JldHVybiB3aW5kb3cuQ3VzdG9tRWxlbWVudHMud2F0Y2hTaGFkb3codGhpcyksZX0pLGUud2F0Y2hTaGFkb3c9cCxlLnVwZ3JhZGVEb2N1bWVudFRyZWU9dixlLnVwZ3JhZGVEb2N1bWVudD13LGUudXBncmFkZVN1YnRyZWU9cixlLnVwZ3JhZGVBbGw9dCxlLmF0dGFjaGVkPWEsZS50YWtlUmVjb3Jkcz1mfSksd2luZG93LkN1c3RvbUVsZW1lbnRzLmFkZE1vZHVsZShmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQscil7aWYoXCJ0ZW1wbGF0ZVwiPT09dC5sb2NhbE5hbWUmJndpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50JiZIVE1MVGVtcGxhdGVFbGVtZW50LmRlY29yYXRlJiZIVE1MVGVtcGxhdGVFbGVtZW50LmRlY29yYXRlKHQpLCF0Ll9fdXBncmFkZWRfXyYmdC5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXt2YXIgbz10LmdldEF0dHJpYnV0ZShcImlzXCIpLGk9ZS5nZXRSZWdpc3RlcmVkRGVmaW5pdGlvbih0LmxvY2FsTmFtZSl8fGUuZ2V0UmVnaXN0ZXJlZERlZmluaXRpb24obyk7aWYoaSYmKG8mJmkudGFnPT10LmxvY2FsTmFtZXx8IW8mJiFpW1wiZXh0ZW5kc1wiXSkpcmV0dXJuIG4odCxpLHIpfX1mdW5jdGlvbiBuKHQsbixvKXtyZXR1cm4gYS51cGdyYWRlJiZjb25zb2xlLmdyb3VwKFwidXBncmFkZTpcIix0LmxvY2FsTmFtZSksbi5pcyYmdC5zZXRBdHRyaWJ1dGUoXCJpc1wiLG4uaXMpLHIodCxuKSx0Ll9fdXBncmFkZWRfXz0hMCxpKHQpLG8mJmUuYXR0YWNoZWQodCksZS51cGdyYWRlU3VidHJlZSh0LG8pLGEudXBncmFkZSYmY29uc29sZS5ncm91cEVuZCgpLHR9ZnVuY3Rpb24gcihlLHQpe09iamVjdC5fX3Byb3RvX18/ZS5fX3Byb3RvX189dC5wcm90b3R5cGU6KG8oZSx0LnByb3RvdHlwZSx0W1wibmF0aXZlXCJdKSxlLl9fcHJvdG9fXz10LnByb3RvdHlwZSl9ZnVuY3Rpb24gbyhlLHQsbil7Zm9yKHZhciByPXt9LG89dDtvIT09biYmbyE9PUhUTUxFbGVtZW50LnByb3RvdHlwZTspe2Zvcih2YXIgaSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG8pLHM9MDtpPWFbc107cysrKXJbaV18fChPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobyxpKSkscltpXT0xKTtvPU9iamVjdC5nZXRQcm90b3R5cGVPZihvKX19ZnVuY3Rpb24gaShlKXtlLmNyZWF0ZWRDYWxsYmFjayYmZS5jcmVhdGVkQ2FsbGJhY2soKX12YXIgYT1lLmZsYWdzO2UudXBncmFkZT10LGUudXBncmFkZVdpdGhEZWZpbml0aW9uPW4sZS5pbXBsZW1lbnRQcm90b3R5cGU9cn0pLHdpbmRvdy5DdXN0b21FbGVtZW50cy5hZGRNb2R1bGUoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0LHIpe3ZhciBjPXJ8fHt9O2lmKCF0KXRocm93IG5ldyBFcnJvcihcImRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudDogZmlyc3QgYXJndW1lbnQgYG5hbWVgIG11c3Qgbm90IGJlIGVtcHR5XCIpO2lmKHQuaW5kZXhPZihcIi1cIik8MCl0aHJvdyBuZXcgRXJyb3IoXCJkb2N1bWVudC5yZWdpc3RlckVsZW1lbnQ6IGZpcnN0IGFyZ3VtZW50ICgnbmFtZScpIG11c3QgY29udGFpbiBhIGRhc2ggKCctJykuIEFyZ3VtZW50IHByb3ZpZGVkIHdhcyAnXCIrU3RyaW5nKHQpK1wiJy5cIik7aWYobyh0KSl0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZXhlY3V0ZSAncmVnaXN0ZXJFbGVtZW50JyBvbiAnRG9jdW1lbnQnOiBSZWdpc3RyYXRpb24gZmFpbGVkIGZvciB0eXBlICdcIitTdHJpbmcodCkrXCInLiBUaGUgdHlwZSBuYW1lIGlzIGludmFsaWQuXCIpO2lmKGwodCkpdGhyb3cgbmV3IEVycm9yKFwiRHVwbGljYXRlRGVmaW5pdGlvbkVycm9yOiBhIHR5cGUgd2l0aCBuYW1lICdcIitTdHJpbmcodCkrXCInIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFwiKTtyZXR1cm4gYy5wcm90b3R5cGV8fChjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEhUTUxFbGVtZW50LnByb3RvdHlwZSkpLGMuX19uYW1lPXQudG9Mb3dlckNhc2UoKSxjLmxpZmVjeWNsZT1jLmxpZmVjeWNsZXx8e30sYy5hbmNlc3RyeT1pKGNbXCJleHRlbmRzXCJdKSxhKGMpLHMoYyksbihjLnByb3RvdHlwZSksdShjLl9fbmFtZSxjKSxjLmN0b3I9ZChjKSxjLmN0b3IucHJvdG90eXBlPWMucHJvdG90eXBlLGMucHJvdG90eXBlLmNvbnN0cnVjdG9yPWMuY3RvcixlLnJlYWR5JiZ2KGRvY3VtZW50KSxjLmN0b3J9ZnVuY3Rpb24gbihlKXtpZighZS5zZXRBdHRyaWJ1dGUuX3BvbHlmaWxsZWQpe3ZhciB0PWUuc2V0QXR0cmlidXRlO2Uuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKGUsbil7ci5jYWxsKHRoaXMsZSxuLHQpfTt2YXIgbj1lLnJlbW92ZUF0dHJpYnV0ZTtlLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihlKXtyLmNhbGwodGhpcyxlLG51bGwsbil9LGUuc2V0QXR0cmlidXRlLl9wb2x5ZmlsbGVkPSEwfX1mdW5jdGlvbiByKGUsdCxuKXtlPWUudG9Mb3dlckNhc2UoKTt2YXIgcj10aGlzLmdldEF0dHJpYnV0ZShlKTtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZShlKTt0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayYmbyE9PXImJnRoaXMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGUscixvKX1mdW5jdGlvbiBvKGUpe2Zvcih2YXIgdD0wO3Q8Xy5sZW5ndGg7dCsrKWlmKGU9PT1fW3RdKXJldHVybiEwfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9bChlKTtyZXR1cm4gdD9pKHRbXCJleHRlbmRzXCJdKS5jb25jYXQoW3RdKTpbXX1mdW5jdGlvbiBhKGUpe2Zvcih2YXIgdCxuPWVbXCJleHRlbmRzXCJdLHI9MDt0PWUuYW5jZXN0cnlbcl07cisrKW49dC5pcyYmdC50YWc7ZS50YWc9bnx8ZS5fX25hbWUsbiYmKGUuaXM9ZS5fX25hbWUpfWZ1bmN0aW9uIHMoZSl7aWYoIU9iamVjdC5fX3Byb3RvX18pe3ZhciB0PUhUTUxFbGVtZW50LnByb3RvdHlwZTtpZihlLmlzKXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUudGFnKTt0PU9iamVjdC5nZXRQcm90b3R5cGVPZihuKX1mb3IodmFyIHIsbz1lLnByb3RvdHlwZSxpPSExO287KW89PXQmJihpPSEwKSxyPU9iamVjdC5nZXRQcm90b3R5cGVPZihvKSxyJiYoby5fX3Byb3RvX189ciksbz1yO2l8fGNvbnNvbGUud2FybihlLnRhZytcIiBwcm90b3R5cGUgbm90IGZvdW5kIGluIHByb3RvdHlwZSBjaGFpbiBmb3IgXCIrZS5pcyksZVtcIm5hdGl2ZVwiXT10fX1mdW5jdGlvbiBjKGUpe3JldHVybiBiKE0oZS50YWcpLGUpfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGU/U1tlLnRvTG93ZXJDYXNlKCldOnZvaWQgMH1mdW5jdGlvbiB1KGUsdCl7U1tlXT10fWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGMoZSl9fWZ1bmN0aW9uIHAoZSx0LG4pe3JldHVybiBlPT09VD9oKHQsbik6TyhlLHQpfWZ1bmN0aW9uIGgoZSx0KXtlJiYoZT1lLnRvTG93ZXJDYXNlKCkpLHQmJih0PXQudG9Mb3dlckNhc2UoKSk7dmFyIG49bCh0fHxlKTtpZihuKXtpZihlPT1uLnRhZyYmdD09bi5pcylyZXR1cm4gbmV3IG4uY3RvcjtpZighdCYmIW4uaXMpcmV0dXJuIG5ldyBuLmN0b3J9dmFyIHI7cmV0dXJuIHQ/KHI9aChlKSxyLnNldEF0dHJpYnV0ZShcImlzXCIsdCkscik6KHI9TShlKSxlLmluZGV4T2YoXCItXCIpPj0wJiZ5KHIsSFRNTEVsZW1lbnQpLHIpfWZ1bmN0aW9uIGYoZSx0KXt2YXIgbj1lW3RdO2VbdF09ZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZyhlKSxlfX12YXIgbSx3PWUuaXNJRSx2PWUudXBncmFkZURvY3VtZW50VHJlZSxnPWUudXBncmFkZUFsbCxiPWUudXBncmFkZVdpdGhEZWZpbml0aW9uLHk9ZS5pbXBsZW1lbnRQcm90b3R5cGUsRT1lLnVzZU5hdGl2ZSxfPVtcImFubm90YXRpb24teG1sXCIsXCJjb2xvci1wcm9maWxlXCIsXCJmb250LWZhY2VcIixcImZvbnQtZmFjZS1zcmNcIixcImZvbnQtZmFjZS11cmlcIixcImZvbnQtZmFjZS1mb3JtYXRcIixcImZvbnQtZmFjZS1uYW1lXCIsXCJtaXNzaW5nLWdseXBoXCJdLFM9e30sVD1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIixNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQuYmluZChkb2N1bWVudCksTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMuYmluZChkb2N1bWVudCk7bT1PYmplY3QuX19wcm90b19ffHxFP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiB0fTpmdW5jdGlvbihlLHQpe2lmKGUgaW5zdGFuY2VvZiB0KXJldHVybiEwO2Zvcih2YXIgbj1lO247KXtpZihuPT09dC5wcm90b3R5cGUpcmV0dXJuITA7bj1uLl9fcHJvdG9fX31yZXR1cm4hMX0sZihOb2RlLnByb3RvdHlwZSxcImNsb25lTm9kZVwiKSxmKGRvY3VtZW50LFwiaW1wb3J0Tm9kZVwiKSx3JiYhZnVuY3Rpb24oKXt2YXIgZT1kb2N1bWVudC5pbXBvcnROb2RlO2RvY3VtZW50LmltcG9ydE5vZGU9ZnVuY3Rpb24oKXt2YXIgdD1lLmFwcGx5KGRvY3VtZW50LGFyZ3VtZW50cyk7aWYodC5ub2RlVHlwZT09dC5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKXt2YXIgbj1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7cmV0dXJuIG4uYXBwZW5kQ2hpbGQodCksbn1yZXR1cm4gdH19KCksZG9jdW1lbnQucmVnaXN0ZXJFbGVtZW50PXQsZG9jdW1lbnQuY3JlYXRlRWxlbWVudD1oLGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUz1wLGUucmVnaXN0cnk9UyxlW1wiaW5zdGFuY2VvZlwiXT1tLGUucmVzZXJ2ZWRUYWdMaXN0PV8sZS5nZXRSZWdpc3RlcmVkRGVmaW5pdGlvbj1sLGRvY3VtZW50LnJlZ2lzdGVyPWRvY3VtZW50LnJlZ2lzdGVyRWxlbWVudH0pLGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtpKHdpbmRvdy53cmFwKGRvY3VtZW50KSksd2luZG93LkN1c3RvbUVsZW1lbnRzLnJlYWR5PSEwO3ZhciBlPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoZSwxNil9O2UoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7d2luZG93LkN1c3RvbUVsZW1lbnRzLnJlYWR5VGltZT1EYXRlLm5vdygpLHdpbmRvdy5IVE1MSW1wb3J0cyYmKHdpbmRvdy5DdXN0b21FbGVtZW50cy5lbGFwc2VkPXdpbmRvdy5DdXN0b21FbGVtZW50cy5yZWFkeVRpbWUtd2luZG93LkhUTUxJbXBvcnRzLnJlYWR5VGltZSksZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJXZWJDb21wb25lbnRzUmVhZHlcIix7YnViYmxlczohMH0pKX0pfSl9dmFyIG49ZS51c2VOYXRpdmUscj1lLmluaXRpYWxpemVNb2R1bGVzO2UuaXNJRTtpZihuKXt2YXIgbz1mdW5jdGlvbigpe307ZS53YXRjaFNoYWRvdz1vLGUudXBncmFkZT1vLGUudXBncmFkZUFsbD1vLGUudXBncmFkZURvY3VtZW50VHJlZT1vLGUudXBncmFkZVN1YnRyZWU9byxlLnRha2VSZWNvcmRzPW8sZVtcImluc3RhbmNlb2ZcIl09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSBpbnN0YW5jZW9mIHR9fWVsc2UgcigpO3ZhciBpPWUudXBncmFkZURvY3VtZW50VHJlZSxhPWUudXBncmFkZURvY3VtZW50O2lmKHdpbmRvdy53cmFwfHwod2luZG93LlNoYWRvd0RPTVBvbHlmaWxsPyh3aW5kb3cud3JhcD13aW5kb3cuU2hhZG93RE9NUG9seWZpbGwud3JhcElmTmVlZGVkLHdpbmRvdy51bndyYXA9d2luZG93LlNoYWRvd0RPTVBvbHlmaWxsLnVud3JhcElmTmVlZGVkKTp3aW5kb3cud3JhcD13aW5kb3cudW53cmFwPWZ1bmN0aW9uKGUpe3JldHVybiBlfSksd2luZG93LkhUTUxJbXBvcnRzJiYod2luZG93LkhUTUxJbXBvcnRzLl9faW1wb3J0c1BhcnNpbmdIb29rPWZ1bmN0aW9uKGUpe2VbXCJpbXBvcnRcIl0mJmEod3JhcChlW1wiaW1wb3J0XCJdKSl9KSxcImNvbXBsZXRlXCI9PT1kb2N1bWVudC5yZWFkeVN0YXRlfHxlLmZsYWdzLmVhZ2VyKXQoKTtlbHNlIGlmKFwiaW50ZXJhY3RpdmVcIiE9PWRvY3VtZW50LnJlYWR5U3RhdGV8fHdpbmRvdy5hdHRhY2hFdmVudHx8d2luZG93LkhUTUxJbXBvcnRzJiYhd2luZG93LkhUTUxJbXBvcnRzLnJlYWR5KXt2YXIgcz13aW5kb3cuSFRNTEltcG9ydHMmJiF3aW5kb3cuSFRNTEltcG9ydHMucmVhZHk/XCJIVE1MSW1wb3J0c0xvYWRlZFwiOlwiRE9NQ29udGVudExvYWRlZFwiO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKHMsdCl9ZWxzZSB0KCl9KHdpbmRvdy5DdXN0b21FbGVtZW50cyksZnVuY3Rpb24oZSl7RnVuY3Rpb24ucHJvdG90eXBlLmJpbmR8fChGdW5jdGlvbi5wcm90b3R5cGUuYmluZD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPW4uc2xpY2UoKTtyZXR1cm4gci5wdXNoLmFwcGx5KHIsYXJndW1lbnRzKSx0LmFwcGx5KGUscil9fSl9KHdpbmRvdy5XZWJDb21wb25lbnRzKSxmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7dC50ZXh0Q29udGVudD1cImJvZHkge3RyYW5zaXRpb246IG9wYWNpdHkgZWFzZS1pbiAwLjJzOyB9IFxcbmJvZHlbdW5yZXNvbHZlZF0ge29wYWNpdHk6IDA7IGRpc3BsYXk6IGJsb2NrOyBvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7IH0gXFxuXCI7dmFyIG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImhlYWRcIik7bi5pbnNlcnRCZWZvcmUodCxuLmZpcnN0Q2hpbGQpfSh3aW5kb3cuV2ViQ29tcG9uZW50cyksZnVuY3Rpb24oZSl7d2luZG93LlBsYXRmb3JtPWV9KHdpbmRvdy5XZWJDb21wb25lbnRzKTsiLCIvLyBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIEJhc2VkIGluIHBhcnQgb24gY29kZSBmcm9tIEFwYWNoZSBSaXBwbGUsIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLXJpcHBsZVxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCd1dGlscycpO1xuXG52YXIgaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX1hNTEh0dHBSZXF1ZXN0ID0gWE1MSHR0cFJlcXVlc3Q7XG4gICAgd2luZG93LlhNTEh0dHBSZXF1ZXN0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgeGhyID0gbmV3IF9YTUxIdHRwUmVxdWVzdCgpLFxuICAgICAgICAgICAgb3JpZ01ldGhvZHMgPSB7XG4gICAgICAgICAgICAgICAgc2V0UmVxdWVzdEhlYWRlcjogeGhyLnNldFJlcXVlc3RIZWFkZXIsXG4gICAgICAgICAgICAgICAgb3BlbjogeGhyLm9wZW5cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgeGhyLm9wZW4gPSBmdW5jdGlvbiAobWV0aG9kLCB1cmwpIHtcbiAgICAgICAgICAgIHZhciBzYW1lT3JpZ2luID0gdXRpbHMuaXNTYW1lT3JpZ2luUmVxdWVzdCh1cmwpO1xuXG4gICAgICAgICAgICBpZiAoIXNhbWVPcmlnaW4pIHtcbiAgICAgICAgICAgICAgICB1cmwgPSAnL3hocl9wcm94eT9ydXJsPScgKyBlc2NhcGUodXJsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb3JpZ01ldGhvZHMub3Blbi5hcHBseSh4aHIsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB4aHI7XG4gICAgfTtcblxuICAgIC8vIEVuc3VyZSB0aGF0IHdlIHJldGFpbiBhbGwgc3RhdGljIHByb3BlcnRpZXMsIHN1Y2ggYXMgRE9ORVxuICAgIHdpbmRvdy5YTUxIdHRwUmVxdWVzdC5fX3Byb3RvX18gPSBfWE1MSHR0cFJlcXVlc3Q7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpbml0OiBpbml0XG59O1xuIl19
|