whs.js/modules/StatsModule.module.js
2018-06-02 14:22:49 +03:00

8138 lines
5.2 MiB

/* Built for whs v2.2.0-beta.0 */
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
/* WhitestormJS Framework v2.2.0-alpha.0 */function createCommonjsModule(fn,module){return module={exports:{}},fn(module,module.exports),module.exports;}var runtime=createCommonjsModule(function(module){/**
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/!function(global){var Op=Object.prototype;var hasOwn=Op.hasOwnProperty;var undefined;// More compressible than void 0.
var $Symbol=typeof Symbol==="function"?Symbol:{};var iteratorSymbol=$Symbol.iterator||"@@iterator";var asyncIteratorSymbol=$Symbol.asyncIterator||"@@asyncIterator";var toStringTagSymbol=$Symbol.toStringTag||"@@toStringTag";var runtime=global.regeneratorRuntime;if(runtime){{// If regeneratorRuntime is defined globally and we're in a module,
// make the exports object identical to regeneratorRuntime.
module.exports=runtime;}// Don't bother evaluating the rest of this file if the runtime was
// already defined globally.
return;}// Define the runtime globally (as expected by generated code) as either
// module.exports (if we're in a module) or a new, empty object.
runtime=global.regeneratorRuntime=module.exports;function wrap(innerFn,outerFn,self,tryLocsList){// If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
var protoGenerator=outerFn&&outerFn.prototype instanceof Generator?outerFn:Generator;var generator=Object.create(protoGenerator.prototype);var context=new Context(tryLocsList||[]);// The ._invoke method unifies the implementations of the .next,
// .throw, and .return methods.
generator._invoke=makeInvokeMethod(innerFn,self,context);return generator;}runtime.wrap=wrap;// Try/catch helper to minimize deoptimizations. Returns a completion
// record like context.tryEntries[i].completion. This interface could
// have been (and was previously) designed to take a closure to be
// invoked without arguments, but in all the cases we care about we
// already have an existing method we want to call, so there's no need
// to create a new function object. We can even get away with assuming
// the method takes exactly one argument, since that happens to be true
// in every case, so we don't have to touch the arguments object. The
// only additional allocation required is the completion record, which
// has a stable shape and so hopefully should be cheap to allocate.
function tryCatch(fn,obj,arg){try{return {type:"normal",arg:fn.call(obj,arg)};}catch(err){return {type:"throw",arg:err};}}var GenStateSuspendedStart="suspendedStart";var GenStateSuspendedYield="suspendedYield";var GenStateExecuting="executing";var GenStateCompleted="completed";// Returning this object from the innerFn has the same effect as
// breaking out of the dispatch switch statement.
var ContinueSentinel={};// Dummy constructor functions that we use as the .constructor and
// .constructor.prototype properties for functions that return Generator
// objects. For full spec compliance, you may wish to configure your
// minifier not to mangle the names of these two functions.
function Generator(){}function GeneratorFunction(){}function GeneratorFunctionPrototype(){}// This is a polyfill for %IteratorPrototype% for environments that
// don't natively support it.
var IteratorPrototype={};IteratorPrototype[iteratorSymbol]=function(){return this;};var getProto=Object.getPrototypeOf;var NativeIteratorPrototype=getProto&&getProto(getProto(values([])));if(NativeIteratorPrototype&&NativeIteratorPrototype!==Op&&hasOwn.call(NativeIteratorPrototype,iteratorSymbol)){// This environment has a native %IteratorPrototype%; use it instead
// of the polyfill.
IteratorPrototype=NativeIteratorPrototype;}var Gp=GeneratorFunctionPrototype.prototype=Generator.prototype=Object.create(IteratorPrototype);GeneratorFunction.prototype=Gp.constructor=GeneratorFunctionPrototype;GeneratorFunctionPrototype.constructor=GeneratorFunction;GeneratorFunctionPrototype[toStringTagSymbol]=GeneratorFunction.displayName="GeneratorFunction";// Helper for defining the .next, .throw, and .return methods of the
// Iterator interface in terms of a single ._invoke method.
function defineIteratorMethods(prototype){["next","throw","return"].forEach(function(method){prototype[method]=function(arg){return this._invoke(method,arg);};});}runtime.isGeneratorFunction=function(genFun){var ctor=typeof genFun==="function"&&genFun.constructor;return ctor?ctor===GeneratorFunction||// For the native GeneratorFunction constructor, the best we can
// do is to check its .name property.
(ctor.displayName||ctor.name)==="GeneratorFunction":false;};runtime.mark=function(genFun){if(Object.setPrototypeOf){Object.setPrototypeOf(genFun,GeneratorFunctionPrototype);}else{genFun.__proto__=GeneratorFunctionPrototype;if(!(toStringTagSymbol in genFun)){genFun[toStringTagSymbol]="GeneratorFunction";}}genFun.prototype=Object.create(Gp);return genFun;};// Within the body of any async function, `await x` is transformed to
// `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
// `hasOwn.call(value, "__await")` to determine if the yielded value is
// meant to be awaited.
runtime.awrap=function(arg){return {__await:arg};};function AsyncIterator(generator){function invoke(method,arg,resolve,reject){var record=tryCatch(generator[method],generator,arg);if(record.type==="throw"){reject(record.arg);}else{var result=record.arg;var value=result.value;if(value&&typeof value==="object"&&hasOwn.call(value,"__await")){return Promise.resolve(value.__await).then(function(value){invoke("next",value,resolve,reject);},function(err){invoke("throw",err,resolve,reject);});}return Promise.resolve(value).then(function(unwrapped){// When a yielded Promise is resolved, its final value becomes
// the .value of the Promise<{value,done}> result for the
// current iteration. If the Promise is rejected, however, the
// result for this iteration will be rejected with the same
// reason. Note that rejections of yielded Promises are not
// thrown back into the generator function, as is the case
// when an awaited Promise is rejected. This difference in
// behavior between yield and await is important, because it
// allows the consumer to decide what to do with the yielded
// rejection (swallow it and continue, manually .throw it back
// into the generator, abandon iteration, whatever). With
// await, by contrast, there is no opportunity to examine the
// rejection reason outside the generator function, so the
// only option is to throw it from the await expression, and
// let the generator function handle the exception.
result.value=unwrapped;resolve(result);},reject);}}var previousPromise;function enqueue(method,arg){function callInvokeWithMethodAndArg(){return new Promise(function(resolve,reject){invoke(method,arg,resolve,reject);});}return previousPromise=// If enqueue has been called before, then we want to wait until
// all previous Promises have been resolved before calling invoke,
// so that results are always delivered in the correct order. If
// enqueue has not been called before, then it is important to
// call invoke immediately, without waiting on a callback to fire,
// so that the async generator function has the opportunity to do
// any necessary setup in a predictable way. This predictability
// is why the Promise constructor synchronously invokes its
// executor callback, and why async functions synchronously
// execute code before the first await. Since we implement simple
// async functions in terms of async generators, it is especially
// important to get this right, even though it requires care.
previousPromise?previousPromise.then(callInvokeWithMethodAndArg,// Avoid propagating failures to Promises returned by later
// invocations of the iterator.
callInvokeWithMethodAndArg):callInvokeWithMethodAndArg();}// Define the unified helper method that is used to implement .next,
// .throw, and .return (see defineIteratorMethods).
this._invoke=enqueue;}defineIteratorMethods(AsyncIterator.prototype);AsyncIterator.prototype[asyncIteratorSymbol]=function(){return this;};runtime.AsyncIterator=AsyncIterator;// Note that simple async functions are implemented on top of
// AsyncIterator objects; they just return a Promise for the value of
// the final result produced by the iterator.
runtime.async=function(innerFn,outerFn,self,tryLocsList){var iter=new AsyncIterator(wrap(innerFn,outerFn,self,tryLocsList));return runtime.isGeneratorFunction(outerFn)?iter// If outerFn is a generator, return the full iterator.
:iter.next().then(function(result){return result.done?result.value:iter.next();});};function makeInvokeMethod(innerFn,self,context){var state=GenStateSuspendedStart;return function invoke(method,arg){if(state===GenStateExecuting){throw new Error("Generator is already running");}if(state===GenStateCompleted){if(method==="throw"){throw arg;}// Be forgiving, per 25.3.3.3.3 of the spec:
// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
return doneResult();}context.method=method;context.arg=arg;while(true){var delegate=context.delegate;if(delegate){var delegateResult=maybeInvokeDelegate(delegate,context);if(delegateResult){if(delegateResult===ContinueSentinel)continue;return delegateResult;}}if(context.method==="next"){// Setting context._sent for legacy support of Babel's
// function.sent implementation.
context.sent=context._sent=context.arg;}else if(context.method==="throw"){if(state===GenStateSuspendedStart){state=GenStateCompleted;throw context.arg;}context.dispatchException(context.arg);}else if(context.method==="return"){context.abrupt("return",context.arg);}state=GenStateExecuting;var record=tryCatch(innerFn,self,context);if(record.type==="normal"){// If an exception is thrown from innerFn, we leave state ===
// GenStateExecuting and loop back for another invocation.
state=context.done?GenStateCompleted:GenStateSuspendedYield;if(record.arg===ContinueSentinel){continue;}return {value:record.arg,done:context.done};}else if(record.type==="throw"){state=GenStateCompleted;// Dispatch the exception by looping back around to the
// context.dispatchException(context.arg) call above.
context.method="throw";context.arg=record.arg;}}};}// Call delegate.iterator[context.method](context.arg) and handle the
// result, either by returning a { value, done } result from the
// delegate iterator, or by modifying context.method and context.arg,
// setting context.delegate to null, and returning the ContinueSentinel.
function maybeInvokeDelegate(delegate,context){var method=delegate.iterator[context.method];if(method===undefined){// A .throw or .return when the delegate iterator has no .throw
// method always terminates the yield* loop.
context.delegate=null;if(context.method==="throw"){if(delegate.iterator.return){// If the delegate iterator has a return method, give it a
// chance to clean up.
context.method="return";context.arg=undefined;maybeInvokeDelegate(delegate,context);if(context.method==="throw"){// If maybeInvokeDelegate(context) changed context.method from
// "return" to "throw", let that override the TypeError below.
return ContinueSentinel;}}context.method="throw";context.arg=new TypeError("The iterator does not provide a 'throw' method");}return ContinueSentinel;}var record=tryCatch(method,delegate.iterator,context.arg);if(record.type==="throw"){context.method="throw";context.arg=record.arg;context.delegate=null;return ContinueSentinel;}var info=record.arg;if(!info){context.method="throw";context.arg=new TypeError("iterator result is not an object");context.delegate=null;return ContinueSentinel;}if(info.done){// Assign the result of the finished delegate to the temporary
// variable specified by delegate.resultName (see delegateYield).
context[delegate.resultName]=info.value;// Resume execution at the desired location (see delegateYield).
context.next=delegate.nextLoc;// If context.method was "throw" but the delegate handled the
// exception, let the outer generator proceed normally. If
// context.method was "next", forget context.arg since it has been
// "consumed" by the delegate iterator. If context.method was
// "return", allow the original .return call to continue in the
// outer generator.
if(context.method!=="return"){context.method="next";context.arg=undefined;}}else{// Re-yield the result returned by the delegate method.
return info;}// The delegate iterator is finished, so forget it and continue with
// the outer generator.
context.delegate=null;return ContinueSentinel;}// Define Generator.prototype.{next,throw,return} in terms of the
// unified ._invoke helper method.
defineIteratorMethods(Gp);Gp[toStringTagSymbol]="Generator";// A Generator should always return itself as the iterator object when the
// @@iterator function is called on it. Some browsers' implementations of the
// iterator prototype chain incorrectly implement this, causing the Generator
// object to not be returned from this call. This ensures that doesn't happen.
// See https://github.com/facebook/regenerator/issues/274 for more details.
Gp[iteratorSymbol]=function(){return this;};Gp.toString=function(){return "[object Generator]";};function pushTryEntry(locs){var entry={tryLoc:locs[0]};if(1 in locs){entry.catchLoc=locs[1];}if(2 in locs){entry.finallyLoc=locs[2];entry.afterLoc=locs[3];}this.tryEntries.push(entry);}function resetTryEntry(entry){var record=entry.completion||{};record.type="normal";delete record.arg;entry.completion=record;}function Context(tryLocsList){// The root entry object (effectively a try statement without a catch
// or a finally block) gives us a place to store values thrown from
// locations where there is no enclosing try statement.
this.tryEntries=[{tryLoc:"root"}];tryLocsList.forEach(pushTryEntry,this);this.reset(true);}runtime.keys=function(object){var keys=[];for(var key in object){keys.push(key);}keys.reverse();// Rather than returning an object with a next method, we keep
// things simple and return the next function itself.
return function next(){while(keys.length){var key=keys.pop();if(key in object){next.value=key;next.done=false;return next;}}// To avoid creating an additional object, we just hang the .value
// and .done properties off the next function object itself. This
// also ensures that the minifier will not anonymize the function.
next.done=true;return next;};};function values(iterable){if(iterable){var iteratorMethod=iterable[iteratorSymbol];if(iteratorMethod){return iteratorMethod.call(iterable);}if(typeof iterable.next==="function"){return iterable;}if(!isNaN(iterable.length)){var i=-1,next=function next(){while(++i<iterable.length){if(hasOwn.call(iterable,i)){next.value=iterable[i];next.done=false;return next;}}next.value=undefined;next.done=true;return next;};return next.next=next;}}// Return an iterator with no values.
return {next:doneResult};}runtime.values=values;function doneResult(){return {value:undefined,done:true};}Context.prototype={constructor:Context,reset:function(skipTempReset){this.prev=0;this.next=0;// Resetting context._sent for legacy support of Babel's
// function.sent implementation.
this.sent=this._sent=undefined;this.done=false;this.delegate=null;this.method="next";this.arg=undefined;this.tryEntries.forEach(resetTryEntry);if(!skipTempReset){for(var name in this){// Not sure about the optimal order of these conditions:
if(name.charAt(0)==="t"&&hasOwn.call(this,name)&&!isNaN(+name.slice(1))){this[name]=undefined;}}}},stop:function(){this.done=true;var rootEntry=this.tryEntries[0];var rootRecord=rootEntry.completion;if(rootRecord.type==="throw"){throw rootRecord.arg;}return this.rval;},dispatchException:function(exception){if(this.done){throw exception;}var context=this;function handle(loc,caught){record.type="throw";record.arg=exception;context.next=loc;if(caught){// If the dispatched exception was caught by a catch block,
// then let that catch block handle the exception normally.
context.method="next";context.arg=undefined;}return !!caught;}for(var i=this.tryEntries.length-1;i>=0;--i){var entry=this.tryEntries[i];var record=entry.completion;if(entry.tryLoc==="root"){// Exception thrown outside of any try block that could handle
// it, so set the completion value of the entire function to
// throw the exception.
return handle("end");}if(entry.tryLoc<=this.prev){var hasCatch=hasOwn.call(entry,"catchLoc");var hasFinally=hasOwn.call(entry,"finallyLoc");if(hasCatch&&hasFinally){if(this.prev<entry.catchLoc){return handle(entry.catchLoc,true);}else if(this.prev<entry.finallyLoc){return handle(entry.finallyLoc);}}else if(hasCatch){if(this.prev<entry.catchLoc){return handle(entry.catchLoc,true);}}else if(hasFinally){if(this.prev<entry.finallyLoc){return handle(entry.finallyLoc);}}else{throw new Error("try statement without catch or finally");}}}},abrupt:function(type,arg){for(var i=this.tryEntries.length-1;i>=0;--i){var entry=this.tryEntries[i];if(entry.tryLoc<=this.prev&&hasOwn.call(entry,"finallyLoc")&&this.prev<entry.finallyLoc){var finallyEntry=entry;break;}}if(finallyEntry&&(type==="break"||type==="continue")&&finallyEntry.tryLoc<=arg&&arg<=finallyEntry.finallyLoc){// Ignore the finally entry if control is not jumping to a
// location outside the try/catch block.
finallyEntry=null;}var record=finallyEntry?finallyEntry.completion:{};record.type=type;record.arg=arg;if(finallyEntry){this.method="next";this.next=finallyEntry.finallyLoc;return ContinueSentinel;}return this.complete(record);},complete:function(record,afterLoc){if(record.type==="throw"){throw record.arg;}if(record.type==="break"||record.type==="continue"){this.next=record.arg;}else if(record.type==="return"){this.rval=this.arg=record.arg;this.method="return";this.next="end";}else if(record.type==="normal"&&afterLoc){this.next=afterLoc;}return ContinueSentinel;},finish:function(finallyLoc){for(var i=this.tryEntries.length-1;i>=0;--i){var entry=this.tryEntries[i];if(entry.finallyLoc===finallyLoc){this.complete(entry.completion,entry.afterLoc);resetTryEntry(entry);return ContinueSentinel;}}},"catch":function(tryLoc){for(var i=this.tryEntries.length-1;i>=0;--i){var entry=this.tryEntries[i];if(entry.tryLoc===tryLoc){var record=entry.completion;if(record.type==="throw"){var thrown=record.arg;resetTryEntry(entry);}return thrown;}}// The context.catch method must only be called with a location
// argument that corresponds to a known catch block.
throw new Error("illegal catch attempt");},delegateYield:function(iterable,resultName,nextLoc){this.delegate={iterator:values(iterable),resultName:resultName,nextLoc:nextLoc};if(this.method==="next"){// Deliberately forget the last sent value so that we don't
// accidentally pass it on to the delegate.
this.arg=undefined;}return ContinueSentinel;}};}(// In sloppy mode, unbound `this` refers to the global object, fallback to
// Function constructor if we're in global strict mode. That is sadly a form
// of indirect eval which violates Content Security Policy.
function(){return this;}()||Function("return this")());});/**
* Copyright (c) 2014-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/ // This method of obtaining a reference to the global object needs to be
// kept identical to the way it is obtained in runtime.js
var g=function(){return this;}()||Function("return this")();// Use `getOwnPropertyNames` because not all browsers support calling
// `hasOwnProperty` on the global `self` object in a worker. See #183.
var hadRuntime=g.regeneratorRuntime&&Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime")>=0;// Save the old regeneratorRuntime in case it needs to be restored later.
var oldRuntime=hadRuntime&&g.regeneratorRuntime;// Force reevalutation of runtime.js.
g.regeneratorRuntime=undefined;var runtimeModule=runtime;if(hadRuntime){// Restore the original runtime.
g.regeneratorRuntime=oldRuntime;}else{// Remove the global property added by runtime.js.
try{delete g.regeneratorRuntime;}catch(e){g.regeneratorRuntime=undefined;}}var regenerator=runtimeModule;// 7.1.4 ToInteger
var ceil=Math.ceil;var floor=Math.floor;var _toInteger=function(it){return isNaN(it=+it)?0:(it>0?floor:ceil)(it);};// 7.2.1 RequireObjectCoercible(argument)
var _defined=function(it){if(it==undefined)throw TypeError("Can't call method on "+it);return it;};// true -> String#at
// false -> String#codePointAt
var _stringAt=function(TO_STRING){return function(that,pos){var s=String(_defined(that));var i=_toInteger(pos);var l=s.length;var a,b;if(i<0||i>=l)return TO_STRING?'':undefined;a=s.charCodeAt(i);return a<0xd800||a>0xdbff||i+1===l||(b=s.charCodeAt(i+1))<0xdc00||b>0xdfff?TO_STRING?s.charAt(i):a:TO_STRING?s.slice(i,i+2):(a-0xd800<<10)+(b-0xdc00)+0x10000;};};var _library=true;var _global=createCommonjsModule(function(module){// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
var global=module.exports=typeof window!='undefined'&&window.Math==Math?window:typeof self!='undefined'&&self.Math==Math?self// eslint-disable-next-line no-new-func
:Function('return this')();if(typeof __g=='number')__g=global;// eslint-disable-line no-undef
});var _core=createCommonjsModule(function(module){var core=module.exports={version:'2.5.6'};if(typeof __e=='number')__e=core;// eslint-disable-line no-undef
});var _core_1=_core.version;var _aFunction=function(it){if(typeof it!='function')throw TypeError(it+' is not a function!');return it;};// optional / simple context binding
var _ctx=function(fn,that,length){_aFunction(fn);if(that===undefined)return fn;switch(length){case 1:return function(a){return fn.call(that,a);};case 2:return function(a,b){return fn.call(that,a,b);};case 3:return function(a,b,c){return fn.call(that,a,b,c);};}return function()/* ...args */{return fn.apply(that,arguments);};};var _isObject=function(it){return typeof it==='object'?it!==null:typeof it==='function';};var _anObject=function(it){if(!_isObject(it))throw TypeError(it+' is not an object!');return it;};var _fails=function(exec){try{return !!exec();}catch(e){return true;}};// Thank's IE8 for his funny defineProperty
var _descriptors=!_fails(function(){return Object.defineProperty({},'a',{get:function(){return 7;}}).a!=7;});var document$1=_global.document;// typeof document.createElement is 'object' in old IE
var is=_isObject(document$1)&&_isObject(document$1.createElement);var _domCreate=function(it){return is?document$1.createElement(it):{};};var _ie8DomDefine=!_descriptors&&!_fails(function(){return Object.defineProperty(_domCreate('div'),'a',{get:function(){return 7;}}).a!=7;});// 7.1.1 ToPrimitive(input [, PreferredType])
// instead of the ES6 spec version, we didn't implement @@toPrimitive case
// and the second argument - flag - preferred type is a string
var _toPrimitive=function(it,S){if(!_isObject(it))return it;var fn,val;if(S&&typeof(fn=it.toString)=='function'&&!_isObject(val=fn.call(it)))return val;if(typeof(fn=it.valueOf)=='function'&&!_isObject(val=fn.call(it)))return val;if(!S&&typeof(fn=it.toString)=='function'&&!_isObject(val=fn.call(it)))return val;throw TypeError("Can't convert object to primitive value");};var dP=Object.defineProperty;var f=_descriptors?Object.defineProperty:function defineProperty(O,P,Attributes){_anObject(O);P=_toPrimitive(P,true);_anObject(Attributes);if(_ie8DomDefine)try{return dP(O,P,Attributes);}catch(e){/* empty */}if('get'in Attributes||'set'in Attributes)throw TypeError('Accessors not supported!');if('value'in Attributes)O[P]=Attributes.value;return O;};var _objectDp={f:f};var _propertyDesc=function(bitmap,value){return {enumerable:!(bitmap&1),configurable:!(bitmap&2),writable:!(bitmap&4),value:value};};var _hide=_descriptors?function(object,key,value){return _objectDp.f(object,key,_propertyDesc(1,value));}:function(object,key,value){object[key]=value;return object;};var hasOwnProperty={}.hasOwnProperty;var _has=function(it,key){return hasOwnProperty.call(it,key);};var PROTOTYPE='prototype';var $export=function(type,name,source){var IS_FORCED=type&$export.F;var IS_GLOBAL=type&$export.G;var IS_STATIC=type&$export.S;var IS_PROTO=type&$export.P;var IS_BIND=type&$export.B;var IS_WRAP=type&$export.W;var exports=IS_GLOBAL?_core:_core[name]||(_core[name]={});var expProto=exports[PROTOTYPE];var target=IS_GLOBAL?_global:IS_STATIC?_global[name]:(_global[name]||{})[PROTOTYPE];var key,own,out;if(IS_GLOBAL)source=name;for(key in source){// contains in native
own=!IS_FORCED&&target&&target[key]!==undefined;if(own&&_has(exports,key))continue;// export native or passed
out=own?target[key]:source[key];// prevent global pollution for namespaces
exports[key]=IS_GLOBAL&&typeof target[key]!='function'?source[key]// bind timers to global for call from export context
:IS_BIND&&own?_ctx(out,_global)// wrap global constructors for prevent change them in library
:IS_WRAP&&target[key]==out?function(C){var F=function(a,b,c){if(this instanceof C){switch(arguments.length){case 0:return new C();case 1:return new C(a);case 2:return new C(a,b);}return new C(a,b,c);}return C.apply(this,arguments);};F[PROTOTYPE]=C[PROTOTYPE];return F;// make static versions for prototype methods
}(out):IS_PROTO&&typeof out=='function'?_ctx(Function.call,out):out;// export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
if(IS_PROTO){(exports.virtual||(exports.virtual={}))[key]=out;// export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
if(type&$export.R&&expProto&&!expProto[key])_hide(expProto,key,out);}}};// type bitmap
$export.F=1;// forced
$export.G=2;// global
$export.S=4;// static
$export.P=8;// proto
$export.B=16;// bind
$export.W=32;// wrap
$export.U=64;// safe
$export.R=128;// real proto method for `library`
var _export=$export;var _redefine=_hide;var _iterators={};var toString={}.toString;var _cof=function(it){return toString.call(it).slice(8,-1);};// fallback for non-array-like ES3 and non-enumerable old V8 strings
// eslint-disable-next-line no-prototype-builtins
var _iobject=Object('z').propertyIsEnumerable(0)?Object:function(it){return _cof(it)=='String'?it.split(''):Object(it);};// to indexed object, toObject with fallback for non-array-like ES3 strings
var _toIobject=function(it){return _iobject(_defined(it));};// 7.1.15 ToLength
var min=Math.min;var _toLength=function(it){return it>0?min(_toInteger(it),0x1fffffffffffff):0;// pow(2, 53) - 1 == 9007199254740991
};var max=Math.max;var min$1=Math.min;var _toAbsoluteIndex=function(index,length){index=_toInteger(index);return index<0?max(index+length,0):min$1(index,length);};// false -> Array#indexOf
// true -> Array#includes
var _arrayIncludes=function(IS_INCLUDES){return function($this,el,fromIndex){var O=_toIobject($this);var length=_toLength(O.length);var index=_toAbsoluteIndex(fromIndex,length);var value;// Array#includes uses SameValueZero equality algorithm
// eslint-disable-next-line no-self-compare
if(IS_INCLUDES&&el!=el)while(length>index){value=O[index++];// eslint-disable-next-line no-self-compare
if(value!=value)return true;// Array#indexOf ignores holes, Array#includes - not
}else for(;length>index;index++)if(IS_INCLUDES||index in O){if(O[index]===el)return IS_INCLUDES||index||0;}return !IS_INCLUDES&&-1;};};var _shared=createCommonjsModule(function(module){var SHARED='__core-js_shared__';var store=_global[SHARED]||(_global[SHARED]={});(module.exports=function(key,value){return store[key]||(store[key]=value!==undefined?value:{});})('versions',[]).push({version:_core.version,mode:'pure',copyright:'© 2018 Denis Pushkarev (zloirock.ru)'});});var id$1=0;var px=Math.random();var _uid=function(key){return 'Symbol('.concat(key===undefined?'':key,')_',(++id$1+px).toString(36));};var shared=_shared('keys');var _sharedKey=function(key){return shared[key]||(shared[key]=_uid(key));};var arrayIndexOf=_arrayIncludes(false);var IE_PROTO=_sharedKey('IE_PROTO');var _objectKeysInternal=function(object,names){var O=_toIobject(object);var i=0;var result=[];var key;for(key in O)if(key!=IE_PROTO)_has(O,key)&&result.push(key);// Don't enum bug & hidden keys
while(names.length>i)if(_has(O,key=names[i++])){~arrayIndexOf(result,key)||result.push(key);}return result;};// IE 8- don't enum bug keys
var _enumBugKeys='constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(',');// 19.1.2.14 / 15.2.3.14 Object.keys(O)
var _objectKeys=Object.keys||function keys(O){return _objectKeysInternal(O,_enumBugKeys);};var _objectDps=_descriptors?Object.defineProperties:function defineProperties(O,Properties){_anObject(O);var keys=_objectKeys(Properties);var length=keys.length;var i=0;var P;while(length>i)_objectDp.f(O,P=keys[i++],Properties[P]);return O;};var document$2=_global.document;var _html=document$2&&document$2.documentElement;// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
var IE_PROTO$1=_sharedKey('IE_PROTO');var Empty=function(){/* empty */};var PROTOTYPE$1='prototype';// Create object with fake `null` prototype: use iframe Object with cleared prototype
var createDict=function(){// Thrash, waste and sodomy: IE GC bug
var iframe=_domCreate('iframe');var i=_enumBugKeys.length;var lt='<';var gt='>';var iframeDocument;iframe.style.display='none';_html.appendChild(iframe);iframe.src='javascript:';// eslint-disable-line no-script-url
// createDict = iframe.contentWindow.Object;
// html.removeChild(iframe);
iframeDocument=iframe.contentWindow.document;iframeDocument.open();iframeDocument.write(lt+'script'+gt+'document.F=Object'+lt+'/script'+gt);iframeDocument.close();createDict=iframeDocument.F;while(i--)delete createDict[PROTOTYPE$1][_enumBugKeys[i]];return createDict();};var _objectCreate=Object.create||function create(O,Properties){var result;if(O!==null){Empty[PROTOTYPE$1]=_anObject(O);result=new Empty();Empty[PROTOTYPE$1]=null;// add "__proto__" for Object.getPrototypeOf polyfill
result[IE_PROTO$1]=O;}else result=createDict();return Properties===undefined?result:_objectDps(result,Properties);};var _wks=createCommonjsModule(function(module){var store=_shared('wks');var Symbol=_global.Symbol;var USE_SYMBOL=typeof Symbol=='function';var $exports=module.exports=function(name){return store[name]||(store[name]=USE_SYMBOL&&Symbol[name]||(USE_SYMBOL?Symbol:_uid)('Symbol.'+name));};$exports.store=store;});var def=_objectDp.f;var TAG=_wks('toStringTag');var _setToStringTag=function(it,tag,stat){if(it&&!_has(it=stat?it:it.prototype,TAG))def(it,TAG,{configurable:true,value:tag});};var IteratorPrototype={};// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
_hide(IteratorPrototype,_wks('iterator'),function(){return this;});var _iterCreate=function(Constructor,NAME,next){Constructor.prototype=_objectCreate(IteratorPrototype,{next:_propertyDesc(1,next)});_setToStringTag(Constructor,NAME+' Iterator');};// 7.1.13 ToObject(argument)
var _toObject=function(it){return Object(_defined(it));};// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
var IE_PROTO$2=_sharedKey('IE_PROTO');var ObjectProto=Object.prototype;var _objectGpo=Object.getPrototypeOf||function(O){O=_toObject(O);if(_has(O,IE_PROTO$2))return O[IE_PROTO$2];if(typeof O.constructor=='function'&&O instanceof O.constructor){return O.constructor.prototype;}return O instanceof Object?ObjectProto:null;};var ITERATOR=_wks('iterator');var BUGGY=!([].keys&&'next'in[].keys());// Safari has buggy iterators w/o `next`
var FF_ITERATOR='@@iterator';var KEYS='keys';var VALUES='values';var returnThis=function(){return this;};var _iterDefine=function(Base,NAME,Constructor,next,DEFAULT,IS_SET,FORCED){_iterCreate(Constructor,NAME,next);var getMethod=function(kind){if(!BUGGY&&kind in proto)return proto[kind];switch(kind){case KEYS:return function keys(){return new Constructor(this,kind);};case VALUES:return function values(){return new Constructor(this,kind);};}return function entries(){return new Constructor(this,kind);};};var TAG=NAME+' Iterator';var DEF_VALUES=DEFAULT==VALUES;var VALUES_BUG=false;var proto=Base.prototype;var $native=proto[ITERATOR]||proto[FF_ITERATOR]||DEFAULT&&proto[DEFAULT];var $default=$native||getMethod(DEFAULT);var $entries=DEFAULT?!DEF_VALUES?$default:getMethod('entries'):undefined;var $anyNative=NAME=='Array'?proto.entries||$native:$native;var methods,key,IteratorPrototype;// Fix native
if($anyNative){IteratorPrototype=_objectGpo($anyNative.call(new Base()));if(IteratorPrototype!==Object.prototype&&IteratorPrototype.next){// Set @@toStringTag to native iterators
_setToStringTag(IteratorPrototype,TAG,true);// fix for some old engines
}}// fix Array#{values, @@iterator}.name in V8 / FF
if(DEF_VALUES&&$native&&$native.name!==VALUES){VALUES_BUG=true;$default=function values(){return $native.call(this);};}// Define iterator
if((FORCED)&&(BUGGY||VALUES_BUG||!proto[ITERATOR])){_hide(proto,ITERATOR,$default);}// Plug for library
_iterators[NAME]=$default;_iterators[TAG]=returnThis;if(DEFAULT){methods={values:DEF_VALUES?$default:getMethod(VALUES),keys:IS_SET?$default:getMethod(KEYS),entries:$entries};if(FORCED)for(key in methods){if(!(key in proto))_redefine(proto,key,methods[key]);}else _export(_export.P+_export.F*(BUGGY||VALUES_BUG),NAME,methods);}return methods;};var $at=_stringAt(true);// 21.1.3.27 String.prototype[@@iterator]()
_iterDefine(String,'String',function(iterated){this._t=String(iterated);// target
this._i=0;// next index
// 21.1.5.2.1 %StringIteratorPrototype%.next()
},function(){var O=this._t;var index=this._i;var point;if(index>=O.length)return {value:undefined,done:true};point=$at(O,index);this._i+=point.length;return {value:point,done:false};});var _iterStep=function(done,value){return {value:value,done:!!done};};// 22.1.3.4 Array.prototype.entries()
// 22.1.3.13 Array.prototype.keys()
// 22.1.3.29 Array.prototype.values()
// 22.1.3.30 Array.prototype[@@iterator]()
var es6_array_iterator=_iterDefine(Array,'Array',function(iterated,kind){this._t=_toIobject(iterated);// target
this._i=0;// next index
this._k=kind;// kind
// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
},function(){var O=this._t;var kind=this._k;var index=this._i++;if(!O||index>=O.length){this._t=undefined;return _iterStep(1);}if(kind=='keys')return _iterStep(0,index);if(kind=='values')return _iterStep(0,O[index]);return _iterStep(0,[index,O[index]]);},'values');// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
_iterators.Arguments=_iterators.Array;var TO_STRING_TAG=_wks('toStringTag');var DOMIterables=('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,'+'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,'+'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,'+'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,'+'TextTrackList,TouchList').split(',');for(var i=0;i<DOMIterables.length;i++){var NAME=DOMIterables[i];var Collection=_global[NAME];var proto=Collection&&Collection.prototype;if(proto&&!proto[TO_STRING_TAG])_hide(proto,TO_STRING_TAG,NAME);_iterators[NAME]=_iterators.Array;}// getting tag from 19.1.3.6 Object.prototype.toString()
var TAG$1=_wks('toStringTag');// ES3 wrong here
var ARG=_cof(function(){return arguments;}())=='Arguments';// fallback for IE11 Script Access Denied error
var tryGet=function(it,key){try{return it[key];}catch(e){/* empty */}};var _classof=function(it){var O,T,B;return it===undefined?'Undefined':it===null?'Null'// @@toStringTag case
:typeof(T=tryGet(O=Object(it),TAG$1))=='string'?T// builtinTag case
:ARG?_cof(O)// ES3 arguments fallback
:(B=_cof(O))=='Object'&&typeof O.callee=='function'?'Arguments':B;};var _anInstance=function(it,Constructor,name,forbiddenField){if(!(it instanceof Constructor)||forbiddenField!==undefined&&forbiddenField in it){throw TypeError(name+': incorrect invocation!');}return it;};// call something on iterator step with safe closing on error
var _iterCall=function(iterator,fn,value,entries){try{return entries?fn(_anObject(value)[0],value[1]):fn(value);// 7.4.6 IteratorClose(iterator, completion)
}catch(e){var ret=iterator['return'];if(ret!==undefined)_anObject(ret.call(iterator));throw e;}};// check on default Array iterator
var ITERATOR$1=_wks('iterator');var ArrayProto=Array.prototype;var _isArrayIter=function(it){return it!==undefined&&(_iterators.Array===it||ArrayProto[ITERATOR$1]===it);};var ITERATOR$2=_wks('iterator');var core_getIteratorMethod=_core.getIteratorMethod=function(it){if(it!=undefined)return it[ITERATOR$2]||it['@@iterator']||_iterators[_classof(it)];};var _forOf=createCommonjsModule(function(module){var BREAK={};var RETURN={};var exports=module.exports=function(iterable,entries,fn,that,ITERATOR){var iterFn=ITERATOR?function(){return iterable;}:core_getIteratorMethod(iterable);var f=_ctx(fn,that,entries?2:1);var index=0;var length,step,iterator,result;if(typeof iterFn!='function')throw TypeError(iterable+' is not iterable!');// fast case for arrays with default iterator
if(_isArrayIter(iterFn))for(length=_toLength(iterable.length);length>index;index++){result=entries?f(_anObject(step=iterable[index])[0],step[1]):f(iterable[index]);if(result===BREAK||result===RETURN)return result;}else for(iterator=iterFn.call(iterable);!(step=iterator.next()).done;){result=_iterCall(iterator,f,step.value,entries);if(result===BREAK||result===RETURN)return result;}};exports.BREAK=BREAK;exports.RETURN=RETURN;});// 7.3.20 SpeciesConstructor(O, defaultConstructor)
var SPECIES=_wks('species');var _speciesConstructor=function(O,D){var C=_anObject(O).constructor;var S;return C===undefined||(S=_anObject(C)[SPECIES])==undefined?D:_aFunction(S);};// fast apply, http://jsperf.lnkit.com/fast-apply/5
var _invoke=function(fn,args,that){var un=that===undefined;switch(args.length){case 0:return un?fn():fn.call(that);case 1:return un?fn(args[0]):fn.call(that,args[0]);case 2:return un?fn(args[0],args[1]):fn.call(that,args[0],args[1]);case 3:return un?fn(args[0],args[1],args[2]):fn.call(that,args[0],args[1],args[2]);case 4:return un?fn(args[0],args[1],args[2],args[3]):fn.call(that,args[0],args[1],args[2],args[3]);}return fn.apply(that,args);};var process=_global.process;var setTask=_global.setImmediate;var clearTask=_global.clearImmediate;var MessageChannel=_global.MessageChannel;var Dispatch=_global.Dispatch;var counter=0;var queue={};var ONREADYSTATECHANGE='onreadystatechange';var defer,channel,port;var run=function(){var id=+this;// eslint-disable-next-line no-prototype-builtins
if(queue.hasOwnProperty(id)){var fn=queue[id];delete queue[id];fn();}};var listener=function(event){run.call(event.data);};// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
if(!setTask||!clearTask){setTask=function setImmediate(fn){var args=[];var i=1;while(arguments.length>i)args.push(arguments[i++]);queue[++counter]=function(){// eslint-disable-next-line no-new-func
_invoke(typeof fn=='function'?fn:Function(fn),args);};defer(counter);return counter;};clearTask=function clearImmediate(id){delete queue[id];};// Node.js 0.8-
if(_cof(process)=='process'){defer=function(id){process.nextTick(_ctx(run,id,1));};// Sphere (JS game engine) Dispatch API
}else if(Dispatch&&Dispatch.now){defer=function(id){Dispatch.now(_ctx(run,id,1));};// Browsers with MessageChannel, includes WebWorkers
}else if(MessageChannel){channel=new MessageChannel();port=channel.port2;channel.port1.onmessage=listener;defer=_ctx(port.postMessage,port,1);// Browsers with postMessage, skip WebWorkers
// IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
}else if(_global.addEventListener&&typeof postMessage=='function'&&!_global.importScripts){defer=function(id){_global.postMessage(id+'','*');};_global.addEventListener('message',listener,false);// IE8-
}else if(ONREADYSTATECHANGE in _domCreate('script')){defer=function(id){_html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE]=function(){_html.removeChild(this);run.call(id);};};// Rest old browsers
}else{defer=function(id){setTimeout(_ctx(run,id,1),0);};}}var _task={set:setTask,clear:clearTask};var macrotask=_task.set;var Observer=_global.MutationObserver||_global.WebKitMutationObserver;var process$1=_global.process;var Promise$1=_global.Promise;var isNode=_cof(process$1)=='process';var _microtask=function(){var head,last,notify;var flush=function(){var parent,fn;if(isNode&&(parent=process$1.domain))parent.exit();while(head){fn=head.fn;head=head.next;try{fn();}catch(e){if(head)notify();else last=undefined;throw e;}}last=undefined;if(parent)parent.enter();};// Node.js
if(isNode){notify=function(){process$1.nextTick(flush);};// browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339
}else if(Observer&&!(_global.navigator&&_global.navigator.standalone)){var toggle=true;var node=document.createTextNode('');new Observer(flush).observe(node,{characterData:true});// eslint-disable-line no-new
notify=function(){node.data=toggle=!toggle;};// environments with maybe non-completely correct, but existent Promise
}else if(Promise$1&&Promise$1.resolve){// Promise.resolve without an argument throws an error in LG WebOS 2
var promise=Promise$1.resolve(undefined);notify=function(){promise.then(flush);};// for other environments - macrotask based on:
// - setImmediate
// - MessageChannel
// - window.postMessag
// - onreadystatechange
// - setTimeout
}else{notify=function(){// strange IE + webpack dev server bug - use .call(global)
macrotask.call(_global,flush);};}return function(fn){var task={fn:fn,next:undefined};if(last)last.next=task;if(!head){head=task;notify();}last=task;};};// 25.4.1.5 NewPromiseCapability(C)
function PromiseCapability(C){var resolve,reject;this.promise=new C(function($$resolve,$$reject){if(resolve!==undefined||reject!==undefined)throw TypeError('Bad Promise constructor');resolve=$$resolve;reject=$$reject;});this.resolve=_aFunction(resolve);this.reject=_aFunction(reject);}var f$1=function(C){return new PromiseCapability(C);};var _newPromiseCapability={f:f$1};var _perform=function(exec){try{return {e:false,v:exec()};}catch(e){return {e:true,v:e};}};var navigator=_global.navigator;var _userAgent=navigator&&navigator.userAgent||'';var _promiseResolve=function(C,x){_anObject(C);if(_isObject(x)&&x.constructor===C)return x;var promiseCapability=_newPromiseCapability.f(C);var resolve=promiseCapability.resolve;resolve(x);return promiseCapability.promise;};var _redefineAll=function(target,src,safe){for(var key in src){if(safe&&target[key])target[key]=src[key];else _hide(target,key,src[key]);}return target;};var SPECIES$1=_wks('species');var _setSpecies=function(KEY){var C=typeof _core[KEY]=='function'?_core[KEY]:_global[KEY];if(_descriptors&&C&&!C[SPECIES$1])_objectDp.f(C,SPECIES$1,{configurable:true,get:function(){return this;}});};var ITERATOR$3=_wks('iterator');var SAFE_CLOSING=false;try{var riter=[7][ITERATOR$3]();riter['return']=function(){SAFE_CLOSING=true;};}catch(e){/* empty */}var _iterDetect=function(exec,skipClosing){if(!skipClosing&&!SAFE_CLOSING)return false;var safe=false;try{var arr=[7];var iter=arr[ITERATOR$3]();iter.next=function(){return {done:safe=true};};arr[ITERATOR$3]=function(){return iter;};exec(arr);}catch(e){/* empty */}return safe;};var task=_task.set;var microtask=_microtask();var PROMISE='Promise';var TypeError$1=_global.TypeError;var process$2=_global.process;var versions=process$2&&process$2.versions;var v8=versions&&versions.v8||'';var $Promise=_global[PROMISE];var isNode$1=_classof(process$2)=='process';var empty=function(){/* empty */};var Internal,newGenericPromiseCapability,OwnPromiseCapability,Wrapper;var newPromiseCapability=newGenericPromiseCapability=_newPromiseCapability.f;var USE_NATIVE=!!function(){try{// correct subclassing with @@species support
var promise=$Promise.resolve(1);var FakePromise=(promise.constructor={})[_wks('species')]=function(exec){exec(empty,empty);};// unhandled rejections tracking support, NodeJS Promise without it fails @@species test
return (isNode$1||typeof PromiseRejectionEvent=='function')&&promise.then(empty)instanceof FakePromise// v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
// https://bugs.chromium.org/p/chromium/issues/detail?id=830565
// we can't detect it synchronously, so just check versions
&&v8.indexOf('6.6')!==0&&_userAgent.indexOf('Chrome/66')===-1;}catch(e){/* empty */}}();// helpers
var isThenable=function(it){var then;return _isObject(it)&&typeof(then=it.then)=='function'?then:false;};var notify=function(promise,isReject){if(promise._n)return;promise._n=true;var chain=promise._c;microtask(function(){var value=promise._v;var ok=promise._s==1;var i=0;var run=function(reaction){var handler=ok?reaction.ok:reaction.fail;var resolve=reaction.resolve;var reject=reaction.reject;var domain=reaction.domain;var result,then,exited;try{if(handler){if(!ok){if(promise._h==2)onHandleUnhandled(promise);promise._h=1;}if(handler===true)result=value;else{if(domain)domain.enter();result=handler(value);// may throw
if(domain){domain.exit();exited=true;}}if(result===reaction.promise){reject(TypeError$1('Promise-chain cycle'));}else if(then=isThenable(result)){then.call(result,resolve,reject);}else resolve(result);}else reject(value);}catch(e){if(domain&&!exited)domain.exit();reject(e);}};while(chain.length>i)run(chain[i++]);// variable length - can't use forEach
promise._c=[];promise._n=false;if(isReject&&!promise._h)onUnhandled(promise);});};var onUnhandled=function(promise){task.call(_global,function(){var value=promise._v;var unhandled=isUnhandled(promise);var result,handler,console;if(unhandled){result=_perform(function(){if(isNode$1){process$2.emit('unhandledRejection',value,promise);}else if(handler=_global.onunhandledrejection){handler({promise:promise,reason:value});}else if((console=_global.console)&&console.error){console.error('Unhandled promise rejection',value);}});// Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
promise._h=isNode$1||isUnhandled(promise)?2:1;}promise._a=undefined;if(unhandled&&result.e)throw result.v;});};var isUnhandled=function(promise){return promise._h!==1&&(promise._a||promise._c).length===0;};var onHandleUnhandled=function(promise){task.call(_global,function(){var handler;if(isNode$1){process$2.emit('rejectionHandled',promise);}else if(handler=_global.onrejectionhandled){handler({promise:promise,reason:promise._v});}});};var $reject=function(value){var promise=this;if(promise._d)return;promise._d=true;promise=promise._w||promise;// unwrap
promise._v=value;promise._s=2;if(!promise._a)promise._a=promise._c.slice();notify(promise,true);};var $resolve=function(value){var promise=this;var then;if(promise._d)return;promise._d=true;promise=promise._w||promise;// unwrap
try{if(promise===value)throw TypeError$1("Promise can't be resolved itself");if(then=isThenable(value)){microtask(function(){var wrapper={_w:promise,_d:false};// wrap
try{then.call(value,_ctx($resolve,wrapper,1),_ctx($reject,wrapper,1));}catch(e){$reject.call(wrapper,e);}});}else{promise._v=value;promise._s=1;notify(promise,false);}}catch(e){$reject.call({_w:promise,_d:false},e);// wrap
}};// constructor polyfill
if(!USE_NATIVE){// 25.4.3.1 Promise(executor)
$Promise=function Promise(executor){_anInstance(this,$Promise,PROMISE,'_h');_aFunction(executor);Internal.call(this);try{executor(_ctx($resolve,this,1),_ctx($reject,this,1));}catch(err){$reject.call(this,err);}};// eslint-disable-next-line no-unused-vars
Internal=function Promise(executor){this._c=[];// <- awaiting reactions
this._a=undefined;// <- checked in isUnhandled reactions
this._s=0;// <- state
this._d=false;// <- done
this._v=undefined;// <- value
this._h=0;// <- rejection state, 0 - default, 1 - handled, 2 - unhandled
this._n=false;// <- notify
};Internal.prototype=_redefineAll($Promise.prototype,{// 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
then:function then(onFulfilled,onRejected){var reaction=newPromiseCapability(_speciesConstructor(this,$Promise));reaction.ok=typeof onFulfilled=='function'?onFulfilled:true;reaction.fail=typeof onRejected=='function'&&onRejected;reaction.domain=isNode$1?process$2.domain:undefined;this._c.push(reaction);if(this._a)this._a.push(reaction);if(this._s)notify(this,false);return reaction.promise;},// 25.4.5.1 Promise.prototype.catch(onRejected)
'catch':function(onRejected){return this.then(undefined,onRejected);}});OwnPromiseCapability=function(){var promise=new Internal();this.promise=promise;this.resolve=_ctx($resolve,promise,1);this.reject=_ctx($reject,promise,1);};_newPromiseCapability.f=newPromiseCapability=function(C){return C===$Promise||C===Wrapper?new OwnPromiseCapability(C):newGenericPromiseCapability(C);};}_export(_export.G+_export.W+_export.F*!USE_NATIVE,{Promise:$Promise});_setToStringTag($Promise,PROMISE);_setSpecies(PROMISE);Wrapper=_core[PROMISE];// statics
_export(_export.S+_export.F*!USE_NATIVE,PROMISE,{// 25.4.4.5 Promise.reject(r)
reject:function reject(r){var capability=newPromiseCapability(this);var $$reject=capability.reject;$$reject(r);return capability.promise;}});_export(_export.S+_export.F*(_library),PROMISE,{// 25.4.4.6 Promise.resolve(x)
resolve:function resolve(x){return _promiseResolve(this===Wrapper?$Promise:this,x);}});_export(_export.S+_export.F*!(USE_NATIVE&&_iterDetect(function(iter){$Promise.all(iter)['catch'](empty);})),PROMISE,{// 25.4.4.1 Promise.all(iterable)
all:function all(iterable){var C=this;var capability=newPromiseCapability(C);var resolve=capability.resolve;var reject=capability.reject;var result=_perform(function(){var values=[];var index=0;var remaining=1;_forOf(iterable,false,function(promise){var $index=index++;var alreadyCalled=false;values.push(undefined);remaining++;C.resolve(promise).then(function(value){if(alreadyCalled)return;alreadyCalled=true;values[$index]=value;--remaining||resolve(values);},reject);});--remaining||resolve(values);});if(result.e)reject(result.v);return capability.promise;},// 25.4.4.4 Promise.race(iterable)
race:function race(iterable){var C=this;var capability=newPromiseCapability(C);var reject=capability.reject;var result=_perform(function(){_forOf(iterable,false,function(promise){C.resolve(promise).then(capability.resolve,reject);});});if(result.e)reject(result.v);return capability.promise;}});_export(_export.P+_export.R,'Promise',{'finally':function(onFinally){var C=_speciesConstructor(this,_core.Promise||_global.Promise);var isFunction=typeof onFinally=='function';return this.then(isFunction?function(x){return _promiseResolve(C,onFinally()).then(function(){return x;});}:onFinally,isFunction?function(e){return _promiseResolve(C,onFinally()).then(function(){throw e;});}:onFinally);}});// https://github.com/tc39/proposal-promise-try
_export(_export.S,'Promise',{'try':function(callbackfn){var promiseCapability=_newPromiseCapability.f(this);var result=_perform(callbackfn);(result.e?promiseCapability.reject:promiseCapability.resolve)(result.v);return promiseCapability.promise;}});var promise=_core.Promise;var promise$1=promise;function _asyncToGenerator$1(fn){return function(){var self=this,args=arguments;return new promise$1(function(resolve,reject){var gen=fn.apply(self,args);function step(key,arg){try{var info=gen[key](arg);var value=info.value;}catch(error){reject(error);return;}if(info.done){resolve(value);}else{promise$1.resolve(value).then(_next,_throw);}}function _next(value){step("next",value);}function _throw(err){step("throw",err);}_next();});};}var asyncToGenerator=_asyncToGenerator$1;var f$2={}.propertyIsEnumerable;var _objectPie={f:f$2};var gOPD=Object.getOwnPropertyDescriptor;var f$3=_descriptors?gOPD:function getOwnPropertyDescriptor(O,P){O=_toIobject(O);P=_toPrimitive(P,true);if(_ie8DomDefine)try{return gOPD(O,P);}catch(e){/* empty */}if(_has(O,P))return _propertyDesc(!_objectPie.f.call(O,P),O[P]);};var _objectGopd={f:f$3};// most Object methods by ES6 should accept primitives
var _objectSap=function(KEY,exec){var fn=(_core.Object||{})[KEY]||Object[KEY];var exp={};exp[KEY]=exec(fn);_export(_export.S+_export.F*_fails(function(){fn(1);}),'Object',exp);};// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
var $getOwnPropertyDescriptor=_objectGopd.f;_objectSap('getOwnPropertyDescriptor',function(){return function getOwnPropertyDescriptor(it,key){return $getOwnPropertyDescriptor(_toIobject(it),key);};});var $Object=_core.Object;var getOwnPropertyDescriptor=function getOwnPropertyDescriptor(it,key){return $Object.getOwnPropertyDescriptor(it,key);};var getOwnPropertyDescriptor$1=getOwnPropertyDescriptor;var _meta=createCommonjsModule(function(module){var META=_uid('meta');var setDesc=_objectDp.f;var id=0;var isExtensible=Object.isExtensible||function(){return true;};var FREEZE=!_fails(function(){return isExtensible(Object.preventExtensions({}));});var setMeta=function(it){setDesc(it,META,{value:{i:'O'+ ++id,// object ID
w:{}// weak collections IDs
}});};var fastKey=function(it,create){// return primitive with prefix
if(!_isObject(it))return typeof it=='symbol'?it:(typeof it=='string'?'S':'P')+it;if(!_has(it,META)){// can't set metadata to uncaught frozen object
if(!isExtensible(it))return 'F';// not necessary to add metadata
if(!create)return 'E';// add missing metadata
setMeta(it);// return object ID
}return it[META].i;};var getWeak=function(it,create){if(!_has(it,META)){// can't set metadata to uncaught frozen object
if(!isExtensible(it))return true;// not necessary to add metadata
if(!create)return false;// add missing metadata
setMeta(it);// return hash weak collections IDs
}return it[META].w;};// add metadata on freeze-family methods calling
var onFreeze=function(it){if(FREEZE&&meta.NEED&&isExtensible(it)&&!_has(it,META))setMeta(it);return it;};var meta=module.exports={KEY:META,NEED:false,fastKey:fastKey,getWeak:getWeak,onFreeze:onFreeze};});var _meta_1=_meta.KEY;var _meta_2=_meta.NEED;var _meta_3=_meta.fastKey;var _meta_4=_meta.getWeak;var _meta_5=_meta.onFreeze;var f$4=_wks;var _wksExt={f:f$4};var defineProperty=_objectDp.f;var _wksDefine=function(name){var $Symbol=_core.Symbol||(_core.Symbol={});if(name.charAt(0)!='_'&&!(name in $Symbol))defineProperty($Symbol,name,{value:_wksExt.f(name)});};var f$5=Object.getOwnPropertySymbols;var _objectGops={f:f$5};// all enumerable object keys, includes symbols
var _enumKeys=function(it){var result=_objectKeys(it);var getSymbols=_objectGops.f;if(getSymbols){var symbols=getSymbols(it);var isEnum=_objectPie.f;var i=0;var key;while(symbols.length>i)if(isEnum.call(it,key=symbols[i++]))result.push(key);}return result;};// 7.2.2 IsArray(argument)
var _isArray=Array.isArray||function isArray(arg){return _cof(arg)=='Array';};// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
var hiddenKeys=_enumBugKeys.concat('length','prototype');var f$6=Object.getOwnPropertyNames||function getOwnPropertyNames(O){return _objectKeysInternal(O,hiddenKeys);};var _objectGopn={f:f$6};// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
var gOPN=_objectGopn.f;var toString$1={}.toString;var windowNames=typeof window=='object'&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];var getWindowNames=function(it){try{return gOPN(it);}catch(e){return windowNames.slice();}};var f$7=function getOwnPropertyNames(it){return windowNames&&toString$1.call(it)=='[object Window]'?getWindowNames(it):gOPN(_toIobject(it));};var _objectGopnExt={f:f$7};// ECMAScript 6 symbols shim
var META=_meta.KEY;var gOPD$1=_objectGopd.f;var dP$1=_objectDp.f;var gOPN$1=_objectGopnExt.f;var $Symbol=_global.Symbol;var $JSON=_global.JSON;var _stringify=$JSON&&$JSON.stringify;var PROTOTYPE$2='prototype';var HIDDEN=_wks('_hidden');var TO_PRIMITIVE=_wks('toPrimitive');var isEnum={}.propertyIsEnumerable;var SymbolRegistry=_shared('symbol-registry');var AllSymbols=_shared('symbols');var OPSymbols=_shared('op-symbols');var ObjectProto$1=Object[PROTOTYPE$2];var USE_NATIVE$1=typeof $Symbol=='function';var QObject=_global.QObject;// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
var setter=!QObject||!QObject[PROTOTYPE$2]||!QObject[PROTOTYPE$2].findChild;// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
var setSymbolDesc=_descriptors&&_fails(function(){return _objectCreate(dP$1({},'a',{get:function(){return dP$1(this,'a',{value:7}).a;}})).a!=7;})?function(it,key,D){var protoDesc=gOPD$1(ObjectProto$1,key);if(protoDesc)delete ObjectProto$1[key];dP$1(it,key,D);if(protoDesc&&it!==ObjectProto$1)dP$1(ObjectProto$1,key,protoDesc);}:dP$1;var wrap=function(tag){var sym=AllSymbols[tag]=_objectCreate($Symbol[PROTOTYPE$2]);sym._k=tag;return sym;};var isSymbol=USE_NATIVE$1&&typeof $Symbol.iterator=='symbol'?function(it){return typeof it=='symbol';}:function(it){return it instanceof $Symbol;};var $defineProperty=function defineProperty(it,key,D){if(it===ObjectProto$1)$defineProperty(OPSymbols,key,D);_anObject(it);key=_toPrimitive(key,true);_anObject(D);if(_has(AllSymbols,key)){if(!D.enumerable){if(!_has(it,HIDDEN))dP$1(it,HIDDEN,_propertyDesc(1,{}));it[HIDDEN][key]=true;}else{if(_has(it,HIDDEN)&&it[HIDDEN][key])it[HIDDEN][key]=false;D=_objectCreate(D,{enumerable:_propertyDesc(0,false)});}return setSymbolDesc(it,key,D);}return dP$1(it,key,D);};var $defineProperties=function defineProperties(it,P){_anObject(it);var keys=_enumKeys(P=_toIobject(P));var i=0;var l=keys.length;var key;while(l>i)$defineProperty(it,key=keys[i++],P[key]);return it;};var $create=function create(it,P){return P===undefined?_objectCreate(it):$defineProperties(_objectCreate(it),P);};var $propertyIsEnumerable=function propertyIsEnumerable(key){var E=isEnum.call(this,key=_toPrimitive(key,true));if(this===ObjectProto$1&&_has(AllSymbols,key)&&!_has(OPSymbols,key))return false;return E||!_has(this,key)||!_has(AllSymbols,key)||_has(this,HIDDEN)&&this[HIDDEN][key]?E:true;};var $getOwnPropertyDescriptor$1=function getOwnPropertyDescriptor(it,key){it=_toIobject(it);key=_toPrimitive(key,true);if(it===ObjectProto$1&&_has(AllSymbols,key)&&!_has(OPSymbols,key))return;var D=gOPD$1(it,key);if(D&&_has(AllSymbols,key)&&!(_has(it,HIDDEN)&&it[HIDDEN][key]))D.enumerable=true;return D;};var $getOwnPropertyNames=function getOwnPropertyNames(it){var names=gOPN$1(_toIobject(it));var result=[];var i=0;var key;while(names.length>i){if(!_has(AllSymbols,key=names[i++])&&key!=HIDDEN&&key!=META)result.push(key);}return result;};var $getOwnPropertySymbols=function getOwnPropertySymbols(it){var IS_OP=it===ObjectProto$1;var names=gOPN$1(IS_OP?OPSymbols:_toIobject(it));var result=[];var i=0;var key;while(names.length>i){if(_has(AllSymbols,key=names[i++])&&(IS_OP?_has(ObjectProto$1,key):true))result.push(AllSymbols[key]);}return result;};// 19.4.1.1 Symbol([description])
if(!USE_NATIVE$1){$Symbol=function Symbol(){if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');var tag=_uid(arguments.length>0?arguments[0]:undefined);var $set=function(value){if(this===ObjectProto$1)$set.call(OPSymbols,value);if(_has(this,HIDDEN)&&_has(this[HIDDEN],tag))this[HIDDEN][tag]=false;setSymbolDesc(this,tag,_propertyDesc(1,value));};if(_descriptors&&setter)setSymbolDesc(ObjectProto$1,tag,{configurable:true,set:$set});return wrap(tag);};_redefine($Symbol[PROTOTYPE$2],'toString',function toString(){return this._k;});_objectGopd.f=$getOwnPropertyDescriptor$1;_objectDp.f=$defineProperty;_objectGopn.f=_objectGopnExt.f=$getOwnPropertyNames;_objectPie.f=$propertyIsEnumerable;_objectGops.f=$getOwnPropertySymbols;if(_descriptors&&!_library){_redefine(ObjectProto$1,'propertyIsEnumerable',$propertyIsEnumerable,true);}_wksExt.f=function(name){return wrap(_wks(name));};}_export(_export.G+_export.W+_export.F*!USE_NATIVE$1,{Symbol:$Symbol});for(var es6Symbols=// 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','),j=0;es6Symbols.length>j;)_wks(es6Symbols[j++]);for(var wellKnownSymbols=_objectKeys(_wks.store),k=0;wellKnownSymbols.length>k;)_wksDefine(wellKnownSymbols[k++]);_export(_export.S+_export.F*!USE_NATIVE$1,'Symbol',{// 19.4.2.1 Symbol.for(key)
'for':function(key){return _has(SymbolRegistry,key+='')?SymbolRegistry[key]:SymbolRegistry[key]=$Symbol(key);},// 19.4.2.5 Symbol.keyFor(sym)
keyFor:function keyFor(sym){if(!isSymbol(sym))throw TypeError(sym+' is not a symbol!');for(var key in SymbolRegistry)if(SymbolRegistry[key]===sym)return key;},useSetter:function(){setter=true;},useSimple:function(){setter=false;}});_export(_export.S+_export.F*!USE_NATIVE$1,'Object',{// 19.1.2.2 Object.create(O [, Properties])
create:$create,// 19.1.2.4 Object.defineProperty(O, P, Attributes)
defineProperty:$defineProperty,// 19.1.2.3 Object.defineProperties(O, Properties)
defineProperties:$defineProperties,// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
getOwnPropertyDescriptor:$getOwnPropertyDescriptor$1,// 19.1.2.7 Object.getOwnPropertyNames(O)
getOwnPropertyNames:$getOwnPropertyNames,// 19.1.2.8 Object.getOwnPropertySymbols(O)
getOwnPropertySymbols:$getOwnPropertySymbols});// 24.3.2 JSON.stringify(value [, replacer [, space]])
$JSON&&_export(_export.S+_export.F*(!USE_NATIVE$1||_fails(function(){var S=$Symbol();// MS Edge converts symbol values to JSON as {}
// WebKit converts symbol values to JSON as null
// V8 throws on boxed symbols
return _stringify([S])!='[null]'||_stringify({a:S})!='{}'||_stringify(Object(S))!='{}';})),'JSON',{stringify:function stringify(it){var args=[it];var i=1;var replacer,$replacer;while(arguments.length>i)args.push(arguments[i++]);$replacer=replacer=args[1];if(!_isObject(replacer)&&it===undefined||isSymbol(it))return;// IE8 returns string on undefined
if(!_isArray(replacer))replacer=function(key,value){if(typeof $replacer=='function')value=$replacer.call(this,key,value);if(!isSymbol(value))return value;};args[1]=replacer;return _stringify.apply($JSON,args);}});// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
$Symbol[PROTOTYPE$2][TO_PRIMITIVE]||_hide($Symbol[PROTOTYPE$2],TO_PRIMITIVE,$Symbol[PROTOTYPE$2].valueOf);// 19.4.3.5 Symbol.prototype[@@toStringTag]
_setToStringTag($Symbol,'Symbol');// 20.2.1.9 Math[@@toStringTag]
_setToStringTag(Math,'Math',true);// 24.3.3 JSON[@@toStringTag]
_setToStringTag(_global.JSON,'JSON',true);var getOwnPropertySymbols=_core.Object.getOwnPropertySymbols;var getOwnPropertySymbols$1=getOwnPropertySymbols;// 19.1.2.14 Object.keys(O)
_objectSap('keys',function(){return function keys(it){return _objectKeys(_toObject(it));};});var keys=_core.Object.keys;var keys$1=keys;// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
_export(_export.S+_export.F*!_descriptors,'Object',{defineProperty:_objectDp.f});var $Object$1=_core.Object;var defineProperty$1=function defineProperty(it,key,desc){return $Object$1.defineProperty(it,key,desc);};var defineProperty$2=defineProperty$1;function _defineProperty$1(obj,key,value){if(key in obj){defineProperty$2(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}var defineProperty$3=_defineProperty$1;function _objectSpread$1(target){for(var i=1;i<arguments.length;i++){var source=arguments[i]!=null?arguments[i]:{};var ownKeys=keys$1(source);if(typeof getOwnPropertySymbols$1==='function'){ownKeys=ownKeys.concat(getOwnPropertySymbols$1(source).filter(function(sym){return getOwnPropertyDescriptor$1(source,sym).enumerable;}));}ownKeys.forEach(function(key){defineProperty$3(target,key,source[key]);});}return target;}var objectSpread=_objectSpread$1;function _classCallCheck$1(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var classCallCheck=_classCallCheck$1;// Works with __proto__ only. Old v8 can't work with null proto objects.
/* eslint-disable no-proto */var check=function(O,proto){_anObject(O);if(!_isObject(proto)&&proto!==null)throw TypeError(proto+": can't set as prototype!");};var _setProto={set:Object.setPrototypeOf||('__proto__'in{}?// eslint-disable-line
function(test,buggy,set){try{set=_ctx(Function.call,_objectGopd.f(Object.prototype,'__proto__').set,2);set(test,[]);buggy=!(test instanceof Array);}catch(e){buggy=true;}return function setPrototypeOf(O,proto){check(O,proto);if(buggy)O.__proto__=proto;else set(O,proto);return O;};}({},false):undefined),check:check};// 19.1.3.19 Object.setPrototypeOf(O, proto)
_export(_export.S,'Object',{setPrototypeOf:_setProto.set});var setPrototypeOf=_core.Object.setPrototypeOf;var setPrototypeOf$1=setPrototypeOf;var setPrototypeOf$2=createCommonjsModule(function(module){function _setPrototypeOf$$1(o,p){module.exports=_setPrototypeOf$$1=setPrototypeOf$1||function _setPrototypeOf$$1(o,p){o.__proto__=p;return o;};return _setPrototypeOf$$1(o,p);}module.exports=_setPrototypeOf$$1;});function _inherits$1(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function");}setPrototypeOf$2(subClass.prototype,superClass&&superClass.prototype);if(superClass)setPrototypeOf$2(subClass,superClass);}var inherits=_inherits$1;function _defineProperties$1(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;defineProperty$2(target,descriptor.key,descriptor);}}function _createClass$1(Constructor,protoProps,staticProps){if(protoProps)_defineProperties$1(Constructor.prototype,protoProps);if(staticProps)_defineProperties$1(Constructor,staticProps);return Constructor;}var createClass=_createClass$1;var iterator=_wksExt.f('iterator');var iterator$1=iterator;_wksDefine('asyncIterator');_wksDefine('observable');var symbol=_core.Symbol;var symbol$1=symbol;var _typeof_1=createCommonjsModule(function(module){function _typeof2(obj){if(typeof symbol$1==="function"&&typeof iterator$1==="symbol"){_typeof2=function _typeof2(obj){return typeof obj;};}else{_typeof2=function _typeof2(obj){return obj&&typeof symbol$1==="function"&&obj.constructor===symbol$1&&obj!==symbol$1.prototype?"symbol":typeof obj;};}return _typeof2(obj);}function _typeof$$1(obj){if(typeof symbol$1==="function"&&_typeof2(iterator$1)==="symbol"){module.exports=_typeof$$1=function _typeof$$1(obj){return _typeof2(obj);};}else{module.exports=_typeof$$1=function _typeof$$1(obj){return obj&&typeof symbol$1==="function"&&obj.constructor===symbol$1&&obj!==symbol$1.prototype?"symbol":_typeof2(obj);};}return _typeof$$1(obj);}module.exports=_typeof$$1;});function _assertThisInitialized$1(self){if(self===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called");}return self;}var assertThisInitialized=_assertThisInitialized$1;function _possibleConstructorReturn$1(self,call){if(call&&(_typeof_1(call)==="object"||typeof call==="function")){return call;}return assertThisInitialized(self);}var possibleConstructorReturn=_possibleConstructorReturn$1;// 19.1.2.9 Object.getPrototypeOf(O)
_objectSap('getPrototypeOf',function(){return function getPrototypeOf(it){return _objectGpo(_toObject(it));};});var getPrototypeOf=_core.Object.getPrototypeOf;var getPrototypeOf$1=getPrototypeOf;var getPrototypeOf$2=createCommonjsModule(function(module){function _getPrototypeOf$$1(o){module.exports=_getPrototypeOf$$1=getPrototypeOf$1||function _getPrototypeOf$$1(o){return o.__proto__;};return _getPrototypeOf$$1(o);}module.exports=_getPrototypeOf$$1;});var extend=function extend(object){for(var _len=arguments.length,extensions=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++){extensions[_key-1]=arguments[_key];}// $.extend alternative, ... is the spread operator.
for(var _i=0;_i<extensions.length;_i++){var extension=extensions[_i];// console.log(extension);
// console.log(typeof extension);
if(!extension)continue;// Ignore null and undefined objects and parameters.
var _iteratorNormalCompletion=true;var _didIteratorError=false;var _iteratorError=undefined;try{for(var _iterator=Object.getOwnPropertyNames(extension)[Symbol.iterator](),_step;!(_iteratorNormalCompletion=(_step=_iterator.next()).done);_iteratorNormalCompletion=true){var prop=_step.value;// Do not traverse the prototype chain.
if(object[prop]!==undefined&&extension[prop]&&object[prop].toString()==='[object Object]'&&extension[prop].toString()==='[object Object]'){// Goes deep only if object[prop] and extension[prop] are both objects !
if(object[prop].constructor===Object)extend(object[prop],extension[prop]);}else object[prop]=typeof object[prop]==='undefined'?extension[prop]:object[prop];if(typeof object[prop]==='undefined'&&Array.isArray(extension[prop]))object[prop]=extension[prop].slice();// Add values that do not already exist.
else if(typeof object[prop]==='undefined'&&Array.isArray(extension[prop]))object[prop]=extension[prop];}}catch(err){_didIteratorError=true;_iteratorError=err;}finally{try{if(!_iteratorNormalCompletion&&_iterator.return!=null){_iterator.return();}}finally{if(_didIteratorError){throw _iteratorError;}}}}return object;};var instruct=function instruct(array,instArray){var tempObject={};for(var i=0,max=instArray.length;i<max;i++){var guide=instArray[i];tempObject[guide]=array[i];}return tempObject;};var transformData=function transformData(object,instructions){for(var key in instructions){if(Array.isArray(object[key]))object[key]=instruct(object[key],instructions[key]);else if(object[key]instanceof Object&&!Array.isArray(instructions[key]))object[key]=transformData(object[key],instructions[key]);}return object;};if(Number.EPSILON===undefined){Number.EPSILON=Math.pow(2,-52);}if(Number.isInteger===undefined){// Missing in IE
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
Number.isInteger=function(value){return typeof value==='number'&&isFinite(value)&&Math.floor(value)===value;};}//
if(Math.sign===undefined){// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign
Math.sign=function(x){return x<0?-1:x>0?1:+x;};}if('name'in Function.prototype===false){// Missing in IE
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name
Object.defineProperty(Function.prototype,'name',{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1];}});}if(Object.assign===undefined){// Missing in IE
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
(function(){Object.assign=function(target){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;};})();}/**
* https://github.com/mrdoob/eventdispatcher.js/
*/function EventDispatcher(){}Object.assign(EventDispatcher.prototype,{addEventListener:function(type,listener){if(this._listeners===undefined)this._listeners={};var listeners=this._listeners;if(listeners[type]===undefined){listeners[type]=[];}if(listeners[type].indexOf(listener)===-1){listeners[type].push(listener);}},hasEventListener:function(type,listener){if(this._listeners===undefined)return false;var listeners=this._listeners;return listeners[type]!==undefined&&listeners[type].indexOf(listener)!==-1;},removeEventListener:function(type,listener){if(this._listeners===undefined)return;var listeners=this._listeners;var listenerArray=listeners[type];if(listenerArray!==undefined){var index=listenerArray.indexOf(listener);if(index!==-1){listenerArray.splice(index,1);}}},dispatchEvent:function(event){if(this._listeners===undefined)return;var listeners=this._listeners;var listenerArray=listeners[event.type];if(listenerArray!==undefined){event.target=this;var array=listenerArray.slice(0);for(var i=0,l=array.length;i<l;i++){array[i].call(this,event);}}}});var REVISION='92';var MOUSE={LEFT:0,MIDDLE:1,RIGHT:2};var CullFaceNone=0;var CullFaceBack=1;var CullFaceFront=2;var PCFShadowMap=1;var PCFSoftShadowMap=2;var FrontSide=0;var BackSide=1;var DoubleSide=2;var FlatShading=1;var NoColors=0;var FaceColors=1;var VertexColors=2;var NoBlending=0;var NormalBlending=1;var AdditiveBlending=2;var SubtractiveBlending=3;var MultiplyBlending=4;var CustomBlending=5;var AddEquation=100;var SubtractEquation=101;var ReverseSubtractEquation=102;var MinEquation=103;var MaxEquation=104;var ZeroFactor=200;var OneFactor=201;var SrcColorFactor=202;var OneMinusSrcColorFactor=203;var SrcAlphaFactor=204;var OneMinusSrcAlphaFactor=205;var DstAlphaFactor=206;var OneMinusDstAlphaFactor=207;var DstColorFactor=208;var OneMinusDstColorFactor=209;var SrcAlphaSaturateFactor=210;var NeverDepth=0;var AlwaysDepth=1;var LessDepth=2;var LessEqualDepth=3;var EqualDepth=4;var GreaterEqualDepth=5;var GreaterDepth=6;var NotEqualDepth=7;var MultiplyOperation=0;var MixOperation=1;var AddOperation=2;var NoToneMapping=0;var LinearToneMapping=1;var ReinhardToneMapping=2;var Uncharted2ToneMapping=3;var CineonToneMapping=4;var UVMapping=300;var CubeReflectionMapping=301;var CubeRefractionMapping=302;var EquirectangularReflectionMapping=303;var EquirectangularRefractionMapping=304;var SphericalReflectionMapping=305;var CubeUVReflectionMapping=306;var CubeUVRefractionMapping=307;var RepeatWrapping=1000;var ClampToEdgeWrapping=1001;var MirroredRepeatWrapping=1002;var NearestFilter=1003;var NearestMipMapNearestFilter=1004;var NearestMipMapLinearFilter=1005;var LinearFilter=1006;var LinearMipMapNearestFilter=1007;var LinearMipMapLinearFilter=1008;var UnsignedByteType=1009;var ByteType=1010;var ShortType=1011;var UnsignedShortType=1012;var IntType=1013;var UnsignedIntType=1014;var FloatType=1015;var HalfFloatType=1016;var UnsignedShort4444Type=1017;var UnsignedShort5551Type=1018;var UnsignedShort565Type=1019;var UnsignedInt248Type=1020;var AlphaFormat=1021;var RGBFormat=1022;var RGBAFormat=1023;var LuminanceFormat=1024;var LuminanceAlphaFormat=1025;var DepthFormat=1026;var DepthStencilFormat=1027;var RGB_S3TC_DXT1_Format=33776;var RGBA_S3TC_DXT1_Format=33777;var RGBA_S3TC_DXT3_Format=33778;var RGBA_S3TC_DXT5_Format=33779;var RGB_PVRTC_4BPPV1_Format=35840;var RGB_PVRTC_2BPPV1_Format=35841;var RGBA_PVRTC_4BPPV1_Format=35842;var RGBA_PVRTC_2BPPV1_Format=35843;var RGB_ETC1_Format=36196;var RGBA_ASTC_4x4_Format=37808;var RGBA_ASTC_5x4_Format=37809;var RGBA_ASTC_5x5_Format=37810;var RGBA_ASTC_6x5_Format=37811;var RGBA_ASTC_6x6_Format=37812;var RGBA_ASTC_8x5_Format=37813;var RGBA_ASTC_8x6_Format=37814;var RGBA_ASTC_8x8_Format=37815;var RGBA_ASTC_10x5_Format=37816;var RGBA_ASTC_10x6_Format=37817;var RGBA_ASTC_10x8_Format=37818;var RGBA_ASTC_10x10_Format=37819;var RGBA_ASTC_12x10_Format=37820;var RGBA_ASTC_12x12_Format=37821;var LoopOnce=2200;var LoopRepeat=2201;var LoopPingPong=2202;var InterpolateDiscrete=2300;var InterpolateLinear=2301;var InterpolateSmooth=2302;var ZeroCurvatureEnding=2400;var ZeroSlopeEnding=2401;var WrapAroundEnding=2402;var TrianglesDrawMode=0;var TriangleStripDrawMode=1;var TriangleFanDrawMode=2;var LinearEncoding=3000;var sRGBEncoding=3001;var GammaEncoding=3007;var RGBEEncoding=3002;var RGBM7Encoding=3004;var RGBM16Encoding=3005;var RGBDEncoding=3006;var BasicDepthPacking=3200;var RGBADepthPacking=3201;/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
*/var _Math={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136
var lut=[];for(var i=0;i<256;i++){lut[i]=(i<16?'0':'')+i.toString(16);}return function generateUUID(){var d0=Math.random()*0xffffffff|0;var d1=Math.random()*0xffffffff|0;var d2=Math.random()*0xffffffff|0;var d3=Math.random()*0xffffffff|0;var uuid=lut[d0&0xff]+lut[d0>>8&0xff]+lut[d0>>16&0xff]+lut[d0>>24&0xff]+'-'+lut[d1&0xff]+lut[d1>>8&0xff]+'-'+lut[d1>>16&0x0f|0x40]+lut[d1>>24&0xff]+'-'+lut[d2&0x3f|0x80]+lut[d2>>8&0xff]+'-'+lut[d2>>16&0xff]+lut[d2>>24&0xff]+lut[d3&0xff]+lut[d3>>8&0xff]+lut[d3>>16&0xff]+lut[d3>>24&0xff];// .toUpperCase() here flattens concatenated strings to save heap memory space.
return uuid.toUpperCase();};}(),clamp:function(value,min,max){return Math.max(min,Math.min(max,value));},// compute euclidian modulo of m % n
// https://en.wikipedia.org/wiki/Modulo_operation
euclideanModulo:function(n,m){return (n%m+m)%m;},// Linear mapping from range <a1, a2> to range <b1, b2>
mapLinear:function(x,a1,a2,b1,b2){return b1+(x-a1)*(b2-b1)/(a2-a1);},// https://en.wikipedia.org/wiki/Linear_interpolation
lerp:function(x,y,t){return (1-t)*x+t*y;},// http://en.wikipedia.org/wiki/Smoothstep
smoothstep:function(x,min,max){if(x<=min)return 0;if(x>=max)return 1;x=(x-min)/(max-min);return x*x*(3-2*x);},smootherstep:function(x,min,max){if(x<=min)return 0;if(x>=max)return 1;x=(x-min)/(max-min);return x*x*x*(x*(x*6-15)+10);},// Random integer from <low, high> interval
randInt:function(low,high){return low+Math.floor(Math.random()*(high-low+1));},// Random float from <low, high> interval
randFloat:function(low,high){return low+Math.random()*(high-low);},// Random float from <-range/2, range/2> interval
randFloatSpread:function(range){return range*(0.5-Math.random());},degToRad:function(degrees){return degrees*_Math.DEG2RAD;},radToDeg:function(radians){return radians*_Math.RAD2DEG;},isPowerOfTwo:function(value){return (value&value-1)===0&&value!==0;},ceilPowerOfTwo:function(value){return Math.pow(2,Math.ceil(Math.log(value)/Math.LN2));},floorPowerOfTwo:function(value){return Math.pow(2,Math.floor(Math.log(value)/Math.LN2));}};/**
* @author mrdoob / http://mrdoob.com/
* @author philogb / http://blog.thejit.org/
* @author egraether / http://egraether.com/
* @author zz85 / http://www.lab4games.net/zz85/blog
*/function Vector2(x,y){this.x=x||0;this.y=y||0;}Object.defineProperties(Vector2.prototype,{"width":{get:function(){return this.x;},set:function(value){this.x=value;}},"height":{get:function(){return this.y;},set:function(value){this.y=value;}}});Object.assign(Vector2.prototype,{isVector2:true,set:function(x,y){this.x=x;this.y=y;return this;},setScalar:function(scalar){this.x=scalar;this.y=scalar;return this;},setX:function(x){this.x=x;return this;},setY:function(y){this.y=y;return this;},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;default:throw new Error('index is out of range: '+index);}return this;},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;default:throw new Error('index is out of range: '+index);}},clone:function(){return new this.constructor(this.x,this.y);},copy:function(v){this.x=v.x;this.y=v.y;return this;},add:function(v,w){if(w!==undefined){console.warn('THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');return this.addVectors(v,w);}this.x+=v.x;this.y+=v.y;return this;},addScalar:function(s){this.x+=s;this.y+=s;return this;},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this;},addScaledVector:function(v,s){this.x+=v.x*s;this.y+=v.y*s;return this;},sub:function(v,w){if(w!==undefined){console.warn('THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');return this.subVectors(v,w);}this.x-=v.x;this.y-=v.y;return this;},subScalar:function(s){this.x-=s;this.y-=s;return this;},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this;},multiply:function(v){this.x*=v.x;this.y*=v.y;return this;},multiplyScalar:function(scalar){this.x*=scalar;this.y*=scalar;return this;},divide:function(v){this.x/=v.x;this.y/=v.y;return this;},divideScalar:function(scalar){return this.multiplyScalar(1/scalar);},applyMatrix3:function(m){var x=this.x,y=this.y;var e=m.elements;this.x=e[0]*x+e[3]*y+e[6];this.y=e[1]*x+e[4]*y+e[7];return this;},min:function(v){this.x=Math.min(this.x,v.x);this.y=Math.min(this.y,v.y);return this;},max:function(v){this.x=Math.max(this.x,v.x);this.y=Math.max(this.y,v.y);return this;},clamp:function(min,max){// assumes min < max, componentwise
this.x=Math.max(min.x,Math.min(max.x,this.x));this.y=Math.max(min.y,Math.min(max.y,this.y));return this;},clampScalar:function(){var min=new Vector2();var max=new Vector2();return function clampScalar(minVal,maxVal){min.set(minVal,minVal);max.set(maxVal,maxVal);return this.clamp(min,max);};}(),clampLength:function(min,max){var length=this.length();return this.divideScalar(length||1).multiplyScalar(Math.max(min,Math.min(max,length)));},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this;},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this;},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this;},roundToZero:function(){this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x);this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y);return this;},negate:function(){this.x=-this.x;this.y=-this.y;return this;},dot:function(v){return this.x*v.x+this.y*v.y;},lengthSq:function(){return this.x*this.x+this.y*this.y;},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y);},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y);},normalize:function(){return this.divideScalar(this.length()||1);},angle:function(){// computes the angle in radians with respect to the positive x-axis
var angle=Math.atan2(this.y,this.x);if(angle<0)angle+=2*Math.PI;return angle;},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v));},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y;return dx*dx+dy*dy;},manhattanDistanceTo:function(v){return Math.abs(this.x-v.x)+Math.abs(this.y-v.y);},setLength:function(length){return this.normalize().multiplyScalar(length);},lerp:function(v,alpha){this.x+=(v.x-this.x)*alpha;this.y+=(v.y-this.y)*alpha;return this;},lerpVectors:function(v1,v2,alpha){return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1);},equals:function(v){return v.x===this.x&&v.y===this.y;},fromArray:function(array,offset){if(offset===undefined)offset=0;this.x=array[offset];this.y=array[offset+1];return this;},toArray:function(array,offset){if(array===undefined)array=[];if(offset===undefined)offset=0;array[offset]=this.x;array[offset+1]=this.y;return array;},fromBufferAttribute:function(attribute,index,offset){if(offset!==undefined){console.warn('THREE.Vector2: offset has been removed from .fromBufferAttribute().');}this.x=attribute.getX(index);this.y=attribute.getY(index);return this;},rotateAround:function(center,angle){var c=Math.cos(angle),s=Math.sin(angle);var x=this.x-center.x;var y=this.y-center.y;this.x=x*c-y*s+center.x;this.y=x*s+y*c+center.y;return this;}});/**
* @author mrdoob / http://mrdoob.com/
* @author supereggbert / http://www.paulbrunt.co.uk/
* @author philogb / http://blog.thejit.org/
* @author jordi_ros / http://plattsoft.com
* @author D1plo1d / http://github.com/D1plo1d
* @author alteredq / http://alteredqualia.com/
* @author mikael emtinger / http://gomo.se/
* @author timknip / http://www.floorplanner.com/
* @author bhouston / http://clara.io
* @author WestLangley / http://github.com/WestLangley
*/function Matrix4(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];if(arguments.length>0){console.error('THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.');}}Object.assign(Matrix4.prototype,{isMatrix4:true,set:function(n11,n12,n13,n14,n21,n22,n23,n24,n31,n32,n33,n34,n41,n42,n43,n44){var te=this.elements;te[0]=n11;te[4]=n12;te[8]=n13;te[12]=n14;te[1]=n21;te[5]=n22;te[9]=n23;te[13]=n24;te[2]=n31;te[6]=n32;te[10]=n33;te[14]=n34;te[3]=n41;te[7]=n42;te[11]=n43;te[15]=n44;return this;},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this;},clone:function(){return new Matrix4().fromArray(this.elements);},copy:function(m){var te=this.elements;var me=m.elements;te[0]=me[0];te[1]=me[1];te[2]=me[2];te[3]=me[3];te[4]=me[4];te[5]=me[5];te[6]=me[6];te[7]=me[7];te[8]=me[8];te[9]=me[9];te[10]=me[10];te[11]=me[11];te[12]=me[12];te[13]=me[13];te[14]=me[14];te[15]=me[15];return this;},copyPosition:function(m){var te=this.elements,me=m.elements;te[12]=me[12];te[13]=me[13];te[14]=me[14];return this;},extractBasis:function(xAxis,yAxis,zAxis){xAxis.setFromMatrixColumn(this,0);yAxis.setFromMatrixColumn(this,1);zAxis.setFromMatrixColumn(this,2);return this;},makeBasis:function(xAxis,yAxis,zAxis){this.set(xAxis.x,yAxis.x,zAxis.x,0,xAxis.y,yAxis.y,zAxis.y,0,xAxis.z,yAxis.z,zAxis.z,0,0,0,0,1);return this;},extractRotation:function(){var v1=new Vector3();return function extractRotation(m){var te=this.elements;var me=m.elements;var scaleX=1/v1.setFromMatrixColumn(m,0).length();var scaleY=1/v1.setFromMatrixColumn(m,1).length();var scaleZ=1/v1.setFromMatrixColumn(m,2).length();te[0]=me[0]*scaleX;te[1]=me[1]*scaleX;te[2]=me[2]*scaleX;te[4]=me[4]*scaleY;te[5]=me[5]*scaleY;te[6]=me[6]*scaleY;te[8]=me[8]*scaleZ;te[9]=me[9]*scaleZ;te[10]=me[10]*scaleZ;return this;};}(),makeRotationFromEuler:function(euler){if(!(euler&&euler.isEuler)){console.error('THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.');}var te=this.elements;var x=euler.x,y=euler.y,z=euler.z;var a=Math.cos(x),b=Math.sin(x);var c=Math.cos(y),d=Math.sin(y);var e=Math.cos(z),f=Math.sin(z);if(euler.order==='XYZ'){var ae=a*e,af=a*f,be=b*e,bf=b*f;te[0]=c*e;te[4]=-c*f;te[8]=d;te[1]=af+be*d;te[5]=ae-bf*d;te[9]=-b*c;te[2]=bf-ae*d;te[6]=be+af*d;te[10]=a*c;}else if(euler.order==='YXZ'){var ce=c*e,cf=c*f,de=d*e,df=d*f;te[0]=ce+df*b;te[4]=de*b-cf;te[8]=a*d;te[1]=a*f;te[5]=a*e;te[9]=-b;te[2]=cf*b-de;te[6]=df+ce*b;te[10]=a*c;}else if(euler.order==='ZXY'){var ce=c*e,cf=c*f,de=d*e,df=d*f;te[0]=ce-df*b;te[4]=-a*f;te[8]=de+cf*b;te[1]=cf+de*b;te[5]=a*e;te[9]=df-ce*b;te[2]=-a*d;te[6]=b;te[10]=a*c;}else if(euler.order==='ZYX'){var ae=a*e,af=a*f,be=b*e,bf=b*f;te[0]=c*e;te[4]=be*d-af;te[8]=ae*d+bf;te[1]=c*f;te[5]=bf*d+ae;te[9]=af*d-be;te[2]=-d;te[6]=b*c;te[10]=a*c;}else if(euler.order==='YZX'){var ac=a*c,ad=a*d,bc=b*c,bd=b*d;te[0]=c*e;te[4]=bd-ac*f;te[8]=bc*f+ad;te[1]=f;te[5]=a*e;te[9]=-b*e;te[2]=-d*e;te[6]=ad*f+bc;te[10]=ac-bd*f;}else if(euler.order==='XZY'){var ac=a*c,ad=a*d,bc=b*c,bd=b*d;te[0]=c*e;te[4]=-f;te[8]=d*e;te[1]=ac*f+bd;te[5]=a*e;te[9]=ad*f-bc;te[2]=bc*f-ad;te[6]=b*e;te[10]=bd*f+ac;}// last column
te[3]=0;te[7]=0;te[11]=0;// bottom row
te[12]=0;te[13]=0;te[14]=0;te[15]=1;return this;},makeRotationFromQuaternion:function(q){var te=this.elements;var x=q._x,y=q._y,z=q._z,w=q._w;var x2=x+x,y2=y+y,z2=z+z;var xx=x*x2,xy=x*y2,xz=x*z2;var yy=y*y2,yz=y*z2,zz=z*z2;var wx=w*x2,wy=w*y2,wz=w*z2;te[0]=1-(yy+zz);te[4]=xy-wz;te[8]=xz+wy;te[1]=xy+wz;te[5]=1-(xx+zz);te[9]=yz-wx;te[2]=xz-wy;te[6]=yz+wx;te[10]=1-(xx+yy);// last column
te[3]=0;te[7]=0;te[11]=0;// bottom row
te[12]=0;te[13]=0;te[14]=0;te[15]=1;return this;},lookAt:function(){var x=new Vector3();var y=new Vector3();var z=new Vector3();return function lookAt(eye,target,up){var te=this.elements;z.subVectors(eye,target);if(z.lengthSq()===0){// eye and target are in the same position
z.z=1;}z.normalize();x.crossVectors(up,z);if(x.lengthSq()===0){// up and z are parallel
if(Math.abs(up.z)===1){z.x+=0.0001;}else{z.z+=0.0001;}z.normalize();x.crossVectors(up,z);}x.normalize();y.crossVectors(z,x);te[0]=x.x;te[4]=y.x;te[8]=z.x;te[1]=x.y;te[5]=y.y;te[9]=z.y;te[2]=x.z;te[6]=y.z;te[10]=z.z;return this;};}(),multiply:function(m,n){if(n!==undefined){console.warn('THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.');return this.multiplyMatrices(m,n);}return this.multiplyMatrices(this,m);},premultiply:function(m){return this.multiplyMatrices(m,this);},multiplyMatrices:function(a,b){var ae=a.elements;var be=b.elements;var te=this.elements;var a11=ae[0],a12=ae[4],a13=ae[8],a14=ae[12];var a21=ae[1],a22=ae[5],a23=ae[9],a24=ae[13];var a31=ae[2],a32=ae[6],a33=ae[10],a34=ae[14];var a41=ae[3],a42=ae[7],a43=ae[11],a44=ae[15];var b11=be[0],b12=be[4],b13=be[8],b14=be[12];var b21=be[1],b22=be[5],b23=be[9],b24=be[13];var b31=be[2],b32=be[6],b33=be[10],b34=be[14];var b41=be[3],b42=be[7],b43=be[11],b44=be[15];te[0]=a11*b11+a12*b21+a13*b31+a14*b41;te[4]=a11*b12+a12*b22+a13*b32+a14*b42;te[8]=a11*b13+a12*b23+a13*b33+a14*b43;te[12]=a11*b14+a12*b24+a13*b34+a14*b44;te[1]=a21*b11+a22*b21+a23*b31+a24*b41;te[5]=a21*b12+a22*b22+a23*b32+a24*b42;te[9]=a21*b13+a22*b23+a23*b33+a24*b43;te[13]=a21*b14+a22*b24+a23*b34+a24*b44;te[2]=a31*b11+a32*b21+a33*b31+a34*b41;te[6]=a31*b12+a32*b22+a33*b32+a34*b42;te[10]=a31*b13+a32*b23+a33*b33+a34*b43;te[14]=a31*b14+a32*b24+a33*b34+a34*b44;te[3]=a41*b11+a42*b21+a43*b31+a44*b41;te[7]=a41*b12+a42*b22+a43*b32+a44*b42;te[11]=a41*b13+a42*b23+a43*b33+a44*b43;te[15]=a41*b14+a42*b24+a43*b34+a44*b44;return this;},multiplyScalar:function(s){var te=this.elements;te[0]*=s;te[4]*=s;te[8]*=s;te[12]*=s;te[1]*=s;te[5]*=s;te[9]*=s;te[13]*=s;te[2]*=s;te[6]*=s;te[10]*=s;te[14]*=s;te[3]*=s;te[7]*=s;te[11]*=s;te[15]*=s;return this;},applyToBufferAttribute:function(){var v1=new Vector3();return function applyToBufferAttribute(attribute){for(var i=0,l=attribute.count;i<l;i++){v1.x=attribute.getX(i);v1.y=attribute.getY(i);v1.z=attribute.getZ(i);v1.applyMatrix4(this);attribute.setXYZ(i,v1.x,v1.y,v1.z);}return attribute;};}(),determinant:function(){var te=this.elements;var n11=te[0],n12=te[4],n13=te[8],n14=te[12];var n21=te[1],n22=te[5],n23=te[9],n24=te[13];var n31=te[2],n32=te[6],n33=te[10],n34=te[14];var n41=te[3],n42=te[7],n43=te[11],n44=te[15];//TODO: make this more efficient
//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )
return n41*(+n14*n23*n32-n13*n24*n32-n14*n22*n33+n12*n24*n33+n13*n22*n34-n12*n23*n34)+n42*(+n11*n23*n34-n11*n24*n33+n14*n21*n33-n13*n21*n34+n13*n24*n31-n14*n23*n31)+n43*(+n11*n24*n32-n11*n22*n34-n14*n21*n32+n12*n21*n34+n14*n22*n31-n12*n24*n31)+n44*(-n13*n22*n31-n11*n23*n32+n11*n22*n33+n13*n21*n32-n12*n21*n33+n12*n23*n31);},transpose:function(){var te=this.elements;var tmp;tmp=te[1];te[1]=te[4];te[4]=tmp;tmp=te[2];te[2]=te[8];te[8]=tmp;tmp=te[6];te[6]=te[9];te[9]=tmp;tmp=te[3];te[3]=te[12];te[12]=tmp;tmp=te[7];te[7]=te[13];te[13]=tmp;tmp=te[11];te[11]=te[14];te[14]=tmp;return this;},setPosition:function(v){var te=this.elements;te[12]=v.x;te[13]=v.y;te[14]=v.z;return this;},getInverse:function(m,throwOnDegenerate){// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm
var te=this.elements,me=m.elements,n11=me[0],n21=me[1],n31=me[2],n41=me[3],n12=me[4],n22=me[5],n32=me[6],n42=me[7],n13=me[8],n23=me[9],n33=me[10],n43=me[11],n14=me[12],n24=me[13],n34=me[14],n44=me[15],t11=n23*n34*n42-n24*n33*n42+n24*n32*n43-n22*n34*n43-n23*n32*n44+n22*n33*n44,t12=n14*n33*n42-n13*n34*n42-n14*n32*n43+n12*n34*n43+n13*n32*n44-n12*n33*n44,t13=n13*n24*n42-n14*n23*n42+n14*n22*n43-n12*n24*n43-n13*n22*n44+n12*n23*n44,t14=n14*n23*n32-n13*n24*n32-n14*n22*n33+n12*n24*n33+n13*n22*n34-n12*n23*n34;var det=n11*t11+n21*t12+n31*t13+n41*t14;if(det===0){var msg="THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0";if(throwOnDegenerate===true){throw new Error(msg);}else{console.warn(msg);}return this.identity();}var detInv=1/det;te[0]=t11*detInv;te[1]=(n24*n33*n41-n23*n34*n41-n24*n31*n43+n21*n34*n43+n23*n31*n44-n21*n33*n44)*detInv;te[2]=(n22*n34*n41-n24*n32*n41+n24*n31*n42-n21*n34*n42-n22*n31*n44+n21*n32*n44)*detInv;te[3]=(n23*n32*n41-n22*n33*n41-n23*n31*n42+n21*n33*n42+n22*n31*n43-n21*n32*n43)*detInv;te[4]=t12*detInv;te[5]=(n13*n34*n41-n14*n33*n41+n14*n31*n43-n11*n34*n43-n13*n31*n44+n11*n33*n44)*detInv;te[6]=(n14*n32*n41-n12*n34*n41-n14*n31*n42+n11*n34*n42+n12*n31*n44-n11*n32*n44)*detInv;te[7]=(n12*n33*n41-n13*n32*n41+n13*n31*n42-n11*n33*n42-n12*n31*n43+n11*n32*n43)*detInv;te[8]=t13*detInv;te[9]=(n14*n23*n41-n13*n24*n41-n14*n21*n43+n11*n24*n43+n13*n21*n44-n11*n23*n44)*detInv;te[10]=(n12*n24*n41-n14*n22*n41+n14*n21*n42-n11*n24*n42-n12*n21*n44+n11*n22*n44)*detInv;te[11]=(n13*n22*n41-n12*n23*n41-n13*n21*n42+n11*n23*n42+n12*n21*n43-n11*n22*n43)*detInv;te[12]=t14*detInv;te[13]=(n13*n24*n31-n14*n23*n31+n14*n21*n33-n11*n24*n33-n13*n21*n34+n11*n23*n34)*detInv;te[14]=(n14*n22*n31-n12*n24*n31-n14*n21*n32+n11*n24*n32+n12*n21*n34-n11*n22*n34)*detInv;te[15]=(n12*n23*n31-n13*n22*n31+n13*n21*n32-n11*n23*n32-n12*n21*n33+n11*n22*n33)*detInv;return this;},scale:function(v){var te=this.elements;var x=v.x,y=v.y,z=v.z;te[0]*=x;te[4]*=y;te[8]*=z;te[1]*=x;te[5]*=y;te[9]*=z;te[2]*=x;te[6]*=y;te[10]*=z;te[3]*=x;te[7]*=y;te[11]*=z;return this;},getMaxScaleOnAxis:function(){var te=this.elements;var scaleXSq=te[0]*te[0]+te[1]*te[1]+te[2]*te[2];var scaleYSq=te[4]*te[4]+te[5]*te[5]+te[6]*te[6];var scaleZSq=te[8]*te[8]+te[9]*te[9]+te[10]*te[10];return Math.sqrt(Math.max(scaleXSq,scaleYSq,scaleZSq));},makeTranslation:function(x,y,z){this.set(1,0,0,x,0,1,0,y,0,0,1,z,0,0,0,1);return this;},makeRotationX:function(theta){var c=Math.cos(theta),s=Math.sin(theta);this.set(1,0,0,0,0,c,-s,0,0,s,c,0,0,0,0,1);return this;},makeRotationY:function(theta){var c=Math.cos(theta),s=Math.sin(theta);this.set(c,0,s,0,0,1,0,0,-s,0,c,0,0,0,0,1);return this;},makeRotationZ:function(theta){var c=Math.cos(theta),s=Math.sin(theta);this.set(c,-s,0,0,s,c,0,0,0,0,1,0,0,0,0,1);return this;},makeRotationAxis:function(axis,angle){// Based on http://www.gamedev.net/reference/articles/article1199.asp
var c=Math.cos(angle);var s=Math.sin(angle);var t=1-c;var x=axis.x,y=axis.y,z=axis.z;var tx=t*x,ty=t*y;this.set(tx*x+c,tx*y-s*z,tx*z+s*y,0,tx*y+s*z,ty*y+c,ty*z-s*x,0,tx*z-s*y,ty*z+s*x,t*z*z+c,0,0,0,0,1);return this;},makeScale:function(x,y,z){this.set(x,0,0,0,0,y,0,0,0,0,z,0,0,0,0,1);return this;},makeShear:function(x,y,z){this.set(1,y,z,0,x,1,z,0,x,y,1,0,0,0,0,1);return this;},compose:function(position,quaternion,scale){this.makeRotationFromQuaternion(quaternion);this.scale(scale);this.setPosition(position);return this;},decompose:function(){var vector=new Vector3();var matrix=new Matrix4();return function decompose(position,quaternion,scale){var te=this.elements;var sx=vector.set(te[0],te[1],te[2]).length();var sy=vector.set(te[4],te[5],te[6]).length();var sz=vector.set(te[8],te[9],te[10]).length();// if determine is negative, we need to invert one scale
var det=this.determinant();if(det<0)sx=-sx;position.x=te[12];position.y=te[13];position.z=te[14];// scale the rotation part
matrix.copy(this);var invSX=1/sx;var invSY=1/sy;var invSZ=1/sz;matrix.elements[0]*=invSX;matrix.elements[1]*=invSX;matrix.elements[2]*=invSX;matrix.elements[4]*=invSY;matrix.elements[5]*=invSY;matrix.elements[6]*=invSY;matrix.elements[8]*=invSZ;matrix.elements[9]*=invSZ;matrix.elements[10]*=invSZ;quaternion.setFromRotationMatrix(matrix);scale.x=sx;scale.y=sy;scale.z=sz;return this;};}(),makePerspective:function(left,right,top,bottom,near,far){if(far===undefined){console.warn('THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.');}var te=this.elements;var x=2*near/(right-left);var y=2*near/(top-bottom);var a=(right+left)/(right-left);var b=(top+bottom)/(top-bottom);var c=-(far+near)/(far-near);var d=-2*far*near/(far-near);te[0]=x;te[4]=0;te[8]=a;te[12]=0;te[1]=0;te[5]=y;te[9]=b;te[13]=0;te[2]=0;te[6]=0;te[10]=c;te[14]=d;te[3]=0;te[7]=0;te[11]=-1;te[15]=0;return this;},makeOrthographic:function(left,right,top,bottom,near,far){var te=this.elements;var w=1.0/(right-left);var h=1.0/(top-bottom);var p=1.0/(far-near);var x=(right+left)*w;var y=(top+bottom)*h;var z=(far+near)*p;te[0]=2*w;te[4]=0;te[8]=0;te[12]=-x;te[1]=0;te[5]=2*h;te[9]=0;te[13]=-y;te[2]=0;te[6]=0;te[10]=-2*p;te[14]=-z;te[3]=0;te[7]=0;te[11]=0;te[15]=1;return this;},equals:function(matrix){var te=this.elements;var me=matrix.elements;for(var i=0;i<16;i++){if(te[i]!==me[i])return false;}return true;},fromArray:function(array,offset){if(offset===undefined)offset=0;for(var i=0;i<16;i++){this.elements[i]=array[i+offset];}return this;},toArray:function(array,offset){if(array===undefined)array=[];if(offset===undefined)offset=0;var te=this.elements;array[offset]=te[0];array[offset+1]=te[1];array[offset+2]=te[2];array[offset+3]=te[3];array[offset+4]=te[4];array[offset+5]=te[5];array[offset+6]=te[6];array[offset+7]=te[7];array[offset+8]=te[8];array[offset+9]=te[9];array[offset+10]=te[10];array[offset+11]=te[11];array[offset+12]=te[12];array[offset+13]=te[13];array[offset+14]=te[14];array[offset+15]=te[15];return array;}});/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author WestLangley / http://github.com/WestLangley
* @author bhouston / http://clara.io
*/function Quaternion(x,y,z,w){this._x=x||0;this._y=y||0;this._z=z||0;this._w=w!==undefined?w:1;}Object.assign(Quaternion,{slerp:function(qa,qb,qm,t){return qm.copy(qa).slerp(qb,t);},slerpFlat:function(dst,dstOffset,src0,srcOffset0,src1,srcOffset1,t){// fuzz-free, array-based Quaternion SLERP operation
var x0=src0[srcOffset0+0],y0=src0[srcOffset0+1],z0=src0[srcOffset0+2],w0=src0[srcOffset0+3],x1=src1[srcOffset1+0],y1=src1[srcOffset1+1],z1=src1[srcOffset1+2],w1=src1[srcOffset1+3];if(w0!==w1||x0!==x1||y0!==y1||z0!==z1){var s=1-t,cos=x0*x1+y0*y1+z0*z1+w0*w1,dir=cos>=0?1:-1,sqrSin=1-cos*cos;// Skip the Slerp for tiny steps to avoid numeric problems:
if(sqrSin>Number.EPSILON){var sin=Math.sqrt(sqrSin),len=Math.atan2(sin,cos*dir);s=Math.sin(s*len)/sin;t=Math.sin(t*len)/sin;}var tDir=t*dir;x0=x0*s+x1*tDir;y0=y0*s+y1*tDir;z0=z0*s+z1*tDir;w0=w0*s+w1*tDir;// Normalize in case we just did a lerp:
if(s===1-t){var f=1/Math.sqrt(x0*x0+y0*y0+z0*z0+w0*w0);x0*=f;y0*=f;z0*=f;w0*=f;}}dst[dstOffset]=x0;dst[dstOffset+1]=y0;dst[dstOffset+2]=z0;dst[dstOffset+3]=w0;}});Object.defineProperties(Quaternion.prototype,{x:{get:function(){return this._x;},set:function(value){this._x=value;this.onChangeCallback();}},y:{get:function(){return this._y;},set:function(value){this._y=value;this.onChangeCallback();}},z:{get:function(){return this._z;},set:function(value){this._z=value;this.onChangeCallback();}},w:{get:function(){return this._w;},set:function(value){this._w=value;this.onChangeCallback();}}});Object.assign(Quaternion.prototype,{set:function(x,y,z,w){this._x=x;this._y=y;this._z=z;this._w=w;this.onChangeCallback();return this;},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w);},copy:function(quaternion){this._x=quaternion.x;this._y=quaternion.y;this._z=quaternion.z;this._w=quaternion.w;this.onChangeCallback();return this;},setFromEuler:function(euler,update){if(!(euler&&euler.isEuler)){throw new Error('THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.');}var x=euler._x,y=euler._y,z=euler._z,order=euler.order;// http://www.mathworks.com/matlabcentral/fileexchange/
// 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/
// content/SpinCalc.m
var cos=Math.cos;var sin=Math.sin;var c1=cos(x/2);var c2=cos(y/2);var c3=cos(z/2);var s1=sin(x/2);var s2=sin(y/2);var s3=sin(z/2);if(order==='XYZ'){this._x=s1*c2*c3+c1*s2*s3;this._y=c1*s2*c3-s1*c2*s3;this._z=c1*c2*s3+s1*s2*c3;this._w=c1*c2*c3-s1*s2*s3;}else if(order==='YXZ'){this._x=s1*c2*c3+c1*s2*s3;this._y=c1*s2*c3-s1*c2*s3;this._z=c1*c2*s3-s1*s2*c3;this._w=c1*c2*c3+s1*s2*s3;}else if(order==='ZXY'){this._x=s1*c2*c3-c1*s2*s3;this._y=c1*s2*c3+s1*c2*s3;this._z=c1*c2*s3+s1*s2*c3;this._w=c1*c2*c3-s1*s2*s3;}else if(order==='ZYX'){this._x=s1*c2*c3-c1*s2*s3;this._y=c1*s2*c3+s1*c2*s3;this._z=c1*c2*s3-s1*s2*c3;this._w=c1*c2*c3+s1*s2*s3;}else if(order==='YZX'){this._x=s1*c2*c3+c1*s2*s3;this._y=c1*s2*c3+s1*c2*s3;this._z=c1*c2*s3-s1*s2*c3;this._w=c1*c2*c3-s1*s2*s3;}else if(order==='XZY'){this._x=s1*c2*c3-c1*s2*s3;this._y=c1*s2*c3-s1*c2*s3;this._z=c1*c2*s3+s1*s2*c3;this._w=c1*c2*c3+s1*s2*s3;}if(update!==false)this.onChangeCallback();return this;},setFromAxisAngle:function(axis,angle){// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
// assumes axis is normalized
var halfAngle=angle/2,s=Math.sin(halfAngle);this._x=axis.x*s;this._y=axis.y*s;this._z=axis.z*s;this._w=Math.cos(halfAngle);this.onChangeCallback();return this;},setFromRotationMatrix:function(m){// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
var te=m.elements,m11=te[0],m12=te[4],m13=te[8],m21=te[1],m22=te[5],m23=te[9],m31=te[2],m32=te[6],m33=te[10],trace=m11+m22+m33,s;if(trace>0){s=0.5/Math.sqrt(trace+1.0);this._w=0.25/s;this._x=(m32-m23)*s;this._y=(m13-m31)*s;this._z=(m21-m12)*s;}else if(m11>m22&&m11>m33){s=2.0*Math.sqrt(1.0+m11-m22-m33);this._w=(m32-m23)/s;this._x=0.25*s;this._y=(m12+m21)/s;this._z=(m13+m31)/s;}else if(m22>m33){s=2.0*Math.sqrt(1.0+m22-m11-m33);this._w=(m13-m31)/s;this._x=(m12+m21)/s;this._y=0.25*s;this._z=(m23+m32)/s;}else{s=2.0*Math.sqrt(1.0+m33-m11-m22);this._w=(m21-m12)/s;this._x=(m13+m31)/s;this._y=(m23+m32)/s;this._z=0.25*s;}this.onChangeCallback();return this;},setFromUnitVectors:function(){// assumes direction vectors vFrom and vTo are normalized
var v1=new Vector3();var r;var EPS=0.000001;return function setFromUnitVectors(vFrom,vTo){if(v1===undefined)v1=new Vector3();r=vFrom.dot(vTo)+1;if(r<EPS){r=0;if(Math.abs(vFrom.x)>Math.abs(vFrom.z)){v1.set(-vFrom.y,vFrom.x,0);}else{v1.set(0,-vFrom.z,vFrom.y);}}else{v1.crossVectors(vFrom,vTo);}this._x=v1.x;this._y=v1.y;this._z=v1.z;this._w=r;return this.normalize();};}(),inverse:function(){// quaternion is assumed to have unit length
return this.conjugate();},conjugate:function(){this._x*=-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this;},dot:function(v){return this._x*v._x+this._y*v._y+this._z*v._z+this._w*v._w;},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w;},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w);},normalize:function(){var l=this.length();if(l===0){this._x=0;this._y=0;this._z=0;this._w=1;}else{l=1/l;this._x=this._x*l;this._y=this._y*l;this._z=this._z*l;this._w=this._w*l;}this.onChangeCallback();return this;},multiply:function(q,p){if(p!==undefined){console.warn('THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.');return this.multiplyQuaternions(q,p);}return this.multiplyQuaternions(this,q);},premultiply:function(q){return this.multiplyQuaternions(q,this);},multiplyQuaternions:function(a,b){// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
var qax=a._x,qay=a._y,qaz=a._z,qaw=a._w;var qbx=b._x,qby=b._y,qbz=b._z,qbw=b._w;this._x=qax*qbw+qaw*qbx+qay*qbz-qaz*qby;this._y=qay*qbw+qaw*qby+qaz*qbx-qax*qbz;this._z=qaz*qbw+qaw*qbz+qax*qby-qay*qbx;this._w=qaw*qbw-qax*qbx-qay*qby-qaz*qbz;this.onChangeCallback();return this;},slerp:function(qb,t){if(t===0)return this;if(t===1)return this.copy(qb);var x=this._x,y=this._y,z=this._z,w=this._w;// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/
var cosHalfTheta=w*qb._w+x*qb._x+y*qb._y+z*qb._z;if(cosHalfTheta<0){this._w=-qb._w;this._x=-qb._x;this._y=-qb._y;this._z=-qb._z;cosHalfTheta=-cosHalfTheta;}else{this.copy(qb);}if(cosHalfTheta>=1.0){this._w=w;this._x=x;this._y=y;this._z=z;return this;}var sinHalfTheta=Math.sqrt(1.0-cosHalfTheta*cosHalfTheta);if(Math.abs(sinHalfTheta)<0.001){this._w=0.5*(w+this._w);this._x=0.5*(x+this._x);this._y=0.5*(y+this._y);this._z=0.5*(z+this._z);return this;}var halfTheta=Math.atan2(sinHalfTheta,cosHalfTheta);var ratioA=Math.sin((1-t)*halfTheta)/sinHalfTheta,ratioB=Math.sin(t*halfTheta)/sinHalfTheta;this._w=w*ratioA+this._w*ratioB;this._x=x*ratioA+this._x*ratioB;this._y=y*ratioA+this._y*ratioB;this._z=z*ratioA+this._z*ratioB;this.onChangeCallback();return this;},equals:function(quaternion){return quaternion._x===this._x&&quaternion._y===this._y&&quaternion._z===this._z&&quaternion._w===this._w;},fromArray:function(array,offset){if(offset===undefined)offset=0;this._x=array[offset];this._y=array[offset+1];this._z=array[offset+2];this._w=array[offset+3];this.onChangeCallback();return this;},toArray:function(array,offset){if(array===undefined)array=[];if(offset===undefined)offset=0;array[offset]=this._x;array[offset+1]=this._y;array[offset+2]=this._z;array[offset+3]=this._w;return array;},onChange:function(callback){this.onChangeCallback=callback;return this;},onChangeCallback:function(){}});/**
* @author mrdoob / http://mrdoob.com/
* @author kile / http://kile.stravaganza.org/
* @author philogb / http://blog.thejit.org/
* @author mikael emtinger / http://gomo.se/
* @author egraether / http://egraether.com/
* @author WestLangley / http://github.com/WestLangley
*/function Vector3(x,y,z){this.x=x||0;this.y=y||0;this.z=z||0;}Object.assign(Vector3.prototype,{isVector3:true,set:function(x,y,z){this.x=x;this.y=y;this.z=z;return this;},setScalar:function(scalar){this.x=scalar;this.y=scalar;this.z=scalar;return this;},setX:function(x){this.x=x;return this;},setY:function(y){this.y=y;return this;},setZ:function(z){this.z=z;return this;},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;case 2:this.z=value;break;default:throw new Error('index is out of range: '+index);}return this;},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error('index is out of range: '+index);}},clone:function(){return new this.constructor(this.x,this.y,this.z);},copy:function(v){this.x=v.x;this.y=v.y;this.z=v.z;return this;},add:function(v,w){if(w!==undefined){console.warn('THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');return this.addVectors(v,w);}this.x+=v.x;this.y+=v.y;this.z+=v.z;return this;},addScalar:function(s){this.x+=s;this.y+=s;this.z+=s;return this;},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this;},addScaledVector:function(v,s){this.x+=v.x*s;this.y+=v.y*s;this.z+=v.z*s;return this;},sub:function(v,w){if(w!==undefined){console.warn('THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');return this.subVectors(v,w);}this.x-=v.x;this.y-=v.y;this.z-=v.z;return this;},subScalar:function(s){this.x-=s;this.y-=s;this.z-=s;return this;},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this;},multiply:function(v,w){if(w!==undefined){console.warn('THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.');return this.multiplyVectors(v,w);}this.x*=v.x;this.y*=v.y;this.z*=v.z;return this;},multiplyScalar:function(scalar){this.x*=scalar;this.y*=scalar;this.z*=scalar;return this;},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this;},applyEuler:function(){var quaternion=new Quaternion();return function applyEuler(euler){if(!(euler&&euler.isEuler)){console.error('THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.');}return this.applyQuaternion(quaternion.setFromEuler(euler));};}(),applyAxisAngle:function(){var quaternion=new Quaternion();return function applyAxisAngle(axis,angle){return this.applyQuaternion(quaternion.setFromAxisAngle(axis,angle));};}(),applyMatrix3:function(m){var x=this.x,y=this.y,z=this.z;var e=m.elements;this.x=e[0]*x+e[3]*y+e[6]*z;this.y=e[1]*x+e[4]*y+e[7]*z;this.z=e[2]*x+e[5]*y+e[8]*z;return this;},applyMatrix4:function(m){var x=this.x,y=this.y,z=this.z;var e=m.elements;var w=1/(e[3]*x+e[7]*y+e[11]*z+e[15]);this.x=(e[0]*x+e[4]*y+e[8]*z+e[12])*w;this.y=(e[1]*x+e[5]*y+e[9]*z+e[13])*w;this.z=(e[2]*x+e[6]*y+e[10]*z+e[14])*w;return this;},applyQuaternion:function(q){var x=this.x,y=this.y,z=this.z;var qx=q.x,qy=q.y,qz=q.z,qw=q.w;// calculate quat * vector
var ix=qw*x+qy*z-qz*y;var iy=qw*y+qz*x-qx*z;var iz=qw*z+qx*y-qy*x;var iw=-qx*x-qy*y-qz*z;// calculate result * inverse quat
this.x=ix*qw+iw*-qx+iy*-qz-iz*-qy;this.y=iy*qw+iw*-qy+iz*-qx-ix*-qz;this.z=iz*qw+iw*-qz+ix*-qy-iy*-qx;return this;},project:function(){var matrix=new Matrix4();return function project(camera){matrix.multiplyMatrices(camera.projectionMatrix,matrix.getInverse(camera.matrixWorld));return this.applyMatrix4(matrix);};}(),unproject:function(){var matrix=new Matrix4();return function unproject(camera){matrix.multiplyMatrices(camera.matrixWorld,matrix.getInverse(camera.projectionMatrix));return this.applyMatrix4(matrix);};}(),transformDirection:function(m){// input: THREE.Matrix4 affine matrix
// vector interpreted as a direction
var x=this.x,y=this.y,z=this.z;var e=m.elements;this.x=e[0]*x+e[4]*y+e[8]*z;this.y=e[1]*x+e[5]*y+e[9]*z;this.z=e[2]*x+e[6]*y+e[10]*z;return this.normalize();},divide:function(v){this.x/=v.x;this.y/=v.y;this.z/=v.z;return this;},divideScalar:function(scalar){return this.multiplyScalar(1/scalar);},min:function(v){this.x=Math.min(this.x,v.x);this.y=Math.min(this.y,v.y);this.z=Math.min(this.z,v.z);return this;},max:function(v){this.x=Math.max(this.x,v.x);this.y=Math.max(this.y,v.y);this.z=Math.max(this.z,v.z);return this;},clamp:function(min,max){// assumes min < max, componentwise
this.x=Math.max(min.x,Math.min(max.x,this.x));this.y=Math.max(min.y,Math.min(max.y,this.y));this.z=Math.max(min.z,Math.min(max.z,this.z));return this;},clampScalar:function(){var min=new Vector3();var max=new Vector3();return function clampScalar(minVal,maxVal){min.set(minVal,minVal,minVal);max.set(maxVal,maxVal,maxVal);return this.clamp(min,max);};}(),clampLength:function(min,max){var length=this.length();return this.divideScalar(length||1).multiplyScalar(Math.max(min,Math.min(max,length)));},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this;},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this;},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this;},roundToZero:function(){this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x);this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y);this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z);return this;},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this;},dot:function(v){return this.x*v.x+this.y*v.y+this.z*v.z;},// TODO lengthSquared?
lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z;},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z);},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z);},normalize:function(){return this.divideScalar(this.length()||1);},setLength:function(length){return this.normalize().multiplyScalar(length);},lerp:function(v,alpha){this.x+=(v.x-this.x)*alpha;this.y+=(v.y-this.y)*alpha;this.z+=(v.z-this.z)*alpha;return this;},lerpVectors:function(v1,v2,alpha){return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1);},cross:function(v,w){if(w!==undefined){console.warn('THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.');return this.crossVectors(v,w);}return this.crossVectors(this,v);},crossVectors:function(a,b){var ax=a.x,ay=a.y,az=a.z;var bx=b.x,by=b.y,bz=b.z;this.x=ay*bz-az*by;this.y=az*bx-ax*bz;this.z=ax*by-ay*bx;return this;},projectOnVector:function(vector){var scalar=vector.dot(this)/vector.lengthSq();return this.copy(vector).multiplyScalar(scalar);},projectOnPlane:function(){var v1=new Vector3();return function projectOnPlane(planeNormal){v1.copy(this).projectOnVector(planeNormal);return this.sub(v1);};}(),reflect:function(){// reflect incident vector off plane orthogonal to normal
// normal is assumed to have unit length
var v1=new Vector3();return function reflect(normal){return this.sub(v1.copy(normal).multiplyScalar(2*this.dot(normal)));};}(),angleTo:function(v){var theta=this.dot(v)/Math.sqrt(this.lengthSq()*v.lengthSq());// clamp, to handle numerical problems
return Math.acos(_Math.clamp(theta,-1,1));},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v));},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y,dz=this.z-v.z;return dx*dx+dy*dy+dz*dz;},manhattanDistanceTo:function(v){return Math.abs(this.x-v.x)+Math.abs(this.y-v.y)+Math.abs(this.z-v.z);},setFromSpherical:function(s){var sinPhiRadius=Math.sin(s.phi)*s.radius;this.x=sinPhiRadius*Math.sin(s.theta);this.y=Math.cos(s.phi)*s.radius;this.z=sinPhiRadius*Math.cos(s.theta);return this;},setFromCylindrical:function(c){this.x=c.radius*Math.sin(c.theta);this.y=c.y;this.z=c.radius*Math.cos(c.theta);return this;},setFromMatrixPosition:function(m){var e=m.elements;this.x=e[12];this.y=e[13];this.z=e[14];return this;},setFromMatrixScale:function(m){var sx=this.setFromMatrixColumn(m,0).length();var sy=this.setFromMatrixColumn(m,1).length();var sz=this.setFromMatrixColumn(m,2).length();this.x=sx;this.y=sy;this.z=sz;return this;},setFromMatrixColumn:function(m,index){return this.fromArray(m.elements,index*4);},equals:function(v){return v.x===this.x&&v.y===this.y&&v.z===this.z;},fromArray:function(array,offset){if(offset===undefined)offset=0;this.x=array[offset];this.y=array[offset+1];this.z=array[offset+2];return this;},toArray:function(array,offset){if(array===undefined)array=[];if(offset===undefined)offset=0;array[offset]=this.x;array[offset+1]=this.y;array[offset+2]=this.z;return array;},fromBufferAttribute:function(attribute,index,offset){if(offset!==undefined){console.warn('THREE.Vector3: offset has been removed from .fromBufferAttribute().');}this.x=attribute.getX(index);this.y=attribute.getY(index);this.z=attribute.getZ(index);return this;}});/**
* @author alteredq / http://alteredqualia.com/
* @author WestLangley / http://github.com/WestLangley
* @author bhouston / http://clara.io
* @author tschw
*/function Matrix3(){this.elements=[1,0,0,0,1,0,0,0,1];if(arguments.length>0){console.error('THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.');}}Object.assign(Matrix3.prototype,{isMatrix3:true,set:function(n11,n12,n13,n21,n22,n23,n31,n32,n33){var te=this.elements;te[0]=n11;te[1]=n21;te[2]=n31;te[3]=n12;te[4]=n22;te[5]=n32;te[6]=n13;te[7]=n23;te[8]=n33;return this;},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this;},clone:function(){return new this.constructor().fromArray(this.elements);},copy:function(m){var te=this.elements;var me=m.elements;te[0]=me[0];te[1]=me[1];te[2]=me[2];te[3]=me[3];te[4]=me[4];te[5]=me[5];te[6]=me[6];te[7]=me[7];te[8]=me[8];return this;},setFromMatrix4:function(m){var me=m.elements;this.set(me[0],me[4],me[8],me[1],me[5],me[9],me[2],me[6],me[10]);return this;},applyToBufferAttribute:function(){var v1=new Vector3();return function applyToBufferAttribute(attribute){for(var i=0,l=attribute.count;i<l;i++){v1.x=attribute.getX(i);v1.y=attribute.getY(i);v1.z=attribute.getZ(i);v1.applyMatrix3(this);attribute.setXYZ(i,v1.x,v1.y,v1.z);}return attribute;};}(),multiply:function(m){return this.multiplyMatrices(this,m);},premultiply:function(m){return this.multiplyMatrices(m,this);},multiplyMatrices:function(a,b){var ae=a.elements;var be=b.elements;var te=this.elements;var a11=ae[0],a12=ae[3],a13=ae[6];var a21=ae[1],a22=ae[4],a23=ae[7];var a31=ae[2],a32=ae[5],a33=ae[8];var b11=be[0],b12=be[3],b13=be[6];var b21=be[1],b22=be[4],b23=be[7];var b31=be[2],b32=be[5],b33=be[8];te[0]=a11*b11+a12*b21+a13*b31;te[3]=a11*b12+a12*b22+a13*b32;te[6]=a11*b13+a12*b23+a13*b33;te[1]=a21*b11+a22*b21+a23*b31;te[4]=a21*b12+a22*b22+a23*b32;te[7]=a21*b13+a22*b23+a23*b33;te[2]=a31*b11+a32*b21+a33*b31;te[5]=a31*b12+a32*b22+a33*b32;te[8]=a31*b13+a32*b23+a33*b33;return this;},multiplyScalar:function(s){var te=this.elements;te[0]*=s;te[3]*=s;te[6]*=s;te[1]*=s;te[4]*=s;te[7]*=s;te[2]*=s;te[5]*=s;te[8]*=s;return this;},determinant:function(){var te=this.elements;var a=te[0],b=te[1],c=te[2],d=te[3],e=te[4],f=te[5],g=te[6],h=te[7],i=te[8];return a*e*i-a*f*h-b*d*i+b*f*g+c*d*h-c*e*g;},getInverse:function(matrix,throwOnDegenerate){if(matrix&&matrix.isMatrix4){console.error("THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.");}var me=matrix.elements,te=this.elements,n11=me[0],n21=me[1],n31=me[2],n12=me[3],n22=me[4],n32=me[5],n13=me[6],n23=me[7],n33=me[8],t11=n33*n22-n32*n23,t12=n32*n13-n33*n12,t13=n23*n12-n22*n13,det=n11*t11+n21*t12+n31*t13;if(det===0){var msg="THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0";if(throwOnDegenerate===true){throw new Error(msg);}else{console.warn(msg);}return this.identity();}var detInv=1/det;te[0]=t11*detInv;te[1]=(n31*n23-n33*n21)*detInv;te[2]=(n32*n21-n31*n22)*detInv;te[3]=t12*detInv;te[4]=(n33*n11-n31*n13)*detInv;te[5]=(n31*n12-n32*n11)*detInv;te[6]=t13*detInv;te[7]=(n21*n13-n23*n11)*detInv;te[8]=(n22*n11-n21*n12)*detInv;return this;},transpose:function(){var tmp,m=this.elements;tmp=m[1];m[1]=m[3];m[3]=tmp;tmp=m[2];m[2]=m[6];m[6]=tmp;tmp=m[5];m[5]=m[7];m[7]=tmp;return this;},getNormalMatrix:function(matrix4){return this.setFromMatrix4(matrix4).getInverse(this).transpose();},transposeIntoArray:function(r){var m=this.elements;r[0]=m[0];r[1]=m[3];r[2]=m[6];r[3]=m[1];r[4]=m[4];r[5]=m[7];r[6]=m[2];r[7]=m[5];r[8]=m[8];return this;},setUvTransform:function(tx,ty,sx,sy,rotation,cx,cy){var c=Math.cos(rotation);var s=Math.sin(rotation);this.set(sx*c,sx*s,-sx*(c*cx+s*cy)+cx+tx,-sy*s,sy*c,-sy*(-s*cx+c*cy)+cy+ty,0,0,1);},scale:function(sx,sy){var te=this.elements;te[0]*=sx;te[3]*=sx;te[6]*=sx;te[1]*=sy;te[4]*=sy;te[7]*=sy;return this;},rotate:function(theta){var c=Math.cos(theta);var s=Math.sin(theta);var te=this.elements;var a11=te[0],a12=te[3],a13=te[6];var a21=te[1],a22=te[4],a23=te[7];te[0]=c*a11+s*a21;te[3]=c*a12+s*a22;te[6]=c*a13+s*a23;te[1]=-s*a11+c*a21;te[4]=-s*a12+c*a22;te[7]=-s*a13+c*a23;return this;},translate:function(tx,ty){var te=this.elements;te[0]+=tx*te[2];te[3]+=tx*te[5];te[6]+=tx*te[8];te[1]+=ty*te[2];te[4]+=ty*te[5];te[7]+=ty*te[8];return this;},equals:function(matrix){var te=this.elements;var me=matrix.elements;for(var i=0;i<9;i++){if(te[i]!==me[i])return false;}return true;},fromArray:function(array,offset){if(offset===undefined)offset=0;for(var i=0;i<9;i++){this.elements[i]=array[i+offset];}return this;},toArray:function(array,offset){if(array===undefined)array=[];if(offset===undefined)offset=0;var te=this.elements;array[offset]=te[0];array[offset+1]=te[1];array[offset+2]=te[2];array[offset+3]=te[3];array[offset+4]=te[4];array[offset+5]=te[5];array[offset+6]=te[6];array[offset+7]=te[7];array[offset+8]=te[8];return array;}});/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
* @author szimek / https://github.com/szimek/
*/var textureId=0;function Texture(image,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy,encoding){Object.defineProperty(this,'id',{value:textureId++});this.uuid=_Math.generateUUID();this.name='';this.image=image!==undefined?image:Texture.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=mapping!==undefined?mapping:Texture.DEFAULT_MAPPING;this.wrapS=wrapS!==undefined?wrapS:ClampToEdgeWrapping;this.wrapT=wrapT!==undefined?wrapT:ClampToEdgeWrapping;this.magFilter=magFilter!==undefined?magFilter:LinearFilter;this.minFilter=minFilter!==undefined?minFilter:LinearMipMapLinearFilter;this.anisotropy=anisotropy!==undefined?anisotropy:1;this.format=format!==undefined?format:RGBAFormat;this.type=type!==undefined?type:UnsignedByteType;this.offset=new Vector2(0,0);this.repeat=new Vector2(1,1);this.center=new Vector2(0,0);this.rotation=0;this.matrixAutoUpdate=true;this.matrix=new Matrix3();this.generateMipmaps=true;this.premultiplyAlpha=false;this.flipY=true;this.unpackAlignment=4;// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)
// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.
//
// Also changing the encoding after already used by a Material will not automatically make the Material
// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.
this.encoding=encoding!==undefined?encoding:LinearEncoding;this.version=0;this.onUpdate=null;}Texture.DEFAULT_IMAGE=undefined;Texture.DEFAULT_MAPPING=UVMapping;Texture.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:Texture,isTexture:true,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y);},clone:function(){return new this.constructor().copy(this);},copy:function(source){this.name=source.name;this.image=source.image;this.mipmaps=source.mipmaps.slice(0);this.mapping=source.mapping;this.wrapS=source.wrapS;this.wrapT=source.wrapT;this.magFilter=source.magFilter;this.minFilter=source.minFilter;this.anisotropy=source.anisotropy;this.format=source.format;this.type=source.type;this.offset.copy(source.offset);this.repeat.copy(source.repeat);this.center.copy(source.center);this.rotation=source.rotation;this.matrixAutoUpdate=source.matrixAutoUpdate;this.matrix.copy(source.matrix);this.generateMipmaps=source.generateMipmaps;this.premultiplyAlpha=source.premultiplyAlpha;this.flipY=source.flipY;this.unpackAlignment=source.unpackAlignment;this.encoding=source.encoding;return this;},toJSON:function(meta){var isRootObject=meta===undefined||typeof meta==='string';if(!isRootObject&&meta.textures[this.uuid]!==undefined){return meta.textures[this.uuid];}function getDataURL(image){var canvas;if(image instanceof HTMLCanvasElement){canvas=image;}else{canvas=document.createElementNS('http://www.w3.org/1999/xhtml','canvas');canvas.width=image.width;canvas.height=image.height;var context=canvas.getContext('2d');if(image instanceof ImageData){context.putImageData(image,0,0);}else{context.drawImage(image,0,0,image.width,image.height);}}if(canvas.width>2048||canvas.height>2048){return canvas.toDataURL('image/jpeg',0.6);}else{return canvas.toDataURL('image/png');}}var output={metadata:{version:4.5,type:'Texture',generator:'Texture.toJSON'},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(this.image!==undefined){// TODO: Move to THREE.Image
var image=this.image;if(image.uuid===undefined){image.uuid=_Math.generateUUID();// UGH
}if(!isRootObject&&meta.images[image.uuid]===undefined){meta.images[image.uuid]={uuid:image.uuid,url:getDataURL(image)};}output.image=image.uuid;}if(!isRootObject){meta.textures[this.uuid]=output;}return output;},dispose:function(){this.dispatchEvent({type:'dispose'});},transformUv:function(uv){if(this.mapping!==UVMapping)return;uv.applyMatrix3(this.matrix);if(uv.x<0||uv.x>1){switch(this.wrapS){case RepeatWrapping:uv.x=uv.x-Math.floor(uv.x);break;case ClampToEdgeWrapping:uv.x=uv.x<0?0:1;break;case MirroredRepeatWrapping:if(Math.abs(Math.floor(uv.x)%2)===1){uv.x=Math.ceil(uv.x)-uv.x;}else{uv.x=uv.x-Math.floor(uv.x);}break;}}if(uv.y<0||uv.y>1){switch(this.wrapT){case RepeatWrapping:uv.y=uv.y-Math.floor(uv.y);break;case ClampToEdgeWrapping:uv.y=uv.y<0?0:1;break;case MirroredRepeatWrapping:if(Math.abs(Math.floor(uv.y)%2)===1){uv.y=Math.ceil(uv.y)-uv.y;}else{uv.y=uv.y-Math.floor(uv.y);}break;}}if(this.flipY){uv.y=1-uv.y;}}});Object.defineProperty(Texture.prototype,"needsUpdate",{set:function(value){if(value===true)this.version++;}});/**
* @author supereggbert / http://www.paulbrunt.co.uk/
* @author philogb / http://blog.thejit.org/
* @author mikael emtinger / http://gomo.se/
* @author egraether / http://egraether.com/
* @author WestLangley / http://github.com/WestLangley
*/function Vector4(x,y,z,w){this.x=x||0;this.y=y||0;this.z=z||0;this.w=w!==undefined?w:1;}Object.assign(Vector4.prototype,{isVector4:true,set:function(x,y,z,w){this.x=x;this.y=y;this.z=z;this.w=w;return this;},setScalar:function(scalar){this.x=scalar;this.y=scalar;this.z=scalar;this.w=scalar;return this;},setX:function(x){this.x=x;return this;},setY:function(y){this.y=y;return this;},setZ:function(z){this.z=z;return this;},setW:function(w){this.w=w;return this;},setComponent:function(index,value){switch(index){case 0:this.x=value;break;case 1:this.y=value;break;case 2:this.z=value;break;case 3:this.w=value;break;default:throw new Error('index is out of range: '+index);}return this;},getComponent:function(index){switch(index){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error('index is out of range: '+index);}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w);},copy:function(v){this.x=v.x;this.y=v.y;this.z=v.z;this.w=v.w!==undefined?v.w:1;return this;},add:function(v,w){if(w!==undefined){console.warn('THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');return this.addVectors(v,w);}this.x+=v.x;this.y+=v.y;this.z+=v.z;this.w+=v.w;return this;},addScalar:function(s){this.x+=s;this.y+=s;this.z+=s;this.w+=s;return this;},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this;},addScaledVector:function(v,s){this.x+=v.x*s;this.y+=v.y*s;this.z+=v.z*s;this.w+=v.w*s;return this;},sub:function(v,w){if(w!==undefined){console.warn('THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');return this.subVectors(v,w);}this.x-=v.x;this.y-=v.y;this.z-=v.z;this.w-=v.w;return this;},subScalar:function(s){this.x-=s;this.y-=s;this.z-=s;this.w-=s;return this;},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this;},multiplyScalar:function(scalar){this.x*=scalar;this.y*=scalar;this.z*=scalar;this.w*=scalar;return this;},applyMatrix4:function(m){var x=this.x,y=this.y,z=this.z,w=this.w;var e=m.elements;this.x=e[0]*x+e[4]*y+e[8]*z+e[12]*w;this.y=e[1]*x+e[5]*y+e[9]*z+e[13]*w;this.z=e[2]*x+e[6]*y+e[10]*z+e[14]*w;this.w=e[3]*x+e[7]*y+e[11]*z+e[15]*w;return this;},divideScalar:function(scalar){return this.multiplyScalar(1/scalar);},setAxisAngleFromQuaternion:function(q){// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm
// q is assumed to be normalized
this.w=2*Math.acos(q.w);var s=Math.sqrt(1-q.w*q.w);if(s<0.0001){this.x=1;this.y=0;this.z=0;}else{this.x=q.x/s;this.y=q.y/s;this.z=q.z/s;}return this;},setAxisAngleFromRotationMatrix:function(m){// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm
// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
var angle,x,y,z,// variables for result
epsilon=0.01,// margin to allow for rounding errors
epsilon2=0.1,// margin to distinguish between 0 and 180 degrees
te=m.elements,m11=te[0],m12=te[4],m13=te[8],m21=te[1],m22=te[5],m23=te[9],m31=te[2],m32=te[6],m33=te[10];if(Math.abs(m12-m21)<epsilon&&Math.abs(m13-m31)<epsilon&&Math.abs(m23-m32)<epsilon){// singularity found
// first check for identity matrix which must have +1 for all terms
// in leading diagonal and zero in other terms
if(Math.abs(m12+m21)<epsilon2&&Math.abs(m13+m31)<epsilon2&&Math.abs(m23+m32)<epsilon2&&Math.abs(m11+m22+m33-3)<epsilon2){// this singularity is identity matrix so angle = 0
this.set(1,0,0,0);return this;// zero angle, arbitrary axis
}// otherwise this singularity is angle = 180
angle=Math.PI;var xx=(m11+1)/2;var yy=(m22+1)/2;var zz=(m33+1)/2;var xy=(m12+m21)/4;var xz=(m13+m31)/4;var yz=(m23+m32)/4;if(xx>yy&&xx>zz){// m11 is the largest diagonal term
if(xx<epsilon){x=0;y=0.707106781;z=0.707106781;}else{x=Math.sqrt(xx);y=xy/x;z=xz/x;}}else if(yy>zz){// m22 is the largest diagonal term
if(yy<epsilon){x=0.707106781;y=0;z=0.707106781;}else{y=Math.sqrt(yy);x=xy/y;z=yz/y;}}else{// m33 is the largest diagonal term so base result on this
if(zz<epsilon){x=0.707106781;y=0.707106781;z=0;}else{z=Math.sqrt(zz);x=xz/z;y=yz/z;}}this.set(x,y,z,angle);return this;// return 180 deg rotation
}// as we have reached here there are no singularities so we can handle normally
var s=Math.sqrt((m32-m23)*(m32-m23)+(m13-m31)*(m13-m31)+(m21-m12)*(m21-m12));// used to normalize
if(Math.abs(s)<0.001)s=1;// prevent divide by zero, should not happen if matrix is orthogonal and should be
// caught by singularity test above, but I've left it in just in case
this.x=(m32-m23)/s;this.y=(m13-m31)/s;this.z=(m21-m12)/s;this.w=Math.acos((m11+m22+m33-1)/2);return this;},min:function(v){this.x=Math.min(this.x,v.x);this.y=Math.min(this.y,v.y);this.z=Math.min(this.z,v.z);this.w=Math.min(this.w,v.w);return this;},max:function(v){this.x=Math.max(this.x,v.x);this.y=Math.max(this.y,v.y);this.z=Math.max(this.z,v.z);this.w=Math.max(this.w,v.w);return this;},clamp:function(min,max){// assumes min < max, componentwise
this.x=Math.max(min.x,Math.min(max.x,this.x));this.y=Math.max(min.y,Math.min(max.y,this.y));this.z=Math.max(min.z,Math.min(max.z,this.z));this.w=Math.max(min.w,Math.min(max.w,this.w));return this;},clampScalar:function(){var min,max;return function clampScalar(minVal,maxVal){if(min===undefined){min=new Vector4();max=new Vector4();}min.set(minVal,minVal,minVal,minVal);max.set(maxVal,maxVal,maxVal,maxVal);return this.clamp(min,max);};}(),clampLength:function(min,max){var length=this.length();return this.divideScalar(length||1).multiplyScalar(Math.max(min,Math.min(max,length)));},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this;},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this;},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);this.w=Math.round(this.w);return this;},roundToZero:function(){this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x);this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y);this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z);this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w);return this;},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this;},dot:function(v){return this.x*v.x+this.y*v.y+this.z*v.z+this.w*v.w;},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w;},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w);},normalize:function(){return this.divideScalar(this.length()||1);},setLength:function(length){return this.normalize().multiplyScalar(length);},lerp:function(v,alpha){this.x+=(v.x-this.x)*alpha;this.y+=(v.y-this.y)*alpha;this.z+=(v.z-this.z)*alpha;this.w+=(v.w-this.w)*alpha;return this;},lerpVectors:function(v1,v2,alpha){return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1);},equals:function(v){return v.x===this.x&&v.y===this.y&&v.z===this.z&&v.w===this.w;},fromArray:function(array,offset){if(offset===undefined)offset=0;this.x=array[offset];this.y=array[offset+1];this.z=array[offset+2];this.w=array[offset+3];return this;},toArray:function(array,offset){if(array===undefined)array=[];if(offset===undefined)offset=0;array[offset]=this.x;array[offset+1]=this.y;array[offset+2]=this.z;array[offset+3]=this.w;return array;},fromBufferAttribute:function(attribute,index,offset){if(offset!==undefined){console.warn('THREE.Vector4: offset has been removed from .fromBufferAttribute().');}this.x=attribute.getX(index);this.y=attribute.getY(index);this.z=attribute.getZ(index);this.w=attribute.getW(index);return this;}});/**
* @author szimek / https://github.com/szimek/
* @author alteredq / http://alteredqualia.com/
* @author Marius Kintel / https://github.com/kintel
*/ /*
In options, we can specify:
* Texture parameters for an auto-generated target texture
* depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers
*/function WebGLRenderTarget(width,height,options){this.width=width;this.height=height;this.scissor=new Vector4(0,0,width,height);this.scissorTest=false;this.viewport=new Vector4(0,0,width,height);options=options||{};if(options.minFilter===undefined)options.minFilter=LinearFilter;this.texture=new Texture(undefined,undefined,options.wrapS,options.wrapT,options.magFilter,options.minFilter,options.format,options.type,options.anisotropy,options.encoding);this.depthBuffer=options.depthBuffer!==undefined?options.depthBuffer:true;this.stencilBuffer=options.stencilBuffer!==undefined?options.stencilBuffer:true;this.depthTexture=options.depthTexture!==undefined?options.depthTexture:null;}WebGLRenderTarget.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:WebGLRenderTarget,isWebGLRenderTarget:true,setSize:function(width,height){if(this.width!==width||this.height!==height){this.width=width;this.height=height;this.dispose();}this.viewport.set(0,0,width,height);this.scissor.set(0,0,width,height);},clone:function(){return new this.constructor().copy(this);},copy:function(source){this.width=source.width;this.height=source.height;this.viewport.copy(source.viewport);this.texture=source.texture.clone();this.depthBuffer=source.depthBuffer;this.stencilBuffer=source.stencilBuffer;this.depthTexture=source.depthTexture;return this;},dispose:function(){this.dispatchEvent({type:'dispose'});}});/**
* @author alteredq / http://alteredqualia.com
*/function WebGLRenderTargetCube(width,height,options){WebGLRenderTarget.call(this,width,height,options);this.activeCubeFace=0;// PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5
this.activeMipMapLevel=0;}WebGLRenderTargetCube.prototype=Object.create(WebGLRenderTarget.prototype);WebGLRenderTargetCube.prototype.constructor=WebGLRenderTargetCube;WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube=true;/**
* @author alteredq / http://alteredqualia.com/
*/function DataTexture(data,width,height,format,type,mapping,wrapS,wrapT,magFilter,minFilter,anisotropy,encoding){Texture.call(this,null,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy,encoding);this.image={data:data,width:width,height:height};this.magFilter=magFilter!==undefined?magFilter:NearestFilter;this.minFilter=minFilter!==undefined?minFilter:NearestFilter;this.generateMipmaps=false;this.flipY=false;this.unpackAlignment=1;}DataTexture.prototype=Object.create(Texture.prototype);DataTexture.prototype.constructor=DataTexture;DataTexture.prototype.isDataTexture=true;/**
* @author bhouston / http://clara.io
* @author WestLangley / http://github.com/WestLangley
*/function Box3(min,max){this.min=min!==undefined?min:new Vector3(+Infinity,+Infinity,+Infinity);this.max=max!==undefined?max:new Vector3(-Infinity,-Infinity,-Infinity);}Object.assign(Box3.prototype,{isBox3:true,set:function(min,max){this.min.copy(min);this.max.copy(max);return this;},setFromArray:function(array){var minX=+Infinity;var minY=+Infinity;var minZ=+Infinity;var maxX=-Infinity;var maxY=-Infinity;var maxZ=-Infinity;for(var i=0,l=array.length;i<l;i+=3){var x=array[i];var y=array[i+1];var z=array[i+2];if(x<minX)minX=x;if(y<minY)minY=y;if(z<minZ)minZ=z;if(x>maxX)maxX=x;if(y>maxY)maxY=y;if(z>maxZ)maxZ=z;}this.min.set(minX,minY,minZ);this.max.set(maxX,maxY,maxZ);return this;},setFromBufferAttribute:function(attribute){var minX=+Infinity;var minY=+Infinity;var minZ=+Infinity;var maxX=-Infinity;var maxY=-Infinity;var maxZ=-Infinity;for(var i=0,l=attribute.count;i<l;i++){var x=attribute.getX(i);var y=attribute.getY(i);var z=attribute.getZ(i);if(x<minX)minX=x;if(y<minY)minY=y;if(z<minZ)minZ=z;if(x>maxX)maxX=x;if(y>maxY)maxY=y;if(z>maxZ)maxZ=z;}this.min.set(minX,minY,minZ);this.max.set(maxX,maxY,maxZ);return this;},setFromPoints:function(points){this.makeEmpty();for(var i=0,il=points.length;i<il;i++){this.expandByPoint(points[i]);}return this;},setFromCenterAndSize:function(){var v1=new Vector3();return function setFromCenterAndSize(center,size){var halfSize=v1.copy(size).multiplyScalar(0.5);this.min.copy(center).sub(halfSize);this.max.copy(center).add(halfSize);return this;};}(),setFromObject:function(object){this.makeEmpty();return this.expandByObject(object);},clone:function(){return new this.constructor().copy(this);},copy:function(box){this.min.copy(box.min);this.max.copy(box.max);return this;},makeEmpty:function(){this.min.x=this.min.y=this.min.z=+Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this;},isEmpty:function(){// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z;},getCenter:function(target){if(target===undefined){console.warn('THREE.Box3: .getCenter() target is now required');target=new Vector3();}return this.isEmpty()?target.set(0,0,0):target.addVectors(this.min,this.max).multiplyScalar(0.5);},getSize:function(target){if(target===undefined){console.warn('THREE.Box3: .getSize() target is now required');target=new Vector3();}return this.isEmpty()?target.set(0,0,0):target.subVectors(this.max,this.min);},expandByPoint:function(point){this.min.min(point);this.max.max(point);return this;},expandByVector:function(vector){this.min.sub(vector);this.max.add(vector);return this;},expandByScalar:function(scalar){this.min.addScalar(-scalar);this.max.addScalar(scalar);return this;},expandByObject:function(){// Computes the world-axis-aligned bounding box of an object (including its children),
// accounting for both the object's, and children's, world transforms
var scope,i,l;var v1=new Vector3();function traverse(node){var geometry=node.geometry;if(geometry!==undefined){if(geometry.isGeometry){var vertices=geometry.vertices;for(i=0,l=vertices.length;i<l;i++){v1.copy(vertices[i]);v1.applyMatrix4(node.matrixWorld);scope.expandByPoint(v1);}}else if(geometry.isBufferGeometry){var attribute=geometry.attributes.position;if(attribute!==undefined){for(i=0,l=attribute.count;i<l;i++){v1.fromBufferAttribute(attribute,i).applyMatrix4(node.matrixWorld);scope.expandByPoint(v1);}}}}}return function expandByObject(object){scope=this;object.updateMatrixWorld(true);object.traverse(traverse);return this;};}(),containsPoint:function(point){return point.x<this.min.x||point.x>this.max.x||point.y<this.min.y||point.y>this.max.y||point.z<this.min.z||point.z>this.max.z?false:true;},containsBox:function(box){return this.min.x<=box.min.x&&box.max.x<=this.max.x&&this.min.y<=box.min.y&&box.max.y<=this.max.y&&this.min.z<=box.min.z&&box.max.z<=this.max.z;},getParameter:function(point,target){// This can potentially have a divide by zero if the box
// has a size dimension of 0.
if(target===undefined){console.warn('THREE.Box3: .getParameter() target is now required');target=new Vector3();}return target.set((point.x-this.min.x)/(this.max.x-this.min.x),(point.y-this.min.y)/(this.max.y-this.min.y),(point.z-this.min.z)/(this.max.z-this.min.z));},intersectsBox:function(box){// using 6 splitting planes to rule out intersections.
return box.max.x<this.min.x||box.min.x>this.max.x||box.max.y<this.min.y||box.min.y>this.max.y||box.max.z<this.min.z||box.min.z>this.max.z?false:true;},intersectsSphere:function(){var closestPoint=new Vector3();return function intersectsSphere(sphere){// Find the point on the AABB closest to the sphere center.
this.clampPoint(sphere.center,closestPoint);// If that point is inside the sphere, the AABB and sphere intersect.
return closestPoint.distanceToSquared(sphere.center)<=sphere.radius*sphere.radius;};}(),intersectsPlane:function(plane){// We compute the minimum and maximum dot product values. If those values
// are on the same side (back or front) of the plane, then there is no intersection.
var min,max;if(plane.normal.x>0){min=plane.normal.x*this.min.x;max=plane.normal.x*this.max.x;}else{min=plane.normal.x*this.max.x;max=plane.normal.x*this.min.x;}if(plane.normal.y>0){min+=plane.normal.y*this.min.y;max+=plane.normal.y*this.max.y;}else{min+=plane.normal.y*this.max.y;max+=plane.normal.y*this.min.y;}if(plane.normal.z>0){min+=plane.normal.z*this.min.z;max+=plane.normal.z*this.max.z;}else{min+=plane.normal.z*this.max.z;max+=plane.normal.z*this.min.z;}return min<=plane.constant&&max>=plane.constant;},intersectsTriangle:function(){// triangle centered vertices
var v0=new Vector3();var v1=new Vector3();var v2=new Vector3();// triangle edge vectors
var f0=new Vector3();var f1=new Vector3();var f2=new Vector3();var testAxis=new Vector3();var center=new Vector3();var extents=new Vector3();var triangleNormal=new Vector3();function satForAxes(axes){var i,j;for(i=0,j=axes.length-3;i<=j;i+=3){testAxis.fromArray(axes,i);// project the aabb onto the seperating axis
var r=extents.x*Math.abs(testAxis.x)+extents.y*Math.abs(testAxis.y)+extents.z*Math.abs(testAxis.z);// project all 3 vertices of the triangle onto the seperating axis
var p0=v0.dot(testAxis);var p1=v1.dot(testAxis);var p2=v2.dot(testAxis);// actual test, basically see if either of the most extreme of the triangle points intersects r
if(Math.max(-Math.max(p0,p1,p2),Math.min(p0,p1,p2))>r){// points of the projected triangle are outside the projected half-length of the aabb
// the axis is seperating and we can exit
return false;}}return true;}return function intersectsTriangle(triangle){if(this.isEmpty()){return false;}// compute box center and extents
this.getCenter(center);extents.subVectors(this.max,center);// translate triangle to aabb origin
v0.subVectors(triangle.a,center);v1.subVectors(triangle.b,center);v2.subVectors(triangle.c,center);// compute edge vectors for triangle
f0.subVectors(v1,v0);f1.subVectors(v2,v1);f2.subVectors(v0,v2);// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb
// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation
// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)
var axes=[0,-f0.z,f0.y,0,-f1.z,f1.y,0,-f2.z,f2.y,f0.z,0,-f0.x,f1.z,0,-f1.x,f2.z,0,-f2.x,-f0.y,f0.x,0,-f1.y,f1.x,0,-f2.y,f2.x,0];if(!satForAxes(axes)){return false;}// test 3 face normals from the aabb
axes=[1,0,0,0,1,0,0,0,1];if(!satForAxes(axes)){return false;}// finally testing the face normal of the triangle
// use already existing triangle edge vectors here
triangleNormal.crossVectors(f0,f1);axes=[triangleNormal.x,triangleNormal.y,triangleNormal.z];return satForAxes(axes);};}(),clampPoint:function(point,target){if(target===undefined){console.warn('THREE.Box3: .clampPoint() target is now required');target=new Vector3();}return target.copy(point).clamp(this.min,this.max);},distanceToPoint:function(){var v1=new Vector3();return function distanceToPoint(point){var clampedPoint=v1.copy(point).clamp(this.min,this.max);return clampedPoint.sub(point).length();};}(),getBoundingSphere:function(){var v1=new Vector3();return function getBoundingSphere(target){if(target===undefined){console.warn('THREE.Box3: .getBoundingSphere() target is now required');target=new Sphere();}this.getCenter(target.center);target.radius=this.getSize(v1).length()*0.5;return target;};}(),intersect:function(box){this.min.max(box.min);this.max.min(box.max);// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.
if(this.isEmpty())this.makeEmpty();return this;},union:function(box){this.min.min(box.min);this.max.max(box.max);return this;},applyMatrix4:function(){var points=[new Vector3(),new Vector3(),new Vector3(),new Vector3(),new Vector3(),new Vector3(),new Vector3(),new Vector3()];return function applyMatrix4(matrix){// transform of empty box is an empty box.
if(this.isEmpty())return this;// NOTE: I am using a binary pattern to specify all 2^3 combinations below
points[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(matrix);// 000
points[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(matrix);// 001
points[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(matrix);// 010
points[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(matrix);// 011
points[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(matrix);// 100
points[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(matrix);// 101
points[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(matrix);// 110
points[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(matrix);// 111
this.setFromPoints(points);return this;};}(),translate:function(offset){this.min.add(offset);this.max.add(offset);return this;},equals:function(box){return box.min.equals(this.min)&&box.max.equals(this.max);}});/**
* @author bhouston / http://clara.io
* @author mrdoob / http://mrdoob.com/
*/function Sphere(center,radius){this.center=center!==undefined?center:new Vector3();this.radius=radius!==undefined?radius:0;}Object.assign(Sphere.prototype,{set:function(center,radius){this.center.copy(center);this.radius=radius;return this;},setFromPoints:function(){var box=new Box3();return function setFromPoints(points,optionalCenter){var center=this.center;if(optionalCenter!==undefined){center.copy(optionalCenter);}else{box.setFromPoints(points).getCenter(center);}var maxRadiusSq=0;for(var i=0,il=points.length;i<il;i++){maxRadiusSq=Math.max(maxRadiusSq,center.distanceToSquared(points[i]));}this.radius=Math.sqrt(maxRadiusSq);return this;};}(),clone:function(){return new this.constructor().copy(this);},copy:function(sphere){this.center.copy(sphere.center);this.radius=sphere.radius;return this;},empty:function(){return this.radius<=0;},containsPoint:function(point){return point.distanceToSquared(this.center)<=this.radius*this.radius;},distanceToPoint:function(point){return point.distanceTo(this.center)-this.radius;},intersectsSphere:function(sphere){var radiusSum=this.radius+sphere.radius;return sphere.center.distanceToSquared(this.center)<=radiusSum*radiusSum;},intersectsBox:function(box){return box.intersectsSphere(this);},intersectsPlane:function(plane){return Math.abs(plane.distanceToPoint(this.center))<=this.radius;},clampPoint:function(point,target){var deltaLengthSq=this.center.distanceToSquared(point);if(target===undefined){console.warn('THREE.Sphere: .clampPoint() target is now required');target=new Vector3();}target.copy(point);if(deltaLengthSq>this.radius*this.radius){target.sub(this.center).normalize();target.multiplyScalar(this.radius).add(this.center);}return target;},getBoundingBox:function(target){if(target===undefined){console.warn('THREE.Sphere: .getBoundingBox() target is now required');target=new Box3();}target.set(this.center,this.center);target.expandByScalar(this.radius);return target;},applyMatrix4:function(matrix){this.center.applyMatrix4(matrix);this.radius=this.radius*matrix.getMaxScaleOnAxis();return this;},translate:function(offset){this.center.add(offset);return this;},equals:function(sphere){return sphere.center.equals(this.center)&&sphere.radius===this.radius;}});/**
* @author bhouston / http://clara.io
*/function Plane(normal,constant){// normal is assumed to be normalized
this.normal=normal!==undefined?normal:new Vector3(1,0,0);this.constant=constant!==undefined?constant:0;}Object.assign(Plane.prototype,{set:function(normal,constant){this.normal.copy(normal);this.constant=constant;return this;},setComponents:function(x,y,z,w){this.normal.set(x,y,z);this.constant=w;return this;},setFromNormalAndCoplanarPoint:function(normal,point){this.normal.copy(normal);this.constant=-point.dot(this.normal);return this;},setFromCoplanarPoints:function(){var v1=new Vector3();var v2=new Vector3();return function setFromCoplanarPoints(a,b,c){var normal=v1.subVectors(c,b).cross(v2.subVectors(a,b)).normalize();// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?
this.setFromNormalAndCoplanarPoint(normal,a);return this;};}(),clone:function(){return new this.constructor().copy(this);},copy:function(plane){this.normal.copy(plane.normal);this.constant=plane.constant;return this;},normalize:function(){// Note: will lead to a divide by zero if the plane is invalid.
var inverseNormalLength=1.0/this.normal.length();this.normal.multiplyScalar(inverseNormalLength);this.constant*=inverseNormalLength;return this;},negate:function(){this.constant*=-1;this.normal.negate();return this;},distanceToPoint:function(point){return this.normal.dot(point)+this.constant;},distanceToSphere:function(sphere){return this.distanceToPoint(sphere.center)-sphere.radius;},projectPoint:function(point,target){if(target===undefined){console.warn('THREE.Plane: .projectPoint() target is now required');target=new Vector3();}return target.copy(this.normal).multiplyScalar(-this.distanceToPoint(point)).add(point);},intersectLine:function(){var v1=new Vector3();return function intersectLine(line,target){if(target===undefined){console.warn('THREE.Plane: .intersectLine() target is now required');target=new Vector3();}var direction=line.delta(v1);var denominator=this.normal.dot(direction);if(denominator===0){// line is coplanar, return origin
if(this.distanceToPoint(line.start)===0){return target.copy(line.start);}// Unsure if this is the correct method to handle this case.
return undefined;}var t=-(line.start.dot(this.normal)+this.constant)/denominator;if(t<0||t>1){return undefined;}return target.copy(direction).multiplyScalar(t).add(line.start);};}(),intersectsLine:function(line){// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.
var startSign=this.distanceToPoint(line.start);var endSign=this.distanceToPoint(line.end);return startSign<0&&endSign>0||endSign<0&&startSign>0;},intersectsBox:function(box){return box.intersectsPlane(this);},intersectsSphere:function(sphere){return sphere.intersectsPlane(this);},coplanarPoint:function(target){if(target===undefined){console.warn('THREE.Plane: .coplanarPoint() target is now required');target=new Vector3();}return target.copy(this.normal).multiplyScalar(-this.constant);},applyMatrix4:function(){var v1=new Vector3();var m1=new Matrix3();return function applyMatrix4(matrix,optionalNormalMatrix){var normalMatrix=optionalNormalMatrix||m1.getNormalMatrix(matrix);var referencePoint=this.coplanarPoint(v1).applyMatrix4(matrix);var normal=this.normal.applyMatrix3(normalMatrix).normalize();this.constant=-referencePoint.dot(normal);return this;};}(),translate:function(offset){this.constant-=offset.dot(this.normal);return this;},equals:function(plane){return plane.normal.equals(this.normal)&&plane.constant===this.constant;}});/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
* @author bhouston / http://clara.io
*/function Frustum(p0,p1,p2,p3,p4,p5){this.planes=[p0!==undefined?p0:new Plane(),p1!==undefined?p1:new Plane(),p2!==undefined?p2:new Plane(),p3!==undefined?p3:new Plane(),p4!==undefined?p4:new Plane(),p5!==undefined?p5:new Plane()];}Object.assign(Frustum.prototype,{set:function(p0,p1,p2,p3,p4,p5){var planes=this.planes;planes[0].copy(p0);planes[1].copy(p1);planes[2].copy(p2);planes[3].copy(p3);planes[4].copy(p4);planes[5].copy(p5);return this;},clone:function(){return new this.constructor().copy(this);},copy:function(frustum){var planes=this.planes;for(var i=0;i<6;i++){planes[i].copy(frustum.planes[i]);}return this;},setFromMatrix:function(m){var planes=this.planes;var me=m.elements;var me0=me[0],me1=me[1],me2=me[2],me3=me[3];var me4=me[4],me5=me[5],me6=me[6],me7=me[7];var me8=me[8],me9=me[9],me10=me[10],me11=me[11];var me12=me[12],me13=me[13],me14=me[14],me15=me[15];planes[0].setComponents(me3-me0,me7-me4,me11-me8,me15-me12).normalize();planes[1].setComponents(me3+me0,me7+me4,me11+me8,me15+me12).normalize();planes[2].setComponents(me3+me1,me7+me5,me11+me9,me15+me13).normalize();planes[3].setComponents(me3-me1,me7-me5,me11-me9,me15-me13).normalize();planes[4].setComponents(me3-me2,me7-me6,me11-me10,me15-me14).normalize();planes[5].setComponents(me3+me2,me7+me6,me11+me10,me15+me14).normalize();return this;},intersectsObject:function(){var sphere=new Sphere();return function intersectsObject(object){var geometry=object.geometry;if(geometry.boundingSphere===null)geometry.computeBoundingSphere();sphere.copy(geometry.boundingSphere).applyMatrix4(object.matrixWorld);return this.intersectsSphere(sphere);};}(),intersectsSprite:function(){var sphere=new Sphere();return function intersectsSprite(sprite){sphere.center.set(0,0,0);sphere.radius=0.7071067811865476;sphere.applyMatrix4(sprite.matrixWorld);return this.intersectsSphere(sphere);};}(),intersectsSphere:function(sphere){var planes=this.planes;var center=sphere.center;var negRadius=-sphere.radius;for(var i=0;i<6;i++){var distance=planes[i].distanceToPoint(center);if(distance<negRadius){return false;}}return true;},intersectsBox:function(){var p1=new Vector3(),p2=new Vector3();return function intersectsBox(box){var planes=this.planes;for(var i=0;i<6;i++){var plane=planes[i];p1.x=plane.normal.x>0?box.min.x:box.max.x;p2.x=plane.normal.x>0?box.max.x:box.min.x;p1.y=plane.normal.y>0?box.min.y:box.max.y;p2.y=plane.normal.y>0?box.max.y:box.min.y;p1.z=plane.normal.z>0?box.min.z:box.max.z;p2.z=plane.normal.z>0?box.max.z:box.min.z;var d1=plane.distanceToPoint(p1);var d2=plane.distanceToPoint(p2);// if both outside plane, no intersection
if(d1<0&&d2<0){return false;}}return true;};}(),containsPoint:function(point){var planes=this.planes;for(var i=0;i<6;i++){if(planes[i].distanceToPoint(point)<0){return false;}}return true;}});var alphamap_fragment="#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n";var alphamap_pars_fragment="#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n";var alphatest_fragment="#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n";var aomap_fragment="#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n";var aomap_pars_fragment="#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif";var begin_vertex="\nvec3 transformed = vec3( position );\n";var beginnormal_vertex="\nvec3 objectNormal = vec3( normal );\n";var bsdfs="float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n";var bumpmap_pars_fragment="#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n";var clipping_planes_fragment="#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\n#endif\n";var clipping_planes_pars_fragment="#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n";var clipping_planes_pars_vertex="#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n";var clipping_planes_vertex="#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n";var color_fragment="#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif";var color_pars_fragment="#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n";var color_pars_vertex="#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif";var color_vertex="#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif";var common="#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\n";var cube_uv_reflection_fragment="#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n";var defaultnormal_vertex="vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n";var displacementmap_pars_vertex="#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n";var displacementmap_vertex="#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n";var emissivemap_fragment="#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n";var emissivemap_pars_fragment="#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n";var encodings_fragment=" gl_FragColor = linearToOutputTexel( gl_FragColor );\n";var encodings_pars_fragment="\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n";var envmap_fragment="#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n";var envmap_pars_fragment="#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n";var envmap_pars_vertex="#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n";var envmap_vertex="#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n";var fog_vertex="\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif";var fog_pars_vertex="#ifdef USE_FOG\n varying float fogDepth;\n#endif\n";var fog_fragment="#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n";var fog_pars_fragment="#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n";var gradientmap_pars_fragment="#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n";var lightmap_fragment="#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n";var lightmap_pars_fragment="#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif";var lights_lambert_vertex="vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n";var lights_pars_begin="uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n";var lights_pars_maps="#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n";var lights_phong_fragment="BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n";var lights_phong_pars_fragment="varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n";var lights_physical_fragment="PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n";var lights_physical_pars_fragment="struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n";var lights_fragment_begin="\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearCoatRadiance = vec3( 0.0 );\n#endif\n";var lights_fragment_maps="#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\n\t#ifndef STANDARD\n\t\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\n\t#endif\n#endif\n";var lights_fragment_end="#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n";var logdepthbuf_fragment="#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif";var logdepthbuf_pars_fragment="#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n";var logdepthbuf_pars_vertex="#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif";var logdepthbuf_vertex="#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif\n";var map_fragment="#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n";var map_pars_fragment="#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n";var map_particle_fragment="#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n";var map_particle_pars_fragment="#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n";var metalnessmap_fragment="float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n";var metalnessmap_pars_fragment="#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif";var morphnormal_vertex="#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n";var morphtarget_pars_vertex="#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif";var morphtarget_vertex="#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n";var normal_fragment_begin="#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n";var normal_fragment_maps="#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n";var normalmap_pars_fragment="#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\t\tscale *= float( gl_FrontFacing ) * 2.0 - 1.0;\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n";var packing="vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n";var premultiplied_alpha_fragment="#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n";var project_vertex="vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n";var dithering_fragment="#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n";var dithering_pars_fragment="#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n";var roughnessmap_fragment="float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n";var roughnessmap_pars_fragment="#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif";var shadowmap_pars_fragment="#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n";var shadowmap_pars_vertex="#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n";var shadowmap_vertex="#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n";var shadowmask_pars_fragment="float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n";var skinbase_vertex="#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif";var skinning_pars_vertex="#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n";var skinning_vertex="#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n";var skinnormal_vertex="#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n";var specularmap_fragment="float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif";var specularmap_pars_fragment="#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif";var tonemapping_fragment="#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n";var tonemapping_pars_fragment="#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n";var uv_pars_fragment="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif";var uv_pars_vertex="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n";var uv_vertex="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif";var uv2_pars_fragment="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif";var uv2_pars_vertex="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif";var uv2_vertex="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif";var worldpos_vertex="#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n";var cube_frag="uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n";var cube_vert="varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}\n";var depth_frag="#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n";var depth_vert="#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n";var distanceRGBA_frag="#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n";var distanceRGBA_vert="#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}\n";var equirect_frag="uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n";var equirect_vert="varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n";var linedashed_frag="uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";var linedashed_vert="uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n";var meshbasic_frag="uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";var meshbasic_vert="#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\n";var meshlambert_frag="uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";var meshlambert_vert="#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";var meshphong_frag="#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";var meshphong_vert="#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";var meshphysical_frag="#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars_begin>\n#include <lights_pars_maps>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n";var meshphysical_vert="#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";var normal_frag="#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n";var normal_vert="#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n";var points_frag="uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";var points_vert="uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";var shadow_frag="uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <fog_fragment>\n}\n";var shadow_vert="#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n";var ShaderChunk={alphamap_fragment:alphamap_fragment,alphamap_pars_fragment:alphamap_pars_fragment,alphatest_fragment:alphatest_fragment,aomap_fragment:aomap_fragment,aomap_pars_fragment:aomap_pars_fragment,begin_vertex:begin_vertex,beginnormal_vertex:beginnormal_vertex,bsdfs:bsdfs,bumpmap_pars_fragment:bumpmap_pars_fragment,clipping_planes_fragment:clipping_planes_fragment,clipping_planes_pars_fragment:clipping_planes_pars_fragment,clipping_planes_pars_vertex:clipping_planes_pars_vertex,clipping_planes_vertex:clipping_planes_vertex,color_fragment:color_fragment,color_pars_fragment:color_pars_fragment,color_pars_vertex:color_pars_vertex,color_vertex:color_vertex,common:common,cube_uv_reflection_fragment:cube_uv_reflection_fragment,defaultnormal_vertex:defaultnormal_vertex,displacementmap_pars_vertex:displacementmap_pars_vertex,displacementmap_vertex:displacementmap_vertex,emissivemap_fragment:emissivemap_fragment,emissivemap_pars_fragment:emissivemap_pars_fragment,encodings_fragment:encodings_fragment,encodings_pars_fragment:encodings_pars_fragment,envmap_fragment:envmap_fragment,envmap_pars_fragment:envmap_pars_fragment,envmap_pars_vertex:envmap_pars_vertex,envmap_vertex:envmap_vertex,fog_vertex:fog_vertex,fog_pars_vertex:fog_pars_vertex,fog_fragment:fog_fragment,fog_pars_fragment:fog_pars_fragment,gradientmap_pars_fragment:gradientmap_pars_fragment,lightmap_fragment:lightmap_fragment,lightmap_pars_fragment:lightmap_pars_fragment,lights_lambert_vertex:lights_lambert_vertex,lights_pars_begin:lights_pars_begin,lights_pars_maps:lights_pars_maps,lights_phong_fragment:lights_phong_fragment,lights_phong_pars_fragment:lights_phong_pars_fragment,lights_physical_fragment:lights_physical_fragment,lights_physical_pars_fragment:lights_physical_pars_fragment,lights_fragment_begin:lights_fragment_begin,lights_fragment_maps:lights_fragment_maps,lights_fragment_end:lights_fragment_end,logdepthbuf_fragment:logdepthbuf_fragment,logdepthbuf_pars_fragment:logdepthbuf_pars_fragment,logdepthbuf_pars_vertex:logdepthbuf_pars_vertex,logdepthbuf_vertex:logdepthbuf_vertex,map_fragment:map_fragment,map_pars_fragment:map_pars_fragment,map_particle_fragment:map_particle_fragment,map_particle_pars_fragment:map_particle_pars_fragment,metalnessmap_fragment:metalnessmap_fragment,metalnessmap_pars_fragment:metalnessmap_pars_fragment,morphnormal_vertex:morphnormal_vertex,morphtarget_pars_vertex:morphtarget_pars_vertex,morphtarget_vertex:morphtarget_vertex,normal_fragment_begin:normal_fragment_begin,normal_fragment_maps:normal_fragment_maps,normalmap_pars_fragment:normalmap_pars_fragment,packing:packing,premultiplied_alpha_fragment:premultiplied_alpha_fragment,project_vertex:project_vertex,dithering_fragment:dithering_fragment,dithering_pars_fragment:dithering_pars_fragment,roughnessmap_fragment:roughnessmap_fragment,roughnessmap_pars_fragment:roughnessmap_pars_fragment,shadowmap_pars_fragment:shadowmap_pars_fragment,shadowmap_pars_vertex:shadowmap_pars_vertex,shadowmap_vertex:shadowmap_vertex,shadowmask_pars_fragment:shadowmask_pars_fragment,skinbase_vertex:skinbase_vertex,skinning_pars_vertex:skinning_pars_vertex,skinning_vertex:skinning_vertex,skinnormal_vertex:skinnormal_vertex,specularmap_fragment:specularmap_fragment,specularmap_pars_fragment:specularmap_pars_fragment,tonemapping_fragment:tonemapping_fragment,tonemapping_pars_fragment:tonemapping_pars_fragment,uv_pars_fragment:uv_pars_fragment,uv_pars_vertex:uv_pars_vertex,uv_vertex:uv_vertex,uv2_pars_fragment:uv2_pars_fragment,uv2_pars_vertex:uv2_pars_vertex,uv2_vertex:uv2_vertex,worldpos_vertex:worldpos_vertex,cube_frag:cube_frag,cube_vert:cube_vert,depth_frag:depth_frag,depth_vert:depth_vert,distanceRGBA_frag:distanceRGBA_frag,distanceRGBA_vert:distanceRGBA_vert,equirect_frag:equirect_frag,equirect_vert:equirect_vert,linedashed_frag:linedashed_frag,linedashed_vert:linedashed_vert,meshbasic_frag:meshbasic_frag,meshbasic_vert:meshbasic_vert,meshlambert_frag:meshlambert_frag,meshlambert_vert:meshlambert_vert,meshphong_frag:meshphong_frag,meshphong_vert:meshphong_vert,meshphysical_frag:meshphysical_frag,meshphysical_vert:meshphysical_vert,normal_frag:normal_frag,normal_vert:normal_vert,points_frag:points_frag,points_vert:points_vert,shadow_frag:shadow_frag,shadow_vert:shadow_vert};/**
* Uniform Utilities
*/var UniformsUtils={merge:function(uniforms){var merged={};for(var u=0;u<uniforms.length;u++){var tmp=this.clone(uniforms[u]);for(var p in tmp){merged[p]=tmp[p];}}return merged;},clone:function(uniforms_src){var uniforms_dst={};for(var u in uniforms_src){uniforms_dst[u]={};for(var p in uniforms_src[u]){var parameter_src=uniforms_src[u][p];if(parameter_src&&(parameter_src.isColor||parameter_src.isMatrix3||parameter_src.isMatrix4||parameter_src.isVector2||parameter_src.isVector3||parameter_src.isVector4||parameter_src.isTexture)){uniforms_dst[u][p]=parameter_src.clone();}else if(Array.isArray(parameter_src)){uniforms_dst[u][p]=parameter_src.slice();}else{uniforms_dst[u][p]=parameter_src;}}}return uniforms_dst;}};/**
* @author mrdoob / http://mrdoob.com/
*/var ColorKeywords={'aliceblue':0xF0F8FF,'antiquewhite':0xFAEBD7,'aqua':0x00FFFF,'aquamarine':0x7FFFD4,'azure':0xF0FFFF,'beige':0xF5F5DC,'bisque':0xFFE4C4,'black':0x000000,'blanchedalmond':0xFFEBCD,'blue':0x0000FF,'blueviolet':0x8A2BE2,'brown':0xA52A2A,'burlywood':0xDEB887,'cadetblue':0x5F9EA0,'chartreuse':0x7FFF00,'chocolate':0xD2691E,'coral':0xFF7F50,'cornflowerblue':0x6495ED,'cornsilk':0xFFF8DC,'crimson':0xDC143C,'cyan':0x00FFFF,'darkblue':0x00008B,'darkcyan':0x008B8B,'darkgoldenrod':0xB8860B,'darkgray':0xA9A9A9,'darkgreen':0x006400,'darkgrey':0xA9A9A9,'darkkhaki':0xBDB76B,'darkmagenta':0x8B008B,'darkolivegreen':0x556B2F,'darkorange':0xFF8C00,'darkorchid':0x9932CC,'darkred':0x8B0000,'darksalmon':0xE9967A,'darkseagreen':0x8FBC8F,'darkslateblue':0x483D8B,'darkslategray':0x2F4F4F,'darkslategrey':0x2F4F4F,'darkturquoise':0x00CED1,'darkviolet':0x9400D3,'deeppink':0xFF1493,'deepskyblue':0x00BFFF,'dimgray':0x696969,'dimgrey':0x696969,'dodgerblue':0x1E90FF,'firebrick':0xB22222,'floralwhite':0xFFFAF0,'forestgreen':0x228B22,'fuchsia':0xFF00FF,'gainsboro':0xDCDCDC,'ghostwhite':0xF8F8FF,'gold':0xFFD700,'goldenrod':0xDAA520,'gray':0x808080,'green':0x008000,'greenyellow':0xADFF2F,'grey':0x808080,'honeydew':0xF0FFF0,'hotpink':0xFF69B4,'indianred':0xCD5C5C,'indigo':0x4B0082,'ivory':0xFFFFF0,'khaki':0xF0E68C,'lavender':0xE6E6FA,'lavenderblush':0xFFF0F5,'lawngreen':0x7CFC00,'lemonchiffon':0xFFFACD,'lightblue':0xADD8E6,'lightcoral':0xF08080,'lightcyan':0xE0FFFF,'lightgoldenrodyellow':0xFAFAD2,'lightgray':0xD3D3D3,'lightgreen':0x90EE90,'lightgrey':0xD3D3D3,'lightpink':0xFFB6C1,'lightsalmon':0xFFA07A,'lightseagreen':0x20B2AA,'lightskyblue':0x87CEFA,'lightslategray':0x778899,'lightslategrey':0x778899,'lightsteelblue':0xB0C4DE,'lightyellow':0xFFFFE0,'lime':0x00FF00,'limegreen':0x32CD32,'linen':0xFAF0E6,'magenta':0xFF00FF,'maroon':0x800000,'mediumaquamarine':0x66CDAA,'mediumblue':0x0000CD,'mediumorchid':0xBA55D3,'mediumpurple':0x9370DB,'mediumseagreen':0x3CB371,'mediumslateblue':0x7B68EE,'mediumspringgreen':0x00FA9A,'mediumturquoise':0x48D1CC,'mediumvioletred':0xC71585,'midnightblue':0x191970,'mintcream':0xF5FFFA,'mistyrose':0xFFE4E1,'moccasin':0xFFE4B5,'navajowhite':0xFFDEAD,'navy':0x000080,'oldlace':0xFDF5E6,'olive':0x808000,'olivedrab':0x6B8E23,'orange':0xFFA500,'orangered':0xFF4500,'orchid':0xDA70D6,'palegoldenrod':0xEEE8AA,'palegreen':0x98FB98,'paleturquoise':0xAFEEEE,'palevioletred':0xDB7093,'papayawhip':0xFFEFD5,'peachpuff':0xFFDAB9,'peru':0xCD853F,'pink':0xFFC0CB,'plum':0xDDA0DD,'powderblue':0xB0E0E6,'purple':0x800080,'rebeccapurple':0x663399,'red':0xFF0000,'rosybrown':0xBC8F8F,'royalblue':0x4169E1,'saddlebrown':0x8B4513,'salmon':0xFA8072,'sandybrown':0xF4A460,'seagreen':0x2E8B57,'seashell':0xFFF5EE,'sienna':0xA0522D,'silver':0xC0C0C0,'skyblue':0x87CEEB,'slateblue':0x6A5ACD,'slategray':0x708090,'slategrey':0x708090,'snow':0xFFFAFA,'springgreen':0x00FF7F,'steelblue':0x4682B4,'tan':0xD2B48C,'teal':0x008080,'thistle':0xD8BFD8,'tomato':0xFF6347,'turquoise':0x40E0D0,'violet':0xEE82EE,'wheat':0xF5DEB3,'white':0xFFFFFF,'whitesmoke':0xF5F5F5,'yellow':0xFFFF00,'yellowgreen':0x9ACD32};function Color(r,g,b){if(g===undefined&&b===undefined){// r is THREE.Color, hex or string
return this.set(r);}return this.setRGB(r,g,b);}Object.assign(Color.prototype,{isColor:true,r:1,g:1,b:1,set:function(value){if(value&&value.isColor){this.copy(value);}else if(typeof value==='number'){this.setHex(value);}else if(typeof value==='string'){this.setStyle(value);}return this;},setScalar:function(scalar){this.r=scalar;this.g=scalar;this.b=scalar;return this;},setHex:function(hex){hex=Math.floor(hex);this.r=(hex>>16&255)/255;this.g=(hex>>8&255)/255;this.b=(hex&255)/255;return this;},setRGB:function(r,g,b){this.r=r;this.g=g;this.b=b;return this;},setHSL:function(){function hue2rgb(p,q,t){if(t<0)t+=1;if(t>1)t-=1;if(t<1/6)return p+(q-p)*6*t;if(t<1/2)return q;if(t<2/3)return p+(q-p)*6*(2/3-t);return p;}return function setHSL(h,s,l){// h,s,l ranges are in 0.0 - 1.0
h=_Math.euclideanModulo(h,1);s=_Math.clamp(s,0,1);l=_Math.clamp(l,0,1);if(s===0){this.r=this.g=this.b=l;}else{var p=l<=0.5?l*(1+s):l+s-l*s;var q=2*l-p;this.r=hue2rgb(q,p,h+1/3);this.g=hue2rgb(q,p,h);this.b=hue2rgb(q,p,h-1/3);}return this;};}(),setStyle:function(style){function handleAlpha(string){if(string===undefined)return;if(parseFloat(string)<1){console.warn('THREE.Color: Alpha component of '+style+' will be ignored.');}}var m;if(m=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(style)){// rgb / hsl
var color;var name=m[1];var components=m[2];switch(name){case'rgb':case'rgba':if(color=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)){// rgb(255,0,0) rgba(255,0,0,0.5)
this.r=Math.min(255,parseInt(color[1],10))/255;this.g=Math.min(255,parseInt(color[2],10))/255;this.b=Math.min(255,parseInt(color[3],10))/255;handleAlpha(color[5]);return this;}if(color=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)){// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)
this.r=Math.min(100,parseInt(color[1],10))/100;this.g=Math.min(100,parseInt(color[2],10))/100;this.b=Math.min(100,parseInt(color[3],10))/100;handleAlpha(color[5]);return this;}break;case'hsl':case'hsla':if(color=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)){// hsl(120,50%,50%) hsla(120,50%,50%,0.5)
var h=parseFloat(color[1])/360;var s=parseInt(color[2],10)/100;var l=parseInt(color[3],10)/100;handleAlpha(color[5]);return this.setHSL(h,s,l);}break;}}else if(m=/^\#([A-Fa-f0-9]+)$/.exec(style)){// hex color
var hex=m[1];var size=hex.length;if(size===3){// #ff0
this.r=parseInt(hex.charAt(0)+hex.charAt(0),16)/255;this.g=parseInt(hex.charAt(1)+hex.charAt(1),16)/255;this.b=parseInt(hex.charAt(2)+hex.charAt(2),16)/255;return this;}else if(size===6){// #ff0000
this.r=parseInt(hex.charAt(0)+hex.charAt(1),16)/255;this.g=parseInt(hex.charAt(2)+hex.charAt(3),16)/255;this.b=parseInt(hex.charAt(4)+hex.charAt(5),16)/255;return this;}}if(style&&style.length>0){// color keywords
var hex=ColorKeywords[style];if(hex!==undefined){// red
this.setHex(hex);}else{// unknown color
console.warn('THREE.Color: Unknown color '+style);}}return this;},clone:function(){return new this.constructor(this.r,this.g,this.b);},copy:function(color){this.r=color.r;this.g=color.g;this.b=color.b;return this;},copyGammaToLinear:function(color,gammaFactor){if(gammaFactor===undefined)gammaFactor=2.0;this.r=Math.pow(color.r,gammaFactor);this.g=Math.pow(color.g,gammaFactor);this.b=Math.pow(color.b,gammaFactor);return this;},copyLinearToGamma:function(color,gammaFactor){if(gammaFactor===undefined)gammaFactor=2.0;var safeInverse=gammaFactor>0?1.0/gammaFactor:1.0;this.r=Math.pow(color.r,safeInverse);this.g=Math.pow(color.g,safeInverse);this.b=Math.pow(color.b,safeInverse);return this;},convertGammaToLinear:function(){var r=this.r,g=this.g,b=this.b;this.r=r*r;this.g=g*g;this.b=b*b;return this;},convertLinearToGamma:function(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this;},getHex:function(){return this.r*255<<16^this.g*255<<8^this.b*255<<0;},getHexString:function(){return ('000000'+this.getHex().toString(16)).slice(-6);},getHSL:function(target){// h,s,l ranges are in 0.0 - 1.0
if(target===undefined){console.warn('THREE.Color: .getHSL() target is now required');target={h:0,s:0,l:0};}var r=this.r,g=this.g,b=this.b;var max=Math.max(r,g,b);var min=Math.min(r,g,b);var hue,saturation;var lightness=(min+max)/2.0;if(min===max){hue=0;saturation=0;}else{var delta=max-min;saturation=lightness<=0.5?delta/(max+min):delta/(2-max-min);switch(max){case r:hue=(g-b)/delta+(g<b?6:0);break;case g:hue=(b-r)/delta+2;break;case b:hue=(r-g)/delta+4;break;}hue/=6;}target.h=hue;target.s=saturation;target.l=lightness;return target;},getStyle:function(){return 'rgb('+(this.r*255|0)+','+(this.g*255|0)+','+(this.b*255|0)+')';},offsetHSL:function(){var hsl={};return function(h,s,l){this.getHSL(hsl);hsl.h+=h;hsl.s+=s;hsl.l+=l;this.setHSL(hsl.h,hsl.s,hsl.l);return this;};}(),add:function(color){this.r+=color.r;this.g+=color.g;this.b+=color.b;return this;},addColors:function(color1,color2){this.r=color1.r+color2.r;this.g=color1.g+color2.g;this.b=color1.b+color2.b;return this;},addScalar:function(s){this.r+=s;this.g+=s;this.b+=s;return this;},sub:function(color){this.r=Math.max(0,this.r-color.r);this.g=Math.max(0,this.g-color.g);this.b=Math.max(0,this.b-color.b);return this;},multiply:function(color){this.r*=color.r;this.g*=color.g;this.b*=color.b;return this;},multiplyScalar:function(s){this.r*=s;this.g*=s;this.b*=s;return this;},lerp:function(color,alpha){this.r+=(color.r-this.r)*alpha;this.g+=(color.g-this.g)*alpha;this.b+=(color.b-this.b)*alpha;return this;},equals:function(c){return c.r===this.r&&c.g===this.g&&c.b===this.b;},fromArray:function(array,offset){if(offset===undefined)offset=0;this.r=array[offset];this.g=array[offset+1];this.b=array[offset+2];return this;},toArray:function(array,offset){if(array===undefined)array=[];if(offset===undefined)offset=0;array[offset]=this.r;array[offset+1]=this.g;array[offset+2]=this.b;return array;},toJSON:function(){return this.getHex();}});/**
* Uniforms library for shared webgl shaders
*/var UniformsLib={common:{diffuse:{value:new Color(0xeeeeee)},opacity:{value:1.0},map:{value:null},uvTransform:{value:new Matrix3()},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1.0},refractionRatio:{value:0.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new Vector2(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:0.00025},fogNear:{value:1},fogFar:{value:2000},fogColor:{value:new Color(0xffffff)}},lights:{ambientLightColor:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src
rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new Color(0xeeeeee)},opacity:{value:1.0},size:{value:1.0},scale:{value:1.0},map:{value:null},uvTransform:{value:new Matrix3()}}};/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
* @author mikael emtinger / http://gomo.se/
*/var ShaderLib={basic:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.specularmap,UniformsLib.envmap,UniformsLib.aomap,UniformsLib.lightmap,UniformsLib.fog]),vertexShader:ShaderChunk.meshbasic_vert,fragmentShader:ShaderChunk.meshbasic_frag},lambert:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.specularmap,UniformsLib.envmap,UniformsLib.aomap,UniformsLib.lightmap,UniformsLib.emissivemap,UniformsLib.fog,UniformsLib.lights,{emissive:{value:new Color(0x000000)}}]),vertexShader:ShaderChunk.meshlambert_vert,fragmentShader:ShaderChunk.meshlambert_frag},phong:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.specularmap,UniformsLib.envmap,UniformsLib.aomap,UniformsLib.lightmap,UniformsLib.emissivemap,UniformsLib.bumpmap,UniformsLib.normalmap,UniformsLib.displacementmap,UniformsLib.gradientmap,UniformsLib.fog,UniformsLib.lights,{emissive:{value:new Color(0x000000)},specular:{value:new Color(0x111111)},shininess:{value:30}}]),vertexShader:ShaderChunk.meshphong_vert,fragmentShader:ShaderChunk.meshphong_frag},standard:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.envmap,UniformsLib.aomap,UniformsLib.lightmap,UniformsLib.emissivemap,UniformsLib.bumpmap,UniformsLib.normalmap,UniformsLib.displacementmap,UniformsLib.roughnessmap,UniformsLib.metalnessmap,UniformsLib.fog,UniformsLib.lights,{emissive:{value:new Color(0x000000)},roughness:{value:0.5},metalness:{value:0.5},envMapIntensity:{value:1// temporary
}}]),vertexShader:ShaderChunk.meshphysical_vert,fragmentShader:ShaderChunk.meshphysical_frag},points:{uniforms:UniformsUtils.merge([UniformsLib.points,UniformsLib.fog]),vertexShader:ShaderChunk.points_vert,fragmentShader:ShaderChunk.points_frag},dashed:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:ShaderChunk.linedashed_vert,fragmentShader:ShaderChunk.linedashed_frag},depth:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.displacementmap]),vertexShader:ShaderChunk.depth_vert,fragmentShader:ShaderChunk.depth_frag},normal:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.bumpmap,UniformsLib.normalmap,UniformsLib.displacementmap,{opacity:{value:1.0}}]),vertexShader:ShaderChunk.normal_vert,fragmentShader:ShaderChunk.normal_frag},/* -------------------------------------------------------------------------
// Cube map shader
------------------------------------------------------------------------- */cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1.0}},vertexShader:ShaderChunk.cube_vert,fragmentShader:ShaderChunk.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:ShaderChunk.equirect_vert,fragmentShader:ShaderChunk.equirect_frag},distanceRGBA:{uniforms:UniformsUtils.merge([UniformsLib.common,UniformsLib.displacementmap,{referencePosition:{value:new Vector3()},nearDistance:{value:1},farDistance:{value:1000}}]),vertexShader:ShaderChunk.distanceRGBA_vert,fragmentShader:ShaderChunk.distanceRGBA_frag},shadow:{uniforms:UniformsUtils.merge([UniformsLib.lights,UniformsLib.fog,{color:{value:new Color(0x00000)},opacity:{value:1.0}}]),vertexShader:ShaderChunk.shadow_vert,fragmentShader:ShaderChunk.shadow_frag}};ShaderLib.physical={uniforms:UniformsUtils.merge([ShaderLib.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:ShaderChunk.meshphysical_vert,fragmentShader:ShaderChunk.meshphysical_frag};/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLAttributes(gl){var buffers=new WeakMap();function createBuffer(attribute,bufferType){var array=attribute.array;var usage=attribute.dynamic?gl.DYNAMIC_DRAW:gl.STATIC_DRAW;var buffer=gl.createBuffer();gl.bindBuffer(bufferType,buffer);gl.bufferData(bufferType,array,usage);attribute.onUploadCallback();var type=gl.FLOAT;if(array instanceof Float32Array){type=gl.FLOAT;}else if(array instanceof Float64Array){console.warn('THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.');}else if(array instanceof Uint16Array){type=gl.UNSIGNED_SHORT;}else if(array instanceof Int16Array){type=gl.SHORT;}else if(array instanceof Uint32Array){type=gl.UNSIGNED_INT;}else if(array instanceof Int32Array){type=gl.INT;}else if(array instanceof Int8Array){type=gl.BYTE;}else if(array instanceof Uint8Array){type=gl.UNSIGNED_BYTE;}return {buffer:buffer,type:type,bytesPerElement:array.BYTES_PER_ELEMENT,version:attribute.version};}function updateBuffer(buffer,attribute,bufferType){var array=attribute.array;var updateRange=attribute.updateRange;gl.bindBuffer(bufferType,buffer);if(attribute.dynamic===false){gl.bufferData(bufferType,array,gl.STATIC_DRAW);}else if(updateRange.count===-1){// Not using update ranges
gl.bufferSubData(bufferType,0,array);}else if(updateRange.count===0){console.error('THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.');}else{gl.bufferSubData(bufferType,updateRange.offset*array.BYTES_PER_ELEMENT,array.subarray(updateRange.offset,updateRange.offset+updateRange.count));updateRange.count=-1;// reset range
}}//
function get(attribute){if(attribute.isInterleavedBufferAttribute)attribute=attribute.data;return buffers.get(attribute);}function remove(attribute){if(attribute.isInterleavedBufferAttribute)attribute=attribute.data;var data=buffers.get(attribute);if(data){gl.deleteBuffer(data.buffer);buffers.delete(attribute);}}function update(attribute,bufferType){if(attribute.isInterleavedBufferAttribute)attribute=attribute.data;var data=buffers.get(attribute);if(data===undefined){buffers.set(attribute,createBuffer(attribute,bufferType));}else if(data.version<attribute.version){updateBuffer(data.buffer,attribute,bufferType);data.version=attribute.version;}}return {get:get,remove:remove,update:update};}/**
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
* @author bhouston / http://clara.io
*/function Euler(x,y,z,order){this._x=x||0;this._y=y||0;this._z=z||0;this._order=order||Euler.DefaultOrder;}Euler.RotationOrders=['XYZ','YZX','ZXY','XZY','YXZ','ZYX'];Euler.DefaultOrder='XYZ';Object.defineProperties(Euler.prototype,{x:{get:function(){return this._x;},set:function(value){this._x=value;this.onChangeCallback();}},y:{get:function(){return this._y;},set:function(value){this._y=value;this.onChangeCallback();}},z:{get:function(){return this._z;},set:function(value){this._z=value;this.onChangeCallback();}},order:{get:function(){return this._order;},set:function(value){this._order=value;this.onChangeCallback();}}});Object.assign(Euler.prototype,{isEuler:true,set:function(x,y,z,order){this._x=x;this._y=y;this._z=z;this._order=order||this._order;this.onChangeCallback();return this;},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order);},copy:function(euler){this._x=euler._x;this._y=euler._y;this._z=euler._z;this._order=euler._order;this.onChangeCallback();return this;},setFromRotationMatrix:function(m,order,update){var clamp=_Math.clamp;// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
var te=m.elements;var m11=te[0],m12=te[4],m13=te[8];var m21=te[1],m22=te[5],m23=te[9];var m31=te[2],m32=te[6],m33=te[10];order=order||this._order;if(order==='XYZ'){this._y=Math.asin(clamp(m13,-1,1));if(Math.abs(m13)<0.99999){this._x=Math.atan2(-m23,m33);this._z=Math.atan2(-m12,m11);}else{this._x=Math.atan2(m32,m22);this._z=0;}}else if(order==='YXZ'){this._x=Math.asin(-clamp(m23,-1,1));if(Math.abs(m23)<0.99999){this._y=Math.atan2(m13,m33);this._z=Math.atan2(m21,m22);}else{this._y=Math.atan2(-m31,m11);this._z=0;}}else if(order==='ZXY'){this._x=Math.asin(clamp(m32,-1,1));if(Math.abs(m32)<0.99999){this._y=Math.atan2(-m31,m33);this._z=Math.atan2(-m12,m22);}else{this._y=0;this._z=Math.atan2(m21,m11);}}else if(order==='ZYX'){this._y=Math.asin(-clamp(m31,-1,1));if(Math.abs(m31)<0.99999){this._x=Math.atan2(m32,m33);this._z=Math.atan2(m21,m11);}else{this._x=0;this._z=Math.atan2(-m12,m22);}}else if(order==='YZX'){this._z=Math.asin(clamp(m21,-1,1));if(Math.abs(m21)<0.99999){this._x=Math.atan2(-m23,m22);this._y=Math.atan2(-m31,m11);}else{this._x=0;this._y=Math.atan2(m13,m33);}}else if(order==='XZY'){this._z=Math.asin(-clamp(m12,-1,1));if(Math.abs(m12)<0.99999){this._x=Math.atan2(m32,m22);this._y=Math.atan2(m13,m11);}else{this._x=Math.atan2(-m23,m33);this._y=0;}}else{console.warn('THREE.Euler: .setFromRotationMatrix() given unsupported order: '+order);}this._order=order;if(update!==false)this.onChangeCallback();return this;},setFromQuaternion:function(){var matrix=new Matrix4();return function setFromQuaternion(q,order,update){matrix.makeRotationFromQuaternion(q);return this.setFromRotationMatrix(matrix,order,update);};}(),setFromVector3:function(v,order){return this.set(v.x,v.y,v.z,order||this._order);},reorder:function(){// WARNING: this discards revolution information -bhouston
var q=new Quaternion();return function reorder(newOrder){q.setFromEuler(this);return this.setFromQuaternion(q,newOrder);};}(),equals:function(euler){return euler._x===this._x&&euler._y===this._y&&euler._z===this._z&&euler._order===this._order;},fromArray:function(array){this._x=array[0];this._y=array[1];this._z=array[2];if(array[3]!==undefined)this._order=array[3];this.onChangeCallback();return this;},toArray:function(array,offset){if(array===undefined)array=[];if(offset===undefined)offset=0;array[offset]=this._x;array[offset+1]=this._y;array[offset+2]=this._z;array[offset+3]=this._order;return array;},toVector3:function(optionalResult){if(optionalResult){return optionalResult.set(this._x,this._y,this._z);}else{return new Vector3(this._x,this._y,this._z);}},onChange:function(callback){this.onChangeCallback=callback;return this;},onChangeCallback:function(){}});/**
* @author mrdoob / http://mrdoob.com/
*/function Layers(){this.mask=1|0;}Object.assign(Layers.prototype,{set:function(channel){this.mask=1<<channel|0;},enable:function(channel){this.mask|=1<<channel|0;},toggle:function(channel){this.mask^=1<<channel|0;},disable:function(channel){this.mask&=~(1<<channel|0);},test:function(layers){return (this.mask&layers.mask)!==0;}});/**
* @author mrdoob / http://mrdoob.com/
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author WestLangley / http://github.com/WestLangley
* @author elephantatwork / www.elephantatwork.ch
*/var object3DId=0;function Object3D(){Object.defineProperty(this,'id',{value:object3DId++});this.uuid=_Math.generateUUID();this.name='';this.type='Object3D';this.parent=null;this.children=[];this.up=Object3D.DefaultUp.clone();var position=new Vector3();var rotation=new Euler();var quaternion=new Quaternion();var scale=new Vector3(1,1,1);function onRotationChange(){quaternion.setFromEuler(rotation,false);}function onQuaternionChange(){rotation.setFromQuaternion(quaternion,undefined,false);}rotation.onChange(onRotationChange);quaternion.onChange(onQuaternionChange);Object.defineProperties(this,{position:{enumerable:true,value:position},rotation:{enumerable:true,value:rotation},quaternion:{enumerable:true,value:quaternion},scale:{enumerable:true,value:scale},modelViewMatrix:{value:new Matrix4()},normalMatrix:{value:new Matrix3()}});this.matrix=new Matrix4();this.matrixWorld=new Matrix4();this.matrixAutoUpdate=Object3D.DefaultMatrixAutoUpdate;this.matrixWorldNeedsUpdate=false;this.layers=new Layers();this.visible=true;this.castShadow=false;this.receiveShadow=false;this.frustumCulled=true;this.renderOrder=0;this.userData={};}Object3D.DefaultUp=new Vector3(0,1,0);Object3D.DefaultMatrixAutoUpdate=true;Object3D.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:Object3D,isObject3D:true,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix:function(matrix){this.matrix.multiplyMatrices(matrix,this.matrix);this.matrix.decompose(this.position,this.quaternion,this.scale);},applyQuaternion:function(q){this.quaternion.premultiply(q);return this;},setRotationFromAxisAngle:function(axis,angle){// assumes axis is normalized
this.quaternion.setFromAxisAngle(axis,angle);},setRotationFromEuler:function(euler){this.quaternion.setFromEuler(euler,true);},setRotationFromMatrix:function(m){// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)
this.quaternion.setFromRotationMatrix(m);},setRotationFromQuaternion:function(q){// assumes q is normalized
this.quaternion.copy(q);},rotateOnAxis:function(){// rotate object on axis in object space
// axis is assumed to be normalized
var q1=new Quaternion();return function rotateOnAxis(axis,angle){q1.setFromAxisAngle(axis,angle);this.quaternion.multiply(q1);return this;};}(),rotateOnWorldAxis:function(){// rotate object on axis in world space
// axis is assumed to be normalized
// method assumes no rotated parent
var q1=new Quaternion();return function rotateOnWorldAxis(axis,angle){q1.setFromAxisAngle(axis,angle);this.quaternion.premultiply(q1);return this;};}(),rotateX:function(){var v1=new Vector3(1,0,0);return function rotateX(angle){return this.rotateOnAxis(v1,angle);};}(),rotateY:function(){var v1=new Vector3(0,1,0);return function rotateY(angle){return this.rotateOnAxis(v1,angle);};}(),rotateZ:function(){var v1=new Vector3(0,0,1);return function rotateZ(angle){return this.rotateOnAxis(v1,angle);};}(),translateOnAxis:function(){// translate object by distance along axis in object space
// axis is assumed to be normalized
var v1=new Vector3();return function translateOnAxis(axis,distance){v1.copy(axis).applyQuaternion(this.quaternion);this.position.add(v1.multiplyScalar(distance));return this;};}(),translateX:function(){var v1=new Vector3(1,0,0);return function translateX(distance){return this.translateOnAxis(v1,distance);};}(),translateY:function(){var v1=new Vector3(0,1,0);return function translateY(distance){return this.translateOnAxis(v1,distance);};}(),translateZ:function(){var v1=new Vector3(0,0,1);return function translateZ(distance){return this.translateOnAxis(v1,distance);};}(),localToWorld:function(vector){return vector.applyMatrix4(this.matrixWorld);},worldToLocal:function(){var m1=new Matrix4();return function worldToLocal(vector){return vector.applyMatrix4(m1.getInverse(this.matrixWorld));};}(),lookAt:function(){// This method does not support objects with rotated and/or translated parent(s)
var m1=new Matrix4();var vector=new Vector3();return function lookAt(x,y,z){if(x.isVector3){vector.copy(x);}else{vector.set(x,y,z);}if(this.isCamera){m1.lookAt(this.position,vector,this.up);}else{m1.lookAt(vector,this.position,this.up);}this.quaternion.setFromRotationMatrix(m1);};}(),add:function(object){if(arguments.length>1){for(var i=0;i<arguments.length;i++){this.add(arguments[i]);}return this;}if(object===this){console.error("THREE.Object3D.add: object can't be added as a child of itself.",object);return this;}if(object&&object.isObject3D){if(object.parent!==null){object.parent.remove(object);}object.parent=this;object.dispatchEvent({type:'added'});this.children.push(object);}else{console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",object);}return this;},remove:function(object){if(arguments.length>1){for(var i=0;i<arguments.length;i++){this.remove(arguments[i]);}return this;}var index=this.children.indexOf(object);if(index!==-1){object.parent=null;object.dispatchEvent({type:'removed'});this.children.splice(index,1);}return this;},getObjectById:function(id){return this.getObjectByProperty('id',id);},getObjectByName:function(name){return this.getObjectByProperty('name',name);},getObjectByProperty:function(name,value){if(this[name]===value)return this;for(var i=0,l=this.children.length;i<l;i++){var child=this.children[i];var object=child.getObjectByProperty(name,value);if(object!==undefined){return object;}}return undefined;},getWorldPosition:function(target){if(target===undefined){console.warn('THREE.Object3D: .getWorldPosition() target is now required');target=new Vector3();}this.updateMatrixWorld(true);return target.setFromMatrixPosition(this.matrixWorld);},getWorldQuaternion:function(){var position=new Vector3();var scale=new Vector3();return function getWorldQuaternion(target){if(target===undefined){console.warn('THREE.Object3D: .getWorldQuaternion() target is now required');target=new Quaternion();}this.updateMatrixWorld(true);this.matrixWorld.decompose(position,target,scale);return target;};}(),getWorldScale:function(){var position=new Vector3();var quaternion=new Quaternion();return function getWorldScale(target){if(target===undefined){console.warn('THREE.Object3D: .getWorldScale() target is now required');target=new Vector3();}this.updateMatrixWorld(true);this.matrixWorld.decompose(position,quaternion,target);return target;};}(),getWorldDirection:function(){var quaternion=new Quaternion();return function getWorldDirection(target){if(target===undefined){console.warn('THREE.Object3D: .getWorldDirection() target is now required');target=new Vector3();}this.getWorldQuaternion(quaternion);return target.set(0,0,1).applyQuaternion(quaternion);};}(),raycast:function(){},traverse:function(callback){callback(this);var children=this.children;for(var i=0,l=children.length;i<l;i++){children[i].traverse(callback);}},traverseVisible:function(callback){if(this.visible===false)return;callback(this);var children=this.children;for(var i=0,l=children.length;i<l;i++){children[i].traverseVisible(callback);}},traverseAncestors:function(callback){var parent=this.parent;if(parent!==null){callback(parent);parent.traverseAncestors(callback);}},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale);this.matrixWorldNeedsUpdate=true;},updateMatrixWorld:function(force){if(this.matrixAutoUpdate)this.updateMatrix();if(this.matrixWorldNeedsUpdate||force){if(this.parent===null){this.matrixWorld.copy(this.matrix);}else{this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix);}this.matrixWorldNeedsUpdate=false;force=true;}// update children
var children=this.children;for(var i=0,l=children.length;i<l;i++){children[i].updateMatrixWorld(force);}},toJSON:function(meta){// meta is a string when called from JSON.stringify
var isRootObject=meta===undefined||typeof meta==='string';var output={};// meta is a hash used to collect geometries, materials.
// not providing it implies that this is the root object
// being serialized.
if(isRootObject){// initialize meta obj
meta={geometries:{},materials:{},textures:{},images:{},shapes:{}};output.metadata={version:4.5,type:'Object',generator:'Object3D.toJSON'};}// standard Object3D serialization
var object={};object.uuid=this.uuid;object.type=this.type;if(this.name!=='')object.name=this.name;if(this.castShadow===true)object.castShadow=true;if(this.receiveShadow===true)object.receiveShadow=true;if(this.visible===false)object.visible=false;if(this.frustumCulled===false)object.frustumCulled=false;if(this.renderOrder!==0)object.renderOrder=this.renderOrder;if(JSON.stringify(this.userData)!=='{}')object.userData=this.userData;object.matrix=this.matrix.toArray();if(this.matrixAutoUpdate===false)object.matrixAutoUpdate=false;//
function serialize(library,element){if(library[element.uuid]===undefined){library[element.uuid]=element.toJSON(meta);}return element.uuid;}if(this.geometry!==undefined){object.geometry=serialize(meta.geometries,this.geometry);var parameters=this.geometry.parameters;if(parameters!==undefined&&parameters.shapes!==undefined){var shapes=parameters.shapes;if(Array.isArray(shapes)){for(var i=0,l=shapes.length;i<l;i++){var shape=shapes[i];serialize(meta.shapes,shape);}}else{serialize(meta.shapes,shapes);}}}if(this.material!==undefined){if(Array.isArray(this.material)){var uuids=[];for(var i=0,l=this.material.length;i<l;i++){uuids.push(serialize(meta.materials,this.material[i]));}object.material=uuids;}else{object.material=serialize(meta.materials,this.material);}}//
if(this.children.length>0){object.children=[];for(var i=0;i<this.children.length;i++){object.children.push(this.children[i].toJSON(meta).object);}}if(isRootObject){var geometries=extractFromCache(meta.geometries);var materials=extractFromCache(meta.materials);var textures=extractFromCache(meta.textures);var images=extractFromCache(meta.images);var shapes=extractFromCache(meta.shapes);if(geometries.length>0)output.geometries=geometries;if(materials.length>0)output.materials=materials;if(textures.length>0)output.textures=textures;if(images.length>0)output.images=images;if(shapes.length>0)output.shapes=shapes;}output.object=object;return output;// extract data from the cache hash
// remove metadata on each item
// and return as array
function extractFromCache(cache){var values=[];for(var key in cache){var data=cache[key];delete data.metadata;values.push(data);}return values;}},clone:function(recursive){return new this.constructor().copy(this,recursive);},copy:function(source,recursive){if(recursive===undefined)recursive=true;this.name=source.name;this.up.copy(source.up);this.position.copy(source.position);this.quaternion.copy(source.quaternion);this.scale.copy(source.scale);this.matrix.copy(source.matrix);this.matrixWorld.copy(source.matrixWorld);this.matrixAutoUpdate=source.matrixAutoUpdate;this.matrixWorldNeedsUpdate=source.matrixWorldNeedsUpdate;this.layers.mask=source.layers.mask;this.visible=source.visible;this.castShadow=source.castShadow;this.receiveShadow=source.receiveShadow;this.frustumCulled=source.frustumCulled;this.renderOrder=source.renderOrder;this.userData=JSON.parse(JSON.stringify(source.userData));if(recursive===true){for(var i=0;i<source.children.length;i++){var child=source.children[i];this.add(child.clone());}}return this;}});/**
* @author mrdoob / http://mrdoob.com/
* @author mikael emtinger / http://gomo.se/
* @author WestLangley / http://github.com/WestLangley
*/function Camera(){Object3D.call(this);this.type='Camera';this.matrixWorldInverse=new Matrix4();this.projectionMatrix=new Matrix4();}Camera.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Camera,isCamera:true,copy:function(source,recursive){Object3D.prototype.copy.call(this,source,recursive);this.matrixWorldInverse.copy(source.matrixWorldInverse);this.projectionMatrix.copy(source.projectionMatrix);return this;},getWorldDirection:function(){var quaternion=new Quaternion();return function getWorldDirection(target){if(target===undefined){console.warn('THREE.Camera: .getWorldDirection() target is now required');target=new Vector3();}this.getWorldQuaternion(quaternion);return target.set(0,0,-1).applyQuaternion(quaternion);};}(),updateMatrixWorld:function(force){Object3D.prototype.updateMatrixWorld.call(this,force);this.matrixWorldInverse.getInverse(this.matrixWorld);},clone:function(){return new this.constructor().copy(this);}});/**
* @author alteredq / http://alteredqualia.com/
* @author arose / http://github.com/arose
*/function OrthographicCamera(left,right,top,bottom,near,far){Camera.call(this);this.type='OrthographicCamera';this.zoom=1;this.view=null;this.left=left;this.right=right;this.top=top;this.bottom=bottom;this.near=near!==undefined?near:0.1;this.far=far!==undefined?far:2000;this.updateProjectionMatrix();}OrthographicCamera.prototype=Object.assign(Object.create(Camera.prototype),{constructor:OrthographicCamera,isOrthographicCamera:true,copy:function(source,recursive){Camera.prototype.copy.call(this,source,recursive);this.left=source.left;this.right=source.right;this.top=source.top;this.bottom=source.bottom;this.near=source.near;this.far=source.far;this.zoom=source.zoom;this.view=source.view===null?null:Object.assign({},source.view);return this;},setViewOffset:function(fullWidth,fullHeight,x,y,width,height){if(this.view===null){this.view={enabled:true,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1};}this.view.enabled=true;this.view.fullWidth=fullWidth;this.view.fullHeight=fullHeight;this.view.offsetX=x;this.view.offsetY=y;this.view.width=width;this.view.height=height;this.updateProjectionMatrix();},clearViewOffset:function(){if(this.view!==null){this.view.enabled=false;}this.updateProjectionMatrix();},updateProjectionMatrix:function(){var dx=(this.right-this.left)/(2*this.zoom);var dy=(this.top-this.bottom)/(2*this.zoom);var cx=(this.right+this.left)/2;var cy=(this.top+this.bottom)/2;var left=cx-dx;var right=cx+dx;var top=cy+dy;var bottom=cy-dy;if(this.view!==null&&this.view.enabled){var zoomW=this.zoom/(this.view.width/this.view.fullWidth);var zoomH=this.zoom/(this.view.height/this.view.fullHeight);var scaleW=(this.right-this.left)/this.view.width;var scaleH=(this.top-this.bottom)/this.view.height;left+=scaleW*(this.view.offsetX/zoomW);right=left+scaleW*(this.view.width/zoomW);top-=scaleH*(this.view.offsetY/zoomH);bottom=top-scaleH*(this.view.height/zoomH);}this.projectionMatrix.makeOrthographic(left,right,top,bottom,this.near,this.far);},toJSON:function(meta){var data=Object3D.prototype.toJSON.call(this,meta);data.object.zoom=this.zoom;data.object.left=this.left;data.object.right=this.right;data.object.top=this.top;data.object.bottom=this.bottom;data.object.near=this.near;data.object.far=this.far;if(this.view!==null)data.object.view=Object.assign({},this.view);return data;}});/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/function Face3(a,b,c,normal,color,materialIndex){this.a=a;this.b=b;this.c=c;this.normal=normal&&normal.isVector3?normal:new Vector3();this.vertexNormals=Array.isArray(normal)?normal:[];this.color=color&&color.isColor?color:new Color();this.vertexColors=Array.isArray(color)?color:[];this.materialIndex=materialIndex!==undefined?materialIndex:0;}Object.assign(Face3.prototype,{clone:function(){return new this.constructor().copy(this);},copy:function(source){this.a=source.a;this.b=source.b;this.c=source.c;this.normal.copy(source.normal);this.color.copy(source.color);this.materialIndex=source.materialIndex;for(var i=0,il=source.vertexNormals.length;i<il;i++){this.vertexNormals[i]=source.vertexNormals[i].clone();}for(var i=0,il=source.vertexColors.length;i<il;i++){this.vertexColors[i]=source.vertexColors[i].clone();}return this;}});/**
* @author mrdoob / http://mrdoob.com/
* @author kile / http://kile.stravaganza.org/
* @author alteredq / http://alteredqualia.com/
* @author mikael emtinger / http://gomo.se/
* @author zz85 / http://www.lab4games.net/zz85/blog
* @author bhouston / http://clara.io
*/var geometryId=0;// Geometry uses even numbers as Id
function Geometry(){Object.defineProperty(this,'id',{value:geometryId+=2});this.uuid=_Math.generateUUID();this.name='';this.type='Geometry';this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingBox=null;this.boundingSphere=null;// update flags
this.elementsNeedUpdate=false;this.verticesNeedUpdate=false;this.uvsNeedUpdate=false;this.normalsNeedUpdate=false;this.colorsNeedUpdate=false;this.lineDistancesNeedUpdate=false;this.groupsNeedUpdate=false;}Geometry.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:Geometry,isGeometry:true,applyMatrix:function(matrix){var normalMatrix=new Matrix3().getNormalMatrix(matrix);for(var i=0,il=this.vertices.length;i<il;i++){var vertex=this.vertices[i];vertex.applyMatrix4(matrix);}for(var i=0,il=this.faces.length;i<il;i++){var face=this.faces[i];face.normal.applyMatrix3(normalMatrix).normalize();for(var j=0,jl=face.vertexNormals.length;j<jl;j++){face.vertexNormals[j].applyMatrix3(normalMatrix).normalize();}}if(this.boundingBox!==null){this.computeBoundingBox();}if(this.boundingSphere!==null){this.computeBoundingSphere();}this.verticesNeedUpdate=true;this.normalsNeedUpdate=true;return this;},rotateX:function(){// rotate geometry around world x-axis
var m1=new Matrix4();return function rotateX(angle){m1.makeRotationX(angle);this.applyMatrix(m1);return this;};}(),rotateY:function(){// rotate geometry around world y-axis
var m1=new Matrix4();return function rotateY(angle){m1.makeRotationY(angle);this.applyMatrix(m1);return this;};}(),rotateZ:function(){// rotate geometry around world z-axis
var m1=new Matrix4();return function rotateZ(angle){m1.makeRotationZ(angle);this.applyMatrix(m1);return this;};}(),translate:function(){// translate geometry
var m1=new Matrix4();return function translate(x,y,z){m1.makeTranslation(x,y,z);this.applyMatrix(m1);return this;};}(),scale:function(){// scale geometry
var m1=new Matrix4();return function scale(x,y,z){m1.makeScale(x,y,z);this.applyMatrix(m1);return this;};}(),lookAt:function(){var obj=new Object3D();return function lookAt(vector){obj.lookAt(vector);obj.updateMatrix();this.applyMatrix(obj.matrix);};}(),fromBufferGeometry:function(geometry){var scope=this;var indices=geometry.index!==null?geometry.index.array:undefined;var attributes=geometry.attributes;var positions=attributes.position.array;var normals=attributes.normal!==undefined?attributes.normal.array:undefined;var colors=attributes.color!==undefined?attributes.color.array:undefined;var uvs=attributes.uv!==undefined?attributes.uv.array:undefined;var uvs2=attributes.uv2!==undefined?attributes.uv2.array:undefined;if(uvs2!==undefined)this.faceVertexUvs[1]=[];var tempNormals=[];var tempUVs=[];var tempUVs2=[];for(var i=0,j=0;i<positions.length;i+=3,j+=2){scope.vertices.push(new Vector3(positions[i],positions[i+1],positions[i+2]));if(normals!==undefined){tempNormals.push(new Vector3(normals[i],normals[i+1],normals[i+2]));}if(colors!==undefined){scope.colors.push(new Color(colors[i],colors[i+1],colors[i+2]));}if(uvs!==undefined){tempUVs.push(new Vector2(uvs[j],uvs[j+1]));}if(uvs2!==undefined){tempUVs2.push(new Vector2(uvs2[j],uvs2[j+1]));}}function addFace(a,b,c,materialIndex){var vertexNormals=normals!==undefined?[tempNormals[a].clone(),tempNormals[b].clone(),tempNormals[c].clone()]:[];var vertexColors=colors!==undefined?[scope.colors[a].clone(),scope.colors[b].clone(),scope.colors[c].clone()]:[];var face=new Face3(a,b,c,vertexNormals,vertexColors,materialIndex);scope.faces.push(face);if(uvs!==undefined){scope.faceVertexUvs[0].push([tempUVs[a].clone(),tempUVs[b].clone(),tempUVs[c].clone()]);}if(uvs2!==undefined){scope.faceVertexUvs[1].push([tempUVs2[a].clone(),tempUVs2[b].clone(),tempUVs2[c].clone()]);}}var groups=geometry.groups;if(groups.length>0){for(var i=0;i<groups.length;i++){var group=groups[i];var start=group.start;var count=group.count;for(var j=start,jl=start+count;j<jl;j+=3){if(indices!==undefined){addFace(indices[j],indices[j+1],indices[j+2],group.materialIndex);}else{addFace(j,j+1,j+2,group.materialIndex);}}}}else{if(indices!==undefined){for(var i=0;i<indices.length;i+=3){addFace(indices[i],indices[i+1],indices[i+2]);}}else{for(var i=0;i<positions.length/3;i+=3){addFace(i,i+1,i+2);}}}this.computeFaceNormals();if(geometry.boundingBox!==null){this.boundingBox=geometry.boundingBox.clone();}if(geometry.boundingSphere!==null){this.boundingSphere=geometry.boundingSphere.clone();}return this;},center:function(){var offset=new Vector3();return function center(){this.computeBoundingBox();this.boundingBox.getCenter(offset).negate();this.translate(offset.x,offset.y,offset.z);return this;};}(),normalize:function(){this.computeBoundingSphere();var center=this.boundingSphere.center;var radius=this.boundingSphere.radius;var s=radius===0?1:1.0/radius;var matrix=new Matrix4();matrix.set(s,0,0,-s*center.x,0,s,0,-s*center.y,0,0,s,-s*center.z,0,0,0,1);this.applyMatrix(matrix);return this;},computeFaceNormals:function(){var cb=new Vector3(),ab=new Vector3();for(var f=0,fl=this.faces.length;f<fl;f++){var face=this.faces[f];var vA=this.vertices[face.a];var vB=this.vertices[face.b];var vC=this.vertices[face.c];cb.subVectors(vC,vB);ab.subVectors(vA,vB);cb.cross(ab);cb.normalize();face.normal.copy(cb);}},computeVertexNormals:function(areaWeighted){if(areaWeighted===undefined)areaWeighted=true;var v,vl,f,fl,face,vertices;vertices=new Array(this.vertices.length);for(v=0,vl=this.vertices.length;v<vl;v++){vertices[v]=new Vector3();}if(areaWeighted){// vertex normals weighted by triangle areas
// http://www.iquilezles.org/www/articles/normals/normals.htm
var vA,vB,vC;var cb=new Vector3(),ab=new Vector3();for(f=0,fl=this.faces.length;f<fl;f++){face=this.faces[f];vA=this.vertices[face.a];vB=this.vertices[face.b];vC=this.vertices[face.c];cb.subVectors(vC,vB);ab.subVectors(vA,vB);cb.cross(ab);vertices[face.a].add(cb);vertices[face.b].add(cb);vertices[face.c].add(cb);}}else{this.computeFaceNormals();for(f=0,fl=this.faces.length;f<fl;f++){face=this.faces[f];vertices[face.a].add(face.normal);vertices[face.b].add(face.normal);vertices[face.c].add(face.normal);}}for(v=0,vl=this.vertices.length;v<vl;v++){vertices[v].normalize();}for(f=0,fl=this.faces.length;f<fl;f++){face=this.faces[f];var vertexNormals=face.vertexNormals;if(vertexNormals.length===3){vertexNormals[0].copy(vertices[face.a]);vertexNormals[1].copy(vertices[face.b]);vertexNormals[2].copy(vertices[face.c]);}else{vertexNormals[0]=vertices[face.a].clone();vertexNormals[1]=vertices[face.b].clone();vertexNormals[2]=vertices[face.c].clone();}}if(this.faces.length>0){this.normalsNeedUpdate=true;}},computeFlatVertexNormals:function(){var f,fl,face;this.computeFaceNormals();for(f=0,fl=this.faces.length;f<fl;f++){face=this.faces[f];var vertexNormals=face.vertexNormals;if(vertexNormals.length===3){vertexNormals[0].copy(face.normal);vertexNormals[1].copy(face.normal);vertexNormals[2].copy(face.normal);}else{vertexNormals[0]=face.normal.clone();vertexNormals[1]=face.normal.clone();vertexNormals[2]=face.normal.clone();}}if(this.faces.length>0){this.normalsNeedUpdate=true;}},computeMorphNormals:function(){var i,il,f,fl,face;// save original normals
// - create temp variables on first access
// otherwise just copy (for faster repeated calls)
for(f=0,fl=this.faces.length;f<fl;f++){face=this.faces[f];if(!face.__originalFaceNormal){face.__originalFaceNormal=face.normal.clone();}else{face.__originalFaceNormal.copy(face.normal);}if(!face.__originalVertexNormals)face.__originalVertexNormals=[];for(i=0,il=face.vertexNormals.length;i<il;i++){if(!face.__originalVertexNormals[i]){face.__originalVertexNormals[i]=face.vertexNormals[i].clone();}else{face.__originalVertexNormals[i].copy(face.vertexNormals[i]);}}}// use temp geometry to compute face and vertex normals for each morph
var tmpGeo=new Geometry();tmpGeo.faces=this.faces;for(i=0,il=this.morphTargets.length;i<il;i++){// create on first access
if(!this.morphNormals[i]){this.morphNormals[i]={};this.morphNormals[i].faceNormals=[];this.morphNormals[i].vertexNormals=[];var dstNormalsFace=this.morphNormals[i].faceNormals;var dstNormalsVertex=this.morphNormals[i].vertexNormals;var faceNormal,vertexNormals;for(f=0,fl=this.faces.length;f<fl;f++){faceNormal=new Vector3();vertexNormals={a:new Vector3(),b:new Vector3(),c:new Vector3()};dstNormalsFace.push(faceNormal);dstNormalsVertex.push(vertexNormals);}}var morphNormals=this.morphNormals[i];// set vertices to morph target
tmpGeo.vertices=this.morphTargets[i].vertices;// compute morph normals
tmpGeo.computeFaceNormals();tmpGeo.computeVertexNormals();// store morph normals
var faceNormal,vertexNormals;for(f=0,fl=this.faces.length;f<fl;f++){face=this.faces[f];faceNormal=morphNormals.faceNormals[f];vertexNormals=morphNormals.vertexNormals[f];faceNormal.copy(face.normal);vertexNormals.a.copy(face.vertexNormals[0]);vertexNormals.b.copy(face.vertexNormals[1]);vertexNormals.c.copy(face.vertexNormals[2]);}}// restore original normals
for(f=0,fl=this.faces.length;f<fl;f++){face=this.faces[f];face.normal=face.__originalFaceNormal;face.vertexNormals=face.__originalVertexNormals;}},computeBoundingBox:function(){if(this.boundingBox===null){this.boundingBox=new Box3();}this.boundingBox.setFromPoints(this.vertices);},computeBoundingSphere:function(){if(this.boundingSphere===null){this.boundingSphere=new Sphere();}this.boundingSphere.setFromPoints(this.vertices);},merge:function(geometry,matrix,materialIndexOffset){if(!(geometry&&geometry.isGeometry)){console.error('THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.',geometry);return;}var normalMatrix,vertexOffset=this.vertices.length,vertices1=this.vertices,vertices2=geometry.vertices,faces1=this.faces,faces2=geometry.faces,uvs1=this.faceVertexUvs[0],uvs2=geometry.faceVertexUvs[0],colors1=this.colors,colors2=geometry.colors;if(materialIndexOffset===undefined)materialIndexOffset=0;if(matrix!==undefined){normalMatrix=new Matrix3().getNormalMatrix(matrix);}// vertices
for(var i=0,il=vertices2.length;i<il;i++){var vertex=vertices2[i];var vertexCopy=vertex.clone();if(matrix!==undefined)vertexCopy.applyMatrix4(matrix);vertices1.push(vertexCopy);}// colors
for(var i=0,il=colors2.length;i<il;i++){colors1.push(colors2[i].clone());}// faces
for(i=0,il=faces2.length;i<il;i++){var face=faces2[i],faceCopy,normal,color,faceVertexNormals=face.vertexNormals,faceVertexColors=face.vertexColors;faceCopy=new Face3(face.a+vertexOffset,face.b+vertexOffset,face.c+vertexOffset);faceCopy.normal.copy(face.normal);if(normalMatrix!==undefined){faceCopy.normal.applyMatrix3(normalMatrix).normalize();}for(var j=0,jl=faceVertexNormals.length;j<jl;j++){normal=faceVertexNormals[j].clone();if(normalMatrix!==undefined){normal.applyMatrix3(normalMatrix).normalize();}faceCopy.vertexNormals.push(normal);}faceCopy.color.copy(face.color);for(var j=0,jl=faceVertexColors.length;j<jl;j++){color=faceVertexColors[j];faceCopy.vertexColors.push(color.clone());}faceCopy.materialIndex=face.materialIndex+materialIndexOffset;faces1.push(faceCopy);}// uvs
for(i=0,il=uvs2.length;i<il;i++){var uv=uvs2[i],uvCopy=[];if(uv===undefined){continue;}for(var j=0,jl=uv.length;j<jl;j++){uvCopy.push(uv[j].clone());}uvs1.push(uvCopy);}},mergeMesh:function(mesh){if(!(mesh&&mesh.isMesh)){console.error('THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.',mesh);return;}if(mesh.matrixAutoUpdate)mesh.updateMatrix();this.merge(mesh.geometry,mesh.matrix);},/*
* Checks for duplicate vertices with hashmap.
* Duplicated vertices are removed
* and faces' vertices are updated.
*/mergeVertices:function(){var verticesMap={};// Hashmap for looking up vertices by position coordinates (and making sure they are unique)
var unique=[],changes=[];var v,key;var precisionPoints=4;// number of decimal points, e.g. 4 for epsilon of 0.0001
var precision=Math.pow(10,precisionPoints);var i,il,face;var indices,j,jl;for(i=0,il=this.vertices.length;i<il;i++){v=this.vertices[i];key=Math.round(v.x*precision)+'_'+Math.round(v.y*precision)+'_'+Math.round(v.z*precision);if(verticesMap[key]===undefined){verticesMap[key]=i;unique.push(this.vertices[i]);changes[i]=unique.length-1;}else{//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);
changes[i]=changes[verticesMap[key]];}}// if faces are completely degenerate after merging vertices, we
// have to remove them from the geometry.
var faceIndicesToRemove=[];for(i=0,il=this.faces.length;i<il;i++){face=this.faces[i];face.a=changes[face.a];face.b=changes[face.b];face.c=changes[face.c];indices=[face.a,face.b,face.c];// if any duplicate vertices are found in a Face3
// we have to remove the face as nothing can be saved
for(var n=0;n<3;n++){if(indices[n]===indices[(n+1)%3]){faceIndicesToRemove.push(i);break;}}}for(i=faceIndicesToRemove.length-1;i>=0;i--){var idx=faceIndicesToRemove[i];this.faces.splice(idx,1);for(j=0,jl=this.faceVertexUvs.length;j<jl;j++){this.faceVertexUvs[j].splice(idx,1);}}// Use unique set of vertices
var diff=this.vertices.length-unique.length;this.vertices=unique;return diff;},setFromPoints:function(points){this.vertices=[];for(var i=0,l=points.length;i<l;i++){var point=points[i];this.vertices.push(new Vector3(point.x,point.y,point.z||0));}return this;},sortFacesByMaterialIndex:function(){var faces=this.faces;var length=faces.length;// tag faces
for(var i=0;i<length;i++){faces[i]._id=i;}// sort faces
function materialIndexSort(a,b){return a.materialIndex-b.materialIndex;}faces.sort(materialIndexSort);// sort uvs
var uvs1=this.faceVertexUvs[0];var uvs2=this.faceVertexUvs[1];var newUvs1,newUvs2;if(uvs1&&uvs1.length===length)newUvs1=[];if(uvs2&&uvs2.length===length)newUvs2=[];for(var i=0;i<length;i++){var id=faces[i]._id;if(newUvs1)newUvs1.push(uvs1[id]);if(newUvs2)newUvs2.push(uvs2[id]);}if(newUvs1)this.faceVertexUvs[0]=newUvs1;if(newUvs2)this.faceVertexUvs[1]=newUvs2;},toJSON:function(){var data={metadata:{version:4.5,type:'Geometry',generator:'Geometry.toJSON'}};// standard Geometry serialization
data.uuid=this.uuid;data.type=this.type;if(this.name!=='')data.name=this.name;if(this.parameters!==undefined){var parameters=this.parameters;for(var key in parameters){if(parameters[key]!==undefined)data[key]=parameters[key];}return data;}var vertices=[];for(var i=0;i<this.vertices.length;i++){var vertex=this.vertices[i];vertices.push(vertex.x,vertex.y,vertex.z);}var faces=[];var normals=[];var normalsHash={};var colors=[];var colorsHash={};var uvs=[];var uvsHash={};for(var i=0;i<this.faces.length;i++){var face=this.faces[i];var hasMaterial=true;var hasFaceUv=false;// deprecated
var hasFaceVertexUv=this.faceVertexUvs[0][i]!==undefined;var hasFaceNormal=face.normal.length()>0;var hasFaceVertexNormal=face.vertexNormals.length>0;var hasFaceColor=face.color.r!==1||face.color.g!==1||face.color.b!==1;var hasFaceVertexColor=face.vertexColors.length>0;var faceType=0;faceType=setBit(faceType,0,0);// isQuad
faceType=setBit(faceType,1,hasMaterial);faceType=setBit(faceType,2,hasFaceUv);faceType=setBit(faceType,3,hasFaceVertexUv);faceType=setBit(faceType,4,hasFaceNormal);faceType=setBit(faceType,5,hasFaceVertexNormal);faceType=setBit(faceType,6,hasFaceColor);faceType=setBit(faceType,7,hasFaceVertexColor);faces.push(faceType);faces.push(face.a,face.b,face.c);faces.push(face.materialIndex);if(hasFaceVertexUv){var faceVertexUvs=this.faceVertexUvs[0][i];faces.push(getUvIndex(faceVertexUvs[0]),getUvIndex(faceVertexUvs[1]),getUvIndex(faceVertexUvs[2]));}if(hasFaceNormal){faces.push(getNormalIndex(face.normal));}if(hasFaceVertexNormal){var vertexNormals=face.vertexNormals;faces.push(getNormalIndex(vertexNormals[0]),getNormalIndex(vertexNormals[1]),getNormalIndex(vertexNormals[2]));}if(hasFaceColor){faces.push(getColorIndex(face.color));}if(hasFaceVertexColor){var vertexColors=face.vertexColors;faces.push(getColorIndex(vertexColors[0]),getColorIndex(vertexColors[1]),getColorIndex(vertexColors[2]));}}function setBit(value,position,enabled){return enabled?value|1<<position:value&~(1<<position);}function getNormalIndex(normal){var hash=normal.x.toString()+normal.y.toString()+normal.z.toString();if(normalsHash[hash]!==undefined){return normalsHash[hash];}normalsHash[hash]=normals.length/3;normals.push(normal.x,normal.y,normal.z);return normalsHash[hash];}function getColorIndex(color){var hash=color.r.toString()+color.g.toString()+color.b.toString();if(colorsHash[hash]!==undefined){return colorsHash[hash];}colorsHash[hash]=colors.length;colors.push(color.getHex());return colorsHash[hash];}function getUvIndex(uv){var hash=uv.x.toString()+uv.y.toString();if(uvsHash[hash]!==undefined){return uvsHash[hash];}uvsHash[hash]=uvs.length/2;uvs.push(uv.x,uv.y);return uvsHash[hash];}data.data={};data.data.vertices=vertices;data.data.normals=normals;if(colors.length>0)data.data.colors=colors;if(uvs.length>0)data.data.uvs=[uvs];// temporal backward compatibility
data.data.faces=faces;return data;},clone:function(){/*
// Handle primitives
var parameters = this.parameters;
if ( parameters !== undefined ) {
var values = [];
for ( var key in parameters ) {
values.push( parameters[ key ] );
}
var geometry = Object.create( this.constructor.prototype );
this.constructor.apply( geometry, values );
return geometry;
}
return new this.constructor().copy( this );
*/return new Geometry().copy(this);},copy:function(source){var i,il,j,jl,k,kl;// reset
this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingBox=null;this.boundingSphere=null;// name
this.name=source.name;// vertices
var vertices=source.vertices;for(i=0,il=vertices.length;i<il;i++){this.vertices.push(vertices[i].clone());}// colors
var colors=source.colors;for(i=0,il=colors.length;i<il;i++){this.colors.push(colors[i].clone());}// faces
var faces=source.faces;for(i=0,il=faces.length;i<il;i++){this.faces.push(faces[i].clone());}// face vertex uvs
for(i=0,il=source.faceVertexUvs.length;i<il;i++){var faceVertexUvs=source.faceVertexUvs[i];if(this.faceVertexUvs[i]===undefined){this.faceVertexUvs[i]=[];}for(j=0,jl=faceVertexUvs.length;j<jl;j++){var uvs=faceVertexUvs[j],uvsCopy=[];for(k=0,kl=uvs.length;k<kl;k++){var uv=uvs[k];uvsCopy.push(uv.clone());}this.faceVertexUvs[i].push(uvsCopy);}}// morph targets
var morphTargets=source.morphTargets;for(i=0,il=morphTargets.length;i<il;i++){var morphTarget={};morphTarget.name=morphTargets[i].name;// vertices
if(morphTargets[i].vertices!==undefined){morphTarget.vertices=[];for(j=0,jl=morphTargets[i].vertices.length;j<jl;j++){morphTarget.vertices.push(morphTargets[i].vertices[j].clone());}}// normals
if(morphTargets[i].normals!==undefined){morphTarget.normals=[];for(j=0,jl=morphTargets[i].normals.length;j<jl;j++){morphTarget.normals.push(morphTargets[i].normals[j].clone());}}this.morphTargets.push(morphTarget);}// morph normals
var morphNormals=source.morphNormals;for(i=0,il=morphNormals.length;i<il;i++){var morphNormal={};// vertex normals
if(morphNormals[i].vertexNormals!==undefined){morphNormal.vertexNormals=[];for(j=0,jl=morphNormals[i].vertexNormals.length;j<jl;j++){var srcVertexNormal=morphNormals[i].vertexNormals[j];var destVertexNormal={};destVertexNormal.a=srcVertexNormal.a.clone();destVertexNormal.b=srcVertexNormal.b.clone();destVertexNormal.c=srcVertexNormal.c.clone();morphNormal.vertexNormals.push(destVertexNormal);}}// face normals
if(morphNormals[i].faceNormals!==undefined){morphNormal.faceNormals=[];for(j=0,jl=morphNormals[i].faceNormals.length;j<jl;j++){morphNormal.faceNormals.push(morphNormals[i].faceNormals[j].clone());}}this.morphNormals.push(morphNormal);}// skin weights
var skinWeights=source.skinWeights;for(i=0,il=skinWeights.length;i<il;i++){this.skinWeights.push(skinWeights[i].clone());}// skin indices
var skinIndices=source.skinIndices;for(i=0,il=skinIndices.length;i<il;i++){this.skinIndices.push(skinIndices[i].clone());}// line distances
var lineDistances=source.lineDistances;for(i=0,il=lineDistances.length;i<il;i++){this.lineDistances.push(lineDistances[i]);}// bounding box
var boundingBox=source.boundingBox;if(boundingBox!==null){this.boundingBox=boundingBox.clone();}// bounding sphere
var boundingSphere=source.boundingSphere;if(boundingSphere!==null){this.boundingSphere=boundingSphere.clone();}// update flags
this.elementsNeedUpdate=source.elementsNeedUpdate;this.verticesNeedUpdate=source.verticesNeedUpdate;this.uvsNeedUpdate=source.uvsNeedUpdate;this.normalsNeedUpdate=source.normalsNeedUpdate;this.colorsNeedUpdate=source.colorsNeedUpdate;this.lineDistancesNeedUpdate=source.lineDistancesNeedUpdate;this.groupsNeedUpdate=source.groupsNeedUpdate;return this;},dispose:function(){this.dispatchEvent({type:'dispose'});}});/**
* @author mrdoob / http://mrdoob.com/
*/function BufferAttribute(array,itemSize,normalized){if(Array.isArray(array)){throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.');}this.name='';this.array=array;this.itemSize=itemSize;this.count=array!==undefined?array.length/itemSize:0;this.normalized=normalized===true;this.dynamic=false;this.updateRange={offset:0,count:-1};this.version=0;}Object.defineProperty(BufferAttribute.prototype,'needsUpdate',{set:function(value){if(value===true)this.version++;}});Object.assign(BufferAttribute.prototype,{isBufferAttribute:true,onUploadCallback:function(){},setArray:function(array){if(Array.isArray(array)){throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.');}this.count=array!==undefined?array.length/this.itemSize:0;this.array=array;return this;},setDynamic:function(value){this.dynamic=value;return this;},copy:function(source){this.name=source.name;this.array=new source.array.constructor(source.array);this.itemSize=source.itemSize;this.count=source.count;this.normalized=source.normalized;this.dynamic=source.dynamic;return this;},copyAt:function(index1,attribute,index2){index1*=this.itemSize;index2*=attribute.itemSize;for(var i=0,l=this.itemSize;i<l;i++){this.array[index1+i]=attribute.array[index2+i];}return this;},copyArray:function(array){this.array.set(array);return this;},copyColorsArray:function(colors){var array=this.array,offset=0;for(var i=0,l=colors.length;i<l;i++){var color=colors[i];if(color===undefined){console.warn('THREE.BufferAttribute.copyColorsArray(): color is undefined',i);color=new Color();}array[offset++]=color.r;array[offset++]=color.g;array[offset++]=color.b;}return this;},copyVector2sArray:function(vectors){var array=this.array,offset=0;for(var i=0,l=vectors.length;i<l;i++){var vector=vectors[i];if(vector===undefined){console.warn('THREE.BufferAttribute.copyVector2sArray(): vector is undefined',i);vector=new Vector2();}array[offset++]=vector.x;array[offset++]=vector.y;}return this;},copyVector3sArray:function(vectors){var array=this.array,offset=0;for(var i=0,l=vectors.length;i<l;i++){var vector=vectors[i];if(vector===undefined){console.warn('THREE.BufferAttribute.copyVector3sArray(): vector is undefined',i);vector=new Vector3();}array[offset++]=vector.x;array[offset++]=vector.y;array[offset++]=vector.z;}return this;},copyVector4sArray:function(vectors){var array=this.array,offset=0;for(var i=0,l=vectors.length;i<l;i++){var vector=vectors[i];if(vector===undefined){console.warn('THREE.BufferAttribute.copyVector4sArray(): vector is undefined',i);vector=new Vector4();}array[offset++]=vector.x;array[offset++]=vector.y;array[offset++]=vector.z;array[offset++]=vector.w;}return this;},set:function(value,offset){if(offset===undefined)offset=0;this.array.set(value,offset);return this;},getX:function(index){return this.array[index*this.itemSize];},setX:function(index,x){this.array[index*this.itemSize]=x;return this;},getY:function(index){return this.array[index*this.itemSize+1];},setY:function(index,y){this.array[index*this.itemSize+1]=y;return this;},getZ:function(index){return this.array[index*this.itemSize+2];},setZ:function(index,z){this.array[index*this.itemSize+2]=z;return this;},getW:function(index){return this.array[index*this.itemSize+3];},setW:function(index,w){this.array[index*this.itemSize+3]=w;return this;},setXY:function(index,x,y){index*=this.itemSize;this.array[index+0]=x;this.array[index+1]=y;return this;},setXYZ:function(index,x,y,z){index*=this.itemSize;this.array[index+0]=x;this.array[index+1]=y;this.array[index+2]=z;return this;},setXYZW:function(index,x,y,z,w){index*=this.itemSize;this.array[index+0]=x;this.array[index+1]=y;this.array[index+2]=z;this.array[index+3]=w;return this;},onUpload:function(callback){this.onUploadCallback=callback;return this;},clone:function(){return new this.constructor(this.array,this.itemSize).copy(this);}});//
function Int8BufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Int8Array(array),itemSize,normalized);}Int8BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Int8BufferAttribute.prototype.constructor=Int8BufferAttribute;function Uint8BufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Uint8Array(array),itemSize,normalized);}Uint8BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Uint8BufferAttribute.prototype.constructor=Uint8BufferAttribute;function Uint8ClampedBufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Uint8ClampedArray(array),itemSize,normalized);}Uint8ClampedBufferAttribute.prototype=Object.create(BufferAttribute.prototype);Uint8ClampedBufferAttribute.prototype.constructor=Uint8ClampedBufferAttribute;function Int16BufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Int16Array(array),itemSize,normalized);}Int16BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Int16BufferAttribute.prototype.constructor=Int16BufferAttribute;function Uint16BufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Uint16Array(array),itemSize,normalized);}Uint16BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Uint16BufferAttribute.prototype.constructor=Uint16BufferAttribute;function Int32BufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Int32Array(array),itemSize,normalized);}Int32BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Int32BufferAttribute.prototype.constructor=Int32BufferAttribute;function Uint32BufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Uint32Array(array),itemSize,normalized);}Uint32BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Uint32BufferAttribute.prototype.constructor=Uint32BufferAttribute;function Float32BufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Float32Array(array),itemSize,normalized);}Float32BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Float32BufferAttribute.prototype.constructor=Float32BufferAttribute;function Float64BufferAttribute(array,itemSize,normalized){BufferAttribute.call(this,new Float64Array(array),itemSize,normalized);}Float64BufferAttribute.prototype=Object.create(BufferAttribute.prototype);Float64BufferAttribute.prototype.constructor=Float64BufferAttribute;/**
* @author mrdoob / http://mrdoob.com/
*/function DirectGeometry(){this.vertices=[];this.normals=[];this.colors=[];this.uvs=[];this.uvs2=[];this.groups=[];this.morphTargets={};this.skinWeights=[];this.skinIndices=[];// this.lineDistances = [];
this.boundingBox=null;this.boundingSphere=null;// update flags
this.verticesNeedUpdate=false;this.normalsNeedUpdate=false;this.colorsNeedUpdate=false;this.uvsNeedUpdate=false;this.groupsNeedUpdate=false;}Object.assign(DirectGeometry.prototype,{computeGroups:function(geometry){var group;var groups=[];var materialIndex=undefined;var faces=geometry.faces;for(var i=0;i<faces.length;i++){var face=faces[i];// materials
if(face.materialIndex!==materialIndex){materialIndex=face.materialIndex;if(group!==undefined){group.count=i*3-group.start;groups.push(group);}group={start:i*3,materialIndex:materialIndex};}}if(group!==undefined){group.count=i*3-group.start;groups.push(group);}this.groups=groups;},fromGeometry:function(geometry){var faces=geometry.faces;var vertices=geometry.vertices;var faceVertexUvs=geometry.faceVertexUvs;var hasFaceVertexUv=faceVertexUvs[0]&&faceVertexUvs[0].length>0;var hasFaceVertexUv2=faceVertexUvs[1]&&faceVertexUvs[1].length>0;// morphs
var morphTargets=geometry.morphTargets;var morphTargetsLength=morphTargets.length;var morphTargetsPosition;if(morphTargetsLength>0){morphTargetsPosition=[];for(var i=0;i<morphTargetsLength;i++){morphTargetsPosition[i]=[];}this.morphTargets.position=morphTargetsPosition;}var morphNormals=geometry.morphNormals;var morphNormalsLength=morphNormals.length;var morphTargetsNormal;if(morphNormalsLength>0){morphTargetsNormal=[];for(var i=0;i<morphNormalsLength;i++){morphTargetsNormal[i]=[];}this.morphTargets.normal=morphTargetsNormal;}// skins
var skinIndices=geometry.skinIndices;var skinWeights=geometry.skinWeights;var hasSkinIndices=skinIndices.length===vertices.length;var hasSkinWeights=skinWeights.length===vertices.length;//
for(var i=0;i<faces.length;i++){var face=faces[i];this.vertices.push(vertices[face.a],vertices[face.b],vertices[face.c]);var vertexNormals=face.vertexNormals;if(vertexNormals.length===3){this.normals.push(vertexNormals[0],vertexNormals[1],vertexNormals[2]);}else{var normal=face.normal;this.normals.push(normal,normal,normal);}var vertexColors=face.vertexColors;if(vertexColors.length===3){this.colors.push(vertexColors[0],vertexColors[1],vertexColors[2]);}else{var color=face.color;this.colors.push(color,color,color);}if(hasFaceVertexUv===true){var vertexUvs=faceVertexUvs[0][i];if(vertexUvs!==undefined){this.uvs.push(vertexUvs[0],vertexUvs[1],vertexUvs[2]);}else{console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ',i);this.uvs.push(new Vector2(),new Vector2(),new Vector2());}}if(hasFaceVertexUv2===true){var vertexUvs=faceVertexUvs[1][i];if(vertexUvs!==undefined){this.uvs2.push(vertexUvs[0],vertexUvs[1],vertexUvs[2]);}else{console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ',i);this.uvs2.push(new Vector2(),new Vector2(),new Vector2());}}// morphs
for(var j=0;j<morphTargetsLength;j++){var morphTarget=morphTargets[j].vertices;morphTargetsPosition[j].push(morphTarget[face.a],morphTarget[face.b],morphTarget[face.c]);}for(var j=0;j<morphNormalsLength;j++){var morphNormal=morphNormals[j].vertexNormals[i];morphTargetsNormal[j].push(morphNormal.a,morphNormal.b,morphNormal.c);}// skins
if(hasSkinIndices){this.skinIndices.push(skinIndices[face.a],skinIndices[face.b],skinIndices[face.c]);}if(hasSkinWeights){this.skinWeights.push(skinWeights[face.a],skinWeights[face.b],skinWeights[face.c]);}}this.computeGroups(geometry);this.verticesNeedUpdate=geometry.verticesNeedUpdate;this.normalsNeedUpdate=geometry.normalsNeedUpdate;this.colorsNeedUpdate=geometry.colorsNeedUpdate;this.uvsNeedUpdate=geometry.uvsNeedUpdate;this.groupsNeedUpdate=geometry.groupsNeedUpdate;return this;}});/**
* @author mrdoob / http://mrdoob.com/
*/function arrayMax(array){if(array.length===0)return -Infinity;var max=array[0];for(var i=1,l=array.length;i<l;++i){if(array[i]>max)max=array[i];}return max;}/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
*/var bufferGeometryId=1;// BufferGeometry uses odd numbers as Id
function BufferGeometry(){Object.defineProperty(this,'id',{value:bufferGeometryId+=2});this.uuid=_Math.generateUUID();this.name='';this.type='BufferGeometry';this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingBox=null;this.boundingSphere=null;this.drawRange={start:0,count:Infinity};}BufferGeometry.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:BufferGeometry,isBufferGeometry:true,getIndex:function(){return this.index;},setIndex:function(index){if(Array.isArray(index)){this.index=new(arrayMax(index)>65535?Uint32BufferAttribute:Uint16BufferAttribute)(index,1);}else{this.index=index;}},addAttribute:function(name,attribute){if(!(attribute&&attribute.isBufferAttribute)&&!(attribute&&attribute.isInterleavedBufferAttribute)){console.warn('THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).');this.addAttribute(name,new BufferAttribute(arguments[1],arguments[2]));return;}if(name==='index'){console.warn('THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.');this.setIndex(attribute);return;}this.attributes[name]=attribute;return this;},getAttribute:function(name){return this.attributes[name];},removeAttribute:function(name){delete this.attributes[name];return this;},addGroup:function(start,count,materialIndex){this.groups.push({start:start,count:count,materialIndex:materialIndex!==undefined?materialIndex:0});},clearGroups:function(){this.groups=[];},setDrawRange:function(start,count){this.drawRange.start=start;this.drawRange.count=count;},applyMatrix:function(matrix){var position=this.attributes.position;if(position!==undefined){matrix.applyToBufferAttribute(position);position.needsUpdate=true;}var normal=this.attributes.normal;if(normal!==undefined){var normalMatrix=new Matrix3().getNormalMatrix(matrix);normalMatrix.applyToBufferAttribute(normal);normal.needsUpdate=true;}if(this.boundingBox!==null){this.computeBoundingBox();}if(this.boundingSphere!==null){this.computeBoundingSphere();}return this;},rotateX:function(){// rotate geometry around world x-axis
var m1=new Matrix4();return function rotateX(angle){m1.makeRotationX(angle);this.applyMatrix(m1);return this;};}(),rotateY:function(){// rotate geometry around world y-axis
var m1=new Matrix4();return function rotateY(angle){m1.makeRotationY(angle);this.applyMatrix(m1);return this;};}(),rotateZ:function(){// rotate geometry around world z-axis
var m1=new Matrix4();return function rotateZ(angle){m1.makeRotationZ(angle);this.applyMatrix(m1);return this;};}(),translate:function(){// translate geometry
var m1=new Matrix4();return function translate(x,y,z){m1.makeTranslation(x,y,z);this.applyMatrix(m1);return this;};}(),scale:function(){// scale geometry
var m1=new Matrix4();return function scale(x,y,z){m1.makeScale(x,y,z);this.applyMatrix(m1);return this;};}(),lookAt:function(){var obj=new Object3D();return function lookAt(vector){obj.lookAt(vector);obj.updateMatrix();this.applyMatrix(obj.matrix);};}(),center:function(){var offset=new Vector3();return function center(){this.computeBoundingBox();this.boundingBox.getCenter(offset).negate();this.translate(offset.x,offset.y,offset.z);return this;};}(),setFromObject:function(object){// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );
var geometry=object.geometry;if(object.isPoints||object.isLine){var positions=new Float32BufferAttribute(geometry.vertices.length*3,3);var colors=new Float32BufferAttribute(geometry.colors.length*3,3);this.addAttribute('position',positions.copyVector3sArray(geometry.vertices));this.addAttribute('color',colors.copyColorsArray(geometry.colors));if(geometry.lineDistances&&geometry.lineDistances.length===geometry.vertices.length){var lineDistances=new Float32BufferAttribute(geometry.lineDistances.length,1);this.addAttribute('lineDistance',lineDistances.copyArray(geometry.lineDistances));}if(geometry.boundingSphere!==null){this.boundingSphere=geometry.boundingSphere.clone();}if(geometry.boundingBox!==null){this.boundingBox=geometry.boundingBox.clone();}}else if(object.isMesh){if(geometry&&geometry.isGeometry){this.fromGeometry(geometry);}}return this;},setFromPoints:function(points){var position=[];for(var i=0,l=points.length;i<l;i++){var point=points[i];position.push(point.x,point.y,point.z||0);}this.addAttribute('position',new Float32BufferAttribute(position,3));return this;},updateFromObject:function(object){var geometry=object.geometry;if(object.isMesh){var direct=geometry.__directGeometry;if(geometry.elementsNeedUpdate===true){direct=undefined;geometry.elementsNeedUpdate=false;}if(direct===undefined){return this.fromGeometry(geometry);}direct.verticesNeedUpdate=geometry.verticesNeedUpdate;direct.normalsNeedUpdate=geometry.normalsNeedUpdate;direct.colorsNeedUpdate=geometry.colorsNeedUpdate;direct.uvsNeedUpdate=geometry.uvsNeedUpdate;direct.groupsNeedUpdate=geometry.groupsNeedUpdate;geometry.verticesNeedUpdate=false;geometry.normalsNeedUpdate=false;geometry.colorsNeedUpdate=false;geometry.uvsNeedUpdate=false;geometry.groupsNeedUpdate=false;geometry=direct;}var attribute;if(geometry.verticesNeedUpdate===true){attribute=this.attributes.position;if(attribute!==undefined){attribute.copyVector3sArray(geometry.vertices);attribute.needsUpdate=true;}geometry.verticesNeedUpdate=false;}if(geometry.normalsNeedUpdate===true){attribute=this.attributes.normal;if(attribute!==undefined){attribute.copyVector3sArray(geometry.normals);attribute.needsUpdate=true;}geometry.normalsNeedUpdate=false;}if(geometry.colorsNeedUpdate===true){attribute=this.attributes.color;if(attribute!==undefined){attribute.copyColorsArray(geometry.colors);attribute.needsUpdate=true;}geometry.colorsNeedUpdate=false;}if(geometry.uvsNeedUpdate){attribute=this.attributes.uv;if(attribute!==undefined){attribute.copyVector2sArray(geometry.uvs);attribute.needsUpdate=true;}geometry.uvsNeedUpdate=false;}if(geometry.lineDistancesNeedUpdate){attribute=this.attributes.lineDistance;if(attribute!==undefined){attribute.copyArray(geometry.lineDistances);attribute.needsUpdate=true;}geometry.lineDistancesNeedUpdate=false;}if(geometry.groupsNeedUpdate){geometry.computeGroups(object.geometry);this.groups=geometry.groups;geometry.groupsNeedUpdate=false;}return this;},fromGeometry:function(geometry){geometry.__directGeometry=new DirectGeometry().fromGeometry(geometry);return this.fromDirectGeometry(geometry.__directGeometry);},fromDirectGeometry:function(geometry){var positions=new Float32Array(geometry.vertices.length*3);this.addAttribute('position',new BufferAttribute(positions,3).copyVector3sArray(geometry.vertices));if(geometry.normals.length>0){var normals=new Float32Array(geometry.normals.length*3);this.addAttribute('normal',new BufferAttribute(normals,3).copyVector3sArray(geometry.normals));}if(geometry.colors.length>0){var colors=new Float32Array(geometry.colors.length*3);this.addAttribute('color',new BufferAttribute(colors,3).copyColorsArray(geometry.colors));}if(geometry.uvs.length>0){var uvs=new Float32Array(geometry.uvs.length*2);this.addAttribute('uv',new BufferAttribute(uvs,2).copyVector2sArray(geometry.uvs));}if(geometry.uvs2.length>0){var uvs2=new Float32Array(geometry.uvs2.length*2);this.addAttribute('uv2',new BufferAttribute(uvs2,2).copyVector2sArray(geometry.uvs2));}// groups
this.groups=geometry.groups;// morphs
for(var name in geometry.morphTargets){var array=[];var morphTargets=geometry.morphTargets[name];for(var i=0,l=morphTargets.length;i<l;i++){var morphTarget=morphTargets[i];var attribute=new Float32BufferAttribute(morphTarget.length*3,3);array.push(attribute.copyVector3sArray(morphTarget));}this.morphAttributes[name]=array;}// skinning
if(geometry.skinIndices.length>0){var skinIndices=new Float32BufferAttribute(geometry.skinIndices.length*4,4);this.addAttribute('skinIndex',skinIndices.copyVector4sArray(geometry.skinIndices));}if(geometry.skinWeights.length>0){var skinWeights=new Float32BufferAttribute(geometry.skinWeights.length*4,4);this.addAttribute('skinWeight',skinWeights.copyVector4sArray(geometry.skinWeights));}//
if(geometry.boundingSphere!==null){this.boundingSphere=geometry.boundingSphere.clone();}if(geometry.boundingBox!==null){this.boundingBox=geometry.boundingBox.clone();}return this;},computeBoundingBox:function(){if(this.boundingBox===null){this.boundingBox=new Box3();}var position=this.attributes.position;if(position!==undefined){this.boundingBox.setFromBufferAttribute(position);}else{this.boundingBox.makeEmpty();}if(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z)){console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this);}},computeBoundingSphere:function(){var box=new Box3();var vector=new Vector3();return function computeBoundingSphere(){if(this.boundingSphere===null){this.boundingSphere=new Sphere();}var position=this.attributes.position;if(position){var center=this.boundingSphere.center;box.setFromBufferAttribute(position);box.getCenter(center);// hoping to find a boundingSphere with a radius smaller than the
// boundingSphere of the boundingBox: sqrt(3) smaller in the best case
var maxRadiusSq=0;for(var i=0,il=position.count;i<il;i++){vector.x=position.getX(i);vector.y=position.getY(i);vector.z=position.getZ(i);maxRadiusSq=Math.max(maxRadiusSq,center.distanceToSquared(vector));}this.boundingSphere.radius=Math.sqrt(maxRadiusSq);if(isNaN(this.boundingSphere.radius)){console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this);}}};}(),computeFaceNormals:function(){// backwards compatibility
},computeVertexNormals:function(){var index=this.index;var attributes=this.attributes;var groups=this.groups;if(attributes.position){var positions=attributes.position.array;if(attributes.normal===undefined){this.addAttribute('normal',new BufferAttribute(new Float32Array(positions.length),3));}else{// reset existing normals to zero
var array=attributes.normal.array;for(var i=0,il=array.length;i<il;i++){array[i]=0;}}var normals=attributes.normal.array;var vA,vB,vC;var pA=new Vector3(),pB=new Vector3(),pC=new Vector3();var cb=new Vector3(),ab=new Vector3();// indexed elements
if(index){var indices=index.array;if(groups.length===0){this.addGroup(0,indices.length);}for(var j=0,jl=groups.length;j<jl;++j){var group=groups[j];var start=group.start;var count=group.count;for(var i=start,il=start+count;i<il;i+=3){vA=indices[i+0]*3;vB=indices[i+1]*3;vC=indices[i+2]*3;pA.fromArray(positions,vA);pB.fromArray(positions,vB);pC.fromArray(positions,vC);cb.subVectors(pC,pB);ab.subVectors(pA,pB);cb.cross(ab);normals[vA]+=cb.x;normals[vA+1]+=cb.y;normals[vA+2]+=cb.z;normals[vB]+=cb.x;normals[vB+1]+=cb.y;normals[vB+2]+=cb.z;normals[vC]+=cb.x;normals[vC+1]+=cb.y;normals[vC+2]+=cb.z;}}}else{// non-indexed elements (unconnected triangle soup)
for(var i=0,il=positions.length;i<il;i+=9){pA.fromArray(positions,i);pB.fromArray(positions,i+3);pC.fromArray(positions,i+6);cb.subVectors(pC,pB);ab.subVectors(pA,pB);cb.cross(ab);normals[i]=cb.x;normals[i+1]=cb.y;normals[i+2]=cb.z;normals[i+3]=cb.x;normals[i+4]=cb.y;normals[i+5]=cb.z;normals[i+6]=cb.x;normals[i+7]=cb.y;normals[i+8]=cb.z;}}this.normalizeNormals();attributes.normal.needsUpdate=true;}},merge:function(geometry,offset){if(!(geometry&&geometry.isBufferGeometry)){console.error('THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.',geometry);return;}if(offset===undefined){offset=0;console.warn('THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '+'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.');}var attributes=this.attributes;for(var key in attributes){if(geometry.attributes[key]===undefined)continue;var attribute1=attributes[key];var attributeArray1=attribute1.array;var attribute2=geometry.attributes[key];var attributeArray2=attribute2.array;var attributeSize=attribute2.itemSize;for(var i=0,j=attributeSize*offset;i<attributeArray2.length;i++,j++){attributeArray1[j]=attributeArray2[i];}}return this;},normalizeNormals:function(){var vector=new Vector3();return function normalizeNormals(){var normals=this.attributes.normal;for(var i=0,il=normals.count;i<il;i++){vector.x=normals.getX(i);vector.y=normals.getY(i);vector.z=normals.getZ(i);vector.normalize();normals.setXYZ(i,vector.x,vector.y,vector.z);}};}(),toNonIndexed:function(){if(this.index===null){console.warn('THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.');return this;}var geometry2=new BufferGeometry();var indices=this.index.array;var attributes=this.attributes;for(var name in attributes){var attribute=attributes[name];var array=attribute.array;var itemSize=attribute.itemSize;var array2=new array.constructor(indices.length*itemSize);var index=0,index2=0;for(var i=0,l=indices.length;i<l;i++){index=indices[i]*itemSize;for(var j=0;j<itemSize;j++){array2[index2++]=array[index++];}}geometry2.addAttribute(name,new BufferAttribute(array2,itemSize));}var groups=this.groups;for(var i=0,l=groups.length;i<l;i++){var group=groups[i];geometry2.addGroup(group.start,group.count,group.materialIndex);}return geometry2;},toJSON:function(){var data={metadata:{version:4.5,type:'BufferGeometry',generator:'BufferGeometry.toJSON'}};// standard BufferGeometry serialization
data.uuid=this.uuid;data.type=this.type;if(this.name!=='')data.name=this.name;if(this.parameters!==undefined){var parameters=this.parameters;for(var key in parameters){if(parameters[key]!==undefined)data[key]=parameters[key];}return data;}data.data={attributes:{}};var index=this.index;if(index!==null){var array=Array.prototype.slice.call(index.array);data.data.index={type:index.array.constructor.name,array:array};}var attributes=this.attributes;for(var key in attributes){var attribute=attributes[key];var array=Array.prototype.slice.call(attribute.array);data.data.attributes[key]={itemSize:attribute.itemSize,type:attribute.array.constructor.name,array:array,normalized:attribute.normalized};}var groups=this.groups;if(groups.length>0){data.data.groups=JSON.parse(JSON.stringify(groups));}var boundingSphere=this.boundingSphere;if(boundingSphere!==null){data.data.boundingSphere={center:boundingSphere.center.toArray(),radius:boundingSphere.radius};}return data;},clone:function(){/*
// Handle primitives
var parameters = this.parameters;
if ( parameters !== undefined ) {
var values = [];
for ( var key in parameters ) {
values.push( parameters[ key ] );
}
var geometry = Object.create( this.constructor.prototype );
this.constructor.apply( geometry, values );
return geometry;
}
return new this.constructor().copy( this );
*/return new BufferGeometry().copy(this);},copy:function(source){var name,i,l;// reset
this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingBox=null;this.boundingSphere=null;// name
this.name=source.name;// index
var index=source.index;if(index!==null){this.setIndex(index.clone());}// attributes
var attributes=source.attributes;for(name in attributes){var attribute=attributes[name];this.addAttribute(name,attribute.clone());}// morph attributes
var morphAttributes=source.morphAttributes;for(name in morphAttributes){var array=[];var morphAttribute=morphAttributes[name];// morphAttribute: array of Float32BufferAttributes
for(i=0,l=morphAttribute.length;i<l;i++){array.push(morphAttribute[i].clone());}this.morphAttributes[name]=array;}// groups
var groups=source.groups;for(i=0,l=groups.length;i<l;i++){var group=groups[i];this.addGroup(group.start,group.count,group.materialIndex);}// bounding box
var boundingBox=source.boundingBox;if(boundingBox!==null){this.boundingBox=boundingBox.clone();}// bounding sphere
var boundingSphere=source.boundingSphere;if(boundingSphere!==null){this.boundingSphere=boundingSphere.clone();}// draw range
this.drawRange.start=source.drawRange.start;this.drawRange.count=source.drawRange.count;return this;},dispose:function(){this.dispatchEvent({type:'dispose'});}});/**
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/ // BoxGeometry
function BoxGeometry(width,height,depth,widthSegments,heightSegments,depthSegments){Geometry.call(this);this.type='BoxGeometry';this.parameters={width:width,height:height,depth:depth,widthSegments:widthSegments,heightSegments:heightSegments,depthSegments:depthSegments};this.fromBufferGeometry(new BoxBufferGeometry(width,height,depth,widthSegments,heightSegments,depthSegments));this.mergeVertices();}BoxGeometry.prototype=Object.create(Geometry.prototype);BoxGeometry.prototype.constructor=BoxGeometry;// BoxBufferGeometry
function BoxBufferGeometry(width,height,depth,widthSegments,heightSegments,depthSegments){BufferGeometry.call(this);this.type='BoxBufferGeometry';this.parameters={width:width,height:height,depth:depth,widthSegments:widthSegments,heightSegments:heightSegments,depthSegments:depthSegments};var scope=this;width=width||1;height=height||1;depth=depth||1;// segments
widthSegments=Math.floor(widthSegments)||1;heightSegments=Math.floor(heightSegments)||1;depthSegments=Math.floor(depthSegments)||1;// buffers
var indices=[];var vertices=[];var normals=[];var uvs=[];// helper variables
var numberOfVertices=0;var groupStart=0;// build each side of the box geometry
buildPlane('z','y','x',-1,-1,depth,height,width,depthSegments,heightSegments,0);// px
buildPlane('z','y','x',1,-1,depth,height,-width,depthSegments,heightSegments,1);// nx
buildPlane('x','z','y',1,1,width,depth,height,widthSegments,depthSegments,2);// py
buildPlane('x','z','y',1,-1,width,depth,-height,widthSegments,depthSegments,3);// ny
buildPlane('x','y','z',1,-1,width,height,depth,widthSegments,heightSegments,4);// pz
buildPlane('x','y','z',-1,-1,width,height,-depth,widthSegments,heightSegments,5);// nz
// build geometry
this.setIndex(indices);this.addAttribute('position',new Float32BufferAttribute(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));function buildPlane(u,v,w,udir,vdir,width,height,depth,gridX,gridY,materialIndex){var segmentWidth=width/gridX;var segmentHeight=height/gridY;var widthHalf=width/2;var heightHalf=height/2;var depthHalf=depth/2;var gridX1=gridX+1;var gridY1=gridY+1;var vertexCounter=0;var groupCount=0;var ix,iy;var vector=new Vector3();// generate vertices, normals and uvs
for(iy=0;iy<gridY1;iy++){var y=iy*segmentHeight-heightHalf;for(ix=0;ix<gridX1;ix++){var x=ix*segmentWidth-widthHalf;// set values to correct vector component
vector[u]=x*udir;vector[v]=y*vdir;vector[w]=depthHalf;// now apply vector to vertex buffer
vertices.push(vector.x,vector.y,vector.z);// set values to correct vector component
vector[u]=0;vector[v]=0;vector[w]=depth>0?1:-1;// now apply vector to normal buffer
normals.push(vector.x,vector.y,vector.z);// uvs
uvs.push(ix/gridX);uvs.push(1-iy/gridY);// counters
vertexCounter+=1;}}// indices
// 1. you need three indices to draw a single face
// 2. a single segment consists of two faces
// 3. so we need to generate six (2*3) indices per segment
for(iy=0;iy<gridY;iy++){for(ix=0;ix<gridX;ix++){var a=numberOfVertices+ix+gridX1*iy;var b=numberOfVertices+ix+gridX1*(iy+1);var c=numberOfVertices+(ix+1)+gridX1*(iy+1);var d=numberOfVertices+(ix+1)+gridX1*iy;// faces
indices.push(a,b,d);indices.push(b,c,d);// increase counter
groupCount+=6;}}// add a group to the geometry. this will ensure multi material support
scope.addGroup(groupStart,groupCount,materialIndex);// calculate new start value for groups
groupStart+=groupCount;// update total number of vertices
numberOfVertices+=vertexCounter;}}BoxBufferGeometry.prototype=Object.create(BufferGeometry.prototype);BoxBufferGeometry.prototype.constructor=BoxBufferGeometry;/**
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/ // PlaneGeometry
function PlaneGeometry(width,height,widthSegments,heightSegments){Geometry.call(this);this.type='PlaneGeometry';this.parameters={width:width,height:height,widthSegments:widthSegments,heightSegments:heightSegments};this.fromBufferGeometry(new PlaneBufferGeometry(width,height,widthSegments,heightSegments));this.mergeVertices();}PlaneGeometry.prototype=Object.create(Geometry.prototype);PlaneGeometry.prototype.constructor=PlaneGeometry;// PlaneBufferGeometry
function PlaneBufferGeometry(width,height,widthSegments,heightSegments){BufferGeometry.call(this);this.type='PlaneBufferGeometry';this.parameters={width:width,height:height,widthSegments:widthSegments,heightSegments:heightSegments};width=width||1;height=height||1;var width_half=width/2;var height_half=height/2;var gridX=Math.floor(widthSegments)||1;var gridY=Math.floor(heightSegments)||1;var gridX1=gridX+1;var gridY1=gridY+1;var segment_width=width/gridX;var segment_height=height/gridY;var ix,iy;// buffers
var indices=[];var vertices=[];var normals=[];var uvs=[];// generate vertices, normals and uvs
for(iy=0;iy<gridY1;iy++){var y=iy*segment_height-height_half;for(ix=0;ix<gridX1;ix++){var x=ix*segment_width-width_half;vertices.push(x,-y,0);normals.push(0,0,1);uvs.push(ix/gridX);uvs.push(1-iy/gridY);}}// indices
for(iy=0;iy<gridY;iy++){for(ix=0;ix<gridX;ix++){var a=ix+gridX1*iy;var b=ix+gridX1*(iy+1);var c=ix+1+gridX1*(iy+1);var d=ix+1+gridX1*iy;// faces
indices.push(a,b,d);indices.push(b,c,d);}}// build geometry
this.setIndex(indices);this.addAttribute('position',new Float32BufferAttribute(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));}PlaneBufferGeometry.prototype=Object.create(BufferGeometry.prototype);PlaneBufferGeometry.prototype.constructor=PlaneBufferGeometry;/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/var materialId=0;function Material(){Object.defineProperty(this,'id',{value:materialId++});this.uuid=_Math.generateUUID();this.name='';this.type='Material';this.fog=true;this.lights=true;this.blending=NormalBlending;this.side=FrontSide;this.flatShading=false;this.vertexColors=NoColors;// THREE.NoColors, THREE.VertexColors, THREE.FaceColors
this.opacity=1;this.transparent=false;this.blendSrc=SrcAlphaFactor;this.blendDst=OneMinusSrcAlphaFactor;this.blendEquation=AddEquation;this.blendSrcAlpha=null;this.blendDstAlpha=null;this.blendEquationAlpha=null;this.depthFunc=LessEqualDepth;this.depthTest=true;this.depthWrite=true;this.clippingPlanes=null;this.clipIntersection=false;this.clipShadows=false;this.shadowSide=null;this.colorWrite=true;this.precision=null;// override the renderer's default precision for this material
this.polygonOffset=false;this.polygonOffsetFactor=0;this.polygonOffsetUnits=0;this.dithering=false;this.alphaTest=0;this.premultipliedAlpha=false;this.overdraw=0;// Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer
this.visible=true;this.userData={};this.needsUpdate=true;}Material.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:Material,isMaterial:true,onBeforeCompile:function(){},setValues:function(values){if(values===undefined)return;for(var key in values){var newValue=values[key];if(newValue===undefined){console.warn("THREE.Material: '"+key+"' parameter is undefined.");continue;}// for backward compatability if shading is set in the constructor
if(key==='shading'){console.warn('THREE.'+this.type+': .shading has been removed. Use the boolean .flatShading instead.');this.flatShading=newValue===FlatShading?true:false;continue;}var currentValue=this[key];if(currentValue===undefined){console.warn("THREE."+this.type+": '"+key+"' is not a property of this material.");continue;}if(currentValue&&currentValue.isColor){currentValue.set(newValue);}else if(currentValue&&currentValue.isVector3&&newValue&&newValue.isVector3){currentValue.copy(newValue);}else if(key==='overdraw'){// ensure overdraw is backwards-compatible with legacy boolean type
this[key]=Number(newValue);}else{this[key]=newValue;}}},toJSON:function(meta){var isRoot=meta===undefined||typeof meta==='string';if(isRoot){meta={textures:{},images:{}};}var data={metadata:{version:4.5,type:'Material',generator:'Material.toJSON'}};// standard Material serialization
data.uuid=this.uuid;data.type=this.type;if(this.name!=='')data.name=this.name;if(this.color&&this.color.isColor)data.color=this.color.getHex();if(this.roughness!==undefined)data.roughness=this.roughness;if(this.metalness!==undefined)data.metalness=this.metalness;if(this.emissive&&this.emissive.isColor)data.emissive=this.emissive.getHex();if(this.emissiveIntensity!==1)data.emissiveIntensity=this.emissiveIntensity;if(this.specular&&this.specular.isColor)data.specular=this.specular.getHex();if(this.shininess!==undefined)data.shininess=this.shininess;if(this.clearCoat!==undefined)data.clearCoat=this.clearCoat;if(this.clearCoatRoughness!==undefined)data.clearCoatRoughness=this.clearCoatRoughness;if(this.map&&this.map.isTexture)data.map=this.map.toJSON(meta).uuid;if(this.alphaMap&&this.alphaMap.isTexture)data.alphaMap=this.alphaMap.toJSON(meta).uuid;if(this.lightMap&&this.lightMap.isTexture)data.lightMap=this.lightMap.toJSON(meta).uuid;if(this.bumpMap&&this.bumpMap.isTexture){data.bumpMap=this.bumpMap.toJSON(meta).uuid;data.bumpScale=this.bumpScale;}if(this.normalMap&&this.normalMap.isTexture){data.normalMap=this.normalMap.toJSON(meta).uuid;data.normalScale=this.normalScale.toArray();}if(this.displacementMap&&this.displacementMap.isTexture){data.displacementMap=this.displacementMap.toJSON(meta).uuid;data.displacementScale=this.displacementScale;data.displacementBias=this.displacementBias;}if(this.roughnessMap&&this.roughnessMap.isTexture)data.roughnessMap=this.roughnessMap.toJSON(meta).uuid;if(this.metalnessMap&&this.metalnessMap.isTexture)data.metalnessMap=this.metalnessMap.toJSON(meta).uuid;if(this.emissiveMap&&this.emissiveMap.isTexture)data.emissiveMap=this.emissiveMap.toJSON(meta).uuid;if(this.specularMap&&this.specularMap.isTexture)data.specularMap=this.specularMap.toJSON(meta).uuid;if(this.envMap&&this.envMap.isTexture){data.envMap=this.envMap.toJSON(meta).uuid;data.reflectivity=this.reflectivity;// Scale behind envMap
}if(this.gradientMap&&this.gradientMap.isTexture){data.gradientMap=this.gradientMap.toJSON(meta).uuid;}if(this.size!==undefined)data.size=this.size;if(this.sizeAttenuation!==undefined)data.sizeAttenuation=this.sizeAttenuation;if(this.blending!==NormalBlending)data.blending=this.blending;if(this.flatShading===true)data.flatShading=this.flatShading;if(this.side!==FrontSide)data.side=this.side;if(this.vertexColors!==NoColors)data.vertexColors=this.vertexColors;if(this.opacity<1)data.opacity=this.opacity;if(this.transparent===true)data.transparent=this.transparent;data.depthFunc=this.depthFunc;data.depthTest=this.depthTest;data.depthWrite=this.depthWrite;// rotation (SpriteMaterial)
if(this.rotation!==0)data.rotation=this.rotation;if(this.linewidth!==1)data.linewidth=this.linewidth;if(this.dashSize!==undefined)data.dashSize=this.dashSize;if(this.gapSize!==undefined)data.gapSize=this.gapSize;if(this.scale!==undefined)data.scale=this.scale;if(this.dithering===true)data.dithering=true;if(this.alphaTest>0)data.alphaTest=this.alphaTest;if(this.premultipliedAlpha===true)data.premultipliedAlpha=this.premultipliedAlpha;if(this.wireframe===true)data.wireframe=this.wireframe;if(this.wireframeLinewidth>1)data.wireframeLinewidth=this.wireframeLinewidth;if(this.wireframeLinecap!=='round')data.wireframeLinecap=this.wireframeLinecap;if(this.wireframeLinejoin!=='round')data.wireframeLinejoin=this.wireframeLinejoin;if(this.morphTargets===true)data.morphTargets=true;if(this.skinning===true)data.skinning=true;if(this.visible===false)data.visible=false;if(JSON.stringify(this.userData)!=='{}')data.userData=this.userData;// TODO: Copied from Object3D.toJSON
function extractFromCache(cache){var values=[];for(var key in cache){var data=cache[key];delete data.metadata;values.push(data);}return values;}if(isRoot){var textures=extractFromCache(meta.textures);var images=extractFromCache(meta.images);if(textures.length>0)data.textures=textures;if(images.length>0)data.images=images;}return data;},clone:function(){return new this.constructor().copy(this);},copy:function(source){this.name=source.name;this.fog=source.fog;this.lights=source.lights;this.blending=source.blending;this.side=source.side;this.flatShading=source.flatShading;this.vertexColors=source.vertexColors;this.opacity=source.opacity;this.transparent=source.transparent;this.blendSrc=source.blendSrc;this.blendDst=source.blendDst;this.blendEquation=source.blendEquation;this.blendSrcAlpha=source.blendSrcAlpha;this.blendDstAlpha=source.blendDstAlpha;this.blendEquationAlpha=source.blendEquationAlpha;this.depthFunc=source.depthFunc;this.depthTest=source.depthTest;this.depthWrite=source.depthWrite;this.colorWrite=source.colorWrite;this.precision=source.precision;this.polygonOffset=source.polygonOffset;this.polygonOffsetFactor=source.polygonOffsetFactor;this.polygonOffsetUnits=source.polygonOffsetUnits;this.dithering=source.dithering;this.alphaTest=source.alphaTest;this.premultipliedAlpha=source.premultipliedAlpha;this.overdraw=source.overdraw;this.visible=source.visible;this.userData=JSON.parse(JSON.stringify(source.userData));this.clipShadows=source.clipShadows;this.clipIntersection=source.clipIntersection;var srcPlanes=source.clippingPlanes,dstPlanes=null;if(srcPlanes!==null){var n=srcPlanes.length;dstPlanes=new Array(n);for(var i=0;i!==n;++i)dstPlanes[i]=srcPlanes[i].clone();}this.clippingPlanes=dstPlanes;this.shadowSide=source.shadowSide;return this;},dispose:function(){this.dispatchEvent({type:'dispose'});}});/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: <hex>,
* opacity: <float>,
* map: new THREE.Texture( <Image> ),
*
* lightMap: new THREE.Texture( <Image> ),
* lightMapIntensity: <float>
*
* aoMap: new THREE.Texture( <Image> ),
* aoMapIntensity: <float>
*
* specularMap: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
* combine: THREE.Multiply,
* reflectivity: <float>,
* refractionRatio: <float>,
*
* depthTest: <bool>,
* depthWrite: <bool>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>,
*
* skinning: <bool>,
* morphTargets: <bool>
* }
*/function MeshBasicMaterial(parameters){Material.call(this);this.type='MeshBasicMaterial';this.color=new Color(0xffffff);// emissive
this.map=null;this.lightMap=null;this.lightMapIntensity=1.0;this.aoMap=null;this.aoMapIntensity=1.0;this.specularMap=null;this.alphaMap=null;this.envMap=null;this.combine=MultiplyOperation;this.reflectivity=1;this.refractionRatio=0.98;this.wireframe=false;this.wireframeLinewidth=1;this.wireframeLinecap='round';this.wireframeLinejoin='round';this.skinning=false;this.morphTargets=false;this.lights=false;this.setValues(parameters);}MeshBasicMaterial.prototype=Object.create(Material.prototype);MeshBasicMaterial.prototype.constructor=MeshBasicMaterial;MeshBasicMaterial.prototype.isMeshBasicMaterial=true;MeshBasicMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.color.copy(source.color);this.map=source.map;this.lightMap=source.lightMap;this.lightMapIntensity=source.lightMapIntensity;this.aoMap=source.aoMap;this.aoMapIntensity=source.aoMapIntensity;this.specularMap=source.specularMap;this.alphaMap=source.alphaMap;this.envMap=source.envMap;this.combine=source.combine;this.reflectivity=source.reflectivity;this.refractionRatio=source.refractionRatio;this.wireframe=source.wireframe;this.wireframeLinewidth=source.wireframeLinewidth;this.wireframeLinecap=source.wireframeLinecap;this.wireframeLinejoin=source.wireframeLinejoin;this.skinning=source.skinning;this.morphTargets=source.morphTargets;return this;};/**
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* defines: { "label" : "value" },
* uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } },
*
* fragmentShader: <string>,
* vertexShader: <string>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>,
*
* lights: <bool>,
*
* skinning: <bool>,
* morphTargets: <bool>,
* morphNormals: <bool>
* }
*/function ShaderMaterial(parameters){Material.call(this);this.type='ShaderMaterial';this.defines={};this.uniforms={};this.vertexShader='void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}';this.fragmentShader='void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}';this.linewidth=1;this.wireframe=false;this.wireframeLinewidth=1;this.fog=false;// set to use scene fog
this.lights=false;// set to use scene lights
this.clipping=false;// set to use user-defined clipping planes
this.skinning=false;// set to use skinning attribute streams
this.morphTargets=false;// set to use morph targets
this.morphNormals=false;// set to use morph normals
this.extensions={derivatives:false,// set to use derivatives
fragDepth:false,// set to use fragment depth values
drawBuffers:false,// set to use draw buffers
shaderTextureLOD:false// set to use shader texture LOD
};// When rendered geometry doesn't include these attributes but the material does,
// use these default values in WebGL. This avoids errors when buffer data is missing.
this.defaultAttributeValues={'color':[1,1,1],'uv':[0,0],'uv2':[0,0]};this.index0AttributeName=undefined;this.uniformsNeedUpdate=false;if(parameters!==undefined){if(parameters.attributes!==undefined){console.error('THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.');}this.setValues(parameters);}}ShaderMaterial.prototype=Object.create(Material.prototype);ShaderMaterial.prototype.constructor=ShaderMaterial;ShaderMaterial.prototype.isShaderMaterial=true;ShaderMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.fragmentShader=source.fragmentShader;this.vertexShader=source.vertexShader;this.uniforms=UniformsUtils.clone(source.uniforms);this.defines=Object.assign({},source.defines);this.wireframe=source.wireframe;this.wireframeLinewidth=source.wireframeLinewidth;this.lights=source.lights;this.clipping=source.clipping;this.skinning=source.skinning;this.morphTargets=source.morphTargets;this.morphNormals=source.morphNormals;this.extensions=source.extensions;return this;};ShaderMaterial.prototype.toJSON=function(meta){var data=Material.prototype.toJSON.call(this,meta);data.uniforms=this.uniforms;data.vertexShader=this.vertexShader;data.fragmentShader=this.fragmentShader;return data;};/**
* @author bhouston / http://clara.io
*/function Ray(origin,direction){this.origin=origin!==undefined?origin:new Vector3();this.direction=direction!==undefined?direction:new Vector3();}Object.assign(Ray.prototype,{set:function(origin,direction){this.origin.copy(origin);this.direction.copy(direction);return this;},clone:function(){return new this.constructor().copy(this);},copy:function(ray){this.origin.copy(ray.origin);this.direction.copy(ray.direction);return this;},at:function(t,target){if(target===undefined){console.warn('THREE.Ray: .at() target is now required');target=new Vector3();}return target.copy(this.direction).multiplyScalar(t).add(this.origin);},lookAt:function(v){this.direction.copy(v).sub(this.origin).normalize();return this;},recast:function(){var v1=new Vector3();return function recast(t){this.origin.copy(this.at(t,v1));return this;};}(),closestPointToPoint:function(point,target){if(target===undefined){console.warn('THREE.Ray: .closestPointToPoint() target is now required');target=new Vector3();}target.subVectors(point,this.origin);var directionDistance=target.dot(this.direction);if(directionDistance<0){return target.copy(this.origin);}return target.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);},distanceToPoint:function(point){return Math.sqrt(this.distanceSqToPoint(point));},distanceSqToPoint:function(){var v1=new Vector3();return function distanceSqToPoint(point){var directionDistance=v1.subVectors(point,this.origin).dot(this.direction);// point behind the ray
if(directionDistance<0){return this.origin.distanceToSquared(point);}v1.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);return v1.distanceToSquared(point);};}(),distanceSqToSegment:function(){var segCenter=new Vector3();var segDir=new Vector3();var diff=new Vector3();return function distanceSqToSegment(v0,v1,optionalPointOnRay,optionalPointOnSegment){// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h
// It returns the min distance between the ray and the segment
// defined by v0 and v1
// It can also set two optional targets :
// - The closest point on the ray
// - The closest point on the segment
segCenter.copy(v0).add(v1).multiplyScalar(0.5);segDir.copy(v1).sub(v0).normalize();diff.copy(this.origin).sub(segCenter);var segExtent=v0.distanceTo(v1)*0.5;var a01=-this.direction.dot(segDir);var b0=diff.dot(this.direction);var b1=-diff.dot(segDir);var c=diff.lengthSq();var det=Math.abs(1-a01*a01);var s0,s1,sqrDist,extDet;if(det>0){// The ray and segment are not parallel.
s0=a01*b1-b0;s1=a01*b0-b1;extDet=segExtent*det;if(s0>=0){if(s1>=-extDet){if(s1<=extDet){// region 0
// Minimum at interior points of ray and segment.
var invDet=1/det;s0*=invDet;s1*=invDet;sqrDist=s0*(s0+a01*s1+2*b0)+s1*(a01*s0+s1+2*b1)+c;}else{// region 1
s1=segExtent;s0=Math.max(0,-(a01*s1+b0));sqrDist=-s0*s0+s1*(s1+2*b1)+c;}}else{// region 5
s1=-segExtent;s0=Math.max(0,-(a01*s1+b0));sqrDist=-s0*s0+s1*(s1+2*b1)+c;}}else{if(s1<=-extDet){// region 4
s0=Math.max(0,-(-a01*segExtent+b0));s1=s0>0?-segExtent:Math.min(Math.max(-segExtent,-b1),segExtent);sqrDist=-s0*s0+s1*(s1+2*b1)+c;}else if(s1<=extDet){// region 3
s0=0;s1=Math.min(Math.max(-segExtent,-b1),segExtent);sqrDist=s1*(s1+2*b1)+c;}else{// region 2
s0=Math.max(0,-(a01*segExtent+b0));s1=s0>0?segExtent:Math.min(Math.max(-segExtent,-b1),segExtent);sqrDist=-s0*s0+s1*(s1+2*b1)+c;}}}else{// Ray and segment are parallel.
s1=a01>0?-segExtent:segExtent;s0=Math.max(0,-(a01*s1+b0));sqrDist=-s0*s0+s1*(s1+2*b1)+c;}if(optionalPointOnRay){optionalPointOnRay.copy(this.direction).multiplyScalar(s0).add(this.origin);}if(optionalPointOnSegment){optionalPointOnSegment.copy(segDir).multiplyScalar(s1).add(segCenter);}return sqrDist;};}(),intersectSphere:function(){var v1=new Vector3();return function intersectSphere(sphere,target){v1.subVectors(sphere.center,this.origin);var tca=v1.dot(this.direction);var d2=v1.dot(v1)-tca*tca;var radius2=sphere.radius*sphere.radius;if(d2>radius2)return null;var thc=Math.sqrt(radius2-d2);// t0 = first intersect point - entrance on front of sphere
var t0=tca-thc;// t1 = second intersect point - exit point on back of sphere
var t1=tca+thc;// test to see if both t0 and t1 are behind the ray - if so, return null
if(t0<0&&t1<0)return null;// test to see if t0 is behind the ray:
// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,
// in order to always return an intersect point that is in front of the ray.
if(t0<0)return this.at(t1,target);// else t0 is in front of the ray, so return the first collision point scaled by t0
return this.at(t0,target);};}(),intersectsSphere:function(sphere){return this.distanceToPoint(sphere.center)<=sphere.radius;},distanceToPlane:function(plane){var denominator=plane.normal.dot(this.direction);if(denominator===0){// line is coplanar, return origin
if(plane.distanceToPoint(this.origin)===0){return 0;}// Null is preferable to undefined since undefined means.... it is undefined
return null;}var t=-(this.origin.dot(plane.normal)+plane.constant)/denominator;// Return if the ray never intersects the plane
return t>=0?t:null;},intersectPlane:function(plane,target){var t=this.distanceToPlane(plane);if(t===null){return null;}return this.at(t,target);},intersectsPlane:function(plane){// check if the ray lies on the plane first
var distToPoint=plane.distanceToPoint(this.origin);if(distToPoint===0){return true;}var denominator=plane.normal.dot(this.direction);if(denominator*distToPoint<0){return true;}// ray origin is behind the plane (and is pointing behind it)
return false;},intersectBox:function(box,target){var tmin,tmax,tymin,tymax,tzmin,tzmax;var invdirx=1/this.direction.x,invdiry=1/this.direction.y,invdirz=1/this.direction.z;var origin=this.origin;if(invdirx>=0){tmin=(box.min.x-origin.x)*invdirx;tmax=(box.max.x-origin.x)*invdirx;}else{tmin=(box.max.x-origin.x)*invdirx;tmax=(box.min.x-origin.x)*invdirx;}if(invdiry>=0){tymin=(box.min.y-origin.y)*invdiry;tymax=(box.max.y-origin.y)*invdiry;}else{tymin=(box.max.y-origin.y)*invdiry;tymax=(box.min.y-origin.y)*invdiry;}if(tmin>tymax||tymin>tmax)return null;// These lines also handle the case where tmin or tmax is NaN
// (result of 0 * Infinity). x !== x returns true if x is NaN
if(tymin>tmin||tmin!==tmin)tmin=tymin;if(tymax<tmax||tmax!==tmax)tmax=tymax;if(invdirz>=0){tzmin=(box.min.z-origin.z)*invdirz;tzmax=(box.max.z-origin.z)*invdirz;}else{tzmin=(box.max.z-origin.z)*invdirz;tzmax=(box.min.z-origin.z)*invdirz;}if(tmin>tzmax||tzmin>tmax)return null;if(tzmin>tmin||tmin!==tmin)tmin=tzmin;if(tzmax<tmax||tmax!==tmax)tmax=tzmax;//return point closest to the ray (positive side)
if(tmax<0)return null;return this.at(tmin>=0?tmin:tmax,target);},intersectsBox:function(){var v=new Vector3();return function intersectsBox(box){return this.intersectBox(box,v)!==null;};}(),intersectTriangle:function(){// Compute the offset origin, edges, and normal.
var diff=new Vector3();var edge1=new Vector3();var edge2=new Vector3();var normal=new Vector3();return function intersectTriangle(a,b,c,backfaceCulling,target){// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h
edge1.subVectors(b,a);edge2.subVectors(c,a);normal.crossVectors(edge1,edge2);// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,
// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by
// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))
// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))
// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)
var DdN=this.direction.dot(normal);var sign;if(DdN>0){if(backfaceCulling)return null;sign=1;}else if(DdN<0){sign=-1;DdN=-DdN;}else{return null;}diff.subVectors(this.origin,a);var DdQxE2=sign*this.direction.dot(edge2.crossVectors(diff,edge2));// b1 < 0, no intersection
if(DdQxE2<0){return null;}var DdE1xQ=sign*this.direction.dot(edge1.cross(diff));// b2 < 0, no intersection
if(DdE1xQ<0){return null;}// b1+b2 > 1, no intersection
if(DdQxE2+DdE1xQ>DdN){return null;}// Line intersects triangle, check if ray does.
var QdN=-sign*diff.dot(normal);// t < 0, no intersection
if(QdN<0){return null;}// Ray intersects triangle.
return this.at(QdN/DdN,target);};}(),applyMatrix4:function(matrix4){this.origin.applyMatrix4(matrix4);this.direction.transformDirection(matrix4);return this;},equals:function(ray){return ray.origin.equals(this.origin)&&ray.direction.equals(this.direction);}});/**
* @author bhouston / http://clara.io
*/function Line3(start,end){this.start=start!==undefined?start:new Vector3();this.end=end!==undefined?end:new Vector3();}Object.assign(Line3.prototype,{set:function(start,end){this.start.copy(start);this.end.copy(end);return this;},clone:function(){return new this.constructor().copy(this);},copy:function(line){this.start.copy(line.start);this.end.copy(line.end);return this;},getCenter:function(target){if(target===undefined){console.warn('THREE.Line3: .getCenter() target is now required');target=new Vector3();}return target.addVectors(this.start,this.end).multiplyScalar(0.5);},delta:function(target){if(target===undefined){console.warn('THREE.Line3: .delta() target is now required');target=new Vector3();}return target.subVectors(this.end,this.start);},distanceSq:function(){return this.start.distanceToSquared(this.end);},distance:function(){return this.start.distanceTo(this.end);},at:function(t,target){if(target===undefined){console.warn('THREE.Line3: .at() target is now required');target=new Vector3();}return this.delta(target).multiplyScalar(t).add(this.start);},closestPointToPointParameter:function(){var startP=new Vector3();var startEnd=new Vector3();return function closestPointToPointParameter(point,clampToLine){startP.subVectors(point,this.start);startEnd.subVectors(this.end,this.start);var startEnd2=startEnd.dot(startEnd);var startEnd_startP=startEnd.dot(startP);var t=startEnd_startP/startEnd2;if(clampToLine){t=_Math.clamp(t,0,1);}return t;};}(),closestPointToPoint:function(point,clampToLine,target){var t=this.closestPointToPointParameter(point,clampToLine);if(target===undefined){console.warn('THREE.Line3: .closestPointToPoint() target is now required');target=new Vector3();}return this.delta(target).multiplyScalar(t).add(this.start);},applyMatrix4:function(matrix){this.start.applyMatrix4(matrix);this.end.applyMatrix4(matrix);return this;},equals:function(line){return line.start.equals(this.start)&&line.end.equals(this.end);}});/**
* @author bhouston / http://clara.io
* @author mrdoob / http://mrdoob.com/
*/function Triangle(a,b,c){this.a=a!==undefined?a:new Vector3();this.b=b!==undefined?b:new Vector3();this.c=c!==undefined?c:new Vector3();}Object.assign(Triangle,{getNormal:function(){var v0=new Vector3();return function getNormal(a,b,c,target){if(target===undefined){console.warn('THREE.Triangle: .getNormal() target is now required');target=new Vector3();}target.subVectors(c,b);v0.subVectors(a,b);target.cross(v0);var targetLengthSq=target.lengthSq();if(targetLengthSq>0){return target.multiplyScalar(1/Math.sqrt(targetLengthSq));}return target.set(0,0,0);};}(),// static/instance method to calculate barycentric coordinates
// based on: http://www.blackpawn.com/texts/pointinpoly/default.html
getBarycoord:function(){var v0=new Vector3();var v1=new Vector3();var v2=new Vector3();return function getBarycoord(point,a,b,c,target){v0.subVectors(c,a);v1.subVectors(b,a);v2.subVectors(point,a);var dot00=v0.dot(v0);var dot01=v0.dot(v1);var dot02=v0.dot(v2);var dot11=v1.dot(v1);var dot12=v1.dot(v2);var denom=dot00*dot11-dot01*dot01;if(target===undefined){console.warn('THREE.Triangle: .getBarycoord() target is now required');target=new Vector3();}// collinear or singular triangle
if(denom===0){// arbitrary location outside of triangle?
// not sure if this is the best idea, maybe should be returning undefined
return target.set(-2,-1,-1);}var invDenom=1/denom;var u=(dot11*dot02-dot01*dot12)*invDenom;var v=(dot00*dot12-dot01*dot02)*invDenom;// barycentric coordinates must always sum to 1
return target.set(1-u-v,v,u);};}(),containsPoint:function(){var v1=new Vector3();return function containsPoint(point,a,b,c){Triangle.getBarycoord(point,a,b,c,v1);return v1.x>=0&&v1.y>=0&&v1.x+v1.y<=1;};}()});Object.assign(Triangle.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this;},setFromPointsAndIndices:function(points,i0,i1,i2){this.a.copy(points[i0]);this.b.copy(points[i1]);this.c.copy(points[i2]);return this;},clone:function(){return new this.constructor().copy(this);},copy:function(triangle){this.a.copy(triangle.a);this.b.copy(triangle.b);this.c.copy(triangle.c);return this;},getArea:function(){var v0=new Vector3();var v1=new Vector3();return function getArea(){v0.subVectors(this.c,this.b);v1.subVectors(this.a,this.b);return v0.cross(v1).length()*0.5;};}(),getMidpoint:function(target){if(target===undefined){console.warn('THREE.Triangle: .getMidpoint() target is now required');target=new Vector3();}return target.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3);},getNormal:function(target){return Triangle.getNormal(this.a,this.b,this.c,target);},getPlane:function(target){if(target===undefined){console.warn('THREE.Triangle: .getPlane() target is now required');target=new Vector3();}return target.setFromCoplanarPoints(this.a,this.b,this.c);},getBarycoord:function(point,target){return Triangle.getBarycoord(point,this.a,this.b,this.c,target);},containsPoint:function(point){return Triangle.containsPoint(point,this.a,this.b,this.c);},intersectsBox:function(box){return box.intersectsTriangle(this);},closestPointToPoint:function(){var plane=new Plane();var edgeList=[new Line3(),new Line3(),new Line3()];var projectedPoint=new Vector3();var closestPoint=new Vector3();return function closestPointToPoint(point,target){if(target===undefined){console.warn('THREE.Triangle: .closestPointToPoint() target is now required');target=new Vector3();}var minDistance=Infinity;// project the point onto the plane of the triangle
plane.setFromCoplanarPoints(this.a,this.b,this.c);plane.projectPoint(point,projectedPoint);// check if the projection lies within the triangle
if(this.containsPoint(projectedPoint)===true){// if so, this is the closest point
target.copy(projectedPoint);}else{// if not, the point falls outside the triangle. the target is the closest point to the triangle's edges or vertices
edgeList[0].set(this.a,this.b);edgeList[1].set(this.b,this.c);edgeList[2].set(this.c,this.a);for(var i=0;i<edgeList.length;i++){edgeList[i].closestPointToPoint(projectedPoint,true,closestPoint);var distance=projectedPoint.distanceToSquared(closestPoint);if(distance<minDistance){minDistance=distance;target.copy(closestPoint);}}}return target;};}(),equals:function(triangle){return triangle.a.equals(this.a)&&triangle.b.equals(this.b)&&triangle.c.equals(this.c);}});/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
* @author mikael emtinger / http://gomo.se/
* @author jonobr1 / http://jonobr1.com/
*/function Mesh(geometry,material){Object3D.call(this);this.type='Mesh';this.geometry=geometry!==undefined?geometry:new BufferGeometry();this.material=material!==undefined?material:new MeshBasicMaterial({color:Math.random()*0xffffff});this.drawMode=TrianglesDrawMode;this.updateMorphTargets();}Mesh.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Mesh,isMesh:true,setDrawMode:function(value){this.drawMode=value;},copy:function(source){Object3D.prototype.copy.call(this,source);this.drawMode=source.drawMode;if(source.morphTargetInfluences!==undefined){this.morphTargetInfluences=source.morphTargetInfluences.slice();}if(source.morphTargetDictionary!==undefined){this.morphTargetDictionary=Object.assign({},source.morphTargetDictionary);}return this;},updateMorphTargets:function(){var geometry=this.geometry;var m,ml,name;if(geometry.isBufferGeometry){var morphAttributes=geometry.morphAttributes;var keys=Object.keys(morphAttributes);if(keys.length>0){var morphAttribute=morphAttributes[keys[0]];if(morphAttribute!==undefined){this.morphTargetInfluences=[];this.morphTargetDictionary={};for(m=0,ml=morphAttribute.length;m<ml;m++){name=morphAttribute[m].name||String(m);this.morphTargetInfluences.push(0);this.morphTargetDictionary[name]=m;}}}}else{var morphTargets=geometry.morphTargets;if(morphTargets!==undefined&&morphTargets.length>0){this.morphTargetInfluences=[];this.morphTargetDictionary={};for(m=0,ml=morphTargets.length;m<ml;m++){name=morphTargets[m].name||String(m);this.morphTargetInfluences.push(0);this.morphTargetDictionary[name]=m;}}}},raycast:function(){var inverseMatrix=new Matrix4();var ray=new Ray();var sphere=new Sphere();var vA=new Vector3();var vB=new Vector3();var vC=new Vector3();var tempA=new Vector3();var tempB=new Vector3();var tempC=new Vector3();var uvA=new Vector2();var uvB=new Vector2();var uvC=new Vector2();var barycoord=new Vector3();var intersectionPoint=new Vector3();var intersectionPointWorld=new Vector3();function uvIntersection(point,p1,p2,p3,uv1,uv2,uv3){Triangle.getBarycoord(point,p1,p2,p3,barycoord);uv1.multiplyScalar(barycoord.x);uv2.multiplyScalar(barycoord.y);uv3.multiplyScalar(barycoord.z);uv1.add(uv2).add(uv3);return uv1.clone();}function checkIntersection(object,material,raycaster,ray,pA,pB,pC,point){var intersect;if(material.side===BackSide){intersect=ray.intersectTriangle(pC,pB,pA,true,point);}else{intersect=ray.intersectTriangle(pA,pB,pC,material.side!==DoubleSide,point);}if(intersect===null)return null;intersectionPointWorld.copy(point);intersectionPointWorld.applyMatrix4(object.matrixWorld);var distance=raycaster.ray.origin.distanceTo(intersectionPointWorld);if(distance<raycaster.near||distance>raycaster.far)return null;return {distance:distance,point:intersectionPointWorld.clone(),object:object};}function checkBufferGeometryIntersection(object,raycaster,ray,position,uv,a,b,c){vA.fromBufferAttribute(position,a);vB.fromBufferAttribute(position,b);vC.fromBufferAttribute(position,c);var intersection=checkIntersection(object,object.material,raycaster,ray,vA,vB,vC,intersectionPoint);if(intersection){if(uv){uvA.fromBufferAttribute(uv,a);uvB.fromBufferAttribute(uv,b);uvC.fromBufferAttribute(uv,c);intersection.uv=uvIntersection(intersectionPoint,vA,vB,vC,uvA,uvB,uvC);}var face=new Face3(a,b,c);Triangle.getNormal(vA,vB,vC,face.normal);intersection.face=face;intersection.faceIndex=a;}return intersection;}return function raycast(raycaster,intersects){var geometry=this.geometry;var material=this.material;var matrixWorld=this.matrixWorld;if(material===undefined)return;// Checking boundingSphere distance to ray
if(geometry.boundingSphere===null)geometry.computeBoundingSphere();sphere.copy(geometry.boundingSphere);sphere.applyMatrix4(matrixWorld);if(raycaster.ray.intersectsSphere(sphere)===false)return;//
inverseMatrix.getInverse(matrixWorld);ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);// Check boundingBox before continuing
if(geometry.boundingBox!==null){if(ray.intersectsBox(geometry.boundingBox)===false)return;}var intersection;if(geometry.isBufferGeometry){var a,b,c;var index=geometry.index;var position=geometry.attributes.position;var uv=geometry.attributes.uv;var i,l;if(index!==null){// indexed buffer geometry
for(i=0,l=index.count;i<l;i+=3){a=index.getX(i);b=index.getX(i+1);c=index.getX(i+2);intersection=checkBufferGeometryIntersection(this,raycaster,ray,position,uv,a,b,c);if(intersection){intersection.faceIndex=Math.floor(i/3);// triangle number in indices buffer semantics
intersects.push(intersection);}}}else if(position!==undefined){// non-indexed buffer geometry
for(i=0,l=position.count;i<l;i+=3){a=i;b=i+1;c=i+2;intersection=checkBufferGeometryIntersection(this,raycaster,ray,position,uv,a,b,c);if(intersection)intersects.push(intersection);}}}else if(geometry.isGeometry){var fvA,fvB,fvC;var isMultiMaterial=Array.isArray(material);var vertices=geometry.vertices;var faces=geometry.faces;var uvs;var faceVertexUvs=geometry.faceVertexUvs[0];if(faceVertexUvs.length>0)uvs=faceVertexUvs;for(var f=0,fl=faces.length;f<fl;f++){var face=faces[f];var faceMaterial=isMultiMaterial?material[face.materialIndex]:material;if(faceMaterial===undefined)continue;fvA=vertices[face.a];fvB=vertices[face.b];fvC=vertices[face.c];if(faceMaterial.morphTargets===true){var morphTargets=geometry.morphTargets;var morphInfluences=this.morphTargetInfluences;vA.set(0,0,0);vB.set(0,0,0);vC.set(0,0,0);for(var t=0,tl=morphTargets.length;t<tl;t++){var influence=morphInfluences[t];if(influence===0)continue;var targets=morphTargets[t].vertices;vA.addScaledVector(tempA.subVectors(targets[face.a],fvA),influence);vB.addScaledVector(tempB.subVectors(targets[face.b],fvB),influence);vC.addScaledVector(tempC.subVectors(targets[face.c],fvC),influence);}vA.add(fvA);vB.add(fvB);vC.add(fvC);fvA=vA;fvB=vB;fvC=vC;}intersection=checkIntersection(this,faceMaterial,raycaster,ray,fvA,fvB,fvC,intersectionPoint);if(intersection){if(uvs&&uvs[f]){var uvs_f=uvs[f];uvA.copy(uvs_f[0]);uvB.copy(uvs_f[1]);uvC.copy(uvs_f[2]);intersection.uv=uvIntersection(intersectionPoint,fvA,fvB,fvC,uvA,uvB,uvC);}intersection.face=face;intersection.faceIndex=f;intersects.push(intersection);}}}};}(),clone:function(){return new this.constructor(this.geometry,this.material).copy(this);}});/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLBackground(renderer,state,geometries,premultipliedAlpha){var clearColor=new Color(0x000000);var clearAlpha=0;var planeCamera,planeMesh;var boxMesh;function render(renderList,scene,camera,forceClear){var background=scene.background;if(background===null){setClear(clearColor,clearAlpha);}else if(background&&background.isColor){setClear(background,1);forceClear=true;}if(renderer.autoClear||forceClear){renderer.clear(renderer.autoClearColor,renderer.autoClearDepth,renderer.autoClearStencil);}if(background&&background.isCubeTexture){if(boxMesh===undefined){boxMesh=new Mesh(new BoxBufferGeometry(1,1,1),new ShaderMaterial({uniforms:ShaderLib.cube.uniforms,vertexShader:ShaderLib.cube.vertexShader,fragmentShader:ShaderLib.cube.fragmentShader,side:BackSide,depthTest:true,depthWrite:false,fog:false}));boxMesh.geometry.removeAttribute('normal');boxMesh.geometry.removeAttribute('uv');boxMesh.onBeforeRender=function(renderer,scene,camera){this.matrixWorld.copyPosition(camera.matrixWorld);};geometries.update(boxMesh.geometry);}boxMesh.material.uniforms.tCube.value=background;renderList.push(boxMesh,boxMesh.geometry,boxMesh.material,0,null);}else if(background&&background.isTexture){if(planeCamera===undefined){planeCamera=new OrthographicCamera(-1,1,1,-1,0,1);planeMesh=new Mesh(new PlaneBufferGeometry(2,2),new MeshBasicMaterial({depthTest:false,depthWrite:false,fog:false}));geometries.update(planeMesh.geometry);}planeMesh.material.map=background;// TODO Push this to renderList
renderer.renderBufferDirect(planeCamera,null,planeMesh.geometry,planeMesh.material,planeMesh,null);}}function setClear(color,alpha){state.buffers.color.setClear(color.r,color.g,color.b,alpha,premultipliedAlpha);}return {getClearColor:function(){return clearColor;},setClearColor:function(color,alpha){clearColor.set(color);clearAlpha=alpha!==undefined?alpha:1;setClear(clearColor,clearAlpha);},getClearAlpha:function(){return clearAlpha;},setClearAlpha:function(alpha){clearAlpha=alpha;setClear(clearColor,clearAlpha);},render:render};}/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLBufferRenderer(gl,extensions,info){var mode;function setMode(value){mode=value;}function render(start,count){gl.drawArrays(mode,start,count);info.update(count,mode);}function renderInstances(geometry,start,count){var extension=extensions.get('ANGLE_instanced_arrays');if(extension===null){console.error('THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');return;}var position=geometry.attributes.position;if(position.isInterleavedBufferAttribute){count=position.data.count;extension.drawArraysInstancedANGLE(mode,0,count,geometry.maxInstancedCount);}else{extension.drawArraysInstancedANGLE(mode,start,count,geometry.maxInstancedCount);}info.update(count,mode,geometry.maxInstancedCount);}//
this.setMode=setMode;this.render=render;this.renderInstances=renderInstances;}/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLCapabilities(gl,extensions,parameters){var maxAnisotropy;function getMaxAnisotropy(){if(maxAnisotropy!==undefined)return maxAnisotropy;var extension=extensions.get('EXT_texture_filter_anisotropic');if(extension!==null){maxAnisotropy=gl.getParameter(extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT);}else{maxAnisotropy=0;}return maxAnisotropy;}function getMaxPrecision(precision){if(precision==='highp'){if(gl.getShaderPrecisionFormat(gl.VERTEX_SHADER,gl.HIGH_FLOAT).precision>0&&gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER,gl.HIGH_FLOAT).precision>0){return 'highp';}precision='mediump';}if(precision==='mediump'){if(gl.getShaderPrecisionFormat(gl.VERTEX_SHADER,gl.MEDIUM_FLOAT).precision>0&&gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER,gl.MEDIUM_FLOAT).precision>0){return 'mediump';}}return 'lowp';}var precision=parameters.precision!==undefined?parameters.precision:'highp';var maxPrecision=getMaxPrecision(precision);if(maxPrecision!==precision){console.warn('THREE.WebGLRenderer:',precision,'not supported, using',maxPrecision,'instead.');precision=maxPrecision;}var logarithmicDepthBuffer=parameters.logarithmicDepthBuffer===true;var maxTextures=gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);var maxVertexTextures=gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS);var maxTextureSize=gl.getParameter(gl.MAX_TEXTURE_SIZE);var maxCubemapSize=gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);var maxAttributes=gl.getParameter(gl.MAX_VERTEX_ATTRIBS);var maxVertexUniforms=gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS);var maxVaryings=gl.getParameter(gl.MAX_VARYING_VECTORS);var maxFragmentUniforms=gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS);var vertexTextures=maxVertexTextures>0;var floatFragmentTextures=!!extensions.get('OES_texture_float');var floatVertexTextures=vertexTextures&&floatFragmentTextures;return {getMaxAnisotropy:getMaxAnisotropy,getMaxPrecision:getMaxPrecision,precision:precision,logarithmicDepthBuffer:logarithmicDepthBuffer,maxTextures:maxTextures,maxVertexTextures:maxVertexTextures,maxTextureSize:maxTextureSize,maxCubemapSize:maxCubemapSize,maxAttributes:maxAttributes,maxVertexUniforms:maxVertexUniforms,maxVaryings:maxVaryings,maxFragmentUniforms:maxFragmentUniforms,vertexTextures:vertexTextures,floatFragmentTextures:floatFragmentTextures,floatVertexTextures:floatVertexTextures};}/**
* @author tschw
*/function WebGLClipping(){var scope=this,globalState=null,numGlobalPlanes=0,localClippingEnabled=false,renderingShadows=false,plane=new Plane(),viewNormalMatrix=new Matrix3(),uniform={value:null,needsUpdate:false};this.uniform=uniform;this.numPlanes=0;this.numIntersection=0;this.init=function(planes,enableLocalClipping,camera){var enabled=planes.length!==0||enableLocalClipping||// enable state of previous frame - the clipping code has to
// run another frame in order to reset the state:
numGlobalPlanes!==0||localClippingEnabled;localClippingEnabled=enableLocalClipping;globalState=projectPlanes(planes,camera,0);numGlobalPlanes=planes.length;return enabled;};this.beginShadows=function(){renderingShadows=true;projectPlanes(null);};this.endShadows=function(){renderingShadows=false;resetGlobalState();};this.setState=function(planes,clipIntersection,clipShadows,camera,cache,fromCache){if(!localClippingEnabled||planes===null||planes.length===0||renderingShadows&&!clipShadows){// there's no local clipping
if(renderingShadows){// there's no global clipping
projectPlanes(null);}else{resetGlobalState();}}else{var nGlobal=renderingShadows?0:numGlobalPlanes,lGlobal=nGlobal*4,dstArray=cache.clippingState||null;uniform.value=dstArray;// ensure unique state
dstArray=projectPlanes(planes,camera,lGlobal,fromCache);for(var i=0;i!==lGlobal;++i){dstArray[i]=globalState[i];}cache.clippingState=dstArray;this.numIntersection=clipIntersection?this.numPlanes:0;this.numPlanes+=nGlobal;}};function resetGlobalState(){if(uniform.value!==globalState){uniform.value=globalState;uniform.needsUpdate=numGlobalPlanes>0;}scope.numPlanes=numGlobalPlanes;scope.numIntersection=0;}function projectPlanes(planes,camera,dstOffset,skipTransform){var nPlanes=planes!==null?planes.length:0,dstArray=null;if(nPlanes!==0){dstArray=uniform.value;if(skipTransform!==true||dstArray===null){var flatSize=dstOffset+nPlanes*4,viewMatrix=camera.matrixWorldInverse;viewNormalMatrix.getNormalMatrix(viewMatrix);if(dstArray===null||dstArray.length<flatSize){dstArray=new Float32Array(flatSize);}for(var i=0,i4=dstOffset;i!==nPlanes;++i,i4+=4){plane.copy(planes[i]).applyMatrix4(viewMatrix,viewNormalMatrix);plane.normal.toArray(dstArray,i4);dstArray[i4+3]=plane.constant;}}uniform.value=dstArray;uniform.needsUpdate=true;}scope.numPlanes=nPlanes;return dstArray;}}/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLExtensions(gl){var extensions={};return {get:function(name){if(extensions[name]!==undefined){return extensions[name];}var extension;switch(name){case'WEBGL_depth_texture':extension=gl.getExtension('WEBGL_depth_texture')||gl.getExtension('MOZ_WEBGL_depth_texture')||gl.getExtension('WEBKIT_WEBGL_depth_texture');break;case'EXT_texture_filter_anisotropic':extension=gl.getExtension('EXT_texture_filter_anisotropic')||gl.getExtension('MOZ_EXT_texture_filter_anisotropic')||gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic');break;case'WEBGL_compressed_texture_s3tc':extension=gl.getExtension('WEBGL_compressed_texture_s3tc')||gl.getExtension('MOZ_WEBGL_compressed_texture_s3tc')||gl.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc');break;case'WEBGL_compressed_texture_pvrtc':extension=gl.getExtension('WEBGL_compressed_texture_pvrtc')||gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc');break;default:extension=gl.getExtension(name);}if(extension===null){console.warn('THREE.WebGLRenderer: '+name+' extension not supported.');}extensions[name]=extension;return extension;}};}/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLGeometries(gl,attributes,info){var geometries={};var wireframeAttributes={};function onGeometryDispose(event){var geometry=event.target;var buffergeometry=geometries[geometry.id];if(buffergeometry.index!==null){attributes.remove(buffergeometry.index);}for(var name in buffergeometry.attributes){attributes.remove(buffergeometry.attributes[name]);}geometry.removeEventListener('dispose',onGeometryDispose);delete geometries[geometry.id];// TODO Remove duplicate code
var attribute=wireframeAttributes[geometry.id];if(attribute){attributes.remove(attribute);delete wireframeAttributes[geometry.id];}attribute=wireframeAttributes[buffergeometry.id];if(attribute){attributes.remove(attribute);delete wireframeAttributes[buffergeometry.id];}//
info.memory.geometries--;}function get(object,geometry){var buffergeometry=geometries[geometry.id];if(buffergeometry)return buffergeometry;geometry.addEventListener('dispose',onGeometryDispose);if(geometry.isBufferGeometry){buffergeometry=geometry;}else if(geometry.isGeometry){if(geometry._bufferGeometry===undefined){geometry._bufferGeometry=new BufferGeometry().setFromObject(object);}buffergeometry=geometry._bufferGeometry;}geometries[geometry.id]=buffergeometry;info.memory.geometries++;return buffergeometry;}function update(geometry){var index=geometry.index;var geometryAttributes=geometry.attributes;if(index!==null){attributes.update(index,gl.ELEMENT_ARRAY_BUFFER);}for(var name in geometryAttributes){attributes.update(geometryAttributes[name],gl.ARRAY_BUFFER);}// morph targets
var morphAttributes=geometry.morphAttributes;for(var name in morphAttributes){var array=morphAttributes[name];for(var i=0,l=array.length;i<l;i++){attributes.update(array[i],gl.ARRAY_BUFFER);}}}function getWireframeAttribute(geometry){var attribute=wireframeAttributes[geometry.id];if(attribute)return attribute;var indices=[];var geometryIndex=geometry.index;var geometryAttributes=geometry.attributes;// console.time( 'wireframe' );
if(geometryIndex!==null){var array=geometryIndex.array;for(var i=0,l=array.length;i<l;i+=3){var a=array[i+0];var b=array[i+1];var c=array[i+2];indices.push(a,b,b,c,c,a);}}else{var array=geometryAttributes.position.array;for(var i=0,l=array.length/3-1;i<l;i+=3){var a=i+0;var b=i+1;var c=i+2;indices.push(a,b,b,c,c,a);}}// console.timeEnd( 'wireframe' );
attribute=new(arrayMax(indices)>65535?Uint32BufferAttribute:Uint16BufferAttribute)(indices,1);attributes.update(attribute,gl.ELEMENT_ARRAY_BUFFER);wireframeAttributes[geometry.id]=attribute;return attribute;}return {get:get,update:update,getWireframeAttribute:getWireframeAttribute};}/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLIndexedBufferRenderer(gl,extensions,info){var mode;function setMode(value){mode=value;}var type,bytesPerElement;function setIndex(value){type=value.type;bytesPerElement=value.bytesPerElement;}function render(start,count){gl.drawElements(mode,count,type,start*bytesPerElement);info.update(count,mode);}function renderInstances(geometry,start,count){var extension=extensions.get('ANGLE_instanced_arrays');if(extension===null){console.error('THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');return;}extension.drawElementsInstancedANGLE(mode,count,type,start*bytesPerElement,geometry.maxInstancedCount);info.update(count,mode,geometry.maxInstancedCount);}//
this.setMode=setMode;this.setIndex=setIndex;this.render=render;this.renderInstances=renderInstances;}/**
* @author Mugen87 / https://github.com/Mugen87
*/function WebGLInfo(gl){var memory={geometries:0,textures:0};var render={frame:0,calls:0,triangles:0,points:0,lines:0};function update(count,mode,instanceCount){instanceCount=instanceCount||1;render.calls++;switch(mode){case gl.TRIANGLES:render.triangles+=instanceCount*(count/3);break;case gl.TRIANGLE_STRIP:case gl.TRIANGLE_FAN:render.triangles+=instanceCount*(count-2);break;case gl.LINES:render.lines+=instanceCount*(count/2);break;case gl.LINE_STRIP:render.lines+=instanceCount*(count-1);break;case gl.LINE_LOOP:render.lines+=instanceCount*count;break;case gl.POINTS:render.points+=instanceCount*count;break;default:console.error('THREE.WebGLInfo: Unknown draw mode:',mode);break;}}function reset(){render.frame++;render.calls=0;render.triangles=0;render.points=0;render.lines=0;}return {memory:memory,render:render,programs:null,autoReset:true,reset:reset,update:update};}/**
* @author mrdoob / http://mrdoob.com/
*/function absNumericalSort(a,b){return Math.abs(b[1])-Math.abs(a[1]);}function WebGLMorphtargets(gl){var influencesList={};var morphInfluences=new Float32Array(8);function update(object,geometry,material,program){var objectInfluences=object.morphTargetInfluences;var length=objectInfluences.length;var influences=influencesList[geometry.id];if(influences===undefined){// initialise list
influences=[];for(var i=0;i<length;i++){influences[i]=[i,0];}influencesList[geometry.id]=influences;}var morphTargets=material.morphTargets&&geometry.morphAttributes.position;var morphNormals=material.morphNormals&&geometry.morphAttributes.normal;// Remove current morphAttributes
for(var i=0;i<length;i++){var influence=influences[i];if(influence[1]!==0){if(morphTargets)geometry.removeAttribute('morphTarget'+i);if(morphNormals)geometry.removeAttribute('morphNormal'+i);}}// Collect influences
for(var i=0;i<length;i++){var influence=influences[i];influence[0]=i;influence[1]=objectInfluences[i];}influences.sort(absNumericalSort);// Add morphAttributes
for(var i=0;i<8;i++){var influence=influences[i];if(influence){var index=influence[0];var value=influence[1];if(value){if(morphTargets)geometry.addAttribute('morphTarget'+i,morphTargets[index]);if(morphNormals)geometry.addAttribute('morphNormal'+i,morphNormals[index]);morphInfluences[i]=value;continue;}}morphInfluences[i]=0;}program.getUniforms().setValue(gl,'morphTargetInfluences',morphInfluences);}return {update:update};}/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLObjects(geometries,info){var updateList={};function update(object){var frame=info.render.frame;var geometry=object.geometry;var buffergeometry=geometries.get(object,geometry);// Update once per frame
if(updateList[buffergeometry.id]!==frame){if(geometry.isGeometry){buffergeometry.updateFromObject(object);}geometries.update(buffergeometry);updateList[buffergeometry.id]=frame;}return buffergeometry;}function dispose(){updateList={};}return {update:update,dispose:dispose};}/**
* @author mrdoob / http://mrdoob.com/
*/function CubeTexture(images,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy,encoding){images=images!==undefined?images:[];mapping=mapping!==undefined?mapping:CubeReflectionMapping;Texture.call(this,images,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy,encoding);this.flipY=false;}CubeTexture.prototype=Object.create(Texture.prototype);CubeTexture.prototype.constructor=CubeTexture;CubeTexture.prototype.isCubeTexture=true;Object.defineProperty(CubeTexture.prototype,'images',{get:function(){return this.image;},set:function(value){this.image=value;}});/**
* @author tschw
*
* Uniforms of a program.
* Those form a tree structure with a special top-level container for the root,
* which you get by calling 'new WebGLUniforms( gl, program, renderer )'.
*
*
* Properties of inner nodes including the top-level container:
*
* .seq - array of nested uniforms
* .map - nested uniforms by name
*
*
* Methods of all nodes except the top-level container:
*
* .setValue( gl, value, [renderer] )
*
* uploads a uniform value(s)
* the 'renderer' parameter is needed for sampler uniforms
*
*
* Static methods of the top-level container (renderer factorizations):
*
* .upload( gl, seq, values, renderer )
*
* sets uniforms in 'seq' to 'values[id].value'
*
* .seqWithValue( seq, values ) : filteredSeq
*
* filters 'seq' entries with corresponding entry in values
*
*
* Methods of the top-level container (renderer factorizations):
*
* .setValue( gl, name, value )
*
* sets uniform with name 'name' to 'value'
*
* .set( gl, obj, prop )
*
* sets uniform from object and property with same name than uniform
*
* .setOptional( gl, obj, prop )
*
* like .set for an optional property of the object
*
*/var emptyTexture=new Texture();var emptyCubeTexture=new CubeTexture();// --- Base for inner nodes (including the root) ---
function UniformContainer(){this.seq=[];this.map={};}// --- Utilities ---
// Array Caches (provide typed arrays for temporary by size)
var arrayCacheF32=[];var arrayCacheI32=[];// Float32Array caches used for uploading Matrix uniforms
var mat4array=new Float32Array(16);var mat3array=new Float32Array(9);// Flattening for arrays of vectors and matrices
function flatten(array,nBlocks,blockSize){var firstElem=array[0];if(firstElem<=0||firstElem>0)return array;// unoptimized: ! isNaN( firstElem )
// see http://jacksondunstan.com/articles/983
var n=nBlocks*blockSize,r=arrayCacheF32[n];if(r===undefined){r=new Float32Array(n);arrayCacheF32[n]=r;}if(nBlocks!==0){firstElem.toArray(r,0);for(var i=1,offset=0;i!==nBlocks;++i){offset+=blockSize;array[i].toArray(r,offset);}}return r;}// Texture unit allocation
function allocTexUnits(renderer,n){var r=arrayCacheI32[n];if(r===undefined){r=new Int32Array(n);arrayCacheI32[n]=r;}for(var i=0;i!==n;++i)r[i]=renderer.allocTextureUnit();return r;}// --- Setters ---
// Note: Defining these methods externally, because they come in a bunch
// and this way their names minify.
// Single scalar
function setValue1f(gl,v){gl.uniform1f(this.addr,v);}function setValue1i(gl,v){gl.uniform1i(this.addr,v);}// Single float vector (from flat array or THREE.VectorN)
function setValue2fv(gl,v){if(v.x===undefined){gl.uniform2fv(this.addr,v);}else{gl.uniform2f(this.addr,v.x,v.y);}}function setValue3fv(gl,v){if(v.x!==undefined){gl.uniform3f(this.addr,v.x,v.y,v.z);}else if(v.r!==undefined){gl.uniform3f(this.addr,v.r,v.g,v.b);}else{gl.uniform3fv(this.addr,v);}}function setValue4fv(gl,v){if(v.x===undefined){gl.uniform4fv(this.addr,v);}else{gl.uniform4f(this.addr,v.x,v.y,v.z,v.w);}}// Single matrix (from flat array or MatrixN)
function setValue2fm(gl,v){gl.uniformMatrix2fv(this.addr,false,v.elements||v);}function setValue3fm(gl,v){if(v.elements===undefined){gl.uniformMatrix3fv(this.addr,false,v);}else{mat3array.set(v.elements);gl.uniformMatrix3fv(this.addr,false,mat3array);}}function setValue4fm(gl,v){if(v.elements===undefined){gl.uniformMatrix4fv(this.addr,false,v);}else{mat4array.set(v.elements);gl.uniformMatrix4fv(this.addr,false,mat4array);}}// Single texture (2D / Cube)
function setValueT1(gl,v,renderer){var unit=renderer.allocTextureUnit();gl.uniform1i(this.addr,unit);renderer.setTexture2D(v||emptyTexture,unit);}function setValueT6(gl,v,renderer){var unit=renderer.allocTextureUnit();gl.uniform1i(this.addr,unit);renderer.setTextureCube(v||emptyCubeTexture,unit);}// Integer / Boolean vectors or arrays thereof (always flat arrays)
function setValue2iv(gl,v){gl.uniform2iv(this.addr,v);}function setValue3iv(gl,v){gl.uniform3iv(this.addr,v);}function setValue4iv(gl,v){gl.uniform4iv(this.addr,v);}// Helper to pick the right setter for the singular case
function getSingularSetter(type){switch(type){case 0x1406:return setValue1f;// FLOAT
case 0x8b50:return setValue2fv;// _VEC2
case 0x8b51:return setValue3fv;// _VEC3
case 0x8b52:return setValue4fv;// _VEC4
case 0x8b5a:return setValue2fm;// _MAT2
case 0x8b5b:return setValue3fm;// _MAT3
case 0x8b5c:return setValue4fm;// _MAT4
case 0x8b5e:case 0x8d66:return setValueT1;// SAMPLER_2D, SAMPLER_EXTERNAL_OES
case 0x8b60:return setValueT6;// SAMPLER_CUBE
case 0x1404:case 0x8b56:return setValue1i;// INT, BOOL
case 0x8b53:case 0x8b57:return setValue2iv;// _VEC2
case 0x8b54:case 0x8b58:return setValue3iv;// _VEC3
case 0x8b55:case 0x8b59:return setValue4iv;// _VEC4
}}// Array of scalars
function setValue1fv(gl,v){gl.uniform1fv(this.addr,v);}function setValue1iv(gl,v){gl.uniform1iv(this.addr,v);}// Array of vectors (flat or from THREE classes)
function setValueV2a(gl,v){gl.uniform2fv(this.addr,flatten(v,this.size,2));}function setValueV3a(gl,v){gl.uniform3fv(this.addr,flatten(v,this.size,3));}function setValueV4a(gl,v){gl.uniform4fv(this.addr,flatten(v,this.size,4));}// Array of matrices (flat or from THREE clases)
function setValueM2a(gl,v){gl.uniformMatrix2fv(this.addr,false,flatten(v,this.size,4));}function setValueM3a(gl,v){gl.uniformMatrix3fv(this.addr,false,flatten(v,this.size,9));}function setValueM4a(gl,v){gl.uniformMatrix4fv(this.addr,false,flatten(v,this.size,16));}// Array of textures (2D / Cube)
function setValueT1a(gl,v,renderer){var n=v.length,units=allocTexUnits(renderer,n);gl.uniform1iv(this.addr,units);for(var i=0;i!==n;++i){renderer.setTexture2D(v[i]||emptyTexture,units[i]);}}function setValueT6a(gl,v,renderer){var n=v.length,units=allocTexUnits(renderer,n);gl.uniform1iv(this.addr,units);for(var i=0;i!==n;++i){renderer.setTextureCube(v[i]||emptyCubeTexture,units[i]);}}// Helper to pick the right setter for a pure (bottom-level) array
function getPureArraySetter(type){switch(type){case 0x1406:return setValue1fv;// FLOAT
case 0x8b50:return setValueV2a;// _VEC2
case 0x8b51:return setValueV3a;// _VEC3
case 0x8b52:return setValueV4a;// _VEC4
case 0x8b5a:return setValueM2a;// _MAT2
case 0x8b5b:return setValueM3a;// _MAT3
case 0x8b5c:return setValueM4a;// _MAT4
case 0x8b5e:return setValueT1a;// SAMPLER_2D
case 0x8b60:return setValueT6a;// SAMPLER_CUBE
case 0x1404:case 0x8b56:return setValue1iv;// INT, BOOL
case 0x8b53:case 0x8b57:return setValue2iv;// _VEC2
case 0x8b54:case 0x8b58:return setValue3iv;// _VEC3
case 0x8b55:case 0x8b59:return setValue4iv;// _VEC4
}}// --- Uniform Classes ---
function SingleUniform(id,activeInfo,addr){this.id=id;this.addr=addr;this.setValue=getSingularSetter(activeInfo.type);// this.path = activeInfo.name; // DEBUG
}function PureArrayUniform(id,activeInfo,addr){this.id=id;this.addr=addr;this.size=activeInfo.size;this.setValue=getPureArraySetter(activeInfo.type);// this.path = activeInfo.name; // DEBUG
}function StructuredUniform(id){this.id=id;UniformContainer.call(this);// mix-in
}StructuredUniform.prototype.setValue=function(gl,value){// Note: Don't need an extra 'renderer' parameter, since samplers
// are not allowed in structured uniforms.
var seq=this.seq;for(var i=0,n=seq.length;i!==n;++i){var u=seq[i];u.setValue(gl,value[u.id]);}};// --- Top-level ---
// Parser - builds up the property tree from the path strings
var RePathPart=/([\w\d_]+)(\])?(\[|\.)?/g;// extracts
// - the identifier (member name or array index)
// - followed by an optional right bracket (found when array index)
// - followed by an optional left bracket or dot (type of subscript)
//
// Note: These portions can be read in a non-overlapping fashion and
// allow straightforward parsing of the hierarchy that WebGL encodes
// in the uniform names.
function addUniform(container,uniformObject){container.seq.push(uniformObject);container.map[uniformObject.id]=uniformObject;}function parseUniform(activeInfo,addr,container){var path=activeInfo.name,pathLength=path.length;// reset RegExp object, because of the early exit of a previous run
RePathPart.lastIndex=0;for(;;){var match=RePathPart.exec(path),matchEnd=RePathPart.lastIndex,id=match[1],idIsIndex=match[2]===']',subscript=match[3];if(idIsIndex)id=id|0;// convert to integer
if(subscript===undefined||subscript==='['&&matchEnd+2===pathLength){// bare name or "pure" bottom-level array "[0]" suffix
addUniform(container,subscript===undefined?new SingleUniform(id,activeInfo,addr):new PureArrayUniform(id,activeInfo,addr));break;}else{// step into inner node / create it in case it doesn't exist
var map=container.map,next=map[id];if(next===undefined){next=new StructuredUniform(id);addUniform(container,next);}container=next;}}}// Root Container
function WebGLUniforms(gl,program,renderer){UniformContainer.call(this);this.renderer=renderer;var n=gl.getProgramParameter(program,gl.ACTIVE_UNIFORMS);for(var i=0;i<n;++i){var info=gl.getActiveUniform(program,i),addr=gl.getUniformLocation(program,info.name);parseUniform(info,addr,this);}}WebGLUniforms.prototype.setValue=function(gl,name,value){var u=this.map[name];if(u!==undefined)u.setValue(gl,value,this.renderer);};WebGLUniforms.prototype.setOptional=function(gl,object,name){var v=object[name];if(v!==undefined)this.setValue(gl,name,v);};// Static interface
WebGLUniforms.upload=function(gl,seq,values,renderer){for(var i=0,n=seq.length;i!==n;++i){var u=seq[i],v=values[u.id];if(v.needsUpdate!==false){// note: always updating when .needsUpdate is undefined
u.setValue(gl,v.value,renderer);}}};WebGLUniforms.seqWithValue=function(seq,values){var r=[];for(var i=0,n=seq.length;i!==n;++i){var u=seq[i];if(u.id in values)r.push(u);}return r;};/**
* @author mrdoob / http://mrdoob.com/
*/function addLineNumbers(string){var lines=string.split('\n');for(var i=0;i<lines.length;i++){lines[i]=i+1+': '+lines[i];}return lines.join('\n');}function WebGLShader(gl,type,string){var shader=gl.createShader(type);gl.shaderSource(shader,string);gl.compileShader(shader);if(gl.getShaderParameter(shader,gl.COMPILE_STATUS)===false){console.error('THREE.WebGLShader: Shader couldn\'t compile.');}if(gl.getShaderInfoLog(shader)!==''){console.warn('THREE.WebGLShader: gl.getShaderInfoLog()',type===gl.VERTEX_SHADER?'vertex':'fragment',gl.getShaderInfoLog(shader),addLineNumbers(string));}// --enable-privileged-webgl-extension
// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );
return shader;}/**
* @author mrdoob / http://mrdoob.com/
*/var programIdCount=0;function getEncodingComponents(encoding){switch(encoding){case LinearEncoding:return ['Linear','( value )'];case sRGBEncoding:return ['sRGB','( value )'];case RGBEEncoding:return ['RGBE','( value )'];case RGBM7Encoding:return ['RGBM','( value, 7.0 )'];case RGBM16Encoding:return ['RGBM','( value, 16.0 )'];case RGBDEncoding:return ['RGBD','( value, 256.0 )'];case GammaEncoding:return ['Gamma','( value, float( GAMMA_FACTOR ) )'];default:throw new Error('unsupported encoding: '+encoding);}}function getTexelDecodingFunction(functionName,encoding){var components=getEncodingComponents(encoding);return 'vec4 '+functionName+'( vec4 value ) { return '+components[0]+'ToLinear'+components[1]+'; }';}function getTexelEncodingFunction(functionName,encoding){var components=getEncodingComponents(encoding);return 'vec4 '+functionName+'( vec4 value ) { return LinearTo'+components[0]+components[1]+'; }';}function getToneMappingFunction(functionName,toneMapping){var toneMappingName;switch(toneMapping){case LinearToneMapping:toneMappingName='Linear';break;case ReinhardToneMapping:toneMappingName='Reinhard';break;case Uncharted2ToneMapping:toneMappingName='Uncharted2';break;case CineonToneMapping:toneMappingName='OptimizedCineon';break;default:throw new Error('unsupported toneMapping: '+toneMapping);}return 'vec3 '+functionName+'( vec3 color ) { return '+toneMappingName+'ToneMapping( color ); }';}function generateExtensions(extensions,parameters,rendererExtensions){extensions=extensions||{};var chunks=[extensions.derivatives||parameters.envMapCubeUV||parameters.bumpMap||parameters.normalMap||parameters.flatShading?'#extension GL_OES_standard_derivatives : enable':'',(extensions.fragDepth||parameters.logarithmicDepthBuffer)&&rendererExtensions.get('EXT_frag_depth')?'#extension GL_EXT_frag_depth : enable':'',extensions.drawBuffers&&rendererExtensions.get('WEBGL_draw_buffers')?'#extension GL_EXT_draw_buffers : require':'',(extensions.shaderTextureLOD||parameters.envMap)&&rendererExtensions.get('EXT_shader_texture_lod')?'#extension GL_EXT_shader_texture_lod : enable':''];return chunks.filter(filterEmptyLine).join('\n');}function generateDefines(defines){var chunks=[];for(var name in defines){var value=defines[name];if(value===false)continue;chunks.push('#define '+name+' '+value);}return chunks.join('\n');}function fetchAttributeLocations(gl,program){var attributes={};var n=gl.getProgramParameter(program,gl.ACTIVE_ATTRIBUTES);for(var i=0;i<n;i++){var info=gl.getActiveAttrib(program,i);var name=info.name;// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );
attributes[name]=gl.getAttribLocation(program,name);}return attributes;}function filterEmptyLine(string){return string!=='';}function replaceLightNums(string,parameters){return string.replace(/NUM_DIR_LIGHTS/g,parameters.numDirLights).replace(/NUM_SPOT_LIGHTS/g,parameters.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,parameters.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,parameters.numPointLights).replace(/NUM_HEMI_LIGHTS/g,parameters.numHemiLights);}function replaceClippingPlaneNums(string,parameters){return string.replace(/NUM_CLIPPING_PLANES/g,parameters.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,parameters.numClippingPlanes-parameters.numClipIntersection);}function parseIncludes(string){var pattern=/^[ \t]*#include +<([\w\d.]+)>/gm;function replace(match,include){var replace=ShaderChunk[include];if(replace===undefined){throw new Error('Can not resolve #include <'+include+'>');}return parseIncludes(replace);}return string.replace(pattern,replace);}function unrollLoops(string){var pattern=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;function replace(match,start,end,snippet){var unroll='';for(var i=parseInt(start);i<parseInt(end);i++){unroll+=snippet.replace(/\[ i \]/g,'[ '+i+' ]');}return unroll;}return string.replace(pattern,replace);}function WebGLProgram(renderer,extensions,code,material,shader,parameters){var gl=renderer.context;var defines=material.defines;var vertexShader=shader.vertexShader;var fragmentShader=shader.fragmentShader;var shadowMapTypeDefine='SHADOWMAP_TYPE_BASIC';if(parameters.shadowMapType===PCFShadowMap){shadowMapTypeDefine='SHADOWMAP_TYPE_PCF';}else if(parameters.shadowMapType===PCFSoftShadowMap){shadowMapTypeDefine='SHADOWMAP_TYPE_PCF_SOFT';}var envMapTypeDefine='ENVMAP_TYPE_CUBE';var envMapModeDefine='ENVMAP_MODE_REFLECTION';var envMapBlendingDefine='ENVMAP_BLENDING_MULTIPLY';if(parameters.envMap){switch(material.envMap.mapping){case CubeReflectionMapping:case CubeRefractionMapping:envMapTypeDefine='ENVMAP_TYPE_CUBE';break;case CubeUVReflectionMapping:case CubeUVRefractionMapping:envMapTypeDefine='ENVMAP_TYPE_CUBE_UV';break;case EquirectangularReflectionMapping:case EquirectangularRefractionMapping:envMapTypeDefine='ENVMAP_TYPE_EQUIREC';break;case SphericalReflectionMapping:envMapTypeDefine='ENVMAP_TYPE_SPHERE';break;}switch(material.envMap.mapping){case CubeRefractionMapping:case EquirectangularRefractionMapping:envMapModeDefine='ENVMAP_MODE_REFRACTION';break;}switch(material.combine){case MultiplyOperation:envMapBlendingDefine='ENVMAP_BLENDING_MULTIPLY';break;case MixOperation:envMapBlendingDefine='ENVMAP_BLENDING_MIX';break;case AddOperation:envMapBlendingDefine='ENVMAP_BLENDING_ADD';break;}}var gammaFactorDefine=renderer.gammaFactor>0?renderer.gammaFactor:1.0;// console.log( 'building new program ' );
//
var customExtensions=generateExtensions(material.extensions,parameters,extensions);var customDefines=generateDefines(defines);//
var program=gl.createProgram();var prefixVertex,prefixFragment;if(material.isRawShaderMaterial){prefixVertex=[customDefines].filter(filterEmptyLine).join('\n');if(prefixVertex.length>0){prefixVertex+='\n';}prefixFragment=[customExtensions,customDefines].filter(filterEmptyLine).join('\n');if(prefixFragment.length>0){prefixFragment+='\n';}}else{prefixVertex=['precision '+parameters.precision+' float;','precision '+parameters.precision+' int;','#define SHADER_NAME '+shader.name,customDefines,parameters.supportsVertexTextures?'#define VERTEX_TEXTURES':'','#define GAMMA_FACTOR '+gammaFactorDefine,'#define MAX_BONES '+parameters.maxBones,parameters.useFog&&parameters.fog?'#define USE_FOG':'',parameters.useFog&&parameters.fogExp?'#define FOG_EXP2':'',parameters.map?'#define USE_MAP':'',parameters.envMap?'#define USE_ENVMAP':'',parameters.envMap?'#define '+envMapModeDefine:'',parameters.lightMap?'#define USE_LIGHTMAP':'',parameters.aoMap?'#define USE_AOMAP':'',parameters.emissiveMap?'#define USE_EMISSIVEMAP':'',parameters.bumpMap?'#define USE_BUMPMAP':'',parameters.normalMap?'#define USE_NORMALMAP':'',parameters.displacementMap&&parameters.supportsVertexTextures?'#define USE_DISPLACEMENTMAP':'',parameters.specularMap?'#define USE_SPECULARMAP':'',parameters.roughnessMap?'#define USE_ROUGHNESSMAP':'',parameters.metalnessMap?'#define USE_METALNESSMAP':'',parameters.alphaMap?'#define USE_ALPHAMAP':'',parameters.vertexColors?'#define USE_COLOR':'',parameters.flatShading?'#define FLAT_SHADED':'',parameters.skinning?'#define USE_SKINNING':'',parameters.useVertexTexture?'#define BONE_TEXTURE':'',parameters.morphTargets?'#define USE_MORPHTARGETS':'',parameters.morphNormals&&parameters.flatShading===false?'#define USE_MORPHNORMALS':'',parameters.doubleSided?'#define DOUBLE_SIDED':'',parameters.flipSided?'#define FLIP_SIDED':'',parameters.shadowMapEnabled?'#define USE_SHADOWMAP':'',parameters.shadowMapEnabled?'#define '+shadowMapTypeDefine:'',parameters.sizeAttenuation?'#define USE_SIZEATTENUATION':'',parameters.logarithmicDepthBuffer?'#define USE_LOGDEPTHBUF':'',parameters.logarithmicDepthBuffer&&extensions.get('EXT_frag_depth')?'#define USE_LOGDEPTHBUF_EXT':'','uniform mat4 modelMatrix;','uniform mat4 modelViewMatrix;','uniform mat4 projectionMatrix;','uniform mat4 viewMatrix;','uniform mat3 normalMatrix;','uniform vec3 cameraPosition;','attribute vec3 position;','attribute vec3 normal;','attribute vec2 uv;','#ifdef USE_COLOR',' attribute vec3 color;','#endif','#ifdef USE_MORPHTARGETS',' attribute vec3 morphTarget0;',' attribute vec3 morphTarget1;',' attribute vec3 morphTarget2;',' attribute vec3 morphTarget3;',' #ifdef USE_MORPHNORMALS',' attribute vec3 morphNormal0;',' attribute vec3 morphNormal1;',' attribute vec3 morphNormal2;',' attribute vec3 morphNormal3;',' #else',' attribute vec3 morphTarget4;',' attribute vec3 morphTarget5;',' attribute vec3 morphTarget6;',' attribute vec3 morphTarget7;',' #endif','#endif','#ifdef USE_SKINNING',' attribute vec4 skinIndex;',' attribute vec4 skinWeight;','#endif','\n'].filter(filterEmptyLine).join('\n');prefixFragment=[customExtensions,'precision '+parameters.precision+' float;','precision '+parameters.precision+' int;','#define SHADER_NAME '+shader.name,customDefines,parameters.alphaTest?'#define ALPHATEST '+parameters.alphaTest:'','#define GAMMA_FACTOR '+gammaFactorDefine,parameters.useFog&&parameters.fog?'#define USE_FOG':'',parameters.useFog&&parameters.fogExp?'#define FOG_EXP2':'',parameters.map?'#define USE_MAP':'',parameters.envMap?'#define USE_ENVMAP':'',parameters.envMap?'#define '+envMapTypeDefine:'',parameters.envMap?'#define '+envMapModeDefine:'',parameters.envMap?'#define '+envMapBlendingDefine:'',parameters.lightMap?'#define USE_LIGHTMAP':'',parameters.aoMap?'#define USE_AOMAP':'',parameters.emissiveMap?'#define USE_EMISSIVEMAP':'',parameters.bumpMap?'#define USE_BUMPMAP':'',parameters.normalMap?'#define USE_NORMALMAP':'',parameters.specularMap?'#define USE_SPECULARMAP':'',parameters.roughnessMap?'#define USE_ROUGHNESSMAP':'',parameters.metalnessMap?'#define USE_METALNESSMAP':'',parameters.alphaMap?'#define USE_ALPHAMAP':'',parameters.vertexColors?'#define USE_COLOR':'',parameters.gradientMap?'#define USE_GRADIENTMAP':'',parameters.flatShading?'#define FLAT_SHADED':'',parameters.doubleSided?'#define DOUBLE_SIDED':'',parameters.flipSided?'#define FLIP_SIDED':'',parameters.shadowMapEnabled?'#define USE_SHADOWMAP':'',parameters.shadowMapEnabled?'#define '+shadowMapTypeDefine:'',parameters.premultipliedAlpha?'#define PREMULTIPLIED_ALPHA':'',parameters.physicallyCorrectLights?'#define PHYSICALLY_CORRECT_LIGHTS':'',parameters.logarithmicDepthBuffer?'#define USE_LOGDEPTHBUF':'',parameters.logarithmicDepthBuffer&&extensions.get('EXT_frag_depth')?'#define USE_LOGDEPTHBUF_EXT':'',parameters.envMap&&extensions.get('EXT_shader_texture_lod')?'#define TEXTURE_LOD_EXT':'','uniform mat4 viewMatrix;','uniform vec3 cameraPosition;',parameters.toneMapping!==NoToneMapping?'#define TONE_MAPPING':'',parameters.toneMapping!==NoToneMapping?ShaderChunk['tonemapping_pars_fragment']:'',// this code is required here because it is used by the toneMapping() function defined below
parameters.toneMapping!==NoToneMapping?getToneMappingFunction('toneMapping',parameters.toneMapping):'',parameters.dithering?'#define DITHERING':'',parameters.outputEncoding||parameters.mapEncoding||parameters.envMapEncoding||parameters.emissiveMapEncoding?ShaderChunk['encodings_pars_fragment']:'',// this code is required here because it is used by the various encoding/decoding function defined below
parameters.mapEncoding?getTexelDecodingFunction('mapTexelToLinear',parameters.mapEncoding):'',parameters.envMapEncoding?getTexelDecodingFunction('envMapTexelToLinear',parameters.envMapEncoding):'',parameters.emissiveMapEncoding?getTexelDecodingFunction('emissiveMapTexelToLinear',parameters.emissiveMapEncoding):'',parameters.outputEncoding?getTexelEncodingFunction('linearToOutputTexel',parameters.outputEncoding):'',parameters.depthPacking?'#define DEPTH_PACKING '+material.depthPacking:'','\n'].filter(filterEmptyLine).join('\n');}vertexShader=parseIncludes(vertexShader);vertexShader=replaceLightNums(vertexShader,parameters);vertexShader=replaceClippingPlaneNums(vertexShader,parameters);fragmentShader=parseIncludes(fragmentShader);fragmentShader=replaceLightNums(fragmentShader,parameters);fragmentShader=replaceClippingPlaneNums(fragmentShader,parameters);vertexShader=unrollLoops(vertexShader);fragmentShader=unrollLoops(fragmentShader);var vertexGlsl=prefixVertex+vertexShader;var fragmentGlsl=prefixFragment+fragmentShader;// console.log( '*VERTEX*', vertexGlsl );
// console.log( '*FRAGMENT*', fragmentGlsl );
var glVertexShader=WebGLShader(gl,gl.VERTEX_SHADER,vertexGlsl);var glFragmentShader=WebGLShader(gl,gl.FRAGMENT_SHADER,fragmentGlsl);gl.attachShader(program,glVertexShader);gl.attachShader(program,glFragmentShader);// Force a particular attribute to index 0.
if(material.index0AttributeName!==undefined){gl.bindAttribLocation(program,0,material.index0AttributeName);}else if(parameters.morphTargets===true){// programs with morphTargets displace position out of attribute 0
gl.bindAttribLocation(program,0,'position');}gl.linkProgram(program);var programLog=gl.getProgramInfoLog(program).trim();var vertexLog=gl.getShaderInfoLog(glVertexShader).trim();var fragmentLog=gl.getShaderInfoLog(glFragmentShader).trim();var runnable=true;var haveDiagnostics=true;// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );
// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );
if(gl.getProgramParameter(program,gl.LINK_STATUS)===false){runnable=false;console.error('THREE.WebGLProgram: shader error: ',gl.getError(),'gl.VALIDATE_STATUS',gl.getProgramParameter(program,gl.VALIDATE_STATUS),'gl.getProgramInfoLog',programLog,vertexLog,fragmentLog);}else if(programLog!==''){console.warn('THREE.WebGLProgram: gl.getProgramInfoLog()',programLog);}else if(vertexLog===''||fragmentLog===''){haveDiagnostics=false;}if(haveDiagnostics){this.diagnostics={runnable:runnable,material:material,programLog:programLog,vertexShader:{log:vertexLog,prefix:prefixVertex},fragmentShader:{log:fragmentLog,prefix:prefixFragment}};}// clean up
gl.deleteShader(glVertexShader);gl.deleteShader(glFragmentShader);// set up caching for uniform locations
var cachedUniforms;this.getUniforms=function(){if(cachedUniforms===undefined){cachedUniforms=new WebGLUniforms(gl,program,renderer);}return cachedUniforms;};// set up caching for attribute locations
var cachedAttributes;this.getAttributes=function(){if(cachedAttributes===undefined){cachedAttributes=fetchAttributeLocations(gl,program);}return cachedAttributes;};// free resource
this.destroy=function(){gl.deleteProgram(program);this.program=undefined;};// DEPRECATED
Object.defineProperties(this,{uniforms:{get:function(){console.warn('THREE.WebGLProgram: .uniforms is now .getUniforms().');return this.getUniforms();}},attributes:{get:function(){console.warn('THREE.WebGLProgram: .attributes is now .getAttributes().');return this.getAttributes();}}});//
this.name=shader.name;this.id=programIdCount++;this.code=code;this.usedTimes=1;this.program=program;this.vertexShader=glVertexShader;this.fragmentShader=glFragmentShader;return this;}/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLPrograms(renderer,extensions,capabilities){var programs=[];var shaderIDs={MeshDepthMaterial:'depth',MeshDistanceMaterial:'distanceRGBA',MeshNormalMaterial:'normal',MeshBasicMaterial:'basic',MeshLambertMaterial:'lambert',MeshPhongMaterial:'phong',MeshToonMaterial:'phong',MeshStandardMaterial:'physical',MeshPhysicalMaterial:'physical',LineBasicMaterial:'basic',LineDashedMaterial:'dashed',PointsMaterial:'points',ShadowMaterial:'shadow'};var parameterNames=["precision","supportsVertexTextures","map","mapEncoding","envMap","envMapMode","envMapEncoding","lightMap","aoMap","emissiveMap","emissiveMapEncoding","bumpMap","normalMap","displacementMap","specularMap","roughnessMap","metalnessMap","gradientMap","alphaMap","combine","vertexColors","fog","useFog","fogExp","flatShading","sizeAttenuation","logarithmicDepthBuffer","skinning","maxBones","useVertexTexture","morphTargets","morphNormals","maxMorphTargets","maxMorphNormals","premultipliedAlpha","numDirLights","numPointLights","numSpotLights","numHemiLights","numRectAreaLights","shadowMapEnabled","shadowMapType","toneMapping",'physicallyCorrectLights',"alphaTest","doubleSided","flipSided","numClippingPlanes","numClipIntersection","depthPacking","dithering"];function allocateBones(object){var skeleton=object.skeleton;var bones=skeleton.bones;if(capabilities.floatVertexTextures){return 1024;}else{// default for when object is not specified
// ( for example when prebuilding shader to be used with multiple objects )
//
// - leave some extra space for other uniforms
// - limit here is ANGLE's 254 max uniform vectors
// (up to 54 should be safe)
var nVertexUniforms=capabilities.maxVertexUniforms;var nVertexMatrices=Math.floor((nVertexUniforms-20)/4);var maxBones=Math.min(nVertexMatrices,bones.length);if(maxBones<bones.length){console.warn('THREE.WebGLRenderer: Skeleton has '+bones.length+' bones. This GPU supports '+maxBones+'.');return 0;}return maxBones;}}function getTextureEncodingFromMap(map,gammaOverrideLinear){var encoding;if(!map){encoding=LinearEncoding;}else if(map.isTexture){encoding=map.encoding;}else if(map.isWebGLRenderTarget){console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.");encoding=map.texture.encoding;}// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.
if(encoding===LinearEncoding&&gammaOverrideLinear){encoding=GammaEncoding;}return encoding;}this.getParameters=function(material,lights,shadows,fog,nClipPlanes,nClipIntersection,object){var shaderID=shaderIDs[material.type];// heuristics to create shader parameters according to lights in the scene
// (not to blow over maxLights budget)
var maxBones=object.isSkinnedMesh?allocateBones(object):0;var precision=capabilities.precision;if(material.precision!==null){precision=capabilities.getMaxPrecision(material.precision);if(precision!==material.precision){console.warn('THREE.WebGLProgram.getParameters:',material.precision,'not supported, using',precision,'instead.');}}var currentRenderTarget=renderer.getRenderTarget();var parameters={shaderID:shaderID,precision:precision,supportsVertexTextures:capabilities.vertexTextures,outputEncoding:getTextureEncodingFromMap(!currentRenderTarget?null:currentRenderTarget.texture,renderer.gammaOutput),map:!!material.map,mapEncoding:getTextureEncodingFromMap(material.map,renderer.gammaInput),envMap:!!material.envMap,envMapMode:material.envMap&&material.envMap.mapping,envMapEncoding:getTextureEncodingFromMap(material.envMap,renderer.gammaInput),envMapCubeUV:!!material.envMap&&(material.envMap.mapping===CubeUVReflectionMapping||material.envMap.mapping===CubeUVRefractionMapping),lightMap:!!material.lightMap,aoMap:!!material.aoMap,emissiveMap:!!material.emissiveMap,emissiveMapEncoding:getTextureEncodingFromMap(material.emissiveMap,renderer.gammaInput),bumpMap:!!material.bumpMap,normalMap:!!material.normalMap,displacementMap:!!material.displacementMap,roughnessMap:!!material.roughnessMap,metalnessMap:!!material.metalnessMap,specularMap:!!material.specularMap,alphaMap:!!material.alphaMap,gradientMap:!!material.gradientMap,combine:material.combine,vertexColors:material.vertexColors,fog:!!fog,useFog:material.fog,fogExp:fog&&fog.isFogExp2,flatShading:material.flatShading,sizeAttenuation:material.sizeAttenuation,logarithmicDepthBuffer:capabilities.logarithmicDepthBuffer,skinning:material.skinning&&maxBones>0,maxBones:maxBones,useVertexTexture:capabilities.floatVertexTextures,morphTargets:material.morphTargets,morphNormals:material.morphNormals,maxMorphTargets:renderer.maxMorphTargets,maxMorphNormals:renderer.maxMorphNormals,numDirLights:lights.directional.length,numPointLights:lights.point.length,numSpotLights:lights.spot.length,numRectAreaLights:lights.rectArea.length,numHemiLights:lights.hemi.length,numClippingPlanes:nClipPlanes,numClipIntersection:nClipIntersection,dithering:material.dithering,shadowMapEnabled:renderer.shadowMap.enabled&&object.receiveShadow&&shadows.length>0,shadowMapType:renderer.shadowMap.type,toneMapping:renderer.toneMapping,physicallyCorrectLights:renderer.physicallyCorrectLights,premultipliedAlpha:material.premultipliedAlpha,alphaTest:material.alphaTest,doubleSided:material.side===DoubleSide,flipSided:material.side===BackSide,depthPacking:material.depthPacking!==undefined?material.depthPacking:false};return parameters;};this.getProgramCode=function(material,parameters){var array=[];if(parameters.shaderID){array.push(parameters.shaderID);}else{array.push(material.fragmentShader);array.push(material.vertexShader);}if(material.defines!==undefined){for(var name in material.defines){array.push(name);array.push(material.defines[name]);}}for(var i=0;i<parameterNames.length;i++){array.push(parameters[parameterNames[i]]);}array.push(material.onBeforeCompile.toString());array.push(renderer.gammaOutput);return array.join();};this.acquireProgram=function(material,shader,parameters,code){var program;// Check if code has been already compiled
for(var p=0,pl=programs.length;p<pl;p++){var programInfo=programs[p];if(programInfo.code===code){program=programInfo;++program.usedTimes;break;}}if(program===undefined){program=new WebGLProgram(renderer,extensions,code,material,shader,parameters);programs.push(program);}return program;};this.releaseProgram=function(program){if(--program.usedTimes===0){// Remove from unordered set
var i=programs.indexOf(program);programs[i]=programs[programs.length-1];programs.pop();// Free WebGL resources
program.destroy();}};// Exposed for resource monitoring & error feedback via renderer.info:
this.programs=programs;}/**
* @author fordacious / fordacious.github.io
*/function WebGLProperties(){var properties=new WeakMap();function get(object){var map=properties.get(object);if(map===undefined){map={};properties.set(object,map);}return map;}function remove(object){properties.delete(object);}function update(object,key,value){properties.get(object)[key]=value;}function dispose(){properties=new WeakMap();}return {get:get,remove:remove,update:update,dispose:dispose};}/**
* @author mrdoob / http://mrdoob.com/
*/function painterSortStable(a,b){if(a.renderOrder!==b.renderOrder){return a.renderOrder-b.renderOrder;}else if(a.program&&b.program&&a.program!==b.program){return a.program.id-b.program.id;}else if(a.material.id!==b.material.id){return a.material.id-b.material.id;}else if(a.z!==b.z){return a.z-b.z;}else{return a.id-b.id;}}function reversePainterSortStable(a,b){if(a.renderOrder!==b.renderOrder){return a.renderOrder-b.renderOrder;}if(a.z!==b.z){return b.z-a.z;}else{return a.id-b.id;}}function WebGLRenderList(){var renderItems=[];var renderItemsIndex=0;var opaque=[];var transparent=[];function init(){renderItemsIndex=0;opaque.length=0;transparent.length=0;}function push(object,geometry,material,z,group){var renderItem=renderItems[renderItemsIndex];if(renderItem===undefined){renderItem={id:object.id,object:object,geometry:geometry,material:material,program:material.program,renderOrder:object.renderOrder,z:z,group:group};renderItems[renderItemsIndex]=renderItem;}else{renderItem.id=object.id;renderItem.object=object;renderItem.geometry=geometry;renderItem.material=material;renderItem.program=material.program;renderItem.renderOrder=object.renderOrder;renderItem.z=z;renderItem.group=group;}(material.transparent===true?transparent:opaque).push(renderItem);renderItemsIndex++;}function sort(){if(opaque.length>1)opaque.sort(painterSortStable);if(transparent.length>1)transparent.sort(reversePainterSortStable);}return {opaque:opaque,transparent:transparent,init:init,push:push,sort:sort};}function WebGLRenderLists(){var lists={};function get(scene,camera){var hash=scene.id+','+camera.id;var list=lists[hash];if(list===undefined){// console.log( 'THREE.WebGLRenderLists:', hash );
list=new WebGLRenderList();lists[hash]=list;}return list;}function dispose(){lists={};}return {get:get,dispose:dispose};}/**
* @author mrdoob / http://mrdoob.com/
*/function UniformsCache(){var lights={};return {get:function(light){if(lights[light.id]!==undefined){return lights[light.id];}var uniforms;switch(light.type){case'DirectionalLight':uniforms={direction:new Vector3(),color:new Color(),shadow:false,shadowBias:0,shadowRadius:1,shadowMapSize:new Vector2()};break;case'SpotLight':uniforms={position:new Vector3(),direction:new Vector3(),color:new Color(),distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:false,shadowBias:0,shadowRadius:1,shadowMapSize:new Vector2()};break;case'PointLight':uniforms={position:new Vector3(),color:new Color(),distance:0,decay:0,shadow:false,shadowBias:0,shadowRadius:1,shadowMapSize:new Vector2(),shadowCameraNear:1,shadowCameraFar:1000};break;case'HemisphereLight':uniforms={direction:new Vector3(),skyColor:new Color(),groundColor:new Color()};break;case'RectAreaLight':uniforms={color:new Color(),position:new Vector3(),halfWidth:new Vector3(),halfHeight:new Vector3()// TODO (abelnation): set RectAreaLight shadow uniforms
};break;}lights[light.id]=uniforms;return uniforms;}};}var count=0;function WebGLLights(){var cache=new UniformsCache();var state={id:count++,hash:'',ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]};var vector3=new Vector3();var matrix4=new Matrix4();var matrix42=new Matrix4();function setup(lights,shadows,camera){var r=0,g=0,b=0;var directionalLength=0;var pointLength=0;var spotLength=0;var rectAreaLength=0;var hemiLength=0;var viewMatrix=camera.matrixWorldInverse;for(var i=0,l=lights.length;i<l;i++){var light=lights[i];var color=light.color;var intensity=light.intensity;var distance=light.distance;var shadowMap=light.shadow&&light.shadow.map?light.shadow.map.texture:null;if(light.isAmbientLight){r+=color.r*intensity;g+=color.g*intensity;b+=color.b*intensity;}else if(light.isDirectionalLight){var uniforms=cache.get(light);uniforms.color.copy(light.color).multiplyScalar(light.intensity);uniforms.direction.setFromMatrixPosition(light.matrixWorld);vector3.setFromMatrixPosition(light.target.matrixWorld);uniforms.direction.sub(vector3);uniforms.direction.transformDirection(viewMatrix);uniforms.shadow=light.castShadow;if(light.castShadow){var shadow=light.shadow;uniforms.shadowBias=shadow.bias;uniforms.shadowRadius=shadow.radius;uniforms.shadowMapSize=shadow.mapSize;}state.directionalShadowMap[directionalLength]=shadowMap;state.directionalShadowMatrix[directionalLength]=light.shadow.matrix;state.directional[directionalLength]=uniforms;directionalLength++;}else if(light.isSpotLight){var uniforms=cache.get(light);uniforms.position.setFromMatrixPosition(light.matrixWorld);uniforms.position.applyMatrix4(viewMatrix);uniforms.color.copy(color).multiplyScalar(intensity);uniforms.distance=distance;uniforms.direction.setFromMatrixPosition(light.matrixWorld);vector3.setFromMatrixPosition(light.target.matrixWorld);uniforms.direction.sub(vector3);uniforms.direction.transformDirection(viewMatrix);uniforms.coneCos=Math.cos(light.angle);uniforms.penumbraCos=Math.cos(light.angle*(1-light.penumbra));uniforms.decay=light.distance===0?0.0:light.decay;uniforms.shadow=light.castShadow;if(light.castShadow){var shadow=light.shadow;uniforms.shadowBias=shadow.bias;uniforms.shadowRadius=shadow.radius;uniforms.shadowMapSize=shadow.mapSize;}state.spotShadowMap[spotLength]=shadowMap;state.spotShadowMatrix[spotLength]=light.shadow.matrix;state.spot[spotLength]=uniforms;spotLength++;}else if(light.isRectAreaLight){var uniforms=cache.get(light);// (a) intensity is the total visible light emitted
//uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );
// (b) intensity is the brightness of the light
uniforms.color.copy(color).multiplyScalar(intensity);uniforms.position.setFromMatrixPosition(light.matrixWorld);uniforms.position.applyMatrix4(viewMatrix);// extract local rotation of light to derive width/height half vectors
matrix42.identity();matrix4.copy(light.matrixWorld);matrix4.premultiply(viewMatrix);matrix42.extractRotation(matrix4);uniforms.halfWidth.set(light.width*0.5,0.0,0.0);uniforms.halfHeight.set(0.0,light.height*0.5,0.0);uniforms.halfWidth.applyMatrix4(matrix42);uniforms.halfHeight.applyMatrix4(matrix42);// TODO (abelnation): RectAreaLight distance?
// uniforms.distance = distance;
state.rectArea[rectAreaLength]=uniforms;rectAreaLength++;}else if(light.isPointLight){var uniforms=cache.get(light);uniforms.position.setFromMatrixPosition(light.matrixWorld);uniforms.position.applyMatrix4(viewMatrix);uniforms.color.copy(light.color).multiplyScalar(light.intensity);uniforms.distance=light.distance;uniforms.decay=light.distance===0?0.0:light.decay;uniforms.shadow=light.castShadow;if(light.castShadow){var shadow=light.shadow;uniforms.shadowBias=shadow.bias;uniforms.shadowRadius=shadow.radius;uniforms.shadowMapSize=shadow.mapSize;uniforms.shadowCameraNear=shadow.camera.near;uniforms.shadowCameraFar=shadow.camera.far;}state.pointShadowMap[pointLength]=shadowMap;state.pointShadowMatrix[pointLength]=light.shadow.matrix;state.point[pointLength]=uniforms;pointLength++;}else if(light.isHemisphereLight){var uniforms=cache.get(light);uniforms.direction.setFromMatrixPosition(light.matrixWorld);uniforms.direction.transformDirection(viewMatrix);uniforms.direction.normalize();uniforms.skyColor.copy(light.color).multiplyScalar(intensity);uniforms.groundColor.copy(light.groundColor).multiplyScalar(intensity);state.hemi[hemiLength]=uniforms;hemiLength++;}}state.ambient[0]=r;state.ambient[1]=g;state.ambient[2]=b;state.directional.length=directionalLength;state.spot.length=spotLength;state.rectArea.length=rectAreaLength;state.point.length=pointLength;state.hemi.length=hemiLength;state.hash=state.id+','+directionalLength+','+pointLength+','+spotLength+','+rectAreaLength+','+hemiLength+','+shadows.length;}return {setup:setup,state:state};}/**
* @author Mugen87 / https://github.com/Mugen87
*/function WebGLRenderState(){var lights=new WebGLLights();var lightsArray=[];var shadowsArray=[];var spritesArray=[];function init(){lightsArray.length=0;shadowsArray.length=0;spritesArray.length=0;}function pushLight(light){lightsArray.push(light);}function pushShadow(shadowLight){shadowsArray.push(shadowLight);}function pushSprite(shadowLight){spritesArray.push(shadowLight);}function setupLights(camera){lights.setup(lightsArray,shadowsArray,camera);}var state={lightsArray:lightsArray,shadowsArray:shadowsArray,spritesArray:spritesArray,lights:lights};return {init:init,state:state,setupLights:setupLights,pushLight:pushLight,pushShadow:pushShadow,pushSprite:pushSprite};}function WebGLRenderStates(){var renderStates={};function get(scene,camera){var hash=scene.id+','+camera.id;var renderState=renderStates[hash];if(renderState===undefined){renderState=new WebGLRenderState();renderStates[hash]=renderState;}return renderState;}function dispose(){renderStates={};}return {get:get,dispose:dispose};}/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
* @author bhouston / https://clara.io
* @author WestLangley / http://github.com/WestLangley
*
* parameters = {
*
* opacity: <float>,
*
* map: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* displacementMap: new THREE.Texture( <Image> ),
* displacementScale: <float>,
* displacementBias: <float>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>
* }
*/function MeshDepthMaterial(parameters){Material.call(this);this.type='MeshDepthMaterial';this.depthPacking=BasicDepthPacking;this.skinning=false;this.morphTargets=false;this.map=null;this.alphaMap=null;this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=false;this.wireframeLinewidth=1;this.fog=false;this.lights=false;this.setValues(parameters);}MeshDepthMaterial.prototype=Object.create(Material.prototype);MeshDepthMaterial.prototype.constructor=MeshDepthMaterial;MeshDepthMaterial.prototype.isMeshDepthMaterial=true;MeshDepthMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.depthPacking=source.depthPacking;this.skinning=source.skinning;this.morphTargets=source.morphTargets;this.map=source.map;this.alphaMap=source.alphaMap;this.displacementMap=source.displacementMap;this.displacementScale=source.displacementScale;this.displacementBias=source.displacementBias;this.wireframe=source.wireframe;this.wireframeLinewidth=source.wireframeLinewidth;return this;};/**
* @author WestLangley / http://github.com/WestLangley
*
* parameters = {
*
* referencePosition: <float>,
* nearDistance: <float>,
* farDistance: <float>,
*
* skinning: <bool>,
* morphTargets: <bool>,
*
* map: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* displacementMap: new THREE.Texture( <Image> ),
* displacementScale: <float>,
* displacementBias: <float>
*
* }
*/function MeshDistanceMaterial(parameters){Material.call(this);this.type='MeshDistanceMaterial';this.referencePosition=new Vector3();this.nearDistance=1;this.farDistance=1000;this.skinning=false;this.morphTargets=false;this.map=null;this.alphaMap=null;this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.fog=false;this.lights=false;this.setValues(parameters);}MeshDistanceMaterial.prototype=Object.create(Material.prototype);MeshDistanceMaterial.prototype.constructor=MeshDistanceMaterial;MeshDistanceMaterial.prototype.isMeshDistanceMaterial=true;MeshDistanceMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.referencePosition.copy(source.referencePosition);this.nearDistance=source.nearDistance;this.farDistance=source.farDistance;this.skinning=source.skinning;this.morphTargets=source.morphTargets;this.map=source.map;this.alphaMap=source.alphaMap;this.displacementMap=source.displacementMap;this.displacementScale=source.displacementScale;this.displacementBias=source.displacementBias;return this;};/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
*/function WebGLShadowMap(_renderer,_objects,maxTextureSize){var _frustum=new Frustum(),_projScreenMatrix=new Matrix4(),_shadowMapSize=new Vector2(),_maxShadowMapSize=new Vector2(maxTextureSize,maxTextureSize),_lookTarget=new Vector3(),_lightPositionWorld=new Vector3(),_MorphingFlag=1,_SkinningFlag=2,_NumberOfMaterialVariants=(_MorphingFlag|_SkinningFlag)+1,_depthMaterials=new Array(_NumberOfMaterialVariants),_distanceMaterials=new Array(_NumberOfMaterialVariants),_materialCache={};var shadowSide={0:BackSide,1:FrontSide,2:DoubleSide};var cubeDirections=[new Vector3(1,0,0),new Vector3(-1,0,0),new Vector3(0,0,1),new Vector3(0,0,-1),new Vector3(0,1,0),new Vector3(0,-1,0)];var cubeUps=[new Vector3(0,1,0),new Vector3(0,1,0),new Vector3(0,1,0),new Vector3(0,1,0),new Vector3(0,0,1),new Vector3(0,0,-1)];var cube2DViewPorts=[new Vector4(),new Vector4(),new Vector4(),new Vector4(),new Vector4(),new Vector4()];// init
for(var i=0;i!==_NumberOfMaterialVariants;++i){var useMorphing=(i&_MorphingFlag)!==0;var useSkinning=(i&_SkinningFlag)!==0;var depthMaterial=new MeshDepthMaterial({depthPacking:RGBADepthPacking,morphTargets:useMorphing,skinning:useSkinning});_depthMaterials[i]=depthMaterial;//
var distanceMaterial=new MeshDistanceMaterial({morphTargets:useMorphing,skinning:useSkinning});_distanceMaterials[i]=distanceMaterial;}//
var scope=this;this.enabled=false;this.autoUpdate=true;this.needsUpdate=false;this.type=PCFShadowMap;this.render=function(lights,scene,camera){if(scope.enabled===false)return;if(scope.autoUpdate===false&&scope.needsUpdate===false)return;if(lights.length===0)return;// TODO Clean up (needed in case of contextlost)
var _gl=_renderer.context;var _state=_renderer.state;// Set GL state for depth map.
_state.disable(_gl.BLEND);_state.buffers.color.setClear(1,1,1,1);_state.buffers.depth.setTest(true);_state.setScissorTest(false);// render depth map
var faceCount;for(var i=0,il=lights.length;i<il;i++){var light=lights[i];var shadow=light.shadow;var isPointLight=light&&light.isPointLight;if(shadow===undefined){console.warn('THREE.WebGLShadowMap:',light,'has no shadow.');continue;}var shadowCamera=shadow.camera;_shadowMapSize.copy(shadow.mapSize);_shadowMapSize.min(_maxShadowMapSize);if(isPointLight){var vpWidth=_shadowMapSize.x;var vpHeight=_shadowMapSize.y;// These viewports map a cube-map onto a 2D texture with the
// following orientation:
//
// xzXZ
// y Y
//
// X - Positive x direction
// x - Negative x direction
// Y - Positive y direction
// y - Negative y direction
// Z - Positive z direction
// z - Negative z direction
// positive X
cube2DViewPorts[0].set(vpWidth*2,vpHeight,vpWidth,vpHeight);// negative X
cube2DViewPorts[1].set(0,vpHeight,vpWidth,vpHeight);// positive Z
cube2DViewPorts[2].set(vpWidth*3,vpHeight,vpWidth,vpHeight);// negative Z
cube2DViewPorts[3].set(vpWidth,vpHeight,vpWidth,vpHeight);// positive Y
cube2DViewPorts[4].set(vpWidth*3,0,vpWidth,vpHeight);// negative Y
cube2DViewPorts[5].set(vpWidth,0,vpWidth,vpHeight);_shadowMapSize.x*=4.0;_shadowMapSize.y*=2.0;}if(shadow.map===null){var pars={minFilter:NearestFilter,magFilter:NearestFilter,format:RGBAFormat};shadow.map=new WebGLRenderTarget(_shadowMapSize.x,_shadowMapSize.y,pars);shadow.map.texture.name=light.name+".shadowMap";shadowCamera.updateProjectionMatrix();}if(shadow.isSpotLightShadow){shadow.update(light);}var shadowMap=shadow.map;var shadowMatrix=shadow.matrix;_lightPositionWorld.setFromMatrixPosition(light.matrixWorld);shadowCamera.position.copy(_lightPositionWorld);if(isPointLight){faceCount=6;// for point lights we set the shadow matrix to be a translation-only matrix
// equal to inverse of the light's position
shadowMatrix.makeTranslation(-_lightPositionWorld.x,-_lightPositionWorld.y,-_lightPositionWorld.z);}else{faceCount=1;_lookTarget.setFromMatrixPosition(light.target.matrixWorld);shadowCamera.lookAt(_lookTarget);shadowCamera.updateMatrixWorld();// compute shadow matrix
shadowMatrix.set(0.5,0.0,0.0,0.5,0.0,0.5,0.0,0.5,0.0,0.0,0.5,0.5,0.0,0.0,0.0,1.0);shadowMatrix.multiply(shadowCamera.projectionMatrix);shadowMatrix.multiply(shadowCamera.matrixWorldInverse);}_renderer.setRenderTarget(shadowMap);_renderer.clear();// render shadow map for each cube face (if omni-directional) or
// run a single pass if not
for(var face=0;face<faceCount;face++){if(isPointLight){_lookTarget.copy(shadowCamera.position);_lookTarget.add(cubeDirections[face]);shadowCamera.up.copy(cubeUps[face]);shadowCamera.lookAt(_lookTarget);shadowCamera.updateMatrixWorld();var vpDimensions=cube2DViewPorts[face];_state.viewport(vpDimensions);}// update camera matrices and frustum
_projScreenMatrix.multiplyMatrices(shadowCamera.projectionMatrix,shadowCamera.matrixWorldInverse);_frustum.setFromMatrix(_projScreenMatrix);// set object matrices & frustum culling
renderObject(scene,camera,shadowCamera,isPointLight);}}scope.needsUpdate=false;};function getDepthMaterial(object,material,isPointLight,lightPositionWorld,shadowCameraNear,shadowCameraFar){var geometry=object.geometry;var result=null;var materialVariants=_depthMaterials;var customMaterial=object.customDepthMaterial;if(isPointLight){materialVariants=_distanceMaterials;customMaterial=object.customDistanceMaterial;}if(!customMaterial){var useMorphing=false;if(material.morphTargets){if(geometry&&geometry.isBufferGeometry){useMorphing=geometry.morphAttributes&&geometry.morphAttributes.position&&geometry.morphAttributes.position.length>0;}else if(geometry&&geometry.isGeometry){useMorphing=geometry.morphTargets&&geometry.morphTargets.length>0;}}if(object.isSkinnedMesh&&material.skinning===false){console.warn('THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:',object);}var useSkinning=object.isSkinnedMesh&&material.skinning;var variantIndex=0;if(useMorphing)variantIndex|=_MorphingFlag;if(useSkinning)variantIndex|=_SkinningFlag;result=materialVariants[variantIndex];}else{result=customMaterial;}if(_renderer.localClippingEnabled&&material.clipShadows===true&&material.clippingPlanes.length!==0){// in this case we need a unique material instance reflecting the
// appropriate state
var keyA=result.uuid,keyB=material.uuid;var materialsForVariant=_materialCache[keyA];if(materialsForVariant===undefined){materialsForVariant={};_materialCache[keyA]=materialsForVariant;}var cachedMaterial=materialsForVariant[keyB];if(cachedMaterial===undefined){cachedMaterial=result.clone();materialsForVariant[keyB]=cachedMaterial;}result=cachedMaterial;}result.visible=material.visible;result.wireframe=material.wireframe;result.side=material.shadowSide!=null?material.shadowSide:shadowSide[material.side];result.clipShadows=material.clipShadows;result.clippingPlanes=material.clippingPlanes;result.clipIntersection=material.clipIntersection;result.wireframeLinewidth=material.wireframeLinewidth;result.linewidth=material.linewidth;if(isPointLight&&result.isMeshDistanceMaterial){result.referencePosition.copy(lightPositionWorld);result.nearDistance=shadowCameraNear;result.farDistance=shadowCameraFar;}return result;}function renderObject(object,camera,shadowCamera,isPointLight){if(object.visible===false)return;var visible=object.layers.test(camera.layers);if(visible&&(object.isMesh||object.isLine||object.isPoints)){if(object.castShadow&&(!object.frustumCulled||_frustum.intersectsObject(object))){object.modelViewMatrix.multiplyMatrices(shadowCamera.matrixWorldInverse,object.matrixWorld);var geometry=_objects.update(object);var material=object.material;if(Array.isArray(material)){var groups=geometry.groups;for(var k=0,kl=groups.length;k<kl;k++){var group=groups[k];var groupMaterial=material[group.materialIndex];if(groupMaterial&&groupMaterial.visible){var depthMaterial=getDepthMaterial(object,groupMaterial,isPointLight,_lightPositionWorld,shadowCamera.near,shadowCamera.far);_renderer.renderBufferDirect(shadowCamera,null,geometry,depthMaterial,object,group);}}}else if(material.visible){var depthMaterial=getDepthMaterial(object,material,isPointLight,_lightPositionWorld,shadowCamera.near,shadowCamera.far);_renderer.renderBufferDirect(shadowCamera,null,geometry,depthMaterial,object,null);}}}var children=object.children;for(var i=0,l=children.length;i<l;i++){renderObject(children[i],camera,shadowCamera,isPointLight);}}}/**
* @author mrdoob / http://mrdoob.com/
*/function CanvasTexture(canvas,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy){Texture.call(this,canvas,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy);this.needsUpdate=true;}CanvasTexture.prototype=Object.create(Texture.prototype);CanvasTexture.prototype.constructor=CanvasTexture;/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
*/function WebGLSpriteRenderer(renderer,gl,state,textures,capabilities){var vertexBuffer,elementBuffer;var program,attributes,uniforms;var texture;// decompose matrixWorld
var spritePosition=new Vector3();var spriteRotation=new Quaternion();var spriteScale=new Vector3();function init(){var vertices=new Float32Array([-0.5,-0.5,0,0,0.5,-0.5,1,0,0.5,0.5,1,1,-0.5,0.5,0,1]);var faces=new Uint16Array([0,1,2,0,2,3]);vertexBuffer=gl.createBuffer();elementBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer);gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW);gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,elementBuffer);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,faces,gl.STATIC_DRAW);program=createProgram();attributes={position:gl.getAttribLocation(program,'position'),uv:gl.getAttribLocation(program,'uv')};uniforms={uvOffset:gl.getUniformLocation(program,'uvOffset'),uvScale:gl.getUniformLocation(program,'uvScale'),rotation:gl.getUniformLocation(program,'rotation'),center:gl.getUniformLocation(program,'center'),scale:gl.getUniformLocation(program,'scale'),color:gl.getUniformLocation(program,'color'),map:gl.getUniformLocation(program,'map'),opacity:gl.getUniformLocation(program,'opacity'),modelViewMatrix:gl.getUniformLocation(program,'modelViewMatrix'),projectionMatrix:gl.getUniformLocation(program,'projectionMatrix'),fogType:gl.getUniformLocation(program,'fogType'),fogDensity:gl.getUniformLocation(program,'fogDensity'),fogNear:gl.getUniformLocation(program,'fogNear'),fogFar:gl.getUniformLocation(program,'fogFar'),fogColor:gl.getUniformLocation(program,'fogColor'),fogDepth:gl.getUniformLocation(program,'fogDepth'),alphaTest:gl.getUniformLocation(program,'alphaTest')};var canvas=document.createElementNS('http://www.w3.org/1999/xhtml','canvas');canvas.width=8;canvas.height=8;var context=canvas.getContext('2d');context.fillStyle='white';context.fillRect(0,0,8,8);texture=new CanvasTexture(canvas);}this.render=function(sprites,scene,camera){if(sprites.length===0)return;// setup gl
if(program===undefined){init();}state.useProgram(program);state.initAttributes();state.enableAttribute(attributes.position);state.enableAttribute(attributes.uv);state.disableUnusedAttributes();state.disable(gl.CULL_FACE);state.enable(gl.BLEND);gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer);gl.vertexAttribPointer(attributes.position,2,gl.FLOAT,false,2*8,0);gl.vertexAttribPointer(attributes.uv,2,gl.FLOAT,false,2*8,8);gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,elementBuffer);gl.uniformMatrix4fv(uniforms.projectionMatrix,false,camera.projectionMatrix.elements);state.activeTexture(gl.TEXTURE0);gl.uniform1i(uniforms.map,0);var oldFogType=0;var sceneFogType=0;var fog=scene.fog;if(fog){gl.uniform3f(uniforms.fogColor,fog.color.r,fog.color.g,fog.color.b);if(fog.isFog){gl.uniform1f(uniforms.fogNear,fog.near);gl.uniform1f(uniforms.fogFar,fog.far);gl.uniform1i(uniforms.fogType,1);oldFogType=1;sceneFogType=1;}else if(fog.isFogExp2){gl.uniform1f(uniforms.fogDensity,fog.density);gl.uniform1i(uniforms.fogType,2);oldFogType=2;sceneFogType=2;}}else{gl.uniform1i(uniforms.fogType,0);oldFogType=0;sceneFogType=0;}// update positions and sort
for(var i=0,l=sprites.length;i<l;i++){var sprite=sprites[i];sprite.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse,sprite.matrixWorld);sprite.z=-sprite.modelViewMatrix.elements[14];}sprites.sort(painterSortStable);// render all sprites
var scale=[];var center=[];for(var i=0,l=sprites.length;i<l;i++){var sprite=sprites[i];var material=sprite.material;if(material.visible===false)continue;sprite.onBeforeRender(renderer,scene,camera,undefined,material,undefined);gl.uniform1f(uniforms.alphaTest,material.alphaTest);gl.uniformMatrix4fv(uniforms.modelViewMatrix,false,sprite.modelViewMatrix.elements);sprite.matrixWorld.decompose(spritePosition,spriteRotation,spriteScale);scale[0]=spriteScale.x;scale[1]=spriteScale.y;center[0]=sprite.center.x-0.5;center[1]=sprite.center.y-0.5;var fogType=0;if(scene.fog&&material.fog){fogType=sceneFogType;}if(oldFogType!==fogType){gl.uniform1i(uniforms.fogType,fogType);oldFogType=fogType;}if(material.map!==null){gl.uniform2f(uniforms.uvOffset,material.map.offset.x,material.map.offset.y);gl.uniform2f(uniforms.uvScale,material.map.repeat.x,material.map.repeat.y);}else{gl.uniform2f(uniforms.uvOffset,0,0);gl.uniform2f(uniforms.uvScale,1,1);}gl.uniform1f(uniforms.opacity,material.opacity);gl.uniform3f(uniforms.color,material.color.r,material.color.g,material.color.b);gl.uniform1f(uniforms.rotation,material.rotation);gl.uniform2fv(uniforms.center,center);gl.uniform2fv(uniforms.scale,scale);state.setBlending(material.blending,material.blendEquation,material.blendSrc,material.blendDst,material.blendEquationAlpha,material.blendSrcAlpha,material.blendDstAlpha,material.premultipliedAlpha);state.buffers.depth.setTest(material.depthTest);state.buffers.depth.setMask(material.depthWrite);state.buffers.color.setMask(material.colorWrite);textures.setTexture2D(material.map||texture,0);gl.drawElements(gl.TRIANGLES,6,gl.UNSIGNED_SHORT,0);sprite.onAfterRender(renderer,scene,camera,undefined,material,undefined);}// restore gl
state.enable(gl.CULL_FACE);state.reset();};function createProgram(){var program=gl.createProgram();var vertexShader=gl.createShader(gl.VERTEX_SHADER);var fragmentShader=gl.createShader(gl.FRAGMENT_SHADER);gl.shaderSource(vertexShader,['precision '+capabilities.precision+' float;','#define SHADER_NAME '+'SpriteMaterial','uniform mat4 modelViewMatrix;','uniform mat4 projectionMatrix;','uniform float rotation;','uniform vec2 center;','uniform vec2 scale;','uniform vec2 uvOffset;','uniform vec2 uvScale;','attribute vec2 position;','attribute vec2 uv;','varying vec2 vUV;','varying float fogDepth;','void main() {',' vUV = uvOffset + uv * uvScale;',' vec2 alignedPosition = ( position - center ) * scale;',' vec2 rotatedPosition;',' rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',' rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',' vec4 mvPosition;',' mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',' mvPosition.xy += rotatedPosition;',' gl_Position = projectionMatrix * mvPosition;',' fogDepth = - mvPosition.z;','}'].join('\n'));gl.shaderSource(fragmentShader,['precision '+capabilities.precision+' float;','#define SHADER_NAME '+'SpriteMaterial','uniform vec3 color;','uniform sampler2D map;','uniform float opacity;','uniform int fogType;','uniform vec3 fogColor;','uniform float fogDensity;','uniform float fogNear;','uniform float fogFar;','uniform float alphaTest;','varying vec2 vUV;','varying float fogDepth;','void main() {',' vec4 texture = texture2D( map, vUV );',' gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',' if ( gl_FragColor.a < alphaTest ) discard;',' if ( fogType > 0 ) {',' float fogFactor = 0.0;',' if ( fogType == 1 ) {',' fogFactor = smoothstep( fogNear, fogFar, fogDepth );',' } else {',' const float LOG2 = 1.442695;',' fogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );',' fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',' }',' gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );',' }','}'].join('\n'));gl.compileShader(vertexShader);gl.compileShader(fragmentShader);gl.attachShader(program,vertexShader);gl.attachShader(program,fragmentShader);gl.linkProgram(program);return program;}function painterSortStable(a,b){if(a.renderOrder!==b.renderOrder){return a.renderOrder-b.renderOrder;}else if(a.z!==b.z){return b.z-a.z;}else{return b.id-a.id;}}}/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLState(gl,extensions,utils){function ColorBuffer(){var locked=false;var color=new Vector4();var currentColorMask=null;var currentColorClear=new Vector4(0,0,0,0);return {setMask:function(colorMask){if(currentColorMask!==colorMask&&!locked){gl.colorMask(colorMask,colorMask,colorMask,colorMask);currentColorMask=colorMask;}},setLocked:function(lock){locked=lock;},setClear:function(r,g,b,a,premultipliedAlpha){if(premultipliedAlpha===true){r*=a;g*=a;b*=a;}color.set(r,g,b,a);if(currentColorClear.equals(color)===false){gl.clearColor(r,g,b,a);currentColorClear.copy(color);}},reset:function(){locked=false;currentColorMask=null;currentColorClear.set(-1,0,0,0);// set to invalid state
}};}function DepthBuffer(){var locked=false;var currentDepthMask=null;var currentDepthFunc=null;var currentDepthClear=null;return {setTest:function(depthTest){if(depthTest){enable(gl.DEPTH_TEST);}else{disable(gl.DEPTH_TEST);}},setMask:function(depthMask){if(currentDepthMask!==depthMask&&!locked){gl.depthMask(depthMask);currentDepthMask=depthMask;}},setFunc:function(depthFunc){if(currentDepthFunc!==depthFunc){if(depthFunc){switch(depthFunc){case NeverDepth:gl.depthFunc(gl.NEVER);break;case AlwaysDepth:gl.depthFunc(gl.ALWAYS);break;case LessDepth:gl.depthFunc(gl.LESS);break;case LessEqualDepth:gl.depthFunc(gl.LEQUAL);break;case EqualDepth:gl.depthFunc(gl.EQUAL);break;case GreaterEqualDepth:gl.depthFunc(gl.GEQUAL);break;case GreaterDepth:gl.depthFunc(gl.GREATER);break;case NotEqualDepth:gl.depthFunc(gl.NOTEQUAL);break;default:gl.depthFunc(gl.LEQUAL);}}else{gl.depthFunc(gl.LEQUAL);}currentDepthFunc=depthFunc;}},setLocked:function(lock){locked=lock;},setClear:function(depth){if(currentDepthClear!==depth){gl.clearDepth(depth);currentDepthClear=depth;}},reset:function(){locked=false;currentDepthMask=null;currentDepthFunc=null;currentDepthClear=null;}};}function StencilBuffer(){var locked=false;var currentStencilMask=null;var currentStencilFunc=null;var currentStencilRef=null;var currentStencilFuncMask=null;var currentStencilFail=null;var currentStencilZFail=null;var currentStencilZPass=null;var currentStencilClear=null;return {setTest:function(stencilTest){if(stencilTest){enable(gl.STENCIL_TEST);}else{disable(gl.STENCIL_TEST);}},setMask:function(stencilMask){if(currentStencilMask!==stencilMask&&!locked){gl.stencilMask(stencilMask);currentStencilMask=stencilMask;}},setFunc:function(stencilFunc,stencilRef,stencilMask){if(currentStencilFunc!==stencilFunc||currentStencilRef!==stencilRef||currentStencilFuncMask!==stencilMask){gl.stencilFunc(stencilFunc,stencilRef,stencilMask);currentStencilFunc=stencilFunc;currentStencilRef=stencilRef;currentStencilFuncMask=stencilMask;}},setOp:function(stencilFail,stencilZFail,stencilZPass){if(currentStencilFail!==stencilFail||currentStencilZFail!==stencilZFail||currentStencilZPass!==stencilZPass){gl.stencilOp(stencilFail,stencilZFail,stencilZPass);currentStencilFail=stencilFail;currentStencilZFail=stencilZFail;currentStencilZPass=stencilZPass;}},setLocked:function(lock){locked=lock;},setClear:function(stencil){if(currentStencilClear!==stencil){gl.clearStencil(stencil);currentStencilClear=stencil;}},reset:function(){locked=false;currentStencilMask=null;currentStencilFunc=null;currentStencilRef=null;currentStencilFuncMask=null;currentStencilFail=null;currentStencilZFail=null;currentStencilZPass=null;currentStencilClear=null;}};}//
var colorBuffer=new ColorBuffer();var depthBuffer=new DepthBuffer();var stencilBuffer=new StencilBuffer();var maxVertexAttributes=gl.getParameter(gl.MAX_VERTEX_ATTRIBS);var newAttributes=new Uint8Array(maxVertexAttributes);var enabledAttributes=new Uint8Array(maxVertexAttributes);var attributeDivisors=new Uint8Array(maxVertexAttributes);var capabilities={};var compressedTextureFormats=null;var currentProgram=null;var currentBlending=null;var currentBlendEquation=null;var currentBlendSrc=null;var currentBlendDst=null;var currentBlendEquationAlpha=null;var currentBlendSrcAlpha=null;var currentBlendDstAlpha=null;var currentPremultipledAlpha=false;var currentFlipSided=null;var currentCullFace=null;var currentLineWidth=null;var currentPolygonOffsetFactor=null;var currentPolygonOffsetUnits=null;var maxTextures=gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS);var lineWidthAvailable=false;var version=0;var glVersion=gl.getParameter(gl.VERSION);if(glVersion.indexOf('WebGL')!==-1){version=parseFloat(/^WebGL\ ([0-9])/.exec(glVersion)[1]);lineWidthAvailable=version>=1.0;}else if(glVersion.indexOf('OpenGL ES')!==-1){version=parseFloat(/^OpenGL\ ES\ ([0-9])/.exec(glVersion)[1]);lineWidthAvailable=version>=2.0;}var currentTextureSlot=null;var currentBoundTextures={};var currentScissor=new Vector4();var currentViewport=new Vector4();function createTexture(type,target,count){var data=new Uint8Array(4);// 4 is required to match default unpack alignment of 4.
var texture=gl.createTexture();gl.bindTexture(type,texture);gl.texParameteri(type,gl.TEXTURE_MIN_FILTER,gl.NEAREST);gl.texParameteri(type,gl.TEXTURE_MAG_FILTER,gl.NEAREST);for(var i=0;i<count;i++){gl.texImage2D(target+i,0,gl.RGBA,1,1,0,gl.RGBA,gl.UNSIGNED_BYTE,data);}return texture;}var emptyTextures={};emptyTextures[gl.TEXTURE_2D]=createTexture(gl.TEXTURE_2D,gl.TEXTURE_2D,1);emptyTextures[gl.TEXTURE_CUBE_MAP]=createTexture(gl.TEXTURE_CUBE_MAP,gl.TEXTURE_CUBE_MAP_POSITIVE_X,6);// init
colorBuffer.setClear(0,0,0,1);depthBuffer.setClear(1);stencilBuffer.setClear(0);enable(gl.DEPTH_TEST);depthBuffer.setFunc(LessEqualDepth);setFlipSided(false);setCullFace(CullFaceBack);enable(gl.CULL_FACE);enable(gl.BLEND);setBlending(NormalBlending);//
function initAttributes(){for(var i=0,l=newAttributes.length;i<l;i++){newAttributes[i]=0;}}function enableAttribute(attribute){newAttributes[attribute]=1;if(enabledAttributes[attribute]===0){gl.enableVertexAttribArray(attribute);enabledAttributes[attribute]=1;}if(attributeDivisors[attribute]!==0){var extension=extensions.get('ANGLE_instanced_arrays');extension.vertexAttribDivisorANGLE(attribute,0);attributeDivisors[attribute]=0;}}function enableAttributeAndDivisor(attribute,meshPerAttribute){newAttributes[attribute]=1;if(enabledAttributes[attribute]===0){gl.enableVertexAttribArray(attribute);enabledAttributes[attribute]=1;}if(attributeDivisors[attribute]!==meshPerAttribute){var extension=extensions.get('ANGLE_instanced_arrays');extension.vertexAttribDivisorANGLE(attribute,meshPerAttribute);attributeDivisors[attribute]=meshPerAttribute;}}function disableUnusedAttributes(){for(var i=0,l=enabledAttributes.length;i!==l;++i){if(enabledAttributes[i]!==newAttributes[i]){gl.disableVertexAttribArray(i);enabledAttributes[i]=0;}}}function enable(id){if(capabilities[id]!==true){gl.enable(id);capabilities[id]=true;}}function disable(id){if(capabilities[id]!==false){gl.disable(id);capabilities[id]=false;}}function getCompressedTextureFormats(){if(compressedTextureFormats===null){compressedTextureFormats=[];if(extensions.get('WEBGL_compressed_texture_pvrtc')||extensions.get('WEBGL_compressed_texture_s3tc')||extensions.get('WEBGL_compressed_texture_etc1')||extensions.get('WEBGL_compressed_texture_astc')){var formats=gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS);for(var i=0;i<formats.length;i++){compressedTextureFormats.push(formats[i]);}}}return compressedTextureFormats;}function useProgram(program){if(currentProgram!==program){gl.useProgram(program);currentProgram=program;return true;}return false;}function setBlending(blending,blendEquation,blendSrc,blendDst,blendEquationAlpha,blendSrcAlpha,blendDstAlpha,premultipliedAlpha){if(blending!==NoBlending){enable(gl.BLEND);}else{disable(gl.BLEND);}if(blending!==CustomBlending){if(blending!==currentBlending||premultipliedAlpha!==currentPremultipledAlpha){switch(blending){case AdditiveBlending:if(premultipliedAlpha){gl.blendEquationSeparate(gl.FUNC_ADD,gl.FUNC_ADD);gl.blendFuncSeparate(gl.ONE,gl.ONE,gl.ONE,gl.ONE);}else{gl.blendEquation(gl.FUNC_ADD);gl.blendFunc(gl.SRC_ALPHA,gl.ONE);}break;case SubtractiveBlending:if(premultipliedAlpha){gl.blendEquationSeparate(gl.FUNC_ADD,gl.FUNC_ADD);gl.blendFuncSeparate(gl.ZERO,gl.ZERO,gl.ONE_MINUS_SRC_COLOR,gl.ONE_MINUS_SRC_ALPHA);}else{gl.blendEquation(gl.FUNC_ADD);gl.blendFunc(gl.ZERO,gl.ONE_MINUS_SRC_COLOR);}break;case MultiplyBlending:if(premultipliedAlpha){gl.blendEquationSeparate(gl.FUNC_ADD,gl.FUNC_ADD);gl.blendFuncSeparate(gl.ZERO,gl.SRC_COLOR,gl.ZERO,gl.SRC_ALPHA);}else{gl.blendEquation(gl.FUNC_ADD);gl.blendFunc(gl.ZERO,gl.SRC_COLOR);}break;default:if(premultipliedAlpha){gl.blendEquationSeparate(gl.FUNC_ADD,gl.FUNC_ADD);gl.blendFuncSeparate(gl.ONE,gl.ONE_MINUS_SRC_ALPHA,gl.ONE,gl.ONE_MINUS_SRC_ALPHA);}else{gl.blendEquationSeparate(gl.FUNC_ADD,gl.FUNC_ADD);gl.blendFuncSeparate(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA,gl.ONE,gl.ONE_MINUS_SRC_ALPHA);}}}currentBlendEquation=null;currentBlendSrc=null;currentBlendDst=null;currentBlendEquationAlpha=null;currentBlendSrcAlpha=null;currentBlendDstAlpha=null;}else{blendEquationAlpha=blendEquationAlpha||blendEquation;blendSrcAlpha=blendSrcAlpha||blendSrc;blendDstAlpha=blendDstAlpha||blendDst;if(blendEquation!==currentBlendEquation||blendEquationAlpha!==currentBlendEquationAlpha){gl.blendEquationSeparate(utils.convert(blendEquation),utils.convert(blendEquationAlpha));currentBlendEquation=blendEquation;currentBlendEquationAlpha=blendEquationAlpha;}if(blendSrc!==currentBlendSrc||blendDst!==currentBlendDst||blendSrcAlpha!==currentBlendSrcAlpha||blendDstAlpha!==currentBlendDstAlpha){gl.blendFuncSeparate(utils.convert(blendSrc),utils.convert(blendDst),utils.convert(blendSrcAlpha),utils.convert(blendDstAlpha));currentBlendSrc=blendSrc;currentBlendDst=blendDst;currentBlendSrcAlpha=blendSrcAlpha;currentBlendDstAlpha=blendDstAlpha;}}currentBlending=blending;currentPremultipledAlpha=premultipliedAlpha;}function setMaterial(material,frontFaceCW){material.side===DoubleSide?disable(gl.CULL_FACE):enable(gl.CULL_FACE);var flipSided=material.side===BackSide;if(frontFaceCW)flipSided=!flipSided;setFlipSided(flipSided);material.transparent===true?setBlending(material.blending,material.blendEquation,material.blendSrc,material.blendDst,material.blendEquationAlpha,material.blendSrcAlpha,material.blendDstAlpha,material.premultipliedAlpha):setBlending(NoBlending);depthBuffer.setFunc(material.depthFunc);depthBuffer.setTest(material.depthTest);depthBuffer.setMask(material.depthWrite);colorBuffer.setMask(material.colorWrite);setPolygonOffset(material.polygonOffset,material.polygonOffsetFactor,material.polygonOffsetUnits);}//
function setFlipSided(flipSided){if(currentFlipSided!==flipSided){if(flipSided){gl.frontFace(gl.CW);}else{gl.frontFace(gl.CCW);}currentFlipSided=flipSided;}}function setCullFace(cullFace){if(cullFace!==CullFaceNone){enable(gl.CULL_FACE);if(cullFace!==currentCullFace){if(cullFace===CullFaceBack){gl.cullFace(gl.BACK);}else if(cullFace===CullFaceFront){gl.cullFace(gl.FRONT);}else{gl.cullFace(gl.FRONT_AND_BACK);}}}else{disable(gl.CULL_FACE);}currentCullFace=cullFace;}function setLineWidth(width){if(width!==currentLineWidth){if(lineWidthAvailable)gl.lineWidth(width);currentLineWidth=width;}}function setPolygonOffset(polygonOffset,factor,units){if(polygonOffset){enable(gl.POLYGON_OFFSET_FILL);if(currentPolygonOffsetFactor!==factor||currentPolygonOffsetUnits!==units){gl.polygonOffset(factor,units);currentPolygonOffsetFactor=factor;currentPolygonOffsetUnits=units;}}else{disable(gl.POLYGON_OFFSET_FILL);}}function setScissorTest(scissorTest){if(scissorTest){enable(gl.SCISSOR_TEST);}else{disable(gl.SCISSOR_TEST);}}// texture
function activeTexture(webglSlot){if(webglSlot===undefined)webglSlot=gl.TEXTURE0+maxTextures-1;if(currentTextureSlot!==webglSlot){gl.activeTexture(webglSlot);currentTextureSlot=webglSlot;}}function bindTexture(webglType,webglTexture){if(currentTextureSlot===null){activeTexture();}var boundTexture=currentBoundTextures[currentTextureSlot];if(boundTexture===undefined){boundTexture={type:undefined,texture:undefined};currentBoundTextures[currentTextureSlot]=boundTexture;}if(boundTexture.type!==webglType||boundTexture.texture!==webglTexture){gl.bindTexture(webglType,webglTexture||emptyTextures[webglType]);boundTexture.type=webglType;boundTexture.texture=webglTexture;}}function compressedTexImage2D(){try{gl.compressedTexImage2D.apply(gl,arguments);}catch(error){console.error('THREE.WebGLState:',error);}}function texImage2D(){try{gl.texImage2D.apply(gl,arguments);}catch(error){console.error('THREE.WebGLState:',error);}}//
function scissor(scissor){if(currentScissor.equals(scissor)===false){gl.scissor(scissor.x,scissor.y,scissor.z,scissor.w);currentScissor.copy(scissor);}}function viewport(viewport){if(currentViewport.equals(viewport)===false){gl.viewport(viewport.x,viewport.y,viewport.z,viewport.w);currentViewport.copy(viewport);}}//
function reset(){for(var i=0;i<enabledAttributes.length;i++){if(enabledAttributes[i]===1){gl.disableVertexAttribArray(i);enabledAttributes[i]=0;}}capabilities={};compressedTextureFormats=null;currentTextureSlot=null;currentBoundTextures={};currentProgram=null;currentBlending=null;currentFlipSided=null;currentCullFace=null;colorBuffer.reset();depthBuffer.reset();stencilBuffer.reset();}return {buffers:{color:colorBuffer,depth:depthBuffer,stencil:stencilBuffer},initAttributes:initAttributes,enableAttribute:enableAttribute,enableAttributeAndDivisor:enableAttributeAndDivisor,disableUnusedAttributes:disableUnusedAttributes,enable:enable,disable:disable,getCompressedTextureFormats:getCompressedTextureFormats,useProgram:useProgram,setBlending:setBlending,setMaterial:setMaterial,setFlipSided:setFlipSided,setCullFace:setCullFace,setLineWidth:setLineWidth,setPolygonOffset:setPolygonOffset,setScissorTest:setScissorTest,activeTexture:activeTexture,bindTexture:bindTexture,compressedTexImage2D:compressedTexImage2D,texImage2D:texImage2D,scissor:scissor,viewport:viewport,reset:reset};}/**
* @author mrdoob / http://mrdoob.com/
*/function WebGLTextures(_gl,extensions,state,properties,capabilities,utils,info){var _isWebGL2=typeof WebGL2RenderingContext!=='undefined'&&_gl instanceof WebGL2RenderingContext;/* global WebGL2RenderingContext */var _videoTextures={};var _canvas;//
function clampToMaxSize(image,maxSize){if(image.width>maxSize||image.height>maxSize){if('data'in image){console.warn('THREE.WebGLRenderer: image in DataTexture is too big ('+image.width+'x'+image.height+').');return;}// Warning: Scaling through the canvas will only work with images that use
// premultiplied alpha.
var scale=maxSize/Math.max(image.width,image.height);var canvas=document.createElementNS('http://www.w3.org/1999/xhtml','canvas');canvas.width=Math.floor(image.width*scale);canvas.height=Math.floor(image.height*scale);var context=canvas.getContext('2d');context.drawImage(image,0,0,image.width,image.height,0,0,canvas.width,canvas.height);console.warn('THREE.WebGLRenderer: image is too big ('+image.width+'x'+image.height+'). Resized to '+canvas.width+'x'+canvas.height,image);return canvas;}return image;}function isPowerOfTwo(image){return _Math.isPowerOfTwo(image.width)&&_Math.isPowerOfTwo(image.height);}function makePowerOfTwo(image){if(image instanceof HTMLImageElement||image instanceof HTMLCanvasElement||image instanceof ImageBitmap){if(_canvas===undefined)_canvas=document.createElementNS('http://www.w3.org/1999/xhtml','canvas');_canvas.width=_Math.floorPowerOfTwo(image.width);_canvas.height=_Math.floorPowerOfTwo(image.height);var context=_canvas.getContext('2d');context.drawImage(image,0,0,_canvas.width,_canvas.height);console.warn('THREE.WebGLRenderer: image is not power of two ('+image.width+'x'+image.height+'). Resized to '+_canvas.width+'x'+_canvas.height,image);return _canvas;}return image;}function textureNeedsPowerOfTwo(texture){return texture.wrapS!==ClampToEdgeWrapping||texture.wrapT!==ClampToEdgeWrapping||texture.minFilter!==NearestFilter&&texture.minFilter!==LinearFilter;}function textureNeedsGenerateMipmaps(texture,isPowerOfTwo){return texture.generateMipmaps&&isPowerOfTwo&&texture.minFilter!==NearestFilter&&texture.minFilter!==LinearFilter;}function generateMipmap(target,texture,width,height){_gl.generateMipmap(target);var textureProperties=properties.get(texture);// Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11
textureProperties.__maxMipLevel=Math.log(Math.max(width,height))*Math.LOG2E;}// Fallback filters for non-power-of-2 textures
function filterFallback(f){if(f===NearestFilter||f===NearestMipMapNearestFilter||f===NearestMipMapLinearFilter){return _gl.NEAREST;}return _gl.LINEAR;}//
function onTextureDispose(event){var texture=event.target;texture.removeEventListener('dispose',onTextureDispose);deallocateTexture(texture);if(texture.isVideoTexture){delete _videoTextures[texture.id];}info.memory.textures--;}function onRenderTargetDispose(event){var renderTarget=event.target;renderTarget.removeEventListener('dispose',onRenderTargetDispose);deallocateRenderTarget(renderTarget);info.memory.textures--;}//
function deallocateTexture(texture){var textureProperties=properties.get(texture);if(texture.image&&textureProperties.__image__webglTextureCube){// cube texture
_gl.deleteTexture(textureProperties.__image__webglTextureCube);}else{// 2D texture
if(textureProperties.__webglInit===undefined)return;_gl.deleteTexture(textureProperties.__webglTexture);}// remove all webgl properties
properties.remove(texture);}function deallocateRenderTarget(renderTarget){var renderTargetProperties=properties.get(renderTarget);var textureProperties=properties.get(renderTarget.texture);if(!renderTarget)return;if(textureProperties.__webglTexture!==undefined){_gl.deleteTexture(textureProperties.__webglTexture);}if(renderTarget.depthTexture){renderTarget.depthTexture.dispose();}if(renderTarget.isWebGLRenderTargetCube){for(var i=0;i<6;i++){_gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[i]);if(renderTargetProperties.__webglDepthbuffer)_gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer[i]);}}else{_gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer);if(renderTargetProperties.__webglDepthbuffer)_gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer);}properties.remove(renderTarget.texture);properties.remove(renderTarget);}//
function setTexture2D(texture,slot){var textureProperties=properties.get(texture);if(texture.isVideoTexture)updateVideoTexture(texture);if(texture.version>0&&textureProperties.__version!==texture.version){var image=texture.image;if(image===undefined){console.warn('THREE.WebGLRenderer: Texture marked for update but image is undefined',texture);}else if(image.complete===false){console.warn('THREE.WebGLRenderer: Texture marked for update but image is incomplete',texture);}else{uploadTexture(textureProperties,texture,slot);return;}}state.activeTexture(_gl.TEXTURE0+slot);state.bindTexture(_gl.TEXTURE_2D,textureProperties.__webglTexture);}function setTextureCube(texture,slot){var textureProperties=properties.get(texture);if(texture.image.length===6){if(texture.version>0&&textureProperties.__version!==texture.version){if(!textureProperties.__image__webglTextureCube){texture.addEventListener('dispose',onTextureDispose);textureProperties.__image__webglTextureCube=_gl.createTexture();info.memory.textures++;}state.activeTexture(_gl.TEXTURE0+slot);state.bindTexture(_gl.TEXTURE_CUBE_MAP,textureProperties.__image__webglTextureCube);_gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL,texture.flipY);var isCompressed=texture&&texture.isCompressedTexture;var isDataTexture=texture.image[0]&&texture.image[0].isDataTexture;var cubeImage=[];for(var i=0;i<6;i++){if(!isCompressed&&!isDataTexture){cubeImage[i]=clampToMaxSize(texture.image[i],capabilities.maxCubemapSize);}else{cubeImage[i]=isDataTexture?texture.image[i].image:texture.image[i];}}var image=cubeImage[0],isPowerOfTwoImage=isPowerOfTwo(image),glFormat=utils.convert(texture.format),glType=utils.convert(texture.type);setTextureParameters(_gl.TEXTURE_CUBE_MAP,texture,isPowerOfTwoImage);for(var i=0;i<6;i++){if(!isCompressed){if(isDataTexture){state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,0,glFormat,cubeImage[i].width,cubeImage[i].height,0,glFormat,glType,cubeImage[i].data);}else{state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,0,glFormat,glFormat,glType,cubeImage[i]);}}else{var mipmap,mipmaps=cubeImage[i].mipmaps;for(var j=0,jl=mipmaps.length;j<jl;j++){mipmap=mipmaps[j];if(texture.format!==RGBAFormat&&texture.format!==RGBFormat){if(state.getCompressedTextureFormats().indexOf(glFormat)>-1){state.compressedTexImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,j,glFormat,mipmap.width,mipmap.height,0,mipmap.data);}else{console.warn('THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()');}}else{state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,j,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data);}}}}if(!isCompressed){textureProperties.__maxMipLevel=0;}else{textureProperties.__maxMipLevel=mipmaps.length-1;}if(textureNeedsGenerateMipmaps(texture,isPowerOfTwoImage)){// We assume images for cube map have the same size.
generateMipmap(_gl.TEXTURE_CUBE_MAP,texture,image.width,image.height);}textureProperties.__version=texture.version;if(texture.onUpdate)texture.onUpdate(texture);}else{state.activeTexture(_gl.TEXTURE0+slot);state.bindTexture(_gl.TEXTURE_CUBE_MAP,textureProperties.__image__webglTextureCube);}}}function setTextureCubeDynamic(texture,slot){state.activeTexture(_gl.TEXTURE0+slot);state.bindTexture(_gl.TEXTURE_CUBE_MAP,properties.get(texture).__webglTexture);}function setTextureParameters(textureType,texture,isPowerOfTwoImage){var extension;if(isPowerOfTwoImage){_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_S,utils.convert(texture.wrapS));_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_T,utils.convert(texture.wrapT));_gl.texParameteri(textureType,_gl.TEXTURE_MAG_FILTER,utils.convert(texture.magFilter));_gl.texParameteri(textureType,_gl.TEXTURE_MIN_FILTER,utils.convert(texture.minFilter));}else{_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_S,_gl.CLAMP_TO_EDGE);_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_T,_gl.CLAMP_TO_EDGE);if(texture.wrapS!==ClampToEdgeWrapping||texture.wrapT!==ClampToEdgeWrapping){console.warn('THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.',texture);}_gl.texParameteri(textureType,_gl.TEXTURE_MAG_FILTER,filterFallback(texture.magFilter));_gl.texParameteri(textureType,_gl.TEXTURE_MIN_FILTER,filterFallback(texture.minFilter));if(texture.minFilter!==NearestFilter&&texture.minFilter!==LinearFilter){console.warn('THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.',texture);}}extension=extensions.get('EXT_texture_filter_anisotropic');if(extension){if(texture.type===FloatType&&extensions.get('OES_texture_float_linear')===null)return;if(texture.type===HalfFloatType&&extensions.get('OES_texture_half_float_linear')===null)return;if(texture.anisotropy>1||properties.get(texture).__currentAnisotropy){_gl.texParameterf(textureType,extension.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(texture.anisotropy,capabilities.getMaxAnisotropy()));properties.get(texture).__currentAnisotropy=texture.anisotropy;}}}function uploadTexture(textureProperties,texture,slot){if(textureProperties.__webglInit===undefined){textureProperties.__webglInit=true;texture.addEventListener('dispose',onTextureDispose);textureProperties.__webglTexture=_gl.createTexture();info.memory.textures++;}state.activeTexture(_gl.TEXTURE0+slot);state.bindTexture(_gl.TEXTURE_2D,textureProperties.__webglTexture);_gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL,texture.flipY);_gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL,texture.premultiplyAlpha);_gl.pixelStorei(_gl.UNPACK_ALIGNMENT,texture.unpackAlignment);var image=clampToMaxSize(texture.image,capabilities.maxTextureSize);if(textureNeedsPowerOfTwo(texture)&&isPowerOfTwo(image)===false){image=makePowerOfTwo(image);}var isPowerOfTwoImage=isPowerOfTwo(image),glFormat=utils.convert(texture.format),glType=utils.convert(texture.type);setTextureParameters(_gl.TEXTURE_2D,texture,isPowerOfTwoImage);var mipmap,mipmaps=texture.mipmaps;if(texture.isDepthTexture){// populate depth texture with dummy data
var internalFormat=_gl.DEPTH_COMPONENT;if(texture.type===FloatType){if(!_isWebGL2)throw new Error('Float Depth Texture only supported in WebGL2.0');internalFormat=_gl.DEPTH_COMPONENT32F;}else if(_isWebGL2){// WebGL 2.0 requires signed internalformat for glTexImage2D
internalFormat=_gl.DEPTH_COMPONENT16;}if(texture.format===DepthFormat&&internalFormat===_gl.DEPTH_COMPONENT){// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are
// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT
// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
if(texture.type!==UnsignedShortType&&texture.type!==UnsignedIntType){console.warn('THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.');texture.type=UnsignedShortType;glType=utils.convert(texture.type);}}// Depth stencil textures need the DEPTH_STENCIL internal format
// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
if(texture.format===DepthStencilFormat){internalFormat=_gl.DEPTH_STENCIL;// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are
// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.
// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)
if(texture.type!==UnsignedInt248Type){console.warn('THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.');texture.type=UnsignedInt248Type;glType=utils.convert(texture.type);}}state.texImage2D(_gl.TEXTURE_2D,0,internalFormat,image.width,image.height,0,glFormat,glType,null);}else if(texture.isDataTexture){// use manually created mipmaps if available
// if there are no manual mipmaps
// set 0 level mipmap and then use GL to generate other mipmap levels
if(mipmaps.length>0&&isPowerOfTwoImage){for(var i=0,il=mipmaps.length;i<il;i++){mipmap=mipmaps[i];state.texImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data);}texture.generateMipmaps=false;textureProperties.__maxMipLevel=mipmaps.length-1;}else{state.texImage2D(_gl.TEXTURE_2D,0,glFormat,image.width,image.height,0,glFormat,glType,image.data);textureProperties.__maxMipLevel=0;}}else if(texture.isCompressedTexture){for(var i=0,il=mipmaps.length;i<il;i++){mipmap=mipmaps[i];if(texture.format!==RGBAFormat&&texture.format!==RGBFormat){if(state.getCompressedTextureFormats().indexOf(glFormat)>-1){state.compressedTexImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,mipmap.data);}else{console.warn('THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()');}}else{state.texImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data);}}textureProperties.__maxMipLevel=mipmaps.length-1;}else{// regular Texture (image, video, canvas)
// use manually created mipmaps if available
// if there are no manual mipmaps
// set 0 level mipmap and then use GL to generate other mipmap levels
if(mipmaps.length>0&&isPowerOfTwoImage){for(var i=0,il=mipmaps.length;i<il;i++){mipmap=mipmaps[i];state.texImage2D(_gl.TEXTURE_2D,i,glFormat,glFormat,glType,mipmap);}texture.generateMipmaps=false;textureProperties.__maxMipLevel=mipmaps.length-1;}else{state.texImage2D(_gl.TEXTURE_2D,0,glFormat,glFormat,glType,image);textureProperties.__maxMipLevel=0;}}if(textureNeedsGenerateMipmaps(texture,isPowerOfTwoImage)){generateMipmap(_gl.TEXTURE_2D,texture,image.width,image.height);}textureProperties.__version=texture.version;if(texture.onUpdate)texture.onUpdate(texture);}// Render targets
// Setup storage for target texture and bind it to correct framebuffer
function setupFrameBufferTexture(framebuffer,renderTarget,attachment,textureTarget){var glFormat=utils.convert(renderTarget.texture.format);var glType=utils.convert(renderTarget.texture.type);state.texImage2D(textureTarget,0,glFormat,renderTarget.width,renderTarget.height,0,glFormat,glType,null);_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer);_gl.framebufferTexture2D(_gl.FRAMEBUFFER,attachment,textureTarget,properties.get(renderTarget.texture).__webglTexture,0);_gl.bindFramebuffer(_gl.FRAMEBUFFER,null);}// Setup storage for internal depth/stencil buffers and bind to correct framebuffer
function setupRenderBufferStorage(renderbuffer,renderTarget){_gl.bindRenderbuffer(_gl.RENDERBUFFER,renderbuffer);if(renderTarget.depthBuffer&&!renderTarget.stencilBuffer){_gl.renderbufferStorage(_gl.RENDERBUFFER,_gl.DEPTH_COMPONENT16,renderTarget.width,renderTarget.height);_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER,_gl.DEPTH_ATTACHMENT,_gl.RENDERBUFFER,renderbuffer);}else if(renderTarget.depthBuffer&&renderTarget.stencilBuffer){_gl.renderbufferStorage(_gl.RENDERBUFFER,_gl.DEPTH_STENCIL,renderTarget.width,renderTarget.height);_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER,_gl.DEPTH_STENCIL_ATTACHMENT,_gl.RENDERBUFFER,renderbuffer);}else{// FIXME: We don't support !depth !stencil
_gl.renderbufferStorage(_gl.RENDERBUFFER,_gl.RGBA4,renderTarget.width,renderTarget.height);}_gl.bindRenderbuffer(_gl.RENDERBUFFER,null);}// Setup resources for a Depth Texture for a FBO (needs an extension)
function setupDepthTexture(framebuffer,renderTarget){var isCube=renderTarget&&renderTarget.isWebGLRenderTargetCube;if(isCube)throw new Error('Depth Texture with cube render targets is not supported');_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer);if(!(renderTarget.depthTexture&&renderTarget.depthTexture.isDepthTexture)){throw new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');}// upload an empty depth texture with framebuffer size
if(!properties.get(renderTarget.depthTexture).__webglTexture||renderTarget.depthTexture.image.width!==renderTarget.width||renderTarget.depthTexture.image.height!==renderTarget.height){renderTarget.depthTexture.image.width=renderTarget.width;renderTarget.depthTexture.image.height=renderTarget.height;renderTarget.depthTexture.needsUpdate=true;}setTexture2D(renderTarget.depthTexture,0);var webglDepthTexture=properties.get(renderTarget.depthTexture).__webglTexture;if(renderTarget.depthTexture.format===DepthFormat){_gl.framebufferTexture2D(_gl.FRAMEBUFFER,_gl.DEPTH_ATTACHMENT,_gl.TEXTURE_2D,webglDepthTexture,0);}else if(renderTarget.depthTexture.format===DepthStencilFormat){_gl.framebufferTexture2D(_gl.FRAMEBUFFER,_gl.DEPTH_STENCIL_ATTACHMENT,_gl.TEXTURE_2D,webglDepthTexture,0);}else{throw new Error('Unknown depthTexture format');}}// Setup GL resources for a non-texture depth buffer
function setupDepthRenderbuffer(renderTarget){var renderTargetProperties=properties.get(renderTarget);var isCube=renderTarget.isWebGLRenderTargetCube===true;if(renderTarget.depthTexture){if(isCube)throw new Error('target.depthTexture not supported in Cube render targets');setupDepthTexture(renderTargetProperties.__webglFramebuffer,renderTarget);}else{if(isCube){renderTargetProperties.__webglDepthbuffer=[];for(var i=0;i<6;i++){_gl.bindFramebuffer(_gl.FRAMEBUFFER,renderTargetProperties.__webglFramebuffer[i]);renderTargetProperties.__webglDepthbuffer[i]=_gl.createRenderbuffer();setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer[i],renderTarget);}}else{_gl.bindFramebuffer(_gl.FRAMEBUFFER,renderTargetProperties.__webglFramebuffer);renderTargetProperties.__webglDepthbuffer=_gl.createRenderbuffer();setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer,renderTarget);}}_gl.bindFramebuffer(_gl.FRAMEBUFFER,null);}// Set up GL resources for the render target
function setupRenderTarget(renderTarget){var renderTargetProperties=properties.get(renderTarget);var textureProperties=properties.get(renderTarget.texture);renderTarget.addEventListener('dispose',onRenderTargetDispose);textureProperties.__webglTexture=_gl.createTexture();info.memory.textures++;var isCube=renderTarget.isWebGLRenderTargetCube===true;var isTargetPowerOfTwo=isPowerOfTwo(renderTarget);// Setup framebuffer
if(isCube){renderTargetProperties.__webglFramebuffer=[];for(var i=0;i<6;i++){renderTargetProperties.__webglFramebuffer[i]=_gl.createFramebuffer();}}else{renderTargetProperties.__webglFramebuffer=_gl.createFramebuffer();}// Setup color buffer
if(isCube){state.bindTexture(_gl.TEXTURE_CUBE_MAP,textureProperties.__webglTexture);setTextureParameters(_gl.TEXTURE_CUBE_MAP,renderTarget.texture,isTargetPowerOfTwo);for(var i=0;i<6;i++){setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer[i],renderTarget,_gl.COLOR_ATTACHMENT0,_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i);}if(textureNeedsGenerateMipmaps(renderTarget.texture,isTargetPowerOfTwo)){generateMipmap(_gl.TEXTURE_CUBE_MAP,renderTarget.texture,renderTarget.width,renderTarget.height);}state.bindTexture(_gl.TEXTURE_CUBE_MAP,null);}else{state.bindTexture(_gl.TEXTURE_2D,textureProperties.__webglTexture);setTextureParameters(_gl.TEXTURE_2D,renderTarget.texture,isTargetPowerOfTwo);setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer,renderTarget,_gl.COLOR_ATTACHMENT0,_gl.TEXTURE_2D);if(textureNeedsGenerateMipmaps(renderTarget.texture,isTargetPowerOfTwo)){generateMipmap(_gl.TEXTURE_2D,renderTarget.texture,renderTarget.width,renderTarget.height);}state.bindTexture(_gl.TEXTURE_2D,null);}// Setup depth and stencil buffers
if(renderTarget.depthBuffer){setupDepthRenderbuffer(renderTarget);}}function updateRenderTargetMipmap(renderTarget){var texture=renderTarget.texture;var isTargetPowerOfTwo=isPowerOfTwo(renderTarget);if(textureNeedsGenerateMipmaps(texture,isTargetPowerOfTwo)){var target=renderTarget.isWebGLRenderTargetCube?_gl.TEXTURE_CUBE_MAP:_gl.TEXTURE_2D;var webglTexture=properties.get(texture).__webglTexture;state.bindTexture(target,webglTexture);generateMipmap(target,texture,renderTarget.width,renderTarget.height);state.bindTexture(target,null);}}function updateVideoTexture(texture){var id=texture.id;var frame=info.render.frame;// Check the last frame we updated the VideoTexture
if(_videoTextures[id]!==frame){_videoTextures[id]=frame;texture.update();}}this.setTexture2D=setTexture2D;this.setTextureCube=setTextureCube;this.setTextureCubeDynamic=setTextureCubeDynamic;this.setupRenderTarget=setupRenderTarget;this.updateRenderTargetMipmap=updateRenderTargetMipmap;}/**
* @author thespite / http://www.twitter.com/thespite
*/function WebGLUtils(gl,extensions){function convert(p){var extension;if(p===RepeatWrapping)return gl.REPEAT;if(p===ClampToEdgeWrapping)return gl.CLAMP_TO_EDGE;if(p===MirroredRepeatWrapping)return gl.MIRRORED_REPEAT;if(p===NearestFilter)return gl.NEAREST;if(p===NearestMipMapNearestFilter)return gl.NEAREST_MIPMAP_NEAREST;if(p===NearestMipMapLinearFilter)return gl.NEAREST_MIPMAP_LINEAR;if(p===LinearFilter)return gl.LINEAR;if(p===LinearMipMapNearestFilter)return gl.LINEAR_MIPMAP_NEAREST;if(p===LinearMipMapLinearFilter)return gl.LINEAR_MIPMAP_LINEAR;if(p===UnsignedByteType)return gl.UNSIGNED_BYTE;if(p===UnsignedShort4444Type)return gl.UNSIGNED_SHORT_4_4_4_4;if(p===UnsignedShort5551Type)return gl.UNSIGNED_SHORT_5_5_5_1;if(p===UnsignedShort565Type)return gl.UNSIGNED_SHORT_5_6_5;if(p===ByteType)return gl.BYTE;if(p===ShortType)return gl.SHORT;if(p===UnsignedShortType)return gl.UNSIGNED_SHORT;if(p===IntType)return gl.INT;if(p===UnsignedIntType)return gl.UNSIGNED_INT;if(p===FloatType)return gl.FLOAT;if(p===HalfFloatType){extension=extensions.get('OES_texture_half_float');if(extension!==null)return extension.HALF_FLOAT_OES;}if(p===AlphaFormat)return gl.ALPHA;if(p===RGBFormat)return gl.RGB;if(p===RGBAFormat)return gl.RGBA;if(p===LuminanceFormat)return gl.LUMINANCE;if(p===LuminanceAlphaFormat)return gl.LUMINANCE_ALPHA;if(p===DepthFormat)return gl.DEPTH_COMPONENT;if(p===DepthStencilFormat)return gl.DEPTH_STENCIL;if(p===AddEquation)return gl.FUNC_ADD;if(p===SubtractEquation)return gl.FUNC_SUBTRACT;if(p===ReverseSubtractEquation)return gl.FUNC_REVERSE_SUBTRACT;if(p===ZeroFactor)return gl.ZERO;if(p===OneFactor)return gl.ONE;if(p===SrcColorFactor)return gl.SRC_COLOR;if(p===OneMinusSrcColorFactor)return gl.ONE_MINUS_SRC_COLOR;if(p===SrcAlphaFactor)return gl.SRC_ALPHA;if(p===OneMinusSrcAlphaFactor)return gl.ONE_MINUS_SRC_ALPHA;if(p===DstAlphaFactor)return gl.DST_ALPHA;if(p===OneMinusDstAlphaFactor)return gl.ONE_MINUS_DST_ALPHA;if(p===DstColorFactor)return gl.DST_COLOR;if(p===OneMinusDstColorFactor)return gl.ONE_MINUS_DST_COLOR;if(p===SrcAlphaSaturateFactor)return gl.SRC_ALPHA_SATURATE;if(p===RGB_S3TC_DXT1_Format||p===RGBA_S3TC_DXT1_Format||p===RGBA_S3TC_DXT3_Format||p===RGBA_S3TC_DXT5_Format){extension=extensions.get('WEBGL_compressed_texture_s3tc');if(extension!==null){if(p===RGB_S3TC_DXT1_Format)return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;if(p===RGBA_S3TC_DXT1_Format)return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(p===RGBA_S3TC_DXT3_Format)return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(p===RGBA_S3TC_DXT5_Format)return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;}}if(p===RGB_PVRTC_4BPPV1_Format||p===RGB_PVRTC_2BPPV1_Format||p===RGBA_PVRTC_4BPPV1_Format||p===RGBA_PVRTC_2BPPV1_Format){extension=extensions.get('WEBGL_compressed_texture_pvrtc');if(extension!==null){if(p===RGB_PVRTC_4BPPV1_Format)return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(p===RGB_PVRTC_2BPPV1_Format)return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(p===RGBA_PVRTC_4BPPV1_Format)return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(p===RGBA_PVRTC_2BPPV1_Format)return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;}}if(p===RGB_ETC1_Format){extension=extensions.get('WEBGL_compressed_texture_etc1');if(extension!==null)return extension.COMPRESSED_RGB_ETC1_WEBGL;}if(p===RGBA_ASTC_4x4_Format||p===RGBA_ASTC_5x4_Format||p===RGBA_ASTC_5x5_Format||p===RGBA_ASTC_6x5_Format||p===RGBA_ASTC_6x6_Format||p===RGBA_ASTC_8x5_Format||p===RGBA_ASTC_8x6_Format||p===RGBA_ASTC_8x8_Format||p===RGBA_ASTC_10x5_Format||p===RGBA_ASTC_10x6_Format||p===RGBA_ASTC_10x8_Format||p===RGBA_ASTC_10x10_Format||p===RGBA_ASTC_12x10_Format||p===RGBA_ASTC_12x12_Format){extension=extensions.get('WEBGL_compressed_texture_astc');if(extension!==null){return p;}}if(p===MinEquation||p===MaxEquation){extension=extensions.get('EXT_blend_minmax');if(extension!==null){if(p===MinEquation)return extension.MIN_EXT;if(p===MaxEquation)return extension.MAX_EXT;}}if(p===UnsignedInt248Type){extension=extensions.get('WEBGL_depth_texture');if(extension!==null)return extension.UNSIGNED_INT_24_8_WEBGL;}return 0;}return {convert:convert};}/**
* @author mrdoob / http://mrdoob.com/
* @author greggman / http://games.greggman.com/
* @author zz85 / http://www.lab4games.net/zz85/blog
* @author tschw
*/function PerspectiveCamera(fov,aspect,near,far){Camera.call(this);this.type='PerspectiveCamera';this.fov=fov!==undefined?fov:50;this.zoom=1;this.near=near!==undefined?near:0.1;this.far=far!==undefined?far:2000;this.focus=10;this.aspect=aspect!==undefined?aspect:1;this.view=null;this.filmGauge=35;// width of the film (default in millimeters)
this.filmOffset=0;// horizontal film offset (same unit as gauge)
this.updateProjectionMatrix();}PerspectiveCamera.prototype=Object.assign(Object.create(Camera.prototype),{constructor:PerspectiveCamera,isPerspectiveCamera:true,copy:function(source,recursive){Camera.prototype.copy.call(this,source,recursive);this.fov=source.fov;this.zoom=source.zoom;this.near=source.near;this.far=source.far;this.focus=source.focus;this.aspect=source.aspect;this.view=source.view===null?null:Object.assign({},source.view);this.filmGauge=source.filmGauge;this.filmOffset=source.filmOffset;return this;},/**
* Sets the FOV by focal length in respect to the current .filmGauge.
*
* The default film gauge is 35, so that the focal length can be specified for
* a 35mm (full frame) camera.
*
* Values for focal length and film gauge must have the same unit.
*/setFocalLength:function(focalLength){// see http://www.bobatkins.com/photography/technical/field_of_view.html
var vExtentSlope=0.5*this.getFilmHeight()/focalLength;this.fov=_Math.RAD2DEG*2*Math.atan(vExtentSlope);this.updateProjectionMatrix();},/**
* Calculates the focal length from the current .fov and .filmGauge.
*/getFocalLength:function(){var vExtentSlope=Math.tan(_Math.DEG2RAD*0.5*this.fov);return 0.5*this.getFilmHeight()/vExtentSlope;},getEffectiveFOV:function(){return _Math.RAD2DEG*2*Math.atan(Math.tan(_Math.DEG2RAD*0.5*this.fov)/this.zoom);},getFilmWidth:function(){// film not completely covered in portrait format (aspect < 1)
return this.filmGauge*Math.min(this.aspect,1);},getFilmHeight:function(){// film not completely covered in landscape format (aspect > 1)
return this.filmGauge/Math.max(this.aspect,1);},/**
* Sets an offset in a larger frustum. This is useful for multi-window or
* multi-monitor/multi-machine setups.
*
* For example, if you have 3x2 monitors and each monitor is 1920x1080 and
* the monitors are in grid like this
*
* +---+---+---+
* | A | B | C |
* +---+---+---+
* | D | E | F |
* +---+---+---+
*
* then for each monitor you would call it like this
*
* var w = 1920;
* var h = 1080;
* var fullWidth = w * 3;
* var fullHeight = h * 2;
*
* --A--
* camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );
* --B--
* camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );
* --C--
* camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );
* --D--
* camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );
* --E--
* camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );
* --F--
* camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );
*
* Note there is no reason monitors have to be the same size or in a grid.
*/setViewOffset:function(fullWidth,fullHeight,x,y,width,height){this.aspect=fullWidth/fullHeight;if(this.view===null){this.view={enabled:true,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1};}this.view.enabled=true;this.view.fullWidth=fullWidth;this.view.fullHeight=fullHeight;this.view.offsetX=x;this.view.offsetY=y;this.view.width=width;this.view.height=height;this.updateProjectionMatrix();},clearViewOffset:function(){if(this.view!==null){this.view.enabled=false;}this.updateProjectionMatrix();},updateProjectionMatrix:function(){var near=this.near,top=near*Math.tan(_Math.DEG2RAD*0.5*this.fov)/this.zoom,height=2*top,width=this.aspect*height,left=-0.5*width,view=this.view;if(this.view!==null&&this.view.enabled){var fullWidth=view.fullWidth,fullHeight=view.fullHeight;left+=view.offsetX*width/fullWidth;top-=view.offsetY*height/fullHeight;width*=view.width/fullWidth;height*=view.height/fullHeight;}var skew=this.filmOffset;if(skew!==0)left+=near*skew/this.getFilmWidth();this.projectionMatrix.makePerspective(left,left+width,top,top-height,near,this.far);},toJSON:function(meta){var data=Object3D.prototype.toJSON.call(this,meta);data.object.fov=this.fov;data.object.zoom=this.zoom;data.object.near=this.near;data.object.far=this.far;data.object.focus=this.focus;data.object.aspect=this.aspect;if(this.view!==null)data.object.view=Object.assign({},this.view);data.object.filmGauge=this.filmGauge;data.object.filmOffset=this.filmOffset;return data;}});/**
* @author mrdoob / http://mrdoob.com/
*/function ArrayCamera(array){PerspectiveCamera.call(this);this.cameras=array||[];}ArrayCamera.prototype=Object.assign(Object.create(PerspectiveCamera.prototype),{constructor:ArrayCamera,isArrayCamera:true});/**
* @author mrdoob / http://mrdoob.com/
*/function WebVRManager(renderer){var scope=this;var device=null;var frameData=null;var poseTarget=null;var standingMatrix=new Matrix4();var standingMatrixInverse=new Matrix4();if(typeof window!=='undefined'&&'VRFrameData'in window){frameData=new window.VRFrameData();window.addEventListener('vrdisplaypresentchange',onVRDisplayPresentChange,false);}var matrixWorldInverse=new Matrix4();var tempQuaternion=new Quaternion();var tempPosition=new Vector3();var cameraL=new PerspectiveCamera();cameraL.bounds=new Vector4(0.0,0.0,0.5,1.0);cameraL.layers.enable(1);var cameraR=new PerspectiveCamera();cameraR.bounds=new Vector4(0.5,0.0,0.5,1.0);cameraR.layers.enable(2);var cameraVR=new ArrayCamera([cameraL,cameraR]);cameraVR.layers.enable(1);cameraVR.layers.enable(2);//
function isPresenting(){return device!==null&&device.isPresenting===true;}var currentSize,currentPixelRatio;function onVRDisplayPresentChange(){if(isPresenting()){var eyeParameters=device.getEyeParameters('left');var renderWidth=eyeParameters.renderWidth;var renderHeight=eyeParameters.renderHeight;currentPixelRatio=renderer.getPixelRatio();currentSize=renderer.getSize();renderer.setDrawingBufferSize(renderWidth*2,renderHeight,1);}else if(scope.enabled){renderer.setDrawingBufferSize(currentSize.width,currentSize.height,currentPixelRatio);}}//
this.enabled=false;this.userHeight=1.6;this.getDevice=function(){return device;};this.setDevice=function(value){if(value!==undefined)device=value;};this.setPoseTarget=function(object){if(object!==undefined)poseTarget=object;};this.getCamera=function(camera){if(device===null)return camera;device.depthNear=camera.near;device.depthFar=camera.far;device.getFrameData(frameData);//
var stageParameters=device.stageParameters;if(stageParameters){standingMatrix.fromArray(stageParameters.sittingToStandingTransform);}else{standingMatrix.makeTranslation(0,scope.userHeight,0);}var pose=frameData.pose;var poseObject=poseTarget!==null?poseTarget:camera;// We want to manipulate poseObject by its position and quaternion components since users may rely on them.
poseObject.matrix.copy(standingMatrix);poseObject.matrix.decompose(poseObject.position,poseObject.quaternion,poseObject.scale);if(pose.orientation!==null){tempQuaternion.fromArray(pose.orientation);poseObject.quaternion.multiply(tempQuaternion);}if(pose.position!==null){tempQuaternion.setFromRotationMatrix(standingMatrix);tempPosition.fromArray(pose.position);tempPosition.applyQuaternion(tempQuaternion);poseObject.position.add(tempPosition);}poseObject.updateMatrixWorld();if(device.isPresenting===false)return camera;//
cameraL.near=camera.near;cameraR.near=camera.near;cameraL.far=camera.far;cameraR.far=camera.far;cameraVR.matrixWorld.copy(camera.matrixWorld);cameraVR.matrixWorldInverse.copy(camera.matrixWorldInverse);cameraL.matrixWorldInverse.fromArray(frameData.leftViewMatrix);cameraR.matrixWorldInverse.fromArray(frameData.rightViewMatrix);// TODO (mrdoob) Double check this code
standingMatrixInverse.getInverse(standingMatrix);cameraL.matrixWorldInverse.multiply(standingMatrixInverse);cameraR.matrixWorldInverse.multiply(standingMatrixInverse);var parent=poseObject.parent;if(parent!==null){matrixWorldInverse.getInverse(parent.matrixWorld);cameraL.matrixWorldInverse.multiply(matrixWorldInverse);cameraR.matrixWorldInverse.multiply(matrixWorldInverse);}// envMap and Mirror needs camera.matrixWorld
cameraL.matrixWorld.getInverse(cameraL.matrixWorldInverse);cameraR.matrixWorld.getInverse(cameraR.matrixWorldInverse);cameraL.projectionMatrix.fromArray(frameData.leftProjectionMatrix);cameraR.projectionMatrix.fromArray(frameData.rightProjectionMatrix);// HACK (mrdoob)
// https://github.com/w3c/webvr/issues/203
cameraVR.projectionMatrix.copy(cameraL.projectionMatrix);//
var layers=device.getLayers();if(layers.length){var layer=layers[0];if(layer.leftBounds!==null&&layer.leftBounds.length===4){cameraL.bounds.fromArray(layer.leftBounds);}if(layer.rightBounds!==null&&layer.rightBounds.length===4){cameraR.bounds.fromArray(layer.rightBounds);}}return cameraVR;};this.getStandingMatrix=function(){return standingMatrix;};this.submitFrame=function(){if(isPresenting())device.submitFrame();};this.dispose=function(){if(typeof window!=='undefined'){window.removeEventListener('vrdisplaypresentchange',onVRDisplayPresentChange);}};}/**
* @author supereggbert / http://www.paulbrunt.co.uk/
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
* @author szimek / https://github.com/szimek/
* @author tschw
*/function WebGLRenderer(parameters){console.log('THREE.WebGLRenderer',REVISION);parameters=parameters||{};var _canvas=parameters.canvas!==undefined?parameters.canvas:document.createElementNS('http://www.w3.org/1999/xhtml','canvas'),_context=parameters.context!==undefined?parameters.context:null,_alpha=parameters.alpha!==undefined?parameters.alpha:false,_depth=parameters.depth!==undefined?parameters.depth:true,_stencil=parameters.stencil!==undefined?parameters.stencil:true,_antialias=parameters.antialias!==undefined?parameters.antialias:false,_premultipliedAlpha=parameters.premultipliedAlpha!==undefined?parameters.premultipliedAlpha:true,_preserveDrawingBuffer=parameters.preserveDrawingBuffer!==undefined?parameters.preserveDrawingBuffer:false,_powerPreference=parameters.powerPreference!==undefined?parameters.powerPreference:'default';var currentRenderList=null;var currentRenderState=null;// public properties
this.domElement=_canvas;this.context=null;// clearing
this.autoClear=true;this.autoClearColor=true;this.autoClearDepth=true;this.autoClearStencil=true;// scene graph
this.sortObjects=true;// user-defined clipping
this.clippingPlanes=[];this.localClippingEnabled=false;// physically based shading
this.gammaFactor=2.0;// for backwards compatibility
this.gammaInput=false;this.gammaOutput=false;// physical lights
this.physicallyCorrectLights=false;// tone mapping
this.toneMapping=LinearToneMapping;this.toneMappingExposure=1.0;this.toneMappingWhitePoint=1.0;// morphs
this.maxMorphTargets=8;this.maxMorphNormals=4;// internal properties
var _this=this,_isContextLost=false,// internal state cache
_currentRenderTarget=null,_currentFramebuffer=null,_currentMaterialId=-1,_currentGeometryProgram='',_currentCamera=null,_currentArrayCamera=null,_currentViewport=new Vector4(),_currentScissor=new Vector4(),_currentScissorTest=null,//
_usedTextureUnits=0,//
_width=_canvas.width,_height=_canvas.height,_pixelRatio=1,_viewport=new Vector4(0,0,_width,_height),_scissor=new Vector4(0,0,_width,_height),_scissorTest=false,// frustum
_frustum=new Frustum(),// clipping
_clipping=new WebGLClipping(),_clippingEnabled=false,_localClippingEnabled=false,// camera matrices cache
_projScreenMatrix=new Matrix4(),_vector3=new Vector3();function getTargetPixelRatio(){return _currentRenderTarget===null?_pixelRatio:1;}// initialize
var _gl;try{var contextAttributes={alpha:_alpha,depth:_depth,stencil:_stencil,antialias:_antialias,premultipliedAlpha:_premultipliedAlpha,preserveDrawingBuffer:_preserveDrawingBuffer,powerPreference:_powerPreference};// event listeners must be registered before WebGL context is created, see #12753
_canvas.addEventListener('webglcontextlost',onContextLost,false);_canvas.addEventListener('webglcontextrestored',onContextRestore,false);_gl=_context||_canvas.getContext('webgl',contextAttributes)||_canvas.getContext('experimental-webgl',contextAttributes);if(_gl===null){if(_canvas.getContext('webgl')!==null){throw new Error('Error creating WebGL context with your selected attributes.');}else{throw new Error('Error creating WebGL context.');}}// Some experimental-webgl implementations do not have getShaderPrecisionFormat
if(_gl.getShaderPrecisionFormat===undefined){_gl.getShaderPrecisionFormat=function(){return {'rangeMin':1,'rangeMax':1,'precision':1};};}}catch(error){console.error('THREE.WebGLRenderer: '+error.message);}var extensions,capabilities,state,info;var properties,textures,attributes,geometries,objects;var programCache,renderLists,renderStates;var background,morphtargets,bufferRenderer,indexedBufferRenderer;var spriteRenderer;var utils;function initGLContext(){extensions=new WebGLExtensions(_gl);extensions.get('WEBGL_depth_texture');extensions.get('OES_texture_float');extensions.get('OES_texture_float_linear');extensions.get('OES_texture_half_float');extensions.get('OES_texture_half_float_linear');extensions.get('OES_standard_derivatives');extensions.get('OES_element_index_uint');extensions.get('ANGLE_instanced_arrays');utils=new WebGLUtils(_gl,extensions);capabilities=new WebGLCapabilities(_gl,extensions,parameters);state=new WebGLState(_gl,extensions,utils);state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio));state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio));info=new WebGLInfo(_gl);properties=new WebGLProperties();textures=new WebGLTextures(_gl,extensions,state,properties,capabilities,utils,info);attributes=new WebGLAttributes(_gl);geometries=new WebGLGeometries(_gl,attributes,info);objects=new WebGLObjects(geometries,info);morphtargets=new WebGLMorphtargets(_gl);programCache=new WebGLPrograms(_this,extensions,capabilities);renderLists=new WebGLRenderLists();renderStates=new WebGLRenderStates();background=new WebGLBackground(_this,state,geometries,_premultipliedAlpha);bufferRenderer=new WebGLBufferRenderer(_gl,extensions,info);indexedBufferRenderer=new WebGLIndexedBufferRenderer(_gl,extensions,info);spriteRenderer=new WebGLSpriteRenderer(_this,_gl,state,textures,capabilities);info.programs=programCache.programs;_this.context=_gl;_this.capabilities=capabilities;_this.extensions=extensions;_this.properties=properties;_this.renderLists=renderLists;_this.state=state;_this.info=info;}initGLContext();// vr
var vr=new WebVRManager(_this);this.vr=vr;// shadow map
var shadowMap=new WebGLShadowMap(_this,objects,capabilities.maxTextureSize);this.shadowMap=shadowMap;// API
this.getContext=function(){return _gl;};this.getContextAttributes=function(){return _gl.getContextAttributes();};this.forceContextLoss=function(){var extension=extensions.get('WEBGL_lose_context');if(extension)extension.loseContext();};this.forceContextRestore=function(){var extension=extensions.get('WEBGL_lose_context');if(extension)extension.restoreContext();};this.getPixelRatio=function(){return _pixelRatio;};this.setPixelRatio=function(value){if(value===undefined)return;_pixelRatio=value;this.setSize(_width,_height,false);};this.getSize=function(){return {width:_width,height:_height};};this.setSize=function(width,height,updateStyle){var device=vr.getDevice();if(device&&device.isPresenting){console.warn('THREE.WebGLRenderer: Can\'t change size while VR device is presenting.');return;}_width=width;_height=height;_canvas.width=width*_pixelRatio;_canvas.height=height*_pixelRatio;if(updateStyle!==false){_canvas.style.width=width+'px';_canvas.style.height=height+'px';}this.setViewport(0,0,width,height);};this.getDrawingBufferSize=function(){return {width:_width*_pixelRatio,height:_height*_pixelRatio};};this.setDrawingBufferSize=function(width,height,pixelRatio){_width=width;_height=height;_pixelRatio=pixelRatio;_canvas.width=width*pixelRatio;_canvas.height=height*pixelRatio;this.setViewport(0,0,width,height);};this.getCurrentViewport=function(){return _currentViewport;};this.setViewport=function(x,y,width,height){_viewport.set(x,_height-y-height,width,height);state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio));};this.setScissor=function(x,y,width,height){_scissor.set(x,_height-y-height,width,height);state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio));};this.setScissorTest=function(boolean){state.setScissorTest(_scissorTest=boolean);};// Clearing
this.getClearColor=function(){return background.getClearColor();};this.setClearColor=function(){background.setClearColor.apply(background,arguments);};this.getClearAlpha=function(){return background.getClearAlpha();};this.setClearAlpha=function(){background.setClearAlpha.apply(background,arguments);};this.clear=function(color,depth,stencil){var bits=0;if(color===undefined||color)bits|=_gl.COLOR_BUFFER_BIT;if(depth===undefined||depth)bits|=_gl.DEPTH_BUFFER_BIT;if(stencil===undefined||stencil)bits|=_gl.STENCIL_BUFFER_BIT;_gl.clear(bits);};this.clearColor=function(){this.clear(true,false,false);};this.clearDepth=function(){this.clear(false,true,false);};this.clearStencil=function(){this.clear(false,false,true);};this.clearTarget=function(renderTarget,color,depth,stencil){this.setRenderTarget(renderTarget);this.clear(color,depth,stencil);};//
this.dispose=function(){_canvas.removeEventListener('webglcontextlost',onContextLost,false);_canvas.removeEventListener('webglcontextrestored',onContextRestore,false);renderLists.dispose();renderStates.dispose();properties.dispose();objects.dispose();vr.dispose();stopAnimation();};// Events
function onContextLost(event){event.preventDefault();console.log('THREE.WebGLRenderer: Context Lost.');_isContextLost=true;}function onContextRestore()/* event */{console.log('THREE.WebGLRenderer: Context Restored.');_isContextLost=false;initGLContext();}function onMaterialDispose(event){var material=event.target;material.removeEventListener('dispose',onMaterialDispose);deallocateMaterial(material);}// Buffer deallocation
function deallocateMaterial(material){releaseMaterialProgramReference(material);properties.remove(material);}function releaseMaterialProgramReference(material){var programInfo=properties.get(material).program;material.program=undefined;if(programInfo!==undefined){programCache.releaseProgram(programInfo);}}// Buffer rendering
function renderObjectImmediate(object,program,material){object.render(function(object){_this.renderBufferImmediate(object,program,material);});}this.renderBufferImmediate=function(object,program,material){state.initAttributes();var buffers=properties.get(object);if(object.hasPositions&&!buffers.position)buffers.position=_gl.createBuffer();if(object.hasNormals&&!buffers.normal)buffers.normal=_gl.createBuffer();if(object.hasUvs&&!buffers.uv)buffers.uv=_gl.createBuffer();if(object.hasColors&&!buffers.color)buffers.color=_gl.createBuffer();var programAttributes=program.getAttributes();if(object.hasPositions){_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.position);_gl.bufferData(_gl.ARRAY_BUFFER,object.positionArray,_gl.DYNAMIC_DRAW);state.enableAttribute(programAttributes.position);_gl.vertexAttribPointer(programAttributes.position,3,_gl.FLOAT,false,0,0);}if(object.hasNormals){_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.normal);if(!material.isMeshPhongMaterial&&!material.isMeshStandardMaterial&&!material.isMeshNormalMaterial&&material.flatShading===true){for(var i=0,l=object.count*3;i<l;i+=9){var array=object.normalArray;var nx=(array[i+0]+array[i+3]+array[i+6])/3;var ny=(array[i+1]+array[i+4]+array[i+7])/3;var nz=(array[i+2]+array[i+5]+array[i+8])/3;array[i+0]=nx;array[i+1]=ny;array[i+2]=nz;array[i+3]=nx;array[i+4]=ny;array[i+5]=nz;array[i+6]=nx;array[i+7]=ny;array[i+8]=nz;}}_gl.bufferData(_gl.ARRAY_BUFFER,object.normalArray,_gl.DYNAMIC_DRAW);state.enableAttribute(programAttributes.normal);_gl.vertexAttribPointer(programAttributes.normal,3,_gl.FLOAT,false,0,0);}if(object.hasUvs&&material.map){_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.uv);_gl.bufferData(_gl.ARRAY_BUFFER,object.uvArray,_gl.DYNAMIC_DRAW);state.enableAttribute(programAttributes.uv);_gl.vertexAttribPointer(programAttributes.uv,2,_gl.FLOAT,false,0,0);}if(object.hasColors&&material.vertexColors!==NoColors){_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.color);_gl.bufferData(_gl.ARRAY_BUFFER,object.colorArray,_gl.DYNAMIC_DRAW);state.enableAttribute(programAttributes.color);_gl.vertexAttribPointer(programAttributes.color,3,_gl.FLOAT,false,0,0);}state.disableUnusedAttributes();_gl.drawArrays(_gl.TRIANGLES,0,object.count);object.count=0;};this.renderBufferDirect=function(camera,fog,geometry,material,object,group){var frontFaceCW=object.isMesh&&object.matrixWorld.determinant()<0;state.setMaterial(material,frontFaceCW);var program=setProgram(camera,fog,material,object);var geometryProgram=geometry.id+'_'+program.id+'_'+(material.wireframe===true);var updateBuffers=false;if(geometryProgram!==_currentGeometryProgram){_currentGeometryProgram=geometryProgram;updateBuffers=true;}if(object.morphTargetInfluences){morphtargets.update(object,geometry,material,program);updateBuffers=true;}//
var index=geometry.index;var position=geometry.attributes.position;var rangeFactor=1;if(material.wireframe===true){index=geometries.getWireframeAttribute(geometry);rangeFactor=2;}var attribute;var renderer=bufferRenderer;if(index!==null){attribute=attributes.get(index);renderer=indexedBufferRenderer;renderer.setIndex(attribute);}if(updateBuffers){setupVertexAttributes(material,program,geometry);if(index!==null){_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER,attribute.buffer);}}//
var dataCount=Infinity;if(index!==null){dataCount=index.count;}else if(position!==undefined){dataCount=position.count;}var rangeStart=geometry.drawRange.start*rangeFactor;var rangeCount=geometry.drawRange.count*rangeFactor;var groupStart=group!==null?group.start*rangeFactor:0;var groupCount=group!==null?group.count*rangeFactor:Infinity;var drawStart=Math.max(rangeStart,groupStart);var drawEnd=Math.min(dataCount,rangeStart+rangeCount,groupStart+groupCount)-1;var drawCount=Math.max(0,drawEnd-drawStart+1);if(drawCount===0)return;//
if(object.isMesh){if(material.wireframe===true){state.setLineWidth(material.wireframeLinewidth*getTargetPixelRatio());renderer.setMode(_gl.LINES);}else{switch(object.drawMode){case TrianglesDrawMode:renderer.setMode(_gl.TRIANGLES);break;case TriangleStripDrawMode:renderer.setMode(_gl.TRIANGLE_STRIP);break;case TriangleFanDrawMode:renderer.setMode(_gl.TRIANGLE_FAN);break;}}}else if(object.isLine){var lineWidth=material.linewidth;if(lineWidth===undefined)lineWidth=1;// Not using Line*Material
state.setLineWidth(lineWidth*getTargetPixelRatio());if(object.isLineSegments){renderer.setMode(_gl.LINES);}else if(object.isLineLoop){renderer.setMode(_gl.LINE_LOOP);}else{renderer.setMode(_gl.LINE_STRIP);}}else if(object.isPoints){renderer.setMode(_gl.POINTS);}if(geometry&&geometry.isInstancedBufferGeometry){if(geometry.maxInstancedCount>0){renderer.renderInstances(geometry,drawStart,drawCount);}}else{renderer.render(drawStart,drawCount);}};function setupVertexAttributes(material,program,geometry){if(geometry&&geometry.isInstancedBufferGeometry){if(extensions.get('ANGLE_instanced_arrays')===null){console.error('THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');return;}}state.initAttributes();var geometryAttributes=geometry.attributes;var programAttributes=program.getAttributes();var materialDefaultAttributeValues=material.defaultAttributeValues;for(var name in programAttributes){var programAttribute=programAttributes[name];if(programAttribute>=0){var geometryAttribute=geometryAttributes[name];if(geometryAttribute!==undefined){var normalized=geometryAttribute.normalized;var size=geometryAttribute.itemSize;var attribute=attributes.get(geometryAttribute);// TODO Attribute may not be available on context restore
if(attribute===undefined)continue;var buffer=attribute.buffer;var type=attribute.type;var bytesPerElement=attribute.bytesPerElement;if(geometryAttribute.isInterleavedBufferAttribute){var data=geometryAttribute.data;var stride=data.stride;var offset=geometryAttribute.offset;if(data&&data.isInstancedInterleavedBuffer){state.enableAttributeAndDivisor(programAttribute,data.meshPerAttribute);if(geometry.maxInstancedCount===undefined){geometry.maxInstancedCount=data.meshPerAttribute*data.count;}}else{state.enableAttribute(programAttribute);}_gl.bindBuffer(_gl.ARRAY_BUFFER,buffer);_gl.vertexAttribPointer(programAttribute,size,type,normalized,stride*bytesPerElement,offset*bytesPerElement);}else{if(geometryAttribute.isInstancedBufferAttribute){state.enableAttributeAndDivisor(programAttribute,geometryAttribute.meshPerAttribute);if(geometry.maxInstancedCount===undefined){geometry.maxInstancedCount=geometryAttribute.meshPerAttribute*geometryAttribute.count;}}else{state.enableAttribute(programAttribute);}_gl.bindBuffer(_gl.ARRAY_BUFFER,buffer);_gl.vertexAttribPointer(programAttribute,size,type,normalized,0,0);}}else if(materialDefaultAttributeValues!==undefined){var value=materialDefaultAttributeValues[name];if(value!==undefined){switch(value.length){case 2:_gl.vertexAttrib2fv(programAttribute,value);break;case 3:_gl.vertexAttrib3fv(programAttribute,value);break;case 4:_gl.vertexAttrib4fv(programAttribute,value);break;default:_gl.vertexAttrib1fv(programAttribute,value);}}}}}state.disableUnusedAttributes();}// Compile
this.compile=function(scene,camera){currentRenderState=renderStates.get(scene,camera);currentRenderState.init();scene.traverse(function(object){if(object.isLight){currentRenderState.pushLight(object);if(object.castShadow){currentRenderState.pushShadow(object);}}});currentRenderState.setupLights(camera);scene.traverse(function(object){if(object.material){if(Array.isArray(object.material)){for(var i=0;i<object.material.length;i++){initMaterial(object.material[i],scene.fog,object);}}else{initMaterial(object.material,scene.fog,object);}}});};// Animation Loop
var isAnimating=false;var onAnimationFrame=null;function startAnimation(){if(isAnimating)return;requestAnimationLoopFrame();isAnimating=true;}function stopAnimation(){isAnimating=false;}function requestAnimationLoopFrame(){var device=vr.getDevice();if(device&&device.isPresenting){device.requestAnimationFrame(animationLoop);}else{window.requestAnimationFrame(animationLoop);}}function animationLoop(time){if(isAnimating===false)return;onAnimationFrame(time);requestAnimationLoopFrame();}this.animate=function(callback){onAnimationFrame=callback;onAnimationFrame!==null?startAnimation():stopAnimation();};// Rendering
this.render=function(scene,camera,renderTarget,forceClear){if(!(camera&&camera.isCamera)){console.error('THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.');return;}if(_isContextLost)return;// reset caching for this frame
_currentGeometryProgram='';_currentMaterialId=-1;_currentCamera=null;// update scene graph
if(scene.autoUpdate===true)scene.updateMatrixWorld();// update camera matrices and frustum
if(camera.parent===null)camera.updateMatrixWorld();if(vr.enabled){camera=vr.getCamera(camera);}//
currentRenderState=renderStates.get(scene,camera);currentRenderState.init();scene.onBeforeRender(_this,scene,camera,renderTarget);_projScreenMatrix.multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse);_frustum.setFromMatrix(_projScreenMatrix);_localClippingEnabled=this.localClippingEnabled;_clippingEnabled=_clipping.init(this.clippingPlanes,_localClippingEnabled,camera);currentRenderList=renderLists.get(scene,camera);currentRenderList.init();projectObject(scene,camera,_this.sortObjects);if(_this.sortObjects===true){currentRenderList.sort();}//
if(_clippingEnabled)_clipping.beginShadows();var shadowsArray=currentRenderState.state.shadowsArray;shadowMap.render(shadowsArray,scene,camera);currentRenderState.setupLights(camera);if(_clippingEnabled)_clipping.endShadows();//
if(this.info.autoReset)this.info.reset();if(renderTarget===undefined){renderTarget=null;}this.setRenderTarget(renderTarget);//
background.render(currentRenderList,scene,camera,forceClear);// render scene
var opaqueObjects=currentRenderList.opaque;var transparentObjects=currentRenderList.transparent;if(scene.overrideMaterial){var overrideMaterial=scene.overrideMaterial;if(opaqueObjects.length)renderObjects(opaqueObjects,scene,camera,overrideMaterial);if(transparentObjects.length)renderObjects(transparentObjects,scene,camera,overrideMaterial);}else{// opaque pass (front-to-back order)
if(opaqueObjects.length)renderObjects(opaqueObjects,scene,camera);// transparent pass (back-to-front order)
if(transparentObjects.length)renderObjects(transparentObjects,scene,camera);}// custom renderers
var spritesArray=currentRenderState.state.spritesArray;spriteRenderer.render(spritesArray,scene,camera);// Generate mipmap if we're using any kind of mipmap filtering
if(renderTarget){textures.updateRenderTargetMipmap(renderTarget);}// Ensure depth buffer writing is enabled so it can be cleared on next render
state.buffers.depth.setTest(true);state.buffers.depth.setMask(true);state.buffers.color.setMask(true);state.setPolygonOffset(false);scene.onAfterRender(_this,scene,camera);if(vr.enabled){vr.submitFrame();}// _gl.finish();
currentRenderList=null;currentRenderState=null;};/*
// TODO Duplicated code (Frustum)
var _sphere = new Sphere();
function isObjectViewable( object ) {
var geometry = object.geometry;
if ( geometry.boundingSphere === null )
geometry.computeBoundingSphere();
_sphere.copy( geometry.boundingSphere ).
applyMatrix4( object.matrixWorld );
return isSphereViewable( _sphere );
}
function isSpriteViewable( sprite ) {
_sphere.center.set( 0, 0, 0 );
_sphere.radius = 0.7071067811865476;
_sphere.applyMatrix4( sprite.matrixWorld );
return isSphereViewable( _sphere );
}
function isSphereViewable( sphere ) {
if ( ! _frustum.intersectsSphere( sphere ) ) return false;
var numPlanes = _clipping.numPlanes;
if ( numPlanes === 0 ) return true;
var planes = _this.clippingPlanes,
center = sphere.center,
negRad = - sphere.radius,
i = 0;
do {
// out when deeper than radius in the negative halfspace
if ( planes[ i ].distanceToPoint( center ) < negRad ) return false;
} while ( ++ i !== numPlanes );
return true;
}
*/function projectObject(object,camera,sortObjects){if(object.visible===false)return;var visible=object.layers.test(camera.layers);if(visible){if(object.isLight){currentRenderState.pushLight(object);if(object.castShadow){currentRenderState.pushShadow(object);}}else if(object.isSprite){if(!object.frustumCulled||_frustum.intersectsSprite(object)){currentRenderState.pushSprite(object);}}else if(object.isImmediateRenderObject){if(sortObjects){_vector3.setFromMatrixPosition(object.matrixWorld).applyMatrix4(_projScreenMatrix);}currentRenderList.push(object,null,object.material,_vector3.z,null);}else if(object.isMesh||object.isLine||object.isPoints){if(object.isSkinnedMesh){object.skeleton.update();}if(!object.frustumCulled||_frustum.intersectsObject(object)){if(sortObjects){_vector3.setFromMatrixPosition(object.matrixWorld).applyMatrix4(_projScreenMatrix);}var geometry=objects.update(object);var material=object.material;if(Array.isArray(material)){var groups=geometry.groups;for(var i=0,l=groups.length;i<l;i++){var group=groups[i];var groupMaterial=material[group.materialIndex];if(groupMaterial&&groupMaterial.visible){currentRenderList.push(object,geometry,groupMaterial,_vector3.z,group);}}}else if(material.visible){currentRenderList.push(object,geometry,material,_vector3.z,null);}}}}var children=object.children;for(var i=0,l=children.length;i<l;i++){projectObject(children[i],camera,sortObjects);}}function renderObjects(renderList,scene,camera,overrideMaterial){for(var i=0,l=renderList.length;i<l;i++){var renderItem=renderList[i];var object=renderItem.object;var geometry=renderItem.geometry;var material=overrideMaterial===undefined?renderItem.material:overrideMaterial;var group=renderItem.group;if(camera.isArrayCamera){_currentArrayCamera=camera;var cameras=camera.cameras;for(var j=0,jl=cameras.length;j<jl;j++){var camera2=cameras[j];if(object.layers.test(camera2.layers)){var bounds=camera2.bounds;var x=bounds.x*_width;var y=bounds.y*_height;var width=bounds.z*_width;var height=bounds.w*_height;state.viewport(_currentViewport.set(x,y,width,height).multiplyScalar(_pixelRatio));renderObject(object,scene,camera2,geometry,material,group);}}}else{_currentArrayCamera=null;renderObject(object,scene,camera,geometry,material,group);}}}function renderObject(object,scene,camera,geometry,material,group){object.onBeforeRender(_this,scene,camera,geometry,material,group);currentRenderState=renderStates.get(scene,_currentArrayCamera||camera);object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse,object.matrixWorld);object.normalMatrix.getNormalMatrix(object.modelViewMatrix);if(object.isImmediateRenderObject){var frontFaceCW=object.isMesh&&object.matrixWorld.determinant()<0;state.setMaterial(material,frontFaceCW);var program=setProgram(camera,scene.fog,material,object);_currentGeometryProgram='';renderObjectImmediate(object,program,material);}else{_this.renderBufferDirect(camera,scene.fog,geometry,material,object,group);}object.onAfterRender(_this,scene,camera,geometry,material,group);currentRenderState=renderStates.get(scene,_currentArrayCamera||camera);}function initMaterial(material,fog,object){var materialProperties=properties.get(material);var lights=currentRenderState.state.lights;var shadowsArray=currentRenderState.state.shadowsArray;var parameters=programCache.getParameters(material,lights.state,shadowsArray,fog,_clipping.numPlanes,_clipping.numIntersection,object);var code=programCache.getProgramCode(material,parameters);var program=materialProperties.program;var programChange=true;if(program===undefined){// new material
material.addEventListener('dispose',onMaterialDispose);}else if(program.code!==code){// changed glsl or parameters
releaseMaterialProgramReference(material);}else if(materialProperties.lightsHash!==lights.state.hash){properties.update(material,'lightsHash',lights.state.hash);programChange=false;}else if(parameters.shaderID!==undefined){// same glsl and uniform list
return;}else{// only rebuild uniform list
programChange=false;}if(programChange){if(parameters.shaderID){var shader=ShaderLib[parameters.shaderID];materialProperties.shader={name:material.type,uniforms:UniformsUtils.clone(shader.uniforms),vertexShader:shader.vertexShader,fragmentShader:shader.fragmentShader};}else{materialProperties.shader={name:material.type,uniforms:material.uniforms,vertexShader:material.vertexShader,fragmentShader:material.fragmentShader};}material.onBeforeCompile(materialProperties.shader,_this);program=programCache.acquireProgram(material,materialProperties.shader,parameters,code);materialProperties.program=program;material.program=program;}var programAttributes=program.getAttributes();if(material.morphTargets){material.numSupportedMorphTargets=0;for(var i=0;i<_this.maxMorphTargets;i++){if(programAttributes['morphTarget'+i]>=0){material.numSupportedMorphTargets++;}}}if(material.morphNormals){material.numSupportedMorphNormals=0;for(var i=0;i<_this.maxMorphNormals;i++){if(programAttributes['morphNormal'+i]>=0){material.numSupportedMorphNormals++;}}}var uniforms=materialProperties.shader.uniforms;if(!material.isShaderMaterial&&!material.isRawShaderMaterial||material.clipping===true){materialProperties.numClippingPlanes=_clipping.numPlanes;materialProperties.numIntersection=_clipping.numIntersection;uniforms.clippingPlanes=_clipping.uniform;}materialProperties.fog=fog;// store the light setup it was created for
materialProperties.lightsHash=lights.state.hash;if(material.lights){// wire up the material to this renderer's lighting state
uniforms.ambientLightColor.value=lights.state.ambient;uniforms.directionalLights.value=lights.state.directional;uniforms.spotLights.value=lights.state.spot;uniforms.rectAreaLights.value=lights.state.rectArea;uniforms.pointLights.value=lights.state.point;uniforms.hemisphereLights.value=lights.state.hemi;uniforms.directionalShadowMap.value=lights.state.directionalShadowMap;uniforms.directionalShadowMatrix.value=lights.state.directionalShadowMatrix;uniforms.spotShadowMap.value=lights.state.spotShadowMap;uniforms.spotShadowMatrix.value=lights.state.spotShadowMatrix;uniforms.pointShadowMap.value=lights.state.pointShadowMap;uniforms.pointShadowMatrix.value=lights.state.pointShadowMatrix;// TODO (abelnation): add area lights shadow info to uniforms
}var progUniforms=materialProperties.program.getUniforms(),uniformsList=WebGLUniforms.seqWithValue(progUniforms.seq,uniforms);materialProperties.uniformsList=uniformsList;}function setProgram(camera,fog,material,object){_usedTextureUnits=0;var materialProperties=properties.get(material);var lights=currentRenderState.state.lights;if(_clippingEnabled){if(_localClippingEnabled||camera!==_currentCamera){var useCache=camera===_currentCamera&&material.id===_currentMaterialId;// we might want to call this function with some ClippingGroup
// object instead of the material, once it becomes feasible
// (#8465, #8379)
_clipping.setState(material.clippingPlanes,material.clipIntersection,material.clipShadows,camera,materialProperties,useCache);}}if(material.needsUpdate===false){if(materialProperties.program===undefined){material.needsUpdate=true;}else if(material.fog&&materialProperties.fog!==fog){material.needsUpdate=true;}else if(material.lights&&materialProperties.lightsHash!==lights.state.hash){material.needsUpdate=true;}else if(materialProperties.numClippingPlanes!==undefined&&(materialProperties.numClippingPlanes!==_clipping.numPlanes||materialProperties.numIntersection!==_clipping.numIntersection)){material.needsUpdate=true;}}if(material.needsUpdate){initMaterial(material,fog,object);material.needsUpdate=false;}var refreshProgram=false;var refreshMaterial=false;var refreshLights=false;var program=materialProperties.program,p_uniforms=program.getUniforms(),m_uniforms=materialProperties.shader.uniforms;if(state.useProgram(program.program)){refreshProgram=true;refreshMaterial=true;refreshLights=true;}if(material.id!==_currentMaterialId){_currentMaterialId=material.id;refreshMaterial=true;}if(refreshProgram||camera!==_currentCamera){p_uniforms.setValue(_gl,'projectionMatrix',camera.projectionMatrix);if(capabilities.logarithmicDepthBuffer){p_uniforms.setValue(_gl,'logDepthBufFC',2.0/(Math.log(camera.far+1.0)/Math.LN2));}// Avoid unneeded uniform updates per ArrayCamera's sub-camera
if(_currentCamera!==(_currentArrayCamera||camera)){_currentCamera=_currentArrayCamera||camera;// lighting uniforms depend on the camera so enforce an update
// now, in case this material supports lights - or later, when
// the next material that does gets activated:
refreshMaterial=true;// set to true on material change
refreshLights=true;// remains set until update done
}// load material specific uniforms
// (shader material also gets them for the sake of genericity)
if(material.isShaderMaterial||material.isMeshPhongMaterial||material.isMeshStandardMaterial||material.envMap){var uCamPos=p_uniforms.map.cameraPosition;if(uCamPos!==undefined){uCamPos.setValue(_gl,_vector3.setFromMatrixPosition(camera.matrixWorld));}}if(material.isMeshPhongMaterial||material.isMeshLambertMaterial||material.isMeshBasicMaterial||material.isMeshStandardMaterial||material.isShaderMaterial||material.skinning){p_uniforms.setValue(_gl,'viewMatrix',camera.matrixWorldInverse);}}// skinning uniforms must be set even if material didn't change
// auto-setting of texture unit for bone texture must go before other textures
// not sure why, but otherwise weird things happen
if(material.skinning){p_uniforms.setOptional(_gl,object,'bindMatrix');p_uniforms.setOptional(_gl,object,'bindMatrixInverse');var skeleton=object.skeleton;if(skeleton){var bones=skeleton.bones;if(capabilities.floatVertexTextures){if(skeleton.boneTexture===undefined){// layout (1 matrix = 4 pixels)
// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)
// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)
// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)
// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)
// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)
var size=Math.sqrt(bones.length*4);// 4 pixels needed for 1 matrix
size=_Math.ceilPowerOfTwo(size);size=Math.max(size,4);var boneMatrices=new Float32Array(size*size*4);// 4 floats per RGBA pixel
boneMatrices.set(skeleton.boneMatrices);// copy current values
var boneTexture=new DataTexture(boneMatrices,size,size,RGBAFormat,FloatType);boneTexture.needsUpdate=true;skeleton.boneMatrices=boneMatrices;skeleton.boneTexture=boneTexture;skeleton.boneTextureSize=size;}p_uniforms.setValue(_gl,'boneTexture',skeleton.boneTexture);p_uniforms.setValue(_gl,'boneTextureSize',skeleton.boneTextureSize);}else{p_uniforms.setOptional(_gl,skeleton,'boneMatrices');}}}if(refreshMaterial){p_uniforms.setValue(_gl,'toneMappingExposure',_this.toneMappingExposure);p_uniforms.setValue(_gl,'toneMappingWhitePoint',_this.toneMappingWhitePoint);if(material.lights){// the current material requires lighting info
// note: all lighting uniforms are always set correctly
// they simply reference the renderer's state for their
// values
//
// use the current material's .needsUpdate flags to set
// the GL state when required
markUniformsLightsNeedsUpdate(m_uniforms,refreshLights);}// refresh uniforms common to several materials
if(fog&&material.fog){refreshUniformsFog(m_uniforms,fog);}if(material.isMeshBasicMaterial){refreshUniformsCommon(m_uniforms,material);}else if(material.isMeshLambertMaterial){refreshUniformsCommon(m_uniforms,material);refreshUniformsLambert(m_uniforms,material);}else if(material.isMeshPhongMaterial){refreshUniformsCommon(m_uniforms,material);if(material.isMeshToonMaterial){refreshUniformsToon(m_uniforms,material);}else{refreshUniformsPhong(m_uniforms,material);}}else if(material.isMeshStandardMaterial){refreshUniformsCommon(m_uniforms,material);if(material.isMeshPhysicalMaterial){refreshUniformsPhysical(m_uniforms,material);}else{refreshUniformsStandard(m_uniforms,material);}}else if(material.isMeshDepthMaterial){refreshUniformsCommon(m_uniforms,material);refreshUniformsDepth(m_uniforms,material);}else if(material.isMeshDistanceMaterial){refreshUniformsCommon(m_uniforms,material);refreshUniformsDistance(m_uniforms,material);}else if(material.isMeshNormalMaterial){refreshUniformsCommon(m_uniforms,material);refreshUniformsNormal(m_uniforms,material);}else if(material.isLineBasicMaterial){refreshUniformsLine(m_uniforms,material);if(material.isLineDashedMaterial){refreshUniformsDash(m_uniforms,material);}}else if(material.isPointsMaterial){refreshUniformsPoints(m_uniforms,material);}else if(material.isShadowMaterial){m_uniforms.color.value=material.color;m_uniforms.opacity.value=material.opacity;}// RectAreaLight Texture
// TODO (mrdoob): Find a nicer implementation
if(m_uniforms.ltc_1!==undefined)m_uniforms.ltc_1.value=UniformsLib.LTC_1;if(m_uniforms.ltc_2!==undefined)m_uniforms.ltc_2.value=UniformsLib.LTC_2;WebGLUniforms.upload(_gl,materialProperties.uniformsList,m_uniforms,_this);}if(material.isShaderMaterial&&material.uniformsNeedUpdate===true){WebGLUniforms.upload(_gl,materialProperties.uniformsList,m_uniforms,_this);material.uniformsNeedUpdate=false;}// common matrices
p_uniforms.setValue(_gl,'modelViewMatrix',object.modelViewMatrix);p_uniforms.setValue(_gl,'normalMatrix',object.normalMatrix);p_uniforms.setValue(_gl,'modelMatrix',object.matrixWorld);return program;}// Uniforms (refresh uniforms objects)
function refreshUniformsCommon(uniforms,material){uniforms.opacity.value=material.opacity;if(material.color){uniforms.diffuse.value=material.color;}if(material.emissive){uniforms.emissive.value.copy(material.emissive).multiplyScalar(material.emissiveIntensity);}if(material.map){uniforms.map.value=material.map;}if(material.alphaMap){uniforms.alphaMap.value=material.alphaMap;}if(material.specularMap){uniforms.specularMap.value=material.specularMap;}if(material.envMap){uniforms.envMap.value=material.envMap;// don't flip CubeTexture envMaps, flip everything else:
// WebGLRenderTargetCube will be flipped for backwards compatibility
// WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture
// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future
uniforms.flipEnvMap.value=!(material.envMap&&material.envMap.isCubeTexture)?1:-1;uniforms.reflectivity.value=material.reflectivity;uniforms.refractionRatio.value=material.refractionRatio;uniforms.maxMipLevel.value=properties.get(material.envMap).__maxMipLevel;}if(material.lightMap){uniforms.lightMap.value=material.lightMap;uniforms.lightMapIntensity.value=material.lightMapIntensity;}if(material.aoMap){uniforms.aoMap.value=material.aoMap;uniforms.aoMapIntensity.value=material.aoMapIntensity;}// uv repeat and offset setting priorities
// 1. color map
// 2. specular map
// 3. normal map
// 4. bump map
// 5. alpha map
// 6. emissive map
var uvScaleMap;if(material.map){uvScaleMap=material.map;}else if(material.specularMap){uvScaleMap=material.specularMap;}else if(material.displacementMap){uvScaleMap=material.displacementMap;}else if(material.normalMap){uvScaleMap=material.normalMap;}else if(material.bumpMap){uvScaleMap=material.bumpMap;}else if(material.roughnessMap){uvScaleMap=material.roughnessMap;}else if(material.metalnessMap){uvScaleMap=material.metalnessMap;}else if(material.alphaMap){uvScaleMap=material.alphaMap;}else if(material.emissiveMap){uvScaleMap=material.emissiveMap;}if(uvScaleMap!==undefined){// backwards compatibility
if(uvScaleMap.isWebGLRenderTarget){uvScaleMap=uvScaleMap.texture;}if(uvScaleMap.matrixAutoUpdate===true){uvScaleMap.updateMatrix();}uniforms.uvTransform.value.copy(uvScaleMap.matrix);}}function refreshUniformsLine(uniforms,material){uniforms.diffuse.value=material.color;uniforms.opacity.value=material.opacity;}function refreshUniformsDash(uniforms,material){uniforms.dashSize.value=material.dashSize;uniforms.totalSize.value=material.dashSize+material.gapSize;uniforms.scale.value=material.scale;}function refreshUniformsPoints(uniforms,material){uniforms.diffuse.value=material.color;uniforms.opacity.value=material.opacity;uniforms.size.value=material.size*_pixelRatio;uniforms.scale.value=_height*0.5;uniforms.map.value=material.map;if(material.map!==null){if(material.map.matrixAutoUpdate===true){material.map.updateMatrix();}uniforms.uvTransform.value.copy(material.map.matrix);}}function refreshUniformsFog(uniforms,fog){uniforms.fogColor.value=fog.color;if(fog.isFog){uniforms.fogNear.value=fog.near;uniforms.fogFar.value=fog.far;}else if(fog.isFogExp2){uniforms.fogDensity.value=fog.density;}}function refreshUniformsLambert(uniforms,material){if(material.emissiveMap){uniforms.emissiveMap.value=material.emissiveMap;}}function refreshUniformsPhong(uniforms,material){uniforms.specular.value=material.specular;uniforms.shininess.value=Math.max(material.shininess,1e-4);// to prevent pow( 0.0, 0.0 )
if(material.emissiveMap){uniforms.emissiveMap.value=material.emissiveMap;}if(material.bumpMap){uniforms.bumpMap.value=material.bumpMap;uniforms.bumpScale.value=material.bumpScale;}if(material.normalMap){uniforms.normalMap.value=material.normalMap;uniforms.normalScale.value.copy(material.normalScale);}if(material.displacementMap){uniforms.displacementMap.value=material.displacementMap;uniforms.displacementScale.value=material.displacementScale;uniforms.displacementBias.value=material.displacementBias;}}function refreshUniformsToon(uniforms,material){refreshUniformsPhong(uniforms,material);if(material.gradientMap){uniforms.gradientMap.value=material.gradientMap;}}function refreshUniformsStandard(uniforms,material){uniforms.roughness.value=material.roughness;uniforms.metalness.value=material.metalness;if(material.roughnessMap){uniforms.roughnessMap.value=material.roughnessMap;}if(material.metalnessMap){uniforms.metalnessMap.value=material.metalnessMap;}if(material.emissiveMap){uniforms.emissiveMap.value=material.emissiveMap;}if(material.bumpMap){uniforms.bumpMap.value=material.bumpMap;uniforms.bumpScale.value=material.bumpScale;}if(material.normalMap){uniforms.normalMap.value=material.normalMap;uniforms.normalScale.value.copy(material.normalScale);}if(material.displacementMap){uniforms.displacementMap.value=material.displacementMap;uniforms.displacementScale.value=material.displacementScale;uniforms.displacementBias.value=material.displacementBias;}if(material.envMap){//uniforms.envMap.value = material.envMap; // part of uniforms common
uniforms.envMapIntensity.value=material.envMapIntensity;}}function refreshUniformsPhysical(uniforms,material){uniforms.clearCoat.value=material.clearCoat;uniforms.clearCoatRoughness.value=material.clearCoatRoughness;refreshUniformsStandard(uniforms,material);}function refreshUniformsDepth(uniforms,material){if(material.displacementMap){uniforms.displacementMap.value=material.displacementMap;uniforms.displacementScale.value=material.displacementScale;uniforms.displacementBias.value=material.displacementBias;}}function refreshUniformsDistance(uniforms,material){if(material.displacementMap){uniforms.displacementMap.value=material.displacementMap;uniforms.displacementScale.value=material.displacementScale;uniforms.displacementBias.value=material.displacementBias;}uniforms.referencePosition.value.copy(material.referencePosition);uniforms.nearDistance.value=material.nearDistance;uniforms.farDistance.value=material.farDistance;}function refreshUniformsNormal(uniforms,material){if(material.bumpMap){uniforms.bumpMap.value=material.bumpMap;uniforms.bumpScale.value=material.bumpScale;}if(material.normalMap){uniforms.normalMap.value=material.normalMap;uniforms.normalScale.value.copy(material.normalScale);}if(material.displacementMap){uniforms.displacementMap.value=material.displacementMap;uniforms.displacementScale.value=material.displacementScale;uniforms.displacementBias.value=material.displacementBias;}}// If uniforms are marked as clean, they don't need to be loaded to the GPU.
function markUniformsLightsNeedsUpdate(uniforms,value){uniforms.ambientLightColor.needsUpdate=value;uniforms.directionalLights.needsUpdate=value;uniforms.pointLights.needsUpdate=value;uniforms.spotLights.needsUpdate=value;uniforms.rectAreaLights.needsUpdate=value;uniforms.hemisphereLights.needsUpdate=value;}// Textures
function allocTextureUnit(){var textureUnit=_usedTextureUnits;if(textureUnit>=capabilities.maxTextures){console.warn('THREE.WebGLRenderer: Trying to use '+textureUnit+' texture units while this GPU supports only '+capabilities.maxTextures);}_usedTextureUnits+=1;return textureUnit;}this.allocTextureUnit=allocTextureUnit;// this.setTexture2D = setTexture2D;
this.setTexture2D=function(){var warned=false;// backwards compatibility: peel texture.texture
return function setTexture2D(texture,slot){if(texture&&texture.isWebGLRenderTarget){if(!warned){console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.");warned=true;}texture=texture.texture;}textures.setTexture2D(texture,slot);};}();this.setTexture=function(){var warned=false;return function setTexture(texture,slot){if(!warned){console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.");warned=true;}textures.setTexture2D(texture,slot);};}();this.setTextureCube=function(){var warned=false;return function setTextureCube(texture,slot){// backwards compatibility: peel texture.texture
if(texture&&texture.isWebGLRenderTargetCube){if(!warned){console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.");warned=true;}texture=texture.texture;}// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture
// TODO: unify these code paths
if(texture&&texture.isCubeTexture||Array.isArray(texture.image)&&texture.image.length===6){// CompressedTexture can have Array in image :/
// this function alone should take care of cube textures
textures.setTextureCube(texture,slot);}else{// assumed: texture property of THREE.WebGLRenderTargetCube
textures.setTextureCubeDynamic(texture,slot);}};}();this.getRenderTarget=function(){return _currentRenderTarget;};this.setRenderTarget=function(renderTarget){_currentRenderTarget=renderTarget;if(renderTarget&&properties.get(renderTarget).__webglFramebuffer===undefined){textures.setupRenderTarget(renderTarget);}var framebuffer=null;var isCube=false;if(renderTarget){var __webglFramebuffer=properties.get(renderTarget).__webglFramebuffer;if(renderTarget.isWebGLRenderTargetCube){framebuffer=__webglFramebuffer[renderTarget.activeCubeFace];isCube=true;}else{framebuffer=__webglFramebuffer;}_currentViewport.copy(renderTarget.viewport);_currentScissor.copy(renderTarget.scissor);_currentScissorTest=renderTarget.scissorTest;}else{_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio);_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio);_currentScissorTest=_scissorTest;}if(_currentFramebuffer!==framebuffer){_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer);_currentFramebuffer=framebuffer;}state.viewport(_currentViewport);state.scissor(_currentScissor);state.setScissorTest(_currentScissorTest);if(isCube){var textureProperties=properties.get(renderTarget.texture);_gl.framebufferTexture2D(_gl.FRAMEBUFFER,_gl.COLOR_ATTACHMENT0,_gl.TEXTURE_CUBE_MAP_POSITIVE_X+renderTarget.activeCubeFace,textureProperties.__webglTexture,renderTarget.activeMipMapLevel);}};this.readRenderTargetPixels=function(renderTarget,x,y,width,height,buffer){if(!(renderTarget&&renderTarget.isWebGLRenderTarget)){console.error('THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.');return;}var framebuffer=properties.get(renderTarget).__webglFramebuffer;if(framebuffer){var restore=false;if(framebuffer!==_currentFramebuffer){_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer);restore=true;}try{var texture=renderTarget.texture;var textureFormat=texture.format;var textureType=texture.type;if(textureFormat!==RGBAFormat&&utils.convert(textureFormat)!==_gl.getParameter(_gl.IMPLEMENTATION_COLOR_READ_FORMAT)){console.error('THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.');return;}if(textureType!==UnsignedByteType&&utils.convert(textureType)!==_gl.getParameter(_gl.IMPLEMENTATION_COLOR_READ_TYPE)&&// IE11, Edge and Chrome Mac < 52 (#9513)
!(textureType===FloatType&&(extensions.get('OES_texture_float')||extensions.get('WEBGL_color_buffer_float')))&&// Chrome Mac >= 52 and Firefox
!(textureType===HalfFloatType&&extensions.get('EXT_color_buffer_half_float'))){console.error('THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.');return;}if(_gl.checkFramebufferStatus(_gl.FRAMEBUFFER)===_gl.FRAMEBUFFER_COMPLETE){// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)
if(x>=0&&x<=renderTarget.width-width&&y>=0&&y<=renderTarget.height-height){_gl.readPixels(x,y,width,height,utils.convert(textureFormat),utils.convert(textureType),buffer);}}else{console.error('THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.');}}finally{if(restore){_gl.bindFramebuffer(_gl.FRAMEBUFFER,_currentFramebuffer);}}}};this.copyFramebufferToTexture=function(position,texture,level){var width=texture.image.width;var height=texture.image.height;var glFormat=utils.convert(texture.format);this.setTexture2D(texture,0);_gl.copyTexImage2D(_gl.TEXTURE_2D,level||0,glFormat,position.x,position.y,width,height,0);};this.copyTextureToTexture=function(position,srcTexture,dstTexture,level){var width=srcTexture.image.width;var height=srcTexture.image.height;var glFormat=utils.convert(dstTexture.format);var glType=utils.convert(dstTexture.type);var pixels=srcTexture.isDataTexture?srcTexture.image.data:srcTexture.image;this.setTexture2D(dstTexture,0);_gl.texSubImage2D(_gl.TEXTURE_2D,level||0,position.x,position.y,width,height,glFormat,glType,pixels);};}/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/function FogExp2(color,density){this.name='';this.color=new Color(color);this.density=density!==undefined?density:0.00025;}FogExp2.prototype.isFogExp2=true;FogExp2.prototype.clone=function(){return new FogExp2(this.color.getHex(),this.density);};FogExp2.prototype.toJSON=function()/* meta */{return {type:'FogExp2',color:this.color.getHex(),density:this.density};};/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/function Fog(color,near,far){this.name='';this.color=new Color(color);this.near=near!==undefined?near:1;this.far=far!==undefined?far:1000;}Fog.prototype.isFog=true;Fog.prototype.clone=function(){return new Fog(this.color.getHex(),this.near,this.far);};Fog.prototype.toJSON=function()/* meta */{return {type:'Fog',color:this.color.getHex(),near:this.near,far:this.far};};/**
* @author mrdoob / http://mrdoob.com/
*/function Scene(){Object3D.call(this);this.type='Scene';this.background=null;this.fog=null;this.overrideMaterial=null;this.autoUpdate=true;// checked by the renderer
}Scene.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Scene,copy:function(source,recursive){Object3D.prototype.copy.call(this,source,recursive);if(source.background!==null)this.background=source.background.clone();if(source.fog!==null)this.fog=source.fog.clone();if(source.overrideMaterial!==null)this.overrideMaterial=source.overrideMaterial.clone();this.autoUpdate=source.autoUpdate;this.matrixAutoUpdate=source.matrixAutoUpdate;return this;},toJSON:function(meta){var data=Object3D.prototype.toJSON.call(this,meta);if(this.background!==null)data.object.background=this.background.toJSON(meta);if(this.fog!==null)data.object.fog=this.fog.toJSON();return data;}});/**
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: <hex>,
* opacity: <float>,
* map: new THREE.Texture( <Image> ),
*
* uvOffset: new THREE.Vector2(),
* uvScale: new THREE.Vector2()
* }
*/function SpriteMaterial(parameters){Material.call(this);this.type='SpriteMaterial';this.color=new Color(0xffffff);this.map=null;this.rotation=0;this.fog=false;this.lights=false;this.setValues(parameters);}SpriteMaterial.prototype=Object.create(Material.prototype);SpriteMaterial.prototype.constructor=SpriteMaterial;SpriteMaterial.prototype.isSpriteMaterial=true;SpriteMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.color.copy(source.color);this.map=source.map;this.rotation=source.rotation;return this;};/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
*/function Sprite(material){Object3D.call(this);this.type='Sprite';this.material=material!==undefined?material:new SpriteMaterial();this.center=new Vector2(0.5,0.5);}Sprite.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Sprite,isSprite:true,raycast:function(){var intersectPoint=new Vector3();var worldPosition=new Vector3();var worldScale=new Vector3();return function raycast(raycaster,intersects){worldPosition.setFromMatrixPosition(this.matrixWorld);raycaster.ray.closestPointToPoint(worldPosition,intersectPoint);worldScale.setFromMatrixScale(this.matrixWorld);var guessSizeSq=worldScale.x*worldScale.y/4;if(worldPosition.distanceToSquared(intersectPoint)>guessSizeSq)return;var distance=raycaster.ray.origin.distanceTo(intersectPoint);if(distance<raycaster.near||distance>raycaster.far)return;intersects.push({distance:distance,point:intersectPoint.clone(),face:null,object:this});};}(),clone:function(){return new this.constructor(this.material).copy(this);},copy:function(source){Object3D.prototype.copy.call(this,source);if(source.center!==undefined)this.center.copy(source.center);return this;}});/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
*/function LOD(){Object3D.call(this);this.type='LOD';Object.defineProperties(this,{levels:{enumerable:true,value:[]}});}LOD.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:LOD,copy:function(source){Object3D.prototype.copy.call(this,source,false);var levels=source.levels;for(var i=0,l=levels.length;i<l;i++){var level=levels[i];this.addLevel(level.object.clone(),level.distance);}return this;},addLevel:function(object,distance){if(distance===undefined)distance=0;distance=Math.abs(distance);var levels=this.levels;for(var l=0;l<levels.length;l++){if(distance<levels[l].distance){break;}}levels.splice(l,0,{distance:distance,object:object});this.add(object);},getObjectForDistance:function(distance){var levels=this.levels;for(var i=1,l=levels.length;i<l;i++){if(distance<levels[i].distance){break;}}return levels[i-1].object;},raycast:function(){var matrixPosition=new Vector3();return function raycast(raycaster,intersects){matrixPosition.setFromMatrixPosition(this.matrixWorld);var distance=raycaster.ray.origin.distanceTo(matrixPosition);this.getObjectForDistance(distance).raycast(raycaster,intersects);};}(),update:function(){var v1=new Vector3();var v2=new Vector3();return function update(camera){var levels=this.levels;if(levels.length>1){v1.setFromMatrixPosition(camera.matrixWorld);v2.setFromMatrixPosition(this.matrixWorld);var distance=v1.distanceTo(v2);levels[0].object.visible=true;for(var i=1,l=levels.length;i<l;i++){if(distance>=levels[i].distance){levels[i-1].object.visible=false;levels[i].object.visible=true;}else{break;}}for(;i<l;i++){levels[i].object.visible=false;}}};}(),toJSON:function(meta){var data=Object3D.prototype.toJSON.call(this,meta);data.object.levels=[];var levels=this.levels;for(var i=0,l=levels.length;i<l;i++){var level=levels[i];data.object.levels.push({object:level.object.uuid,distance:level.distance});}return data;}});/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author michael guerrero / http://realitymeltdown.com
* @author ikerr / http://verold.com
*/function Skeleton(bones,boneInverses){// copy the bone array
bones=bones||[];this.bones=bones.slice(0);this.boneMatrices=new Float32Array(this.bones.length*16);// use the supplied bone inverses or calculate the inverses
if(boneInverses===undefined){this.calculateInverses();}else{if(this.bones.length===boneInverses.length){this.boneInverses=boneInverses.slice(0);}else{console.warn('THREE.Skeleton boneInverses is the wrong length.');this.boneInverses=[];for(var i=0,il=this.bones.length;i<il;i++){this.boneInverses.push(new Matrix4());}}}}Object.assign(Skeleton.prototype,{calculateInverses:function(){this.boneInverses=[];for(var i=0,il=this.bones.length;i<il;i++){var inverse=new Matrix4();if(this.bones[i]){inverse.getInverse(this.bones[i].matrixWorld);}this.boneInverses.push(inverse);}},pose:function(){var bone,i,il;// recover the bind-time world matrices
for(i=0,il=this.bones.length;i<il;i++){bone=this.bones[i];if(bone){bone.matrixWorld.getInverse(this.boneInverses[i]);}}// compute the local matrices, positions, rotations and scales
for(i=0,il=this.bones.length;i<il;i++){bone=this.bones[i];if(bone){if(bone.parent&&bone.parent.isBone){bone.matrix.getInverse(bone.parent.matrixWorld);bone.matrix.multiply(bone.matrixWorld);}else{bone.matrix.copy(bone.matrixWorld);}bone.matrix.decompose(bone.position,bone.quaternion,bone.scale);}}},update:function(){var offsetMatrix=new Matrix4();var identityMatrix=new Matrix4();return function update(){var bones=this.bones;var boneInverses=this.boneInverses;var boneMatrices=this.boneMatrices;var boneTexture=this.boneTexture;// flatten bone matrices to array
for(var i=0,il=bones.length;i<il;i++){// compute the offset between the current and the original transform
var matrix=bones[i]?bones[i].matrixWorld:identityMatrix;offsetMatrix.multiplyMatrices(matrix,boneInverses[i]);offsetMatrix.toArray(boneMatrices,i*16);}if(boneTexture!==undefined){boneTexture.needsUpdate=true;}};}(),clone:function(){return new Skeleton(this.bones,this.boneInverses);},getBoneByName:function(name){for(var i=0,il=this.bones.length;i<il;i++){var bone=this.bones[i];if(bone.name===name){return bone;}}return undefined;}});/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author ikerr / http://verold.com
*/function Bone(){Object3D.call(this);this.type='Bone';}Bone.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Bone,isBone:true});/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author ikerr / http://verold.com
*/function SkinnedMesh(geometry,material){Mesh.call(this,geometry,material);this.type='SkinnedMesh';this.bindMode='attached';this.bindMatrix=new Matrix4();this.bindMatrixInverse=new Matrix4();var bones=this.initBones();var skeleton=new Skeleton(bones);this.bind(skeleton,this.matrixWorld);this.normalizeSkinWeights();}SkinnedMesh.prototype=Object.assign(Object.create(Mesh.prototype),{constructor:SkinnedMesh,isSkinnedMesh:true,initBones:function(){var bones=[],bone,gbone;var i,il;if(this.geometry&&this.geometry.bones!==undefined){// first, create array of 'Bone' objects from geometry data
for(i=0,il=this.geometry.bones.length;i<il;i++){gbone=this.geometry.bones[i];// create new 'Bone' object
bone=new Bone();bones.push(bone);// apply values
bone.name=gbone.name;bone.position.fromArray(gbone.pos);bone.quaternion.fromArray(gbone.rotq);if(gbone.scl!==undefined)bone.scale.fromArray(gbone.scl);}// second, create bone hierarchy
for(i=0,il=this.geometry.bones.length;i<il;i++){gbone=this.geometry.bones[i];if(gbone.parent!==-1&&gbone.parent!==null&&bones[gbone.parent]!==undefined){// subsequent bones in the hierarchy
bones[gbone.parent].add(bones[i]);}else{// topmost bone, immediate child of the skinned mesh
this.add(bones[i]);}}}// now the bones are part of the scene graph and children of the skinned mesh.
// let's update the corresponding matrices
this.updateMatrixWorld(true);return bones;},bind:function(skeleton,bindMatrix){this.skeleton=skeleton;if(bindMatrix===undefined){this.updateMatrixWorld(true);this.skeleton.calculateInverses();bindMatrix=this.matrixWorld;}this.bindMatrix.copy(bindMatrix);this.bindMatrixInverse.getInverse(bindMatrix);},pose:function(){this.skeleton.pose();},normalizeSkinWeights:function(){var scale,i;if(this.geometry&&this.geometry.isGeometry){for(i=0;i<this.geometry.skinWeights.length;i++){var sw=this.geometry.skinWeights[i];scale=1.0/sw.manhattanLength();if(scale!==Infinity){sw.multiplyScalar(scale);}else{sw.set(1,0,0,0);// do something reasonable
}}}else if(this.geometry&&this.geometry.isBufferGeometry){var vec=new Vector4();var skinWeight=this.geometry.attributes.skinWeight;for(i=0;i<skinWeight.count;i++){vec.x=skinWeight.getX(i);vec.y=skinWeight.getY(i);vec.z=skinWeight.getZ(i);vec.w=skinWeight.getW(i);scale=1.0/vec.manhattanLength();if(scale!==Infinity){vec.multiplyScalar(scale);}else{vec.set(1,0,0,0);// do something reasonable
}skinWeight.setXYZW(i,vec.x,vec.y,vec.z,vec.w);}}},updateMatrixWorld:function(force){Mesh.prototype.updateMatrixWorld.call(this,force);if(this.bindMode==='attached'){this.bindMatrixInverse.getInverse(this.matrixWorld);}else if(this.bindMode==='detached'){this.bindMatrixInverse.getInverse(this.bindMatrix);}else{console.warn('THREE.SkinnedMesh: Unrecognized bindMode: '+this.bindMode);}},clone:function(){return new this.constructor(this.geometry,this.material).copy(this);}});/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: <hex>,
* opacity: <float>,
*
* linewidth: <float>,
* linecap: "round",
* linejoin: "round"
* }
*/function LineBasicMaterial(parameters){Material.call(this);this.type='LineBasicMaterial';this.color=new Color(0xffffff);this.linewidth=1;this.linecap='round';this.linejoin='round';this.lights=false;this.setValues(parameters);}LineBasicMaterial.prototype=Object.create(Material.prototype);LineBasicMaterial.prototype.constructor=LineBasicMaterial;LineBasicMaterial.prototype.isLineBasicMaterial=true;LineBasicMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.color.copy(source.color);this.linewidth=source.linewidth;this.linecap=source.linecap;this.linejoin=source.linejoin;return this;};/**
* @author mrdoob / http://mrdoob.com/
*/function Line(geometry,material,mode){if(mode===1){console.warn('THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.');return new LineSegments(geometry,material);}Object3D.call(this);this.type='Line';this.geometry=geometry!==undefined?geometry:new BufferGeometry();this.material=material!==undefined?material:new LineBasicMaterial({color:Math.random()*0xffffff});}Line.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Line,isLine:true,computeLineDistances:function(){var start=new Vector3();var end=new Vector3();return function computeLineDistances(){var geometry=this.geometry;if(geometry.isBufferGeometry){// we assume non-indexed geometry
if(geometry.index===null){var positionAttribute=geometry.attributes.position;var lineDistances=[0];for(var i=1,l=positionAttribute.count;i<l;i++){start.fromBufferAttribute(positionAttribute,i-1);end.fromBufferAttribute(positionAttribute,i);lineDistances[i]=lineDistances[i-1];lineDistances[i]+=start.distanceTo(end);}geometry.addAttribute('lineDistance',new Float32BufferAttribute(lineDistances,1));}else{console.warn('THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.');}}else if(geometry.isGeometry){var vertices=geometry.vertices;var lineDistances=geometry.lineDistances;lineDistances[0]=0;for(var i=1,l=vertices.length;i<l;i++){lineDistances[i]=lineDistances[i-1];lineDistances[i]+=vertices[i-1].distanceTo(vertices[i]);}}return this;};}(),raycast:function(){var inverseMatrix=new Matrix4();var ray=new Ray();var sphere=new Sphere();return function raycast(raycaster,intersects){var precision=raycaster.linePrecision;var precisionSq=precision*precision;var geometry=this.geometry;var matrixWorld=this.matrixWorld;// Checking boundingSphere distance to ray
if(geometry.boundingSphere===null)geometry.computeBoundingSphere();sphere.copy(geometry.boundingSphere);sphere.applyMatrix4(matrixWorld);if(raycaster.ray.intersectsSphere(sphere)===false)return;//
inverseMatrix.getInverse(matrixWorld);ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);var vStart=new Vector3();var vEnd=new Vector3();var interSegment=new Vector3();var interRay=new Vector3();var step=this&&this.isLineSegments?2:1;if(geometry.isBufferGeometry){var index=geometry.index;var attributes=geometry.attributes;var positions=attributes.position.array;if(index!==null){var indices=index.array;for(var i=0,l=indices.length-1;i<l;i+=step){var a=indices[i];var b=indices[i+1];vStart.fromArray(positions,a*3);vEnd.fromArray(positions,b*3);var distSq=ray.distanceSqToSegment(vStart,vEnd,interRay,interSegment);if(distSq>precisionSq)continue;interRay.applyMatrix4(this.matrixWorld);//Move back to world space for distance calculation
var distance=raycaster.ray.origin.distanceTo(interRay);if(distance<raycaster.near||distance>raycaster.far)continue;intersects.push({distance:distance,// What do we want? intersection point on the ray or on the segment??
// point: raycaster.ray.at( distance ),
point:interSegment.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this});}}else{for(var i=0,l=positions.length/3-1;i<l;i+=step){vStart.fromArray(positions,3*i);vEnd.fromArray(positions,3*i+3);var distSq=ray.distanceSqToSegment(vStart,vEnd,interRay,interSegment);if(distSq>precisionSq)continue;interRay.applyMatrix4(this.matrixWorld);//Move back to world space for distance calculation
var distance=raycaster.ray.origin.distanceTo(interRay);if(distance<raycaster.near||distance>raycaster.far)continue;intersects.push({distance:distance,// What do we want? intersection point on the ray or on the segment??
// point: raycaster.ray.at( distance ),
point:interSegment.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this});}}}else if(geometry.isGeometry){var vertices=geometry.vertices;var nbVertices=vertices.length;for(var i=0;i<nbVertices-1;i+=step){var distSq=ray.distanceSqToSegment(vertices[i],vertices[i+1],interRay,interSegment);if(distSq>precisionSq)continue;interRay.applyMatrix4(this.matrixWorld);//Move back to world space for distance calculation
var distance=raycaster.ray.origin.distanceTo(interRay);if(distance<raycaster.near||distance>raycaster.far)continue;intersects.push({distance:distance,// What do we want? intersection point on the ray or on the segment??
// point: raycaster.ray.at( distance ),
point:interSegment.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this});}}};}(),clone:function(){return new this.constructor(this.geometry,this.material).copy(this);}});/**
* @author mrdoob / http://mrdoob.com/
*/function LineSegments(geometry,material){Line.call(this,geometry,material);this.type='LineSegments';}LineSegments.prototype=Object.assign(Object.create(Line.prototype),{constructor:LineSegments,isLineSegments:true,computeLineDistances:function(){var start=new Vector3();var end=new Vector3();return function computeLineDistances(){var geometry=this.geometry;if(geometry.isBufferGeometry){// we assume non-indexed geometry
if(geometry.index===null){var positionAttribute=geometry.attributes.position;var lineDistances=[];for(var i=0,l=positionAttribute.count;i<l;i+=2){start.fromBufferAttribute(positionAttribute,i);end.fromBufferAttribute(positionAttribute,i+1);lineDistances[i]=i===0?0:lineDistances[i-1];lineDistances[i+1]=lineDistances[i]+start.distanceTo(end);}geometry.addAttribute('lineDistance',new Float32BufferAttribute(lineDistances,1));}else{console.warn('THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.');}}else if(geometry.isGeometry){var vertices=geometry.vertices;var lineDistances=geometry.lineDistances;for(var i=0,l=vertices.length;i<l;i+=2){start.copy(vertices[i]);end.copy(vertices[i+1]);lineDistances[i]=i===0?0:lineDistances[i-1];lineDistances[i+1]=lineDistances[i]+start.distanceTo(end);}}return this;};}()});/**
* @author mgreter / http://github.com/mgreter
*/function LineLoop(geometry,material){Line.call(this,geometry,material);this.type='LineLoop';}LineLoop.prototype=Object.assign(Object.create(Line.prototype),{constructor:LineLoop,isLineLoop:true});/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: <hex>,
* opacity: <float>,
* map: new THREE.Texture( <Image> ),
*
* size: <float>,
* sizeAttenuation: <bool>
* }
*/function PointsMaterial(parameters){Material.call(this);this.type='PointsMaterial';this.color=new Color(0xffffff);this.map=null;this.size=1;this.sizeAttenuation=true;this.lights=false;this.setValues(parameters);}PointsMaterial.prototype=Object.create(Material.prototype);PointsMaterial.prototype.constructor=PointsMaterial;PointsMaterial.prototype.isPointsMaterial=true;PointsMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.color.copy(source.color);this.map=source.map;this.size=source.size;this.sizeAttenuation=source.sizeAttenuation;return this;};/**
* @author alteredq / http://alteredqualia.com/
*/function Points(geometry,material){Object3D.call(this);this.type='Points';this.geometry=geometry!==undefined?geometry:new BufferGeometry();this.material=material!==undefined?material:new PointsMaterial({color:Math.random()*0xffffff});}Points.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Points,isPoints:true,raycast:function(){var inverseMatrix=new Matrix4();var ray=new Ray();var sphere=new Sphere();return function raycast(raycaster,intersects){var object=this;var geometry=this.geometry;var matrixWorld=this.matrixWorld;var threshold=raycaster.params.Points.threshold;// Checking boundingSphere distance to ray
if(geometry.boundingSphere===null)geometry.computeBoundingSphere();sphere.copy(geometry.boundingSphere);sphere.applyMatrix4(matrixWorld);sphere.radius+=threshold;if(raycaster.ray.intersectsSphere(sphere)===false)return;//
inverseMatrix.getInverse(matrixWorld);ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);var localThreshold=threshold/((this.scale.x+this.scale.y+this.scale.z)/3);var localThresholdSq=localThreshold*localThreshold;var position=new Vector3();var intersectPoint=new Vector3();function testPoint(point,index){var rayPointDistanceSq=ray.distanceSqToPoint(point);if(rayPointDistanceSq<localThresholdSq){ray.closestPointToPoint(point,intersectPoint);intersectPoint.applyMatrix4(matrixWorld);var distance=raycaster.ray.origin.distanceTo(intersectPoint);if(distance<raycaster.near||distance>raycaster.far)return;intersects.push({distance:distance,distanceToRay:Math.sqrt(rayPointDistanceSq),point:intersectPoint.clone(),index:index,face:null,object:object});}}if(geometry.isBufferGeometry){var index=geometry.index;var attributes=geometry.attributes;var positions=attributes.position.array;if(index!==null){var indices=index.array;for(var i=0,il=indices.length;i<il;i++){var a=indices[i];position.fromArray(positions,a*3);testPoint(position,a);}}else{for(var i=0,l=positions.length/3;i<l;i++){position.fromArray(positions,i*3);testPoint(position,i);}}}else{var vertices=geometry.vertices;for(var i=0,l=vertices.length;i<l;i++){testPoint(vertices[i],i);}}};}(),clone:function(){return new this.constructor(this.geometry,this.material).copy(this);}});/**
* @author mrdoob / http://mrdoob.com/
*/function Group(){Object3D.call(this);this.type='Group';}Group.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Group,isGroup:true});/**
* @author mrdoob / http://mrdoob.com/
*/function VideoTexture(video,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy){Texture.call(this,video,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy);this.generateMipmaps=false;}VideoTexture.prototype=Object.assign(Object.create(Texture.prototype),{constructor:VideoTexture,isVideoTexture:true,update:function(){var video=this.image;if(video.readyState>=video.HAVE_CURRENT_DATA){this.needsUpdate=true;}}});/**
* @author alteredq / http://alteredqualia.com/
*/function CompressedTexture(mipmaps,width,height,format,type,mapping,wrapS,wrapT,magFilter,minFilter,anisotropy,encoding){Texture.call(this,null,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy,encoding);this.image={width:width,height:height};this.mipmaps=mipmaps;// no flipping for cube textures
// (also flipping doesn't work for compressed textures )
this.flipY=false;// can't generate mipmaps for compressed textures
// mips must be embedded in DDS files
this.generateMipmaps=false;}CompressedTexture.prototype=Object.create(Texture.prototype);CompressedTexture.prototype.constructor=CompressedTexture;CompressedTexture.prototype.isCompressedTexture=true;/**
* @author Matt DesLauriers / @mattdesl
* @author atix / arthursilber.de
*/function DepthTexture(width,height,type,mapping,wrapS,wrapT,magFilter,minFilter,anisotropy,format){format=format!==undefined?format:DepthFormat;if(format!==DepthFormat&&format!==DepthStencilFormat){throw new Error('DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat');}if(type===undefined&&format===DepthFormat)type=UnsignedShortType;if(type===undefined&&format===DepthStencilFormat)type=UnsignedInt248Type;Texture.call(this,null,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy);this.image={width:width,height:height};this.magFilter=magFilter!==undefined?magFilter:NearestFilter;this.minFilter=minFilter!==undefined?minFilter:NearestFilter;this.flipY=false;this.generateMipmaps=false;}DepthTexture.prototype=Object.create(Texture.prototype);DepthTexture.prototype.constructor=DepthTexture;DepthTexture.prototype.isDepthTexture=true;/**
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/function WireframeGeometry(geometry){BufferGeometry.call(this);this.type='WireframeGeometry';// buffer
var vertices=[];// helper variables
var i,j,l,o,ol;var edge=[0,0],edges={},e,edge1,edge2;var key,keys=['a','b','c'];var vertex;// different logic for Geometry and BufferGeometry
if(geometry&&geometry.isGeometry){// create a data structure that contains all edges without duplicates
var faces=geometry.faces;for(i=0,l=faces.length;i<l;i++){var face=faces[i];for(j=0;j<3;j++){edge1=face[keys[j]];edge2=face[keys[(j+1)%3]];edge[0]=Math.min(edge1,edge2);// sorting prevents duplicates
edge[1]=Math.max(edge1,edge2);key=edge[0]+','+edge[1];if(edges[key]===undefined){edges[key]={index1:edge[0],index2:edge[1]};}}}// generate vertices
for(key in edges){e=edges[key];vertex=geometry.vertices[e.index1];vertices.push(vertex.x,vertex.y,vertex.z);vertex=geometry.vertices[e.index2];vertices.push(vertex.x,vertex.y,vertex.z);}}else if(geometry&&geometry.isBufferGeometry){var position,indices,groups;var group,start,count;var index1,index2;vertex=new Vector3();if(geometry.index!==null){// indexed BufferGeometry
position=geometry.attributes.position;indices=geometry.index;groups=geometry.groups;if(groups.length===0){groups=[{start:0,count:indices.count,materialIndex:0}];}// create a data structure that contains all eges without duplicates
for(o=0,ol=groups.length;o<ol;++o){group=groups[o];start=group.start;count=group.count;for(i=start,l=start+count;i<l;i+=3){for(j=0;j<3;j++){edge1=indices.getX(i+j);edge2=indices.getX(i+(j+1)%3);edge[0]=Math.min(edge1,edge2);// sorting prevents duplicates
edge[1]=Math.max(edge1,edge2);key=edge[0]+','+edge[1];if(edges[key]===undefined){edges[key]={index1:edge[0],index2:edge[1]};}}}}// generate vertices
for(key in edges){e=edges[key];vertex.fromBufferAttribute(position,e.index1);vertices.push(vertex.x,vertex.y,vertex.z);vertex.fromBufferAttribute(position,e.index2);vertices.push(vertex.x,vertex.y,vertex.z);}}else{// non-indexed BufferGeometry
position=geometry.attributes.position;for(i=0,l=position.count/3;i<l;i++){for(j=0;j<3;j++){// three edges per triangle, an edge is represented as (index1, index2)
// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)
index1=3*i+j;vertex.fromBufferAttribute(position,index1);vertices.push(vertex.x,vertex.y,vertex.z);index2=3*i+(j+1)%3;vertex.fromBufferAttribute(position,index2);vertices.push(vertex.x,vertex.y,vertex.z);}}}}// build geometry
this.addAttribute('position',new Float32BufferAttribute(vertices,3));}WireframeGeometry.prototype=Object.create(BufferGeometry.prototype);WireframeGeometry.prototype.constructor=WireframeGeometry;/**
* @author zz85 / https://github.com/zz85
* @author Mugen87 / https://github.com/Mugen87
*
* Parametric Surfaces Geometry
* based on the brilliant article by @prideout http://prideout.net/blog/?p=44
*/ // ParametricGeometry
function ParametricGeometry(func,slices,stacks){Geometry.call(this);this.type='ParametricGeometry';this.parameters={func:func,slices:slices,stacks:stacks};this.fromBufferGeometry(new ParametricBufferGeometry(func,slices,stacks));this.mergeVertices();}ParametricGeometry.prototype=Object.create(Geometry.prototype);ParametricGeometry.prototype.constructor=ParametricGeometry;// ParametricBufferGeometry
function ParametricBufferGeometry(func,slices,stacks){BufferGeometry.call(this);this.type='ParametricBufferGeometry';this.parameters={func:func,slices:slices,stacks:stacks};// buffers
var indices=[];var vertices=[];var normals=[];var uvs=[];var EPS=0.00001;var normal=new Vector3();var p0=new Vector3(),p1=new Vector3();var pu=new Vector3(),pv=new Vector3();var i,j;// generate vertices, normals and uvs
var sliceCount=slices+1;for(i=0;i<=stacks;i++){var v=i/stacks;for(j=0;j<=slices;j++){var u=j/slices;// vertex
func(u,v,p0);vertices.push(p0.x,p0.y,p0.z);// normal
// approximate tangent vectors via finite differences
if(u-EPS>=0){func(u-EPS,v,p1);pu.subVectors(p0,p1);}else{func(u+EPS,v,p1);pu.subVectors(p1,p0);}if(v-EPS>=0){func(u,v-EPS,p1);pv.subVectors(p0,p1);}else{func(u,v+EPS,p1);pv.subVectors(p1,p0);}// cross product of tangent vectors returns surface normal
normal.crossVectors(pu,pv).normalize();normals.push(normal.x,normal.y,normal.z);// uv
uvs.push(u,v);}}// generate indices
for(i=0;i<stacks;i++){for(j=0;j<slices;j++){var a=i*sliceCount+j;var b=i*sliceCount+j+1;var c=(i+1)*sliceCount+j+1;var d=(i+1)*sliceCount+j;// faces one and two
indices.push(a,b,d);indices.push(b,c,d);}}// build geometry
this.setIndex(indices);this.addAttribute('position',new Float32BufferAttribute(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));}ParametricBufferGeometry.prototype=Object.create(BufferGeometry.prototype);ParametricBufferGeometry.prototype.constructor=ParametricBufferGeometry;/**
* @author clockworkgeek / https://github.com/clockworkgeek
* @author timothypratley / https://github.com/timothypratley
* @author WestLangley / http://github.com/WestLangley
* @author Mugen87 / https://github.com/Mugen87
*/ // PolyhedronGeometry
function PolyhedronGeometry(vertices,indices,radius,detail){Geometry.call(this);this.type='PolyhedronGeometry';this.parameters={vertices:vertices,indices:indices,radius:radius,detail:detail};this.fromBufferGeometry(new PolyhedronBufferGeometry(vertices,indices,radius,detail));this.mergeVertices();}PolyhedronGeometry.prototype=Object.create(Geometry.prototype);PolyhedronGeometry.prototype.constructor=PolyhedronGeometry;// PolyhedronBufferGeometry
function PolyhedronBufferGeometry(vertices,indices,radius,detail){BufferGeometry.call(this);this.type='PolyhedronBufferGeometry';this.parameters={vertices:vertices,indices:indices,radius:radius,detail:detail};radius=radius||1;detail=detail||0;// default buffer data
var vertexBuffer=[];var uvBuffer=[];// the subdivision creates the vertex buffer data
subdivide(detail);// all vertices should lie on a conceptual sphere with a given radius
appplyRadius(radius);// finally, create the uv data
generateUVs();// build non-indexed geometry
this.addAttribute('position',new Float32BufferAttribute(vertexBuffer,3));this.addAttribute('normal',new Float32BufferAttribute(vertexBuffer.slice(),3));this.addAttribute('uv',new Float32BufferAttribute(uvBuffer,2));if(detail===0){this.computeVertexNormals();// flat normals
}else{this.normalizeNormals();// smooth normals
}// helper functions
function subdivide(detail){var a=new Vector3();var b=new Vector3();var c=new Vector3();// iterate over all faces and apply a subdivison with the given detail value
for(var i=0;i<indices.length;i+=3){// get the vertices of the face
getVertexByIndex(indices[i+0],a);getVertexByIndex(indices[i+1],b);getVertexByIndex(indices[i+2],c);// perform subdivision
subdivideFace(a,b,c,detail);}}function subdivideFace(a,b,c,detail){var cols=Math.pow(2,detail);// we use this multidimensional array as a data structure for creating the subdivision
var v=[];var i,j;// construct all of the vertices for this subdivision
for(i=0;i<=cols;i++){v[i]=[];var aj=a.clone().lerp(c,i/cols);var bj=b.clone().lerp(c,i/cols);var rows=cols-i;for(j=0;j<=rows;j++){if(j===0&&i===cols){v[i][j]=aj;}else{v[i][j]=aj.clone().lerp(bj,j/rows);}}}// construct all of the faces
for(i=0;i<cols;i++){for(j=0;j<2*(cols-i)-1;j++){var k=Math.floor(j/2);if(j%2===0){pushVertex(v[i][k+1]);pushVertex(v[i+1][k]);pushVertex(v[i][k]);}else{pushVertex(v[i][k+1]);pushVertex(v[i+1][k+1]);pushVertex(v[i+1][k]);}}}}function appplyRadius(radius){var vertex=new Vector3();// iterate over the entire buffer and apply the radius to each vertex
for(var i=0;i<vertexBuffer.length;i+=3){vertex.x=vertexBuffer[i+0];vertex.y=vertexBuffer[i+1];vertex.z=vertexBuffer[i+2];vertex.normalize().multiplyScalar(radius);vertexBuffer[i+0]=vertex.x;vertexBuffer[i+1]=vertex.y;vertexBuffer[i+2]=vertex.z;}}function generateUVs(){var vertex=new Vector3();for(var i=0;i<vertexBuffer.length;i+=3){vertex.x=vertexBuffer[i+0];vertex.y=vertexBuffer[i+1];vertex.z=vertexBuffer[i+2];var u=azimuth(vertex)/2/Math.PI+0.5;var v=inclination(vertex)/Math.PI+0.5;uvBuffer.push(u,1-v);}correctUVs();correctSeam();}function correctSeam(){// handle case when face straddles the seam, see #3269
for(var i=0;i<uvBuffer.length;i+=6){// uv data of a single face
var x0=uvBuffer[i+0];var x1=uvBuffer[i+2];var x2=uvBuffer[i+4];var max=Math.max(x0,x1,x2);var min=Math.min(x0,x1,x2);// 0.9 is somewhat arbitrary
if(max>0.9&&min<0.1){if(x0<0.2)uvBuffer[i+0]+=1;if(x1<0.2)uvBuffer[i+2]+=1;if(x2<0.2)uvBuffer[i+4]+=1;}}}function pushVertex(vertex){vertexBuffer.push(vertex.x,vertex.y,vertex.z);}function getVertexByIndex(index,vertex){var stride=index*3;vertex.x=vertices[stride+0];vertex.y=vertices[stride+1];vertex.z=vertices[stride+2];}function correctUVs(){var a=new Vector3();var b=new Vector3();var c=new Vector3();var centroid=new Vector3();var uvA=new Vector2();var uvB=new Vector2();var uvC=new Vector2();for(var i=0,j=0;i<vertexBuffer.length;i+=9,j+=6){a.set(vertexBuffer[i+0],vertexBuffer[i+1],vertexBuffer[i+2]);b.set(vertexBuffer[i+3],vertexBuffer[i+4],vertexBuffer[i+5]);c.set(vertexBuffer[i+6],vertexBuffer[i+7],vertexBuffer[i+8]);uvA.set(uvBuffer[j+0],uvBuffer[j+1]);uvB.set(uvBuffer[j+2],uvBuffer[j+3]);uvC.set(uvBuffer[j+4],uvBuffer[j+5]);centroid.copy(a).add(b).add(c).divideScalar(3);var azi=azimuth(centroid);correctUV(uvA,j+0,a,azi);correctUV(uvB,j+2,b,azi);correctUV(uvC,j+4,c,azi);}}function correctUV(uv,stride,vector,azimuth){if(azimuth<0&&uv.x===1){uvBuffer[stride]=uv.x-1;}if(vector.x===0&&vector.z===0){uvBuffer[stride]=azimuth/2/Math.PI+0.5;}}// Angle around the Y axis, counter-clockwise when looking from above.
function azimuth(vector){return Math.atan2(vector.z,-vector.x);}// Angle above the XZ plane.
function inclination(vector){return Math.atan2(-vector.y,Math.sqrt(vector.x*vector.x+vector.z*vector.z));}}PolyhedronBufferGeometry.prototype=Object.create(BufferGeometry.prototype);PolyhedronBufferGeometry.prototype.constructor=PolyhedronBufferGeometry;/**
* @author timothypratley / https://github.com/timothypratley
* @author Mugen87 / https://github.com/Mugen87
*/ // TetrahedronGeometry
function TetrahedronGeometry(radius,detail){Geometry.call(this);this.type='TetrahedronGeometry';this.parameters={radius:radius,detail:detail};this.fromBufferGeometry(new TetrahedronBufferGeometry(radius,detail));this.mergeVertices();}TetrahedronGeometry.prototype=Object.create(Geometry.prototype);TetrahedronGeometry.prototype.constructor=TetrahedronGeometry;// TetrahedronBufferGeometry
function TetrahedronBufferGeometry(radius,detail){var vertices=[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1];var indices=[2,1,0,0,3,2,1,3,0,2,3,1];PolyhedronBufferGeometry.call(this,vertices,indices,radius,detail);this.type='TetrahedronBufferGeometry';this.parameters={radius:radius,detail:detail};}TetrahedronBufferGeometry.prototype=Object.create(PolyhedronBufferGeometry.prototype);TetrahedronBufferGeometry.prototype.constructor=TetrahedronBufferGeometry;/**
* @author timothypratley / https://github.com/timothypratley
* @author Mugen87 / https://github.com/Mugen87
*/ // OctahedronGeometry
function OctahedronGeometry(radius,detail){Geometry.call(this);this.type='OctahedronGeometry';this.parameters={radius:radius,detail:detail};this.fromBufferGeometry(new OctahedronBufferGeometry(radius,detail));this.mergeVertices();}OctahedronGeometry.prototype=Object.create(Geometry.prototype);OctahedronGeometry.prototype.constructor=OctahedronGeometry;// OctahedronBufferGeometry
function OctahedronBufferGeometry(radius,detail){var vertices=[1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1];var indices=[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2];PolyhedronBufferGeometry.call(this,vertices,indices,radius,detail);this.type='OctahedronBufferGeometry';this.parameters={radius:radius,detail:detail};}OctahedronBufferGeometry.prototype=Object.create(PolyhedronBufferGeometry.prototype);OctahedronBufferGeometry.prototype.constructor=OctahedronBufferGeometry;/**
* @author timothypratley / https://github.com/timothypratley
* @author Mugen87 / https://github.com/Mugen87
*/ // IcosahedronGeometry
function IcosahedronGeometry(radius,detail){Geometry.call(this);this.type='IcosahedronGeometry';this.parameters={radius:radius,detail:detail};this.fromBufferGeometry(new IcosahedronBufferGeometry(radius,detail));this.mergeVertices();}IcosahedronGeometry.prototype=Object.create(Geometry.prototype);IcosahedronGeometry.prototype.constructor=IcosahedronGeometry;// IcosahedronBufferGeometry
function IcosahedronBufferGeometry(radius,detail){var t=(1+Math.sqrt(5))/2;var vertices=[-1,t,0,1,t,0,-1,-t,0,1,-t,0,0,-1,t,0,1,t,0,-1,-t,0,1,-t,t,0,-1,t,0,1,-t,0,-1,-t,0,1];var indices=[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1];PolyhedronBufferGeometry.call(this,vertices,indices,radius,detail);this.type='IcosahedronBufferGeometry';this.parameters={radius:radius,detail:detail};}IcosahedronBufferGeometry.prototype=Object.create(PolyhedronBufferGeometry.prototype);IcosahedronBufferGeometry.prototype.constructor=IcosahedronBufferGeometry;/**
* @author Abe Pazos / https://hamoid.com
* @author Mugen87 / https://github.com/Mugen87
*/ // DodecahedronGeometry
function DodecahedronGeometry(radius,detail){Geometry.call(this);this.type='DodecahedronGeometry';this.parameters={radius:radius,detail:detail};this.fromBufferGeometry(new DodecahedronBufferGeometry(radius,detail));this.mergeVertices();}DodecahedronGeometry.prototype=Object.create(Geometry.prototype);DodecahedronGeometry.prototype.constructor=DodecahedronGeometry;// DodecahedronBufferGeometry
function DodecahedronBufferGeometry(radius,detail){var t=(1+Math.sqrt(5))/2;var r=1/t;var vertices=[// (±1, ±1, ±1)
-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,// (0, ±1/φ, ±φ)
0,-r,-t,0,-r,t,0,r,-t,0,r,t,// (±1/φ, ±φ, 0)
-r,-t,0,-r,t,0,r,-t,0,r,t,0,// (±φ, 0, ±1/φ)
-t,0,-r,t,0,-r,-t,0,r,t,0,r];var indices=[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9];PolyhedronBufferGeometry.call(this,vertices,indices,radius,detail);this.type='DodecahedronBufferGeometry';this.parameters={radius:radius,detail:detail};}DodecahedronBufferGeometry.prototype=Object.create(PolyhedronBufferGeometry.prototype);DodecahedronBufferGeometry.prototype.constructor=DodecahedronBufferGeometry;/**
* @author oosmoxiecode / https://github.com/oosmoxiecode
* @author WestLangley / https://github.com/WestLangley
* @author zz85 / https://github.com/zz85
* @author miningold / https://github.com/miningold
* @author jonobr1 / https://github.com/jonobr1
* @author Mugen87 / https://github.com/Mugen87
*
*/ // TubeGeometry
function TubeGeometry(path,tubularSegments,radius,radialSegments,closed,taper){Geometry.call(this);this.type='TubeGeometry';this.parameters={path:path,tubularSegments:tubularSegments,radius:radius,radialSegments:radialSegments,closed:closed};if(taper!==undefined)console.warn('THREE.TubeGeometry: taper has been removed.');var bufferGeometry=new TubeBufferGeometry(path,tubularSegments,radius,radialSegments,closed);// expose internals
this.tangents=bufferGeometry.tangents;this.normals=bufferGeometry.normals;this.binormals=bufferGeometry.binormals;// create geometry
this.fromBufferGeometry(bufferGeometry);this.mergeVertices();}TubeGeometry.prototype=Object.create(Geometry.prototype);TubeGeometry.prototype.constructor=TubeGeometry;// TubeBufferGeometry
function TubeBufferGeometry(path,tubularSegments,radius,radialSegments,closed){BufferGeometry.call(this);this.type='TubeBufferGeometry';this.parameters={path:path,tubularSegments:tubularSegments,radius:radius,radialSegments:radialSegments,closed:closed};tubularSegments=tubularSegments||64;radius=radius||1;radialSegments=radialSegments||8;closed=closed||false;var frames=path.computeFrenetFrames(tubularSegments,closed);// expose internals
this.tangents=frames.tangents;this.normals=frames.normals;this.binormals=frames.binormals;// helper variables
var vertex=new Vector3();var normal=new Vector3();var uv=new Vector2();var P=new Vector3();var i,j;// buffer
var vertices=[];var normals=[];var uvs=[];var indices=[];// create buffer data
generateBufferData();// build geometry
this.setIndex(indices);this.addAttribute('position',new Float32BufferAttribute(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));// functions
function generateBufferData(){for(i=0;i<tubularSegments;i++){generateSegment(i);}// if the geometry is not closed, generate the last row of vertices and normals
// at the regular position on the given path
//
// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)
generateSegment(closed===false?tubularSegments:0);// uvs are generated in a separate function.
// this makes it easy compute correct values for closed geometries
generateUVs();// finally create faces
generateIndices();}function generateSegment(i){// we use getPointAt to sample evenly distributed points from the given path
P=path.getPointAt(i/tubularSegments,P);// retrieve corresponding normal and binormal
var N=frames.normals[i];var B=frames.binormals[i];// generate normals and vertices for the current segment
for(j=0;j<=radialSegments;j++){var v=j/radialSegments*Math.PI*2;var sin=Math.sin(v);var cos=-Math.cos(v);// normal
normal.x=cos*N.x+sin*B.x;normal.y=cos*N.y+sin*B.y;normal.z=cos*N.z+sin*B.z;normal.normalize();normals.push(normal.x,normal.y,normal.z);// vertex
vertex.x=P.x+radius*normal.x;vertex.y=P.y+radius*normal.y;vertex.z=P.z+radius*normal.z;vertices.push(vertex.x,vertex.y,vertex.z);}}function generateIndices(){for(j=1;j<=tubularSegments;j++){for(i=1;i<=radialSegments;i++){var a=(radialSegments+1)*(j-1)+(i-1);var b=(radialSegments+1)*j+(i-1);var c=(radialSegments+1)*j+i;var d=(radialSegments+1)*(j-1)+i;// faces
indices.push(a,b,d);indices.push(b,c,d);}}}function generateUVs(){for(i=0;i<=tubularSegments;i++){for(j=0;j<=radialSegments;j++){uv.x=i/tubularSegments;uv.y=j/radialSegments;uvs.push(uv.x,uv.y);}}}}TubeBufferGeometry.prototype=Object.create(BufferGeometry.prototype);TubeBufferGeometry.prototype.constructor=TubeBufferGeometry;/**
* @author oosmoxiecode
* @author Mugen87 / https://github.com/Mugen87
*
* based on http://www.blackpawn.com/texts/pqtorus/
*/ // TorusKnotGeometry
function TorusKnotGeometry(radius,tube,tubularSegments,radialSegments,p,q,heightScale){Geometry.call(this);this.type='TorusKnotGeometry';this.parameters={radius:radius,tube:tube,tubularSegments:tubularSegments,radialSegments:radialSegments,p:p,q:q};if(heightScale!==undefined)console.warn('THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.');this.fromBufferGeometry(new TorusKnotBufferGeometry(radius,tube,tubularSegments,radialSegments,p,q));this.mergeVertices();}TorusKnotGeometry.prototype=Object.create(Geometry.prototype);TorusKnotGeometry.prototype.constructor=TorusKnotGeometry;// TorusKnotBufferGeometry
function TorusKnotBufferGeometry(radius,tube,tubularSegments,radialSegments,p,q){BufferGeometry.call(this);this.type='TorusKnotBufferGeometry';this.parameters={radius:radius,tube:tube,tubularSegments:tubularSegments,radialSegments:radialSegments,p:p,q:q};radius=radius||1;tube=tube||0.4;tubularSegments=Math.floor(tubularSegments)||64;radialSegments=Math.floor(radialSegments)||8;p=p||2;q=q||3;// buffers
var indices=[];var vertices=[];var normals=[];var uvs=[];// helper variables
var i,j;var vertex=new Vector3();var normal=new Vector3();var P1=new Vector3();var P2=new Vector3();var B=new Vector3();var T=new Vector3();var N=new Vector3();// generate vertices, normals and uvs
for(i=0;i<=tubularSegments;++i){// the radian "u" is used to calculate the position on the torus curve of the current tubular segement
var u=i/tubularSegments*p*Math.PI*2;// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.
// these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions
calculatePositionOnCurve(u,p,q,radius,P1);calculatePositionOnCurve(u+0.01,p,q,radius,P2);// calculate orthonormal basis
T.subVectors(P2,P1);N.addVectors(P2,P1);B.crossVectors(T,N);N.crossVectors(B,T);// normalize B, N. T can be ignored, we don't use it
B.normalize();N.normalize();for(j=0;j<=radialSegments;++j){// now calculate the vertices. they are nothing more than an extrusion of the torus curve.
// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.
var v=j/radialSegments*Math.PI*2;var cx=-tube*Math.cos(v);var cy=tube*Math.sin(v);// now calculate the final vertex position.
// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve
vertex.x=P1.x+(cx*N.x+cy*B.x);vertex.y=P1.y+(cx*N.y+cy*B.y);vertex.z=P1.z+(cx*N.z+cy*B.z);vertices.push(vertex.x,vertex.y,vertex.z);// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)
normal.subVectors(vertex,P1).normalize();normals.push(normal.x,normal.y,normal.z);// uv
uvs.push(i/tubularSegments);uvs.push(j/radialSegments);}}// generate indices
for(j=1;j<=tubularSegments;j++){for(i=1;i<=radialSegments;i++){// indices
var a=(radialSegments+1)*(j-1)+(i-1);var b=(radialSegments+1)*j+(i-1);var c=(radialSegments+1)*j+i;var d=(radialSegments+1)*(j-1)+i;// faces
indices.push(a,b,d);indices.push(b,c,d);}}// build geometry
this.setIndex(indices);this.addAttribute('position',new Float32BufferAttribute(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));// this function calculates the current position on the torus curve
function calculatePositionOnCurve(u,p,q,radius,position){var cu=Math.cos(u);var su=Math.sin(u);var quOverP=q/p*u;var cs=Math.cos(quOverP);position.x=radius*(2+cs)*0.5*cu;position.y=radius*(2+cs)*su*0.5;position.z=radius*Math.sin(quOverP)*0.5;}}TorusKnotBufferGeometry.prototype=Object.create(BufferGeometry.prototype);TorusKnotBufferGeometry.prototype.constructor=TorusKnotBufferGeometry;/**
* @author oosmoxiecode
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/ // TorusGeometry
function TorusGeometry(radius,tube,radialSegments,tubularSegments,arc){Geometry.call(this);this.type='TorusGeometry';this.parameters={radius:radius,tube:tube,radialSegments:radialSegments,tubularSegments:tubularSegments,arc:arc};this.fromBufferGeometry(new TorusBufferGeometry(radius,tube,radialSegments,tubularSegments,arc));this.mergeVertices();}TorusGeometry.prototype=Object.create(Geometry.prototype);TorusGeometry.prototype.constructor=TorusGeometry;// TorusBufferGeometry
function TorusBufferGeometry(radius,tube,radialSegments,tubularSegments,arc){BufferGeometry.call(this);this.type='TorusBufferGeometry';this.parameters={radius:radius,tube:tube,radialSegments:radialSegments,tubularSegments:tubularSegments,arc:arc};radius=radius||1;tube=tube||0.4;radialSegments=Math.floor(radialSegments)||8;tubularSegments=Math.floor(tubularSegments)||6;arc=arc||Math.PI*2;// buffers
var indices=[];var vertices=[];var normals=[];var uvs=[];// helper variables
var center=new Vector3();var vertex=new Vector3();var normal=new Vector3();var j,i;// generate vertices, normals and uvs
for(j=0;j<=radialSegments;j++){for(i=0;i<=tubularSegments;i++){var u=i/tubularSegments*arc;var v=j/radialSegments*Math.PI*2;// vertex
vertex.x=(radius+tube*Math.cos(v))*Math.cos(u);vertex.y=(radius+tube*Math.cos(v))*Math.sin(u);vertex.z=tube*Math.sin(v);vertices.push(vertex.x,vertex.y,vertex.z);// normal
center.x=radius*Math.cos(u);center.y=radius*Math.sin(u);normal.subVectors(vertex,center).normalize();normals.push(normal.x,normal.y,normal.z);// uv
uvs.push(i/tubularSegments);uvs.push(j/radialSegments);}}// generate indices
for(j=1;j<=radialSegments;j++){for(i=1;i<=tubularSegments;i++){// indices
var a=(tubularSegments+1)*j+i-1;var b=(tubularSegments+1)*(j-1)+i-1;var c=(tubularSegments+1)*(j-1)+i;var d=(tubularSegments+1)*j+i;// faces
indices.push(a,b,d);indices.push(b,c,d);}}// build geometry
this.setIndex(indices);this.addAttribute('position',new Float32BufferAttribute(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));}TorusBufferGeometry.prototype=Object.create(BufferGeometry.prototype);TorusBufferGeometry.prototype.constructor=TorusBufferGeometry;/**
* @author Mugen87 / https://github.com/Mugen87
* Port from https://github.com/mapbox/earcut (v2.1.2)
*/var Earcut={triangulate:function(data,holeIndices,dim){dim=dim||2;var hasHoles=holeIndices&&holeIndices.length,outerLen=hasHoles?holeIndices[0]*dim:data.length,outerNode=linkedList(data,0,outerLen,dim,true),triangles=[];if(!outerNode)return triangles;var minX,minY,maxX,maxY,x,y,invSize;if(hasHoles)outerNode=eliminateHoles(data,holeIndices,outerNode,dim);// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
if(data.length>80*dim){minX=maxX=data[0];minY=maxY=data[1];for(var i=dim;i<outerLen;i+=dim){x=data[i];y=data[i+1];if(x<minX)minX=x;if(y<minY)minY=y;if(x>maxX)maxX=x;if(y>maxY)maxY=y;}// minX, minY and invSize are later used to transform coords into integers for z-order calculation
invSize=Math.max(maxX-minX,maxY-minY);invSize=invSize!==0?1/invSize:0;}earcutLinked(outerNode,triangles,dim,minX,minY,invSize);return triangles;}};// create a circular doubly linked list from polygon points in the specified winding order
function linkedList(data,start,end,dim,clockwise){var i,last;if(clockwise===signedArea(data,start,end,dim)>0){for(i=start;i<end;i+=dim)last=insertNode(i,data[i],data[i+1],last);}else{for(i=end-dim;i>=start;i-=dim)last=insertNode(i,data[i],data[i+1],last);}if(last&&equals(last,last.next)){removeNode(last);last=last.next;}return last;}// eliminate colinear or duplicate points
function filterPoints(start,end){if(!start)return start;if(!end)end=start;var p=start,again;do{again=false;if(!p.steiner&&(equals(p,p.next)||area(p.prev,p,p.next)===0)){removeNode(p);p=end=p.prev;if(p===p.next)break;again=true;}else{p=p.next;}}while(again||p!==end);return end;}// main ear slicing loop which triangulates a polygon (given as a linked list)
function earcutLinked(ear,triangles,dim,minX,minY,invSize,pass){if(!ear)return;// interlink polygon nodes in z-order
if(!pass&&invSize)indexCurve(ear,minX,minY,invSize);var stop=ear,prev,next;// iterate through ears, slicing them one by one
while(ear.prev!==ear.next){prev=ear.prev;next=ear.next;if(invSize?isEarHashed(ear,minX,minY,invSize):isEar(ear)){// cut off the triangle
triangles.push(prev.i/dim);triangles.push(ear.i/dim);triangles.push(next.i/dim);removeNode(ear);// skipping the next vertice leads to less sliver triangles
ear=next.next;stop=next.next;continue;}ear=next;// if we looped through the whole remaining polygon and can't find any more ears
if(ear===stop){// try filtering points and slicing again
if(!pass){earcutLinked(filterPoints(ear),triangles,dim,minX,minY,invSize,1);// if this didn't work, try curing all small self-intersections locally
}else if(pass===1){ear=cureLocalIntersections(ear,triangles,dim);earcutLinked(ear,triangles,dim,minX,minY,invSize,2);// as a last resort, try splitting the remaining polygon into two
}else if(pass===2){splitEarcut(ear,triangles,dim,minX,minY,invSize);}break;}}}// check whether a polygon node forms a valid ear with adjacent nodes
function isEar(ear){var a=ear.prev,b=ear,c=ear.next;if(area(a,b,c)>=0)return false;// reflex, can't be an ear
// now make sure we don't have other points inside the potential ear
var p=ear.next.next;while(p!==ear.prev){if(pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,p.x,p.y)&&area(p.prev,p,p.next)>=0){return false;}p=p.next;}return true;}function isEarHashed(ear,minX,minY,invSize){var a=ear.prev,b=ear,c=ear.next;if(area(a,b,c)>=0)return false;// reflex, can't be an ear
// triangle bbox; min & max are calculated like this for speed
var minTX=a.x<b.x?a.x<c.x?a.x:c.x:b.x<c.x?b.x:c.x,minTY=a.y<b.y?a.y<c.y?a.y:c.y:b.y<c.y?b.y:c.y,maxTX=a.x>b.x?a.x>c.x?a.x:c.x:b.x>c.x?b.x:c.x,maxTY=a.y>b.y?a.y>c.y?a.y:c.y:b.y>c.y?b.y:c.y;// z-order range for the current triangle bbox;
var minZ=zOrder(minTX,minTY,minX,minY,invSize),maxZ=zOrder(maxTX,maxTY,minX,minY,invSize);// first look for points inside the triangle in increasing z-order
var p=ear.nextZ;while(p&&p.z<=maxZ){if(p!==ear.prev&&p!==ear.next&&pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,p.x,p.y)&&area(p.prev,p,p.next)>=0)return false;p=p.nextZ;}// then look for points in decreasing z-order
p=ear.prevZ;while(p&&p.z>=minZ){if(p!==ear.prev&&p!==ear.next&&pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,p.x,p.y)&&area(p.prev,p,p.next)>=0)return false;p=p.prevZ;}return true;}// go through all polygon nodes and cure small local self-intersections
function cureLocalIntersections(start,triangles,dim){var p=start;do{var a=p.prev,b=p.next.next;if(!equals(a,b)&&intersects(a,p,p.next,b)&&locallyInside(a,b)&&locallyInside(b,a)){triangles.push(a.i/dim);triangles.push(p.i/dim);triangles.push(b.i/dim);// remove two nodes involved
removeNode(p);removeNode(p.next);p=start=b;}p=p.next;}while(p!==start);return p;}// try splitting polygon into two and triangulate them independently
function splitEarcut(start,triangles,dim,minX,minY,invSize){// look for a valid diagonal that divides the polygon into two
var a=start;do{var b=a.next.next;while(b!==a.prev){if(a.i!==b.i&&isValidDiagonal(a,b)){// split the polygon in two by the diagonal
var c=splitPolygon(a,b);// filter colinear points around the cuts
a=filterPoints(a,a.next);c=filterPoints(c,c.next);// run earcut on each half
earcutLinked(a,triangles,dim,minX,minY,invSize);earcutLinked(c,triangles,dim,minX,minY,invSize);return;}b=b.next;}a=a.next;}while(a!==start);}// link every hole into the outer loop, producing a single-ring polygon without holes
function eliminateHoles(data,holeIndices,outerNode,dim){var queue=[],i,len,start,end,list;for(i=0,len=holeIndices.length;i<len;i++){start=holeIndices[i]*dim;end=i<len-1?holeIndices[i+1]*dim:data.length;list=linkedList(data,start,end,dim,false);if(list===list.next)list.steiner=true;queue.push(getLeftmost(list));}queue.sort(compareX);// process holes from left to right
for(i=0;i<queue.length;i++){eliminateHole(queue[i],outerNode);outerNode=filterPoints(outerNode,outerNode.next);}return outerNode;}function compareX(a,b){return a.x-b.x;}// find a bridge between vertices that connects hole with an outer ring and and link it
function eliminateHole(hole,outerNode){outerNode=findHoleBridge(hole,outerNode);if(outerNode){var b=splitPolygon(outerNode,hole);filterPoints(b,b.next);}}// David Eberly's algorithm for finding a bridge between hole and outer polygon
function findHoleBridge(hole,outerNode){var p=outerNode,hx=hole.x,hy=hole.y,qx=-Infinity,m;// find a segment intersected by a ray from the hole's leftmost point to the left;
// segment's endpoint with lesser x will be potential connection point
do{if(hy<=p.y&&hy>=p.next.y&&p.next.y!==p.y){var x=p.x+(hy-p.y)*(p.next.x-p.x)/(p.next.y-p.y);if(x<=hx&&x>qx){qx=x;if(x===hx){if(hy===p.y)return p;if(hy===p.next.y)return p.next;}m=p.x<p.next.x?p:p.next;}}p=p.next;}while(p!==outerNode);if(!m)return null;if(hx===qx)return m.prev;// hole touches outer segment; pick lower endpoint
// look for points inside the triangle of hole point, segment intersection and endpoint;
// if there are no points found, we have a valid connection;
// otherwise choose the point of the minimum angle with the ray as connection point
var stop=m,mx=m.x,my=m.y,tanMin=Infinity,tan;p=m.next;while(p!==stop){if(hx>=p.x&&p.x>=mx&&hx!==p.x&&pointInTriangle(hy<my?hx:qx,hy,mx,my,hy<my?qx:hx,hy,p.x,p.y)){tan=Math.abs(hy-p.y)/(hx-p.x);// tangential
if((tan<tanMin||tan===tanMin&&p.x>m.x)&&locallyInside(p,hole)){m=p;tanMin=tan;}}p=p.next;}return m;}// interlink polygon nodes in z-order
function indexCurve(start,minX,minY,invSize){var p=start;do{if(p.z===null)p.z=zOrder(p.x,p.y,minX,minY,invSize);p.prevZ=p.prev;p.nextZ=p.next;p=p.next;}while(p!==start);p.prevZ.nextZ=null;p.prevZ=null;sortLinked(p);}// Simon Tatham's linked list merge sort algorithm
// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
function sortLinked(list){var i,p,q,e,tail,numMerges,pSize,qSize,inSize=1;do{p=list;list=null;tail=null;numMerges=0;while(p){numMerges++;q=p;pSize=0;for(i=0;i<inSize;i++){pSize++;q=q.nextZ;if(!q)break;}qSize=inSize;while(pSize>0||qSize>0&&q){if(pSize!==0&&(qSize===0||!q||p.z<=q.z)){e=p;p=p.nextZ;pSize--;}else{e=q;q=q.nextZ;qSize--;}if(tail)tail.nextZ=e;else list=e;e.prevZ=tail;tail=e;}p=q;}tail.nextZ=null;inSize*=2;}while(numMerges>1);return list;}// z-order of a point given coords and inverse of the longer side of data bbox
function zOrder(x,y,minX,minY,invSize){// coords are transformed into non-negative 15-bit integer range
x=32767*(x-minX)*invSize;y=32767*(y-minY)*invSize;x=(x|x<<8)&0x00FF00FF;x=(x|x<<4)&0x0F0F0F0F;x=(x|x<<2)&0x33333333;x=(x|x<<1)&0x55555555;y=(y|y<<8)&0x00FF00FF;y=(y|y<<4)&0x0F0F0F0F;y=(y|y<<2)&0x33333333;y=(y|y<<1)&0x55555555;return x|y<<1;}// find the leftmost node of a polygon ring
function getLeftmost(start){var p=start,leftmost=start;do{if(p.x<leftmost.x)leftmost=p;p=p.next;}while(p!==start);return leftmost;}// check if a point lies within a convex triangle
function pointInTriangle(ax,ay,bx,by,cx,cy,px,py){return (cx-px)*(ay-py)-(ax-px)*(cy-py)>=0&&(ax-px)*(by-py)-(bx-px)*(ay-py)>=0&&(bx-px)*(cy-py)-(cx-px)*(by-py)>=0;}// check if a diagonal between two polygon nodes is valid (lies in polygon interior)
function isValidDiagonal(a,b){return a.next.i!==b.i&&a.prev.i!==b.i&&!intersectsPolygon(a,b)&&locallyInside(a,b)&&locallyInside(b,a)&&middleInside(a,b);}// signed area of a triangle
function area(p,q,r){return (q.y-p.y)*(r.x-q.x)-(q.x-p.x)*(r.y-q.y);}// check if two points are equal
function equals(p1,p2){return p1.x===p2.x&&p1.y===p2.y;}// check if two segments intersect
function intersects(p1,q1,p2,q2){if(equals(p1,q1)&&equals(p2,q2)||equals(p1,q2)&&equals(p2,q1))return true;return area(p1,q1,p2)>0!==area(p1,q1,q2)>0&&area(p2,q2,p1)>0!==area(p2,q2,q1)>0;}// check if a polygon diagonal intersects any polygon segments
function intersectsPolygon(a,b){var p=a;do{if(p.i!==a.i&&p.next.i!==a.i&&p.i!==b.i&&p.next.i!==b.i&&intersects(p,p.next,a,b)){return true;}p=p.next;}while(p!==a);return false;}// check if a polygon diagonal is locally inside the polygon
function locallyInside(a,b){return area(a.prev,a,a.next)<0?area(a,b,a.next)>=0&&area(a,a.prev,b)>=0:area(a,b,a.prev)<0||area(a,a.next,b)<0;}// check if the middle point of a polygon diagonal is inside the polygon
function middleInside(a,b){var p=a,inside=false,px=(a.x+b.x)/2,py=(a.y+b.y)/2;do{if(p.y>py!==p.next.y>py&&p.next.y!==p.y&&px<(p.next.x-p.x)*(py-p.y)/(p.next.y-p.y)+p.x){inside=!inside;}p=p.next;}while(p!==a);return inside;}// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
// if one belongs to the outer ring and another to a hole, it merges it into a single ring
function splitPolygon(a,b){var a2=new Node(a.i,a.x,a.y),b2=new Node(b.i,b.x,b.y),an=a.next,bp=b.prev;a.next=b;b.prev=a;a2.next=an;an.prev=a2;b2.next=a2;a2.prev=b2;bp.next=b2;b2.prev=bp;return b2;}// create a node and optionally link it with previous one (in a circular doubly linked list)
function insertNode(i,x,y,last){var p=new Node(i,x,y);if(!last){p.prev=p;p.next=p;}else{p.next=last.next;p.prev=last;last.next.prev=p;last.next=p;}return p;}function removeNode(p){p.next.prev=p.prev;p.prev.next=p.next;if(p.prevZ)p.prevZ.nextZ=p.nextZ;if(p.nextZ)p.nextZ.prevZ=p.prevZ;}function Node(i,x,y){// vertice index in coordinates array
this.i=i;// vertex coordinates
this.x=x;this.y=y;// previous and next vertice nodes in a polygon ring
this.prev=null;this.next=null;// z-order curve value
this.z=null;// previous and next nodes in z-order
this.prevZ=null;this.nextZ=null;// indicates whether this is a steiner point
this.steiner=false;}function signedArea(data,start,end,dim){var sum=0;for(var i=start,j=end-dim;i<end;i+=dim){sum+=(data[j]-data[i])*(data[i+1]+data[j+1]);j=i;}return sum;}/**
* @author zz85 / http://www.lab4games.net/zz85/blog
*/var ShapeUtils={// calculate area of the contour polygon
area:function(contour){var n=contour.length;var a=0.0;for(var p=n-1,q=0;q<n;p=q++){a+=contour[p].x*contour[q].y-contour[q].x*contour[p].y;}return a*0.5;},isClockWise:function(pts){return ShapeUtils.area(pts)<0;},triangulateShape:function(contour,holes){var vertices=[];// flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]
var holeIndices=[];// array of hole indices
var faces=[];// final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]
removeDupEndPts(contour);addContour(vertices,contour);//
var holeIndex=contour.length;holes.forEach(removeDupEndPts);for(var i=0;i<holes.length;i++){holeIndices.push(holeIndex);holeIndex+=holes[i].length;addContour(vertices,holes[i]);}//
var triangles=Earcut.triangulate(vertices,holeIndices);//
for(var i=0;i<triangles.length;i+=3){faces.push(triangles.slice(i,i+3));}return faces;}};function removeDupEndPts(points){var l=points.length;if(l>2&&points[l-1].equals(points[0])){points.pop();}}function addContour(vertices,contour){for(var i=0;i<contour.length;i++){vertices.push(contour[i].x);vertices.push(contour[i].y);}}/**
* @author zz85 / http://www.lab4games.net/zz85/blog
*
* Creates extruded geometry from a path shape.
*
* parameters = {
*
* curveSegments: <int>, // number of points on the curves
* steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too
* amount: <int>, // Depth to extrude the shape
*
* bevelEnabled: <bool>, // turn on bevel
* bevelThickness: <float>, // how deep into the original shape bevel goes
* bevelSize: <float>, // how far from shape outline is bevel
* bevelSegments: <int>, // number of bevel layers
*
* extrudePath: <THREE.Curve> // curve to extrude shape along
*
* UVGenerator: <Object> // object that provides UV generator functions
*
* }
*/ // ExtrudeGeometry
function ExtrudeGeometry(shapes,options){Geometry.call(this);this.type='ExtrudeGeometry';this.parameters={shapes:shapes,options:options};this.fromBufferGeometry(new ExtrudeBufferGeometry(shapes,options));this.mergeVertices();}ExtrudeGeometry.prototype=Object.create(Geometry.prototype);ExtrudeGeometry.prototype.constructor=ExtrudeGeometry;// ExtrudeBufferGeometry
function ExtrudeBufferGeometry(shapes,options){BufferGeometry.call(this);this.type='ExtrudeBufferGeometry';this.parameters={shapes:shapes,options:options};shapes=Array.isArray(shapes)?shapes:[shapes];var scope=this;var verticesArray=[];var uvArray=[];for(var i=0,l=shapes.length;i<l;i++){var shape=shapes[i];addShape(shape,options);}// build geometry
this.addAttribute('position',new Float32BufferAttribute(verticesArray,3));this.addAttribute('uv',new Float32BufferAttribute(uvArray,2));this.computeVertexNormals();// functions
function addShape(shape){var placeholder=[];// options
var curveSegments=options.curveSegments!==undefined?options.curveSegments:12;var steps=options.steps!==undefined?options.steps:1;var amount=options.amount!==undefined?options.amount:100;var bevelEnabled=options.bevelEnabled!==undefined?options.bevelEnabled:true;var bevelThickness=options.bevelThickness!==undefined?options.bevelThickness:6;var bevelSize=options.bevelSize!==undefined?options.bevelSize:bevelThickness-2;var bevelSegments=options.bevelSegments!==undefined?options.bevelSegments:3;var extrudePath=options.extrudePath;var uvgen=options.UVGenerator!==undefined?options.UVGenerator:WorldUVGenerator;//
var extrudePts,extrudeByPath=false;var splineTube,binormal,normal,position2;if(extrudePath){extrudePts=extrudePath.getSpacedPoints(steps);extrudeByPath=true;bevelEnabled=false;// bevels not supported for path extrusion
// SETUP TNB variables
// TODO1 - have a .isClosed in spline?
splineTube=extrudePath.computeFrenetFrames(steps,false);// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);
binormal=new Vector3();normal=new Vector3();position2=new Vector3();}// Safeguards if bevels are not enabled
if(!bevelEnabled){bevelSegments=0;bevelThickness=0;bevelSize=0;}// Variables initialization
var ahole,h,hl;// looping of holes
var shapePoints=shape.extractPoints(curveSegments);var vertices=shapePoints.shape;var holes=shapePoints.holes;var reverse=!ShapeUtils.isClockWise(vertices);if(reverse){vertices=vertices.reverse();// Maybe we should also check if holes are in the opposite direction, just to be safe ...
for(h=0,hl=holes.length;h<hl;h++){ahole=holes[h];if(ShapeUtils.isClockWise(ahole)){holes[h]=ahole.reverse();}}}var faces=ShapeUtils.triangulateShape(vertices,holes);/* Vertices */var contour=vertices;// vertices has all points but contour has only points of circumference
for(h=0,hl=holes.length;h<hl;h++){ahole=holes[h];vertices=vertices.concat(ahole);}function scalePt2(pt,vec,size){if(!vec)console.error("THREE.ExtrudeGeometry: vec does not exist");return vec.clone().multiplyScalar(size).add(pt);}var b,bs,t,z,vert,vlen=vertices.length,face,flen=faces.length;// Find directions for point movement
function getBevelVec(inPt,inPrev,inNext){// computes for inPt the corresponding point inPt' on a new contour
// shifted by 1 unit (length of normalized vector) to the left
// if we walk along contour clockwise, this new contour is outside the old one
//
// inPt' is the intersection of the two lines parallel to the two
// adjacent edges of inPt at a distance of 1 unit on the left side.
var v_trans_x,v_trans_y,shrink_by;// resulting translation vector for inPt
// good reading for geometry algorithms (here: line-line intersection)
// http://geomalgorithms.com/a05-_intersect-1.html
var v_prev_x=inPt.x-inPrev.x,v_prev_y=inPt.y-inPrev.y;var v_next_x=inNext.x-inPt.x,v_next_y=inNext.y-inPt.y;var v_prev_lensq=v_prev_x*v_prev_x+v_prev_y*v_prev_y;// check for collinear edges
var collinear0=v_prev_x*v_next_y-v_prev_y*v_next_x;if(Math.abs(collinear0)>Number.EPSILON){// not collinear
// length of vectors for normalizing
var v_prev_len=Math.sqrt(v_prev_lensq);var v_next_len=Math.sqrt(v_next_x*v_next_x+v_next_y*v_next_y);// shift adjacent points by unit vectors to the left
var ptPrevShift_x=inPrev.x-v_prev_y/v_prev_len;var ptPrevShift_y=inPrev.y+v_prev_x/v_prev_len;var ptNextShift_x=inNext.x-v_next_y/v_next_len;var ptNextShift_y=inNext.y+v_next_x/v_next_len;// scaling factor for v_prev to intersection point
var sf=((ptNextShift_x-ptPrevShift_x)*v_next_y-(ptNextShift_y-ptPrevShift_y)*v_next_x)/(v_prev_x*v_next_y-v_prev_y*v_next_x);// vector from inPt to intersection point
v_trans_x=ptPrevShift_x+v_prev_x*sf-inPt.x;v_trans_y=ptPrevShift_y+v_prev_y*sf-inPt.y;// Don't normalize!, otherwise sharp corners become ugly
// but prevent crazy spikes
var v_trans_lensq=v_trans_x*v_trans_x+v_trans_y*v_trans_y;if(v_trans_lensq<=2){return new Vector2(v_trans_x,v_trans_y);}else{shrink_by=Math.sqrt(v_trans_lensq/2);}}else{// handle special case of collinear edges
var direction_eq=false;// assumes: opposite
if(v_prev_x>Number.EPSILON){if(v_next_x>Number.EPSILON){direction_eq=true;}}else{if(v_prev_x<-Number.EPSILON){if(v_next_x<-Number.EPSILON){direction_eq=true;}}else{if(Math.sign(v_prev_y)===Math.sign(v_next_y)){direction_eq=true;}}}if(direction_eq){// console.log("Warning: lines are a straight sequence");
v_trans_x=-v_prev_y;v_trans_y=v_prev_x;shrink_by=Math.sqrt(v_prev_lensq);}else{// console.log("Warning: lines are a straight spike");
v_trans_x=v_prev_x;v_trans_y=v_prev_y;shrink_by=Math.sqrt(v_prev_lensq/2);}}return new Vector2(v_trans_x/shrink_by,v_trans_y/shrink_by);}var contourMovements=[];for(var i=0,il=contour.length,j=il-1,k=i+1;i<il;i++,j++,k++){if(j===il)j=0;if(k===il)k=0;// (j)---(i)---(k)
// console.log('i,j,k', i, j , k)
contourMovements[i]=getBevelVec(contour[i],contour[j],contour[k]);}var holesMovements=[],oneHoleMovements,verticesMovements=contourMovements.concat();for(h=0,hl=holes.length;h<hl;h++){ahole=holes[h];oneHoleMovements=[];for(i=0,il=ahole.length,j=il-1,k=i+1;i<il;i++,j++,k++){if(j===il)j=0;if(k===il)k=0;// (j)---(i)---(k)
oneHoleMovements[i]=getBevelVec(ahole[i],ahole[j],ahole[k]);}holesMovements.push(oneHoleMovements);verticesMovements=verticesMovements.concat(oneHoleMovements);}// Loop bevelSegments, 1 for the front, 1 for the back
for(b=0;b<bevelSegments;b++){//for ( b = bevelSegments; b > 0; b -- ) {
t=b/bevelSegments;z=bevelThickness*Math.cos(t*Math.PI/2);bs=bevelSize*Math.sin(t*Math.PI/2);// contract shape
for(i=0,il=contour.length;i<il;i++){vert=scalePt2(contour[i],contourMovements[i],bs);v(vert.x,vert.y,-z);}// expand holes
for(h=0,hl=holes.length;h<hl;h++){ahole=holes[h];oneHoleMovements=holesMovements[h];for(i=0,il=ahole.length;i<il;i++){vert=scalePt2(ahole[i],oneHoleMovements[i],bs);v(vert.x,vert.y,-z);}}}bs=bevelSize;// Back facing vertices
for(i=0;i<vlen;i++){vert=bevelEnabled?scalePt2(vertices[i],verticesMovements[i],bs):vertices[i];if(!extrudeByPath){v(vert.x,vert.y,0);}else{// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );
normal.copy(splineTube.normals[0]).multiplyScalar(vert.x);binormal.copy(splineTube.binormals[0]).multiplyScalar(vert.y);position2.copy(extrudePts[0]).add(normal).add(binormal);v(position2.x,position2.y,position2.z);}}// Add stepped vertices...
// Including front facing vertices
var s;for(s=1;s<=steps;s++){for(i=0;i<vlen;i++){vert=bevelEnabled?scalePt2(vertices[i],verticesMovements[i],bs):vertices[i];if(!extrudeByPath){v(vert.x,vert.y,amount/steps*s);}else{// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );
normal.copy(splineTube.normals[s]).multiplyScalar(vert.x);binormal.copy(splineTube.binormals[s]).multiplyScalar(vert.y);position2.copy(extrudePts[s]).add(normal).add(binormal);v(position2.x,position2.y,position2.z);}}}// Add bevel segments planes
//for ( b = 1; b <= bevelSegments; b ++ ) {
for(b=bevelSegments-1;b>=0;b--){t=b/bevelSegments;z=bevelThickness*Math.cos(t*Math.PI/2);bs=bevelSize*Math.sin(t*Math.PI/2);// contract shape
for(i=0,il=contour.length;i<il;i++){vert=scalePt2(contour[i],contourMovements[i],bs);v(vert.x,vert.y,amount+z);}// expand holes
for(h=0,hl=holes.length;h<hl;h++){ahole=holes[h];oneHoleMovements=holesMovements[h];for(i=0,il=ahole.length;i<il;i++){vert=scalePt2(ahole[i],oneHoleMovements[i],bs);if(!extrudeByPath){v(vert.x,vert.y,amount+z);}else{v(vert.x,vert.y+extrudePts[steps-1].y,extrudePts[steps-1].x+z);}}}}/* Faces */ // Top and bottom faces
buildLidFaces();// Sides faces
buildSideFaces();///// Internal functions
function buildLidFaces(){var start=verticesArray.length/3;if(bevelEnabled){var layer=0;// steps + 1
var offset=vlen*layer;// Bottom faces
for(i=0;i<flen;i++){face=faces[i];f3(face[2]+offset,face[1]+offset,face[0]+offset);}layer=steps+bevelSegments*2;offset=vlen*layer;// Top faces
for(i=0;i<flen;i++){face=faces[i];f3(face[0]+offset,face[1]+offset,face[2]+offset);}}else{// Bottom faces
for(i=0;i<flen;i++){face=faces[i];f3(face[2],face[1],face[0]);}// Top faces
for(i=0;i<flen;i++){face=faces[i];f3(face[0]+vlen*steps,face[1]+vlen*steps,face[2]+vlen*steps);}}scope.addGroup(start,verticesArray.length/3-start,0);}// Create faces for the z-sides of the shape
function buildSideFaces(){var start=verticesArray.length/3;var layeroffset=0;sidewalls(contour,layeroffset);layeroffset+=contour.length;for(h=0,hl=holes.length;h<hl;h++){ahole=holes[h];sidewalls(ahole,layeroffset);//, true
layeroffset+=ahole.length;}scope.addGroup(start,verticesArray.length/3-start,1);}function sidewalls(contour,layeroffset){var j,k;i=contour.length;while(--i>=0){j=i;k=i-1;if(k<0)k=contour.length-1;//console.log('b', i,j, i-1, k,vertices.length);
var s=0,sl=steps+bevelSegments*2;for(s=0;s<sl;s++){var slen1=vlen*s;var slen2=vlen*(s+1);var a=layeroffset+j+slen1,b=layeroffset+k+slen1,c=layeroffset+k+slen2,d=layeroffset+j+slen2;f4(a,b,c,d);}}}function v(x,y,z){placeholder.push(x);placeholder.push(y);placeholder.push(z);}function f3(a,b,c){addVertex(a);addVertex(b);addVertex(c);var nextIndex=verticesArray.length/3;var uvs=uvgen.generateTopUV(scope,verticesArray,nextIndex-3,nextIndex-2,nextIndex-1);addUV(uvs[0]);addUV(uvs[1]);addUV(uvs[2]);}function f4(a,b,c,d){addVertex(a);addVertex(b);addVertex(d);addVertex(b);addVertex(c);addVertex(d);var nextIndex=verticesArray.length/3;var uvs=uvgen.generateSideWallUV(scope,verticesArray,nextIndex-6,nextIndex-3,nextIndex-2,nextIndex-1);addUV(uvs[0]);addUV(uvs[1]);addUV(uvs[3]);addUV(uvs[1]);addUV(uvs[2]);addUV(uvs[3]);}function addVertex(index){verticesArray.push(placeholder[index*3+0]);verticesArray.push(placeholder[index*3+1]);verticesArray.push(placeholder[index*3+2]);}function addUV(vector2){uvArray.push(vector2.x);uvArray.push(vector2.y);}}}ExtrudeBufferGeometry.prototype=Object.create(BufferGeometry.prototype);ExtrudeBufferGeometry.prototype.constructor=ExtrudeBufferGeometry;var WorldUVGenerator={generateTopUV:function(geometry,vertices,indexA,indexB,indexC){var a_x=vertices[indexA*3];var a_y=vertices[indexA*3+1];var b_x=vertices[indexB*3];var b_y=vertices[indexB*3+1];var c_x=vertices[indexC*3];var c_y=vertices[indexC*3+1];return [new Vector2(a_x,a_y),new Vector2(b_x,b_y),new Vector2(c_x,c_y)];},generateSideWallUV:function(geometry,vertices,indexA,indexB,indexC,indexD){var a_x=vertices[indexA*3];var a_y=vertices[indexA*3+1];var a_z=vertices[indexA*3+2];var b_x=vertices[indexB*3];var b_y=vertices[indexB*3+1];var b_z=vertices[indexB*3+2];var c_x=vertices[indexC*3];var c_y=vertices[indexC*3+1];var c_z=vertices[indexC*3+2];var d_x=vertices[indexD*3];var d_y=vertices[indexD*3+1];var d_z=vertices[indexD*3+2];if(Math.abs(a_y-b_y)<0.01){return [new Vector2(a_x,1-a_z),new Vector2(b_x,1-b_z),new Vector2(c_x,1-c_z),new Vector2(d_x,1-d_z)];}else{return [new Vector2(a_y,1-a_z),new Vector2(b_y,1-b_z),new Vector2(c_y,1-c_z),new Vector2(d_y,1-d_z)];}}};/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* @author alteredq / http://alteredqualia.com/
*
* Text = 3D Text
*
* parameters = {
* font: <THREE.Font>, // font
*
* size: <float>, // size of the text
* height: <float>, // thickness to extrude text
* curveSegments: <int>, // number of points on the curves
*
* bevelEnabled: <bool>, // turn on bevel
* bevelThickness: <float>, // how deep into text bevel goes
* bevelSize: <float> // how far from text outline is bevel
* }
*/ // TextGeometry
function TextGeometry(text,parameters){Geometry.call(this);this.type='TextGeometry';this.parameters={text:text,parameters:parameters};this.fromBufferGeometry(new TextBufferGeometry(text,parameters));this.mergeVertices();}TextGeometry.prototype=Object.create(Geometry.prototype);TextGeometry.prototype.constructor=TextGeometry;// TextBufferGeometry
function TextBufferGeometry(text,parameters){parameters=parameters||{};var font=parameters.font;if(!(font&&font.isFont)){console.error('THREE.TextGeometry: font parameter is not an instance of THREE.Font.');return new Geometry();}var shapes=font.generateShapes(text,parameters.size,parameters.curveSegments);// translate parameters to ExtrudeGeometry API
parameters.amount=parameters.height!==undefined?parameters.height:50;// defaults
if(parameters.bevelThickness===undefined)parameters.bevelThickness=10;if(parameters.bevelSize===undefined)parameters.bevelSize=8;if(parameters.bevelEnabled===undefined)parameters.bevelEnabled=false;ExtrudeBufferGeometry.call(this,shapes,parameters);this.type='TextBufferGeometry';}TextBufferGeometry.prototype=Object.create(ExtrudeBufferGeometry.prototype);TextBufferGeometry.prototype.constructor=TextBufferGeometry;/**
* @author mrdoob / http://mrdoob.com/
* @author benaadams / https://twitter.com/ben_a_adams
* @author Mugen87 / https://github.com/Mugen87
*/ // SphereGeometry
function SphereGeometry(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength){Geometry.call(this);this.type='SphereGeometry';this.parameters={radius:radius,widthSegments:widthSegments,heightSegments:heightSegments,phiStart:phiStart,phiLength:phiLength,thetaStart:thetaStart,thetaLength:thetaLength};this.fromBufferGeometry(new SphereBufferGeometry(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength));this.mergeVertices();}SphereGeometry.prototype=Object.create(Geometry.prototype);SphereGeometry.prototype.constructor=SphereGeometry;// SphereBufferGeometry
function SphereBufferGeometry(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength){BufferGeometry.call(this);this.type='SphereBufferGeometry';this.parameters={radius:radius,widthSegments:widthSegments,heightSegments:heightSegments,phiStart:phiStart,phiLength:phiLength,thetaStart:thetaStart,thetaLength:thetaLength};radius=radius||1;widthSegments=Math.max(3,Math.floor(widthSegments)||8);heightSegments=Math.max(2,Math.floor(heightSegments)||6);phiStart=phiStart!==undefined?phiStart:0;phiLength=phiLength!==undefined?phiLength:Math.PI*2;thetaStart=thetaStart!==undefined?thetaStart:0;thetaLength=thetaLength!==undefined?thetaLength:Math.PI;var thetaEnd=thetaStart+thetaLength;var ix,iy;var index=0;var grid=[];var vertex=new Vector3();var normal=new Vector3();// buffers
var indices=[];var vertices=[];var normals=[];var uvs=[];// generate vertices, normals and uvs
for(iy=0;iy<=heightSegments;iy++){var verticesRow=[];var v=iy/heightSegments;for(ix=0;ix<=widthSegments;ix++){var u=ix/widthSegments;// vertex
vertex.x=-radius*Math.cos(phiStart+u*phiLength)*Math.sin(thetaStart+v*thetaLength);vertex.y=radius*Math.cos(thetaStart+v*thetaLength);vertex.z=radius*Math.sin(phiStart+u*phiLength)*Math.sin(thetaStart+v*thetaLength);vertices.push(vertex.x,vertex.y,vertex.z);// normal
normal.set(vertex.x,vertex.y,vertex.z).normalize();normals.push(normal.x,normal.y,normal.z);// uv
uvs.push(u,1-v);verticesRow.push(index++);}grid.push(verticesRow);}// indices
for(iy=0;iy<heightSegments;iy++){for(ix=0;ix<widthSegments;ix++){var a=grid[iy][ix+1];var b=grid[iy][ix];var c=grid[iy+1][ix];var d=grid[iy+1][ix+1];if(iy!==0||thetaStart>0)indices.push(a,b,d);if(iy!==heightSegments-1||thetaEnd<Math.PI)indices.push(b,c,d);}}// build geometry
this.setIndex(indices);this.addAttribute('position',new Float32BufferAttribute(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));}SphereBufferGeometry.prototype=Object.create(BufferGeometry.prototype);SphereBufferGeometry.prototype.constructor=SphereBufferGeometry;/**
* @author Kaleb Murphy
* @author Mugen87 / https://github.com/Mugen87
*/ // RingGeometry
function RingGeometry(innerRadius,outerRadius,thetaSegments,phiSegments,thetaStart,thetaLength){Geometry.call(this);this.type='RingGeometry';this.parameters={innerRadius:innerRadius,outerRadius:outerRadius,thetaSegments:thetaSegments,phiSegments:phiSegments,thetaStart:thetaStart,thetaLength:thetaLength};this.fromBufferGeometry(new RingBufferGeometry(innerRadius,outerRadius,thetaSegments,phiSegments,thetaStart,thetaLength));this.mergeVertices();}RingGeometry.prototype=Object.create(Geometry.prototype);RingGeometry.prototype.constructor=RingGeometry;// RingBufferGeometry
function RingBufferGeometry(innerRadius,outerRadius,thetaSegments,phiSegments,thetaStart,thetaLength){BufferGeometry.call(this);this.type='RingBufferGeometry';this.parameters={innerRadius:innerRadius,outerRadius:outerRadius,thetaSegments:thetaSegments,phiSegments:phiSegments,thetaStart:thetaStart,thetaLength:thetaLength};innerRadius=innerRadius||0.5;outerRadius=outerRadius||1;thetaStart=thetaStart!==undefined?thetaStart:0;thetaLength=thetaLength!==undefined?thetaLength:Math.PI*2;thetaSegments=thetaSegments!==undefined?Math.max(3,thetaSegments):8;phiSegments=phiSegments!==undefined?Math.max(1,phiSegments):1;// buffers
var indices=[];var vertices=[];var normals=[];var uvs=[];// some helper variables
var segment;var radius=innerRadius;var radiusStep=(outerRadius-innerRadius)/phiSegments;var vertex=new Vector3();var uv=new Vector2();var j,i;// generate vertices, normals and uvs
for(j=0;j<=phiSegments;j++){for(i=0;i<=thetaSegments;i++){// values are generate from the inside of the ring to the outside
segment=thetaStart+i/thetaSegments*thetaLength;// vertex
vertex.x=radius*Math.cos(segment);vertex.y=radius*Math.sin(segment);vertices.push(vertex.x,vertex.y,vertex.z);// normal
normals.push(0,0,1);// uv
uv.x=(vertex.x/outerRadius+1)/2;uv.y=(vertex.y/outerRadius+1)/2;uvs.push(uv.x,uv.y);}// increase the radius for next row of vertices
radius+=radiusStep;}// indices
for(j=0;j<phiSegments;j++){var thetaSegmentLevel=j*(thetaSegments+1);for(i=0;i<thetaSegments;i++){segment=i+thetaSegmentLevel;var a=segment;var b=segment+thetaSegments+1;var c=segment+thetaSegments+2;var d=segment+1;// faces
indices.push(a,b,d);indices.push(b,c,d);}}// build geometry
this.setIndex(indices);this.addAttribute('position',new Float32BufferAttribute(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));}RingBufferGeometry.prototype=Object.create(BufferGeometry.prototype);RingBufferGeometry.prototype.constructor=RingBufferGeometry;/**
* @author astrodud / http://astrodud.isgreat.org/
* @author zz85 / https://github.com/zz85
* @author bhouston / http://clara.io
* @author Mugen87 / https://github.com/Mugen87
*/ // LatheGeometry
function LatheGeometry(points,segments,phiStart,phiLength){Geometry.call(this);this.type='LatheGeometry';this.parameters={points:points,segments:segments,phiStart:phiStart,phiLength:phiLength};this.fromBufferGeometry(new LatheBufferGeometry(points,segments,phiStart,phiLength));this.mergeVertices();}LatheGeometry.prototype=Object.create(Geometry.prototype);LatheGeometry.prototype.constructor=LatheGeometry;// LatheBufferGeometry
function LatheBufferGeometry(points,segments,phiStart,phiLength){BufferGeometry.call(this);this.type='LatheBufferGeometry';this.parameters={points:points,segments:segments,phiStart:phiStart,phiLength:phiLength};segments=Math.floor(segments)||12;phiStart=phiStart||0;phiLength=phiLength||Math.PI*2;// clamp phiLength so it's in range of [ 0, 2PI ]
phiLength=_Math.clamp(phiLength,0,Math.PI*2);// buffers
var indices=[];var vertices=[];var uvs=[];// helper variables
var base;var inverseSegments=1.0/segments;var vertex=new Vector3();var uv=new Vector2();var i,j;// generate vertices and uvs
for(i=0;i<=segments;i++){var phi=phiStart+i*inverseSegments*phiLength;var sin=Math.sin(phi);var cos=Math.cos(phi);for(j=0;j<=points.length-1;j++){// vertex
vertex.x=points[j].x*sin;vertex.y=points[j].y;vertex.z=points[j].x*cos;vertices.push(vertex.x,vertex.y,vertex.z);// uv
uv.x=i/segments;uv.y=j/(points.length-1);uvs.push(uv.x,uv.y);}}// indices
for(i=0;i<segments;i++){for(j=0;j<points.length-1;j++){base=j+i*points.length;var a=base;var b=base+points.length;var c=base+points.length+1;var d=base+1;// faces
indices.push(a,b,d);indices.push(b,c,d);}}// build geometry
this.setIndex(indices);this.addAttribute('position',new Float32BufferAttribute(vertices,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));// generate normals
this.computeVertexNormals();// if the geometry is closed, we need to average the normals along the seam.
// because the corresponding vertices are identical (but still have different UVs).
if(phiLength===Math.PI*2){var normals=this.attributes.normal.array;var n1=new Vector3();var n2=new Vector3();var n=new Vector3();// this is the buffer offset for the last line of vertices
base=segments*points.length*3;for(i=0,j=0;i<points.length;i++,j+=3){// select the normal of the vertex in the first line
n1.x=normals[j+0];n1.y=normals[j+1];n1.z=normals[j+2];// select the normal of the vertex in the last line
n2.x=normals[base+j+0];n2.y=normals[base+j+1];n2.z=normals[base+j+2];// average normals
n.addVectors(n1,n2).normalize();// assign the new values to both normals
normals[j+0]=normals[base+j+0]=n.x;normals[j+1]=normals[base+j+1]=n.y;normals[j+2]=normals[base+j+2]=n.z;}}}LatheBufferGeometry.prototype=Object.create(BufferGeometry.prototype);LatheBufferGeometry.prototype.constructor=LatheBufferGeometry;/**
* @author jonobr1 / http://jonobr1.com
* @author Mugen87 / https://github.com/Mugen87
*/ // ShapeGeometry
function ShapeGeometry(shapes,curveSegments){Geometry.call(this);this.type='ShapeGeometry';if(typeof curveSegments==='object'){console.warn('THREE.ShapeGeometry: Options parameter has been removed.');curveSegments=curveSegments.curveSegments;}this.parameters={shapes:shapes,curveSegments:curveSegments};this.fromBufferGeometry(new ShapeBufferGeometry(shapes,curveSegments));this.mergeVertices();}ShapeGeometry.prototype=Object.create(Geometry.prototype);ShapeGeometry.prototype.constructor=ShapeGeometry;ShapeGeometry.prototype.toJSON=function(){var data=Geometry.prototype.toJSON.call(this);var shapes=this.parameters.shapes;return toJSON(shapes,data);};// ShapeBufferGeometry
function ShapeBufferGeometry(shapes,curveSegments){BufferGeometry.call(this);this.type='ShapeBufferGeometry';this.parameters={shapes:shapes,curveSegments:curveSegments};curveSegments=curveSegments||12;// buffers
var indices=[];var vertices=[];var normals=[];var uvs=[];// helper variables
var groupStart=0;var groupCount=0;// allow single and array values for "shapes" parameter
if(Array.isArray(shapes)===false){addShape(shapes);}else{for(var i=0;i<shapes.length;i++){addShape(shapes[i]);this.addGroup(groupStart,groupCount,i);// enables MultiMaterial support
groupStart+=groupCount;groupCount=0;}}// build geometry
this.setIndex(indices);this.addAttribute('position',new Float32BufferAttribute(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));// helper functions
function addShape(shape){var i,l,shapeHole;var indexOffset=vertices.length/3;var points=shape.extractPoints(curveSegments);var shapeVertices=points.shape;var shapeHoles=points.holes;// check direction of vertices
if(ShapeUtils.isClockWise(shapeVertices)===false){shapeVertices=shapeVertices.reverse();// also check if holes are in the opposite direction
for(i=0,l=shapeHoles.length;i<l;i++){shapeHole=shapeHoles[i];if(ShapeUtils.isClockWise(shapeHole)===true){shapeHoles[i]=shapeHole.reverse();}}}var faces=ShapeUtils.triangulateShape(shapeVertices,shapeHoles);// join vertices of inner and outer paths to a single array
for(i=0,l=shapeHoles.length;i<l;i++){shapeHole=shapeHoles[i];shapeVertices=shapeVertices.concat(shapeHole);}// vertices, normals, uvs
for(i=0,l=shapeVertices.length;i<l;i++){var vertex=shapeVertices[i];vertices.push(vertex.x,vertex.y,0);normals.push(0,0,1);uvs.push(vertex.x,vertex.y);// world uvs
}// incides
for(i=0,l=faces.length;i<l;i++){var face=faces[i];var a=face[0]+indexOffset;var b=face[1]+indexOffset;var c=face[2]+indexOffset;indices.push(a,b,c);groupCount+=3;}}}ShapeBufferGeometry.prototype=Object.create(BufferGeometry.prototype);ShapeBufferGeometry.prototype.constructor=ShapeBufferGeometry;ShapeBufferGeometry.prototype.toJSON=function(){var data=BufferGeometry.prototype.toJSON.call(this);var shapes=this.parameters.shapes;return toJSON(shapes,data);};//
function toJSON(shapes,data){data.shapes=[];if(Array.isArray(shapes)){for(var i=0,l=shapes.length;i<l;i++){var shape=shapes[i];data.shapes.push(shape.uuid);}}else{data.shapes.push(shapes.uuid);}return data;}/**
* @author WestLangley / http://github.com/WestLangley
* @author Mugen87 / https://github.com/Mugen87
*/function EdgesGeometry(geometry,thresholdAngle){BufferGeometry.call(this);this.type='EdgesGeometry';this.parameters={thresholdAngle:thresholdAngle};thresholdAngle=thresholdAngle!==undefined?thresholdAngle:1;// buffer
var vertices=[];// helper variables
var thresholdDot=Math.cos(_Math.DEG2RAD*thresholdAngle);var edge=[0,0],edges={},edge1,edge2;var key,keys=['a','b','c'];// prepare source geometry
var geometry2;if(geometry.isBufferGeometry){geometry2=new Geometry();geometry2.fromBufferGeometry(geometry);}else{geometry2=geometry.clone();}geometry2.mergeVertices();geometry2.computeFaceNormals();var sourceVertices=geometry2.vertices;var faces=geometry2.faces;// now create a data structure where each entry represents an edge with its adjoining faces
for(var i=0,l=faces.length;i<l;i++){var face=faces[i];for(var j=0;j<3;j++){edge1=face[keys[j]];edge2=face[keys[(j+1)%3]];edge[0]=Math.min(edge1,edge2);edge[1]=Math.max(edge1,edge2);key=edge[0]+','+edge[1];if(edges[key]===undefined){edges[key]={index1:edge[0],index2:edge[1],face1:i,face2:undefined};}else{edges[key].face2=i;}}}// generate vertices
for(key in edges){var e=edges[key];// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.
if(e.face2===undefined||faces[e.face1].normal.dot(faces[e.face2].normal)<=thresholdDot){var vertex=sourceVertices[e.index1];vertices.push(vertex.x,vertex.y,vertex.z);vertex=sourceVertices[e.index2];vertices.push(vertex.x,vertex.y,vertex.z);}}// build geometry
this.addAttribute('position',new Float32BufferAttribute(vertices,3));}EdgesGeometry.prototype=Object.create(BufferGeometry.prototype);EdgesGeometry.prototype.constructor=EdgesGeometry;/**
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/ // CylinderGeometry
function CylinderGeometry(radiusTop,radiusBottom,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength){Geometry.call(this);this.type='CylinderGeometry';this.parameters={radiusTop:radiusTop,radiusBottom:radiusBottom,height:height,radialSegments:radialSegments,heightSegments:heightSegments,openEnded:openEnded,thetaStart:thetaStart,thetaLength:thetaLength};this.fromBufferGeometry(new CylinderBufferGeometry(radiusTop,radiusBottom,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength));this.mergeVertices();}CylinderGeometry.prototype=Object.create(Geometry.prototype);CylinderGeometry.prototype.constructor=CylinderGeometry;// CylinderBufferGeometry
function CylinderBufferGeometry(radiusTop,radiusBottom,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength){BufferGeometry.call(this);this.type='CylinderBufferGeometry';this.parameters={radiusTop:radiusTop,radiusBottom:radiusBottom,height:height,radialSegments:radialSegments,heightSegments:heightSegments,openEnded:openEnded,thetaStart:thetaStart,thetaLength:thetaLength};var scope=this;radiusTop=radiusTop!==undefined?radiusTop:1;radiusBottom=radiusBottom!==undefined?radiusBottom:1;height=height||1;radialSegments=Math.floor(radialSegments)||8;heightSegments=Math.floor(heightSegments)||1;openEnded=openEnded!==undefined?openEnded:false;thetaStart=thetaStart!==undefined?thetaStart:0.0;thetaLength=thetaLength!==undefined?thetaLength:Math.PI*2;// buffers
var indices=[];var vertices=[];var normals=[];var uvs=[];// helper variables
var index=0;var indexArray=[];var halfHeight=height/2;var groupStart=0;// generate geometry
generateTorso();if(openEnded===false){if(radiusTop>0)generateCap(true);if(radiusBottom>0)generateCap(false);}// build geometry
this.setIndex(indices);this.addAttribute('position',new Float32BufferAttribute(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));function generateTorso(){var x,y;var normal=new Vector3();var vertex=new Vector3();var groupCount=0;// this will be used to calculate the normal
var slope=(radiusBottom-radiusTop)/height;// generate vertices, normals and uvs
for(y=0;y<=heightSegments;y++){var indexRow=[];var v=y/heightSegments;// calculate the radius of the current row
var radius=v*(radiusBottom-radiusTop)+radiusTop;for(x=0;x<=radialSegments;x++){var u=x/radialSegments;var theta=u*thetaLength+thetaStart;var sinTheta=Math.sin(theta);var cosTheta=Math.cos(theta);// vertex
vertex.x=radius*sinTheta;vertex.y=-v*height+halfHeight;vertex.z=radius*cosTheta;vertices.push(vertex.x,vertex.y,vertex.z);// normal
normal.set(sinTheta,slope,cosTheta).normalize();normals.push(normal.x,normal.y,normal.z);// uv
uvs.push(u,1-v);// save index of vertex in respective row
indexRow.push(index++);}// now save vertices of the row in our index array
indexArray.push(indexRow);}// generate indices
for(x=0;x<radialSegments;x++){for(y=0;y<heightSegments;y++){// we use the index array to access the correct indices
var a=indexArray[y][x];var b=indexArray[y+1][x];var c=indexArray[y+1][x+1];var d=indexArray[y][x+1];// faces
indices.push(a,b,d);indices.push(b,c,d);// update group counter
groupCount+=6;}}// add a group to the geometry. this will ensure multi material support
scope.addGroup(groupStart,groupCount,0);// calculate new start value for groups
groupStart+=groupCount;}function generateCap(top){var x,centerIndexStart,centerIndexEnd;var uv=new Vector2();var vertex=new Vector3();var groupCount=0;var radius=top===true?radiusTop:radiusBottom;var sign=top===true?1:-1;// save the index of the first center vertex
centerIndexStart=index;// first we generate the center vertex data of the cap.
// because the geometry needs one set of uvs per face,
// we must generate a center vertex per face/segment
for(x=1;x<=radialSegments;x++){// vertex
vertices.push(0,halfHeight*sign,0);// normal
normals.push(0,sign,0);// uv
uvs.push(0.5,0.5);// increase index
index++;}// save the index of the last center vertex
centerIndexEnd=index;// now we generate the surrounding vertices, normals and uvs
for(x=0;x<=radialSegments;x++){var u=x/radialSegments;var theta=u*thetaLength+thetaStart;var cosTheta=Math.cos(theta);var sinTheta=Math.sin(theta);// vertex
vertex.x=radius*sinTheta;vertex.y=halfHeight*sign;vertex.z=radius*cosTheta;vertices.push(vertex.x,vertex.y,vertex.z);// normal
normals.push(0,sign,0);// uv
uv.x=cosTheta*0.5+0.5;uv.y=sinTheta*0.5*sign+0.5;uvs.push(uv.x,uv.y);// increase index
index++;}// generate indices
for(x=0;x<radialSegments;x++){var c=centerIndexStart+x;var i=centerIndexEnd+x;if(top===true){// face top
indices.push(i,i+1,c);}else{// face bottom
indices.push(i+1,i,c);}groupCount+=3;}// add a group to the geometry. this will ensure multi material support
scope.addGroup(groupStart,groupCount,top===true?1:2);// calculate new start value for groups
groupStart+=groupCount;}}CylinderBufferGeometry.prototype=Object.create(BufferGeometry.prototype);CylinderBufferGeometry.prototype.constructor=CylinderBufferGeometry;/**
* @author abelnation / http://github.com/abelnation
*/ // ConeGeometry
function ConeGeometry(radius,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength){CylinderGeometry.call(this,0,radius,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength);this.type='ConeGeometry';this.parameters={radius:radius,height:height,radialSegments:radialSegments,heightSegments:heightSegments,openEnded:openEnded,thetaStart:thetaStart,thetaLength:thetaLength};}ConeGeometry.prototype=Object.create(CylinderGeometry.prototype);ConeGeometry.prototype.constructor=ConeGeometry;// ConeBufferGeometry
function ConeBufferGeometry(radius,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength){CylinderBufferGeometry.call(this,0,radius,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength);this.type='ConeBufferGeometry';this.parameters={radius:radius,height:height,radialSegments:radialSegments,heightSegments:heightSegments,openEnded:openEnded,thetaStart:thetaStart,thetaLength:thetaLength};}ConeBufferGeometry.prototype=Object.create(CylinderBufferGeometry.prototype);ConeBufferGeometry.prototype.constructor=ConeBufferGeometry;/**
* @author benaadams / https://twitter.com/ben_a_adams
* @author Mugen87 / https://github.com/Mugen87
* @author hughes
*/ // CircleGeometry
function CircleGeometry(radius,segments,thetaStart,thetaLength){Geometry.call(this);this.type='CircleGeometry';this.parameters={radius:radius,segments:segments,thetaStart:thetaStart,thetaLength:thetaLength};this.fromBufferGeometry(new CircleBufferGeometry(radius,segments,thetaStart,thetaLength));this.mergeVertices();}CircleGeometry.prototype=Object.create(Geometry.prototype);CircleGeometry.prototype.constructor=CircleGeometry;// CircleBufferGeometry
function CircleBufferGeometry(radius,segments,thetaStart,thetaLength){BufferGeometry.call(this);this.type='CircleBufferGeometry';this.parameters={radius:radius,segments:segments,thetaStart:thetaStart,thetaLength:thetaLength};radius=radius||1;segments=segments!==undefined?Math.max(3,segments):8;thetaStart=thetaStart!==undefined?thetaStart:0;thetaLength=thetaLength!==undefined?thetaLength:Math.PI*2;// buffers
var indices=[];var vertices=[];var normals=[];var uvs=[];// helper variables
var i,s;var vertex=new Vector3();var uv=new Vector2();// center point
vertices.push(0,0,0);normals.push(0,0,1);uvs.push(0.5,0.5);for(s=0,i=3;s<=segments;s++,i+=3){var segment=thetaStart+s/segments*thetaLength;// vertex
vertex.x=radius*Math.cos(segment);vertex.y=radius*Math.sin(segment);vertices.push(vertex.x,vertex.y,vertex.z);// normal
normals.push(0,0,1);// uvs
uv.x=(vertices[i]/radius+1)/2;uv.y=(vertices[i+1]/radius+1)/2;uvs.push(uv.x,uv.y);}// indices
for(i=1;i<=segments;i++){indices.push(i,i+1,0);}// build geometry
this.setIndex(indices);this.addAttribute('position',new Float32BufferAttribute(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));}CircleBufferGeometry.prototype=Object.create(BufferGeometry.prototype);CircleBufferGeometry.prototype.constructor=CircleBufferGeometry;var Geometries=Object.freeze({WireframeGeometry:WireframeGeometry,ParametricGeometry:ParametricGeometry,ParametricBufferGeometry:ParametricBufferGeometry,TetrahedronGeometry:TetrahedronGeometry,TetrahedronBufferGeometry:TetrahedronBufferGeometry,OctahedronGeometry:OctahedronGeometry,OctahedronBufferGeometry:OctahedronBufferGeometry,IcosahedronGeometry:IcosahedronGeometry,IcosahedronBufferGeometry:IcosahedronBufferGeometry,DodecahedronGeometry:DodecahedronGeometry,DodecahedronBufferGeometry:DodecahedronBufferGeometry,PolyhedronGeometry:PolyhedronGeometry,PolyhedronBufferGeometry:PolyhedronBufferGeometry,TubeGeometry:TubeGeometry,TubeBufferGeometry:TubeBufferGeometry,TorusKnotGeometry:TorusKnotGeometry,TorusKnotBufferGeometry:TorusKnotBufferGeometry,TorusGeometry:TorusGeometry,TorusBufferGeometry:TorusBufferGeometry,TextGeometry:TextGeometry,TextBufferGeometry:TextBufferGeometry,SphereGeometry:SphereGeometry,SphereBufferGeometry:SphereBufferGeometry,RingGeometry:RingGeometry,RingBufferGeometry:RingBufferGeometry,PlaneGeometry:PlaneGeometry,PlaneBufferGeometry:PlaneBufferGeometry,LatheGeometry:LatheGeometry,LatheBufferGeometry:LatheBufferGeometry,ShapeGeometry:ShapeGeometry,ShapeBufferGeometry:ShapeBufferGeometry,ExtrudeGeometry:ExtrudeGeometry,ExtrudeBufferGeometry:ExtrudeBufferGeometry,EdgesGeometry:EdgesGeometry,ConeGeometry:ConeGeometry,ConeBufferGeometry:ConeBufferGeometry,CylinderGeometry:CylinderGeometry,CylinderBufferGeometry:CylinderBufferGeometry,CircleGeometry:CircleGeometry,CircleBufferGeometry:CircleBufferGeometry,BoxGeometry:BoxGeometry,BoxBufferGeometry:BoxBufferGeometry});/**
* @author mrdoob / http://mrdoob.com/
*
* parameters = {
* color: <THREE.Color>
* }
*/function ShadowMaterial(parameters){Material.call(this);this.type='ShadowMaterial';this.color=new Color(0x000000);this.transparent=true;this.setValues(parameters);}ShadowMaterial.prototype=Object.create(Material.prototype);ShadowMaterial.prototype.constructor=ShadowMaterial;ShadowMaterial.prototype.isShadowMaterial=true;ShadowMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.color.copy(source.color);return this;};/**
* @author mrdoob / http://mrdoob.com/
*/function RawShaderMaterial(parameters){ShaderMaterial.call(this,parameters);this.type='RawShaderMaterial';}RawShaderMaterial.prototype=Object.create(ShaderMaterial.prototype);RawShaderMaterial.prototype.constructor=RawShaderMaterial;RawShaderMaterial.prototype.isRawShaderMaterial=true;/**
* @author WestLangley / http://github.com/WestLangley
*
* parameters = {
* color: <hex>,
* roughness: <float>,
* metalness: <float>,
* opacity: <float>,
*
* map: new THREE.Texture( <Image> ),
*
* lightMap: new THREE.Texture( <Image> ),
* lightMapIntensity: <float>
*
* aoMap: new THREE.Texture( <Image> ),
* aoMapIntensity: <float>
*
* emissive: <hex>,
* emissiveIntensity: <float>
* emissiveMap: new THREE.Texture( <Image> ),
*
* bumpMap: new THREE.Texture( <Image> ),
* bumpScale: <float>,
*
* normalMap: new THREE.Texture( <Image> ),
* normalScale: <Vector2>,
*
* displacementMap: new THREE.Texture( <Image> ),
* displacementScale: <float>,
* displacementBias: <float>,
*
* roughnessMap: new THREE.Texture( <Image> ),
*
* metalnessMap: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
* envMapIntensity: <float>
*
* refractionRatio: <float>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>,
*
* skinning: <bool>,
* morphTargets: <bool>,
* morphNormals: <bool>
* }
*/function MeshStandardMaterial(parameters){Material.call(this);this.defines={'STANDARD':''};this.type='MeshStandardMaterial';this.color=new Color(0xffffff);// diffuse
this.roughness=0.5;this.metalness=0.5;this.map=null;this.lightMap=null;this.lightMapIntensity=1.0;this.aoMap=null;this.aoMapIntensity=1.0;this.emissive=new Color(0x000000);this.emissiveIntensity=1.0;this.emissiveMap=null;this.bumpMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new Vector2(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.roughnessMap=null;this.metalnessMap=null;this.alphaMap=null;this.envMap=null;this.envMapIntensity=1.0;this.refractionRatio=0.98;this.wireframe=false;this.wireframeLinewidth=1;this.wireframeLinecap='round';this.wireframeLinejoin='round';this.skinning=false;this.morphTargets=false;this.morphNormals=false;this.setValues(parameters);}MeshStandardMaterial.prototype=Object.create(Material.prototype);MeshStandardMaterial.prototype.constructor=MeshStandardMaterial;MeshStandardMaterial.prototype.isMeshStandardMaterial=true;MeshStandardMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.defines={'STANDARD':''};this.color.copy(source.color);this.roughness=source.roughness;this.metalness=source.metalness;this.map=source.map;this.lightMap=source.lightMap;this.lightMapIntensity=source.lightMapIntensity;this.aoMap=source.aoMap;this.aoMapIntensity=source.aoMapIntensity;this.emissive.copy(source.emissive);this.emissiveMap=source.emissiveMap;this.emissiveIntensity=source.emissiveIntensity;this.bumpMap=source.bumpMap;this.bumpScale=source.bumpScale;this.normalMap=source.normalMap;this.normalScale.copy(source.normalScale);this.displacementMap=source.displacementMap;this.displacementScale=source.displacementScale;this.displacementBias=source.displacementBias;this.roughnessMap=source.roughnessMap;this.metalnessMap=source.metalnessMap;this.alphaMap=source.alphaMap;this.envMap=source.envMap;this.envMapIntensity=source.envMapIntensity;this.refractionRatio=source.refractionRatio;this.wireframe=source.wireframe;this.wireframeLinewidth=source.wireframeLinewidth;this.wireframeLinecap=source.wireframeLinecap;this.wireframeLinejoin=source.wireframeLinejoin;this.skinning=source.skinning;this.morphTargets=source.morphTargets;this.morphNormals=source.morphNormals;return this;};/**
* @author WestLangley / http://github.com/WestLangley
*
* parameters = {
* reflectivity: <float>
* }
*/function MeshPhysicalMaterial(parameters){MeshStandardMaterial.call(this);this.defines={'PHYSICAL':''};this.type='MeshPhysicalMaterial';this.reflectivity=0.5;// maps to F0 = 0.04
this.clearCoat=0.0;this.clearCoatRoughness=0.0;this.setValues(parameters);}MeshPhysicalMaterial.prototype=Object.create(MeshStandardMaterial.prototype);MeshPhysicalMaterial.prototype.constructor=MeshPhysicalMaterial;MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial=true;MeshPhysicalMaterial.prototype.copy=function(source){MeshStandardMaterial.prototype.copy.call(this,source);this.defines={'PHYSICAL':''};this.reflectivity=source.reflectivity;this.clearCoat=source.clearCoat;this.clearCoatRoughness=source.clearCoatRoughness;return this;};/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: <hex>,
* specular: <hex>,
* shininess: <float>,
* opacity: <float>,
*
* map: new THREE.Texture( <Image> ),
*
* lightMap: new THREE.Texture( <Image> ),
* lightMapIntensity: <float>
*
* aoMap: new THREE.Texture( <Image> ),
* aoMapIntensity: <float>
*
* emissive: <hex>,
* emissiveIntensity: <float>
* emissiveMap: new THREE.Texture( <Image> ),
*
* bumpMap: new THREE.Texture( <Image> ),
* bumpScale: <float>,
*
* normalMap: new THREE.Texture( <Image> ),
* normalScale: <Vector2>,
*
* displacementMap: new THREE.Texture( <Image> ),
* displacementScale: <float>,
* displacementBias: <float>,
*
* specularMap: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
* combine: THREE.Multiply,
* reflectivity: <float>,
* refractionRatio: <float>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>,
*
* skinning: <bool>,
* morphTargets: <bool>,
* morphNormals: <bool>
* }
*/function MeshPhongMaterial(parameters){Material.call(this);this.type='MeshPhongMaterial';this.color=new Color(0xffffff);// diffuse
this.specular=new Color(0x111111);this.shininess=30;this.map=null;this.lightMap=null;this.lightMapIntensity=1.0;this.aoMap=null;this.aoMapIntensity=1.0;this.emissive=new Color(0x000000);this.emissiveIntensity=1.0;this.emissiveMap=null;this.bumpMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new Vector2(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.specularMap=null;this.alphaMap=null;this.envMap=null;this.combine=MultiplyOperation;this.reflectivity=1;this.refractionRatio=0.98;this.wireframe=false;this.wireframeLinewidth=1;this.wireframeLinecap='round';this.wireframeLinejoin='round';this.skinning=false;this.morphTargets=false;this.morphNormals=false;this.setValues(parameters);}MeshPhongMaterial.prototype=Object.create(Material.prototype);MeshPhongMaterial.prototype.constructor=MeshPhongMaterial;MeshPhongMaterial.prototype.isMeshPhongMaterial=true;MeshPhongMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.color.copy(source.color);this.specular.copy(source.specular);this.shininess=source.shininess;this.map=source.map;this.lightMap=source.lightMap;this.lightMapIntensity=source.lightMapIntensity;this.aoMap=source.aoMap;this.aoMapIntensity=source.aoMapIntensity;this.emissive.copy(source.emissive);this.emissiveMap=source.emissiveMap;this.emissiveIntensity=source.emissiveIntensity;this.bumpMap=source.bumpMap;this.bumpScale=source.bumpScale;this.normalMap=source.normalMap;this.normalScale.copy(source.normalScale);this.displacementMap=source.displacementMap;this.displacementScale=source.displacementScale;this.displacementBias=source.displacementBias;this.specularMap=source.specularMap;this.alphaMap=source.alphaMap;this.envMap=source.envMap;this.combine=source.combine;this.reflectivity=source.reflectivity;this.refractionRatio=source.refractionRatio;this.wireframe=source.wireframe;this.wireframeLinewidth=source.wireframeLinewidth;this.wireframeLinecap=source.wireframeLinecap;this.wireframeLinejoin=source.wireframeLinejoin;this.skinning=source.skinning;this.morphTargets=source.morphTargets;this.morphNormals=source.morphNormals;return this;};/**
* @author takahirox / http://github.com/takahirox
*
* parameters = {
* gradientMap: new THREE.Texture( <Image> )
* }
*/function MeshToonMaterial(parameters){MeshPhongMaterial.call(this);this.defines={'TOON':''};this.type='MeshToonMaterial';this.gradientMap=null;this.setValues(parameters);}MeshToonMaterial.prototype=Object.create(MeshPhongMaterial.prototype);MeshToonMaterial.prototype.constructor=MeshToonMaterial;MeshToonMaterial.prototype.isMeshToonMaterial=true;MeshToonMaterial.prototype.copy=function(source){MeshPhongMaterial.prototype.copy.call(this,source);this.gradientMap=source.gradientMap;return this;};/**
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
*
* parameters = {
* opacity: <float>,
*
* bumpMap: new THREE.Texture( <Image> ),
* bumpScale: <float>,
*
* normalMap: new THREE.Texture( <Image> ),
* normalScale: <Vector2>,
*
* displacementMap: new THREE.Texture( <Image> ),
* displacementScale: <float>,
* displacementBias: <float>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>
*
* skinning: <bool>,
* morphTargets: <bool>,
* morphNormals: <bool>
* }
*/function MeshNormalMaterial(parameters){Material.call(this);this.type='MeshNormalMaterial';this.bumpMap=null;this.bumpScale=1;this.normalMap=null;this.normalScale=new Vector2(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=false;this.wireframeLinewidth=1;this.fog=false;this.lights=false;this.skinning=false;this.morphTargets=false;this.morphNormals=false;this.setValues(parameters);}MeshNormalMaterial.prototype=Object.create(Material.prototype);MeshNormalMaterial.prototype.constructor=MeshNormalMaterial;MeshNormalMaterial.prototype.isMeshNormalMaterial=true;MeshNormalMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.bumpMap=source.bumpMap;this.bumpScale=source.bumpScale;this.normalMap=source.normalMap;this.normalScale.copy(source.normalScale);this.displacementMap=source.displacementMap;this.displacementScale=source.displacementScale;this.displacementBias=source.displacementBias;this.wireframe=source.wireframe;this.wireframeLinewidth=source.wireframeLinewidth;this.skinning=source.skinning;this.morphTargets=source.morphTargets;this.morphNormals=source.morphNormals;return this;};/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: <hex>,
* opacity: <float>,
*
* map: new THREE.Texture( <Image> ),
*
* lightMap: new THREE.Texture( <Image> ),
* lightMapIntensity: <float>
*
* aoMap: new THREE.Texture( <Image> ),
* aoMapIntensity: <float>
*
* emissive: <hex>,
* emissiveIntensity: <float>
* emissiveMap: new THREE.Texture( <Image> ),
*
* specularMap: new THREE.Texture( <Image> ),
*
* alphaMap: new THREE.Texture( <Image> ),
*
* envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),
* combine: THREE.Multiply,
* reflectivity: <float>,
* refractionRatio: <float>,
*
* wireframe: <boolean>,
* wireframeLinewidth: <float>,
*
* skinning: <bool>,
* morphTargets: <bool>,
* morphNormals: <bool>
* }
*/function MeshLambertMaterial(parameters){Material.call(this);this.type='MeshLambertMaterial';this.color=new Color(0xffffff);// diffuse
this.map=null;this.lightMap=null;this.lightMapIntensity=1.0;this.aoMap=null;this.aoMapIntensity=1.0;this.emissive=new Color(0x000000);this.emissiveIntensity=1.0;this.emissiveMap=null;this.specularMap=null;this.alphaMap=null;this.envMap=null;this.combine=MultiplyOperation;this.reflectivity=1;this.refractionRatio=0.98;this.wireframe=false;this.wireframeLinewidth=1;this.wireframeLinecap='round';this.wireframeLinejoin='round';this.skinning=false;this.morphTargets=false;this.morphNormals=false;this.setValues(parameters);}MeshLambertMaterial.prototype=Object.create(Material.prototype);MeshLambertMaterial.prototype.constructor=MeshLambertMaterial;MeshLambertMaterial.prototype.isMeshLambertMaterial=true;MeshLambertMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.color.copy(source.color);this.map=source.map;this.lightMap=source.lightMap;this.lightMapIntensity=source.lightMapIntensity;this.aoMap=source.aoMap;this.aoMapIntensity=source.aoMapIntensity;this.emissive.copy(source.emissive);this.emissiveMap=source.emissiveMap;this.emissiveIntensity=source.emissiveIntensity;this.specularMap=source.specularMap;this.alphaMap=source.alphaMap;this.envMap=source.envMap;this.combine=source.combine;this.reflectivity=source.reflectivity;this.refractionRatio=source.refractionRatio;this.wireframe=source.wireframe;this.wireframeLinewidth=source.wireframeLinewidth;this.wireframeLinecap=source.wireframeLinecap;this.wireframeLinejoin=source.wireframeLinejoin;this.skinning=source.skinning;this.morphTargets=source.morphTargets;this.morphNormals=source.morphNormals;return this;};/**
* @author alteredq / http://alteredqualia.com/
*
* parameters = {
* color: <hex>,
* opacity: <float>,
*
* linewidth: <float>,
*
* scale: <float>,
* dashSize: <float>,
* gapSize: <float>
* }
*/function LineDashedMaterial(parameters){LineBasicMaterial.call(this);this.type='LineDashedMaterial';this.scale=1;this.dashSize=3;this.gapSize=1;this.setValues(parameters);}LineDashedMaterial.prototype=Object.create(LineBasicMaterial.prototype);LineDashedMaterial.prototype.constructor=LineDashedMaterial;LineDashedMaterial.prototype.isLineDashedMaterial=true;LineDashedMaterial.prototype.copy=function(source){LineBasicMaterial.prototype.copy.call(this,source);this.scale=source.scale;this.dashSize=source.dashSize;this.gapSize=source.gapSize;return this;};var Materials=Object.freeze({ShadowMaterial:ShadowMaterial,SpriteMaterial:SpriteMaterial,RawShaderMaterial:RawShaderMaterial,ShaderMaterial:ShaderMaterial,PointsMaterial:PointsMaterial,MeshPhysicalMaterial:MeshPhysicalMaterial,MeshStandardMaterial:MeshStandardMaterial,MeshPhongMaterial:MeshPhongMaterial,MeshToonMaterial:MeshToonMaterial,MeshNormalMaterial:MeshNormalMaterial,MeshLambertMaterial:MeshLambertMaterial,MeshDepthMaterial:MeshDepthMaterial,MeshDistanceMaterial:MeshDistanceMaterial,MeshBasicMaterial:MeshBasicMaterial,LineDashedMaterial:LineDashedMaterial,LineBasicMaterial:LineBasicMaterial,Material:Material});/**
* @author mrdoob / http://mrdoob.com/
*/var Cache={enabled:false,files:{},add:function(key,file){if(this.enabled===false)return;// console.log( 'THREE.Cache', 'Adding key:', key );
this.files[key]=file;},get:function(key){if(this.enabled===false)return;// console.log( 'THREE.Cache', 'Checking key:', key );
return this.files[key];},remove:function(key){delete this.files[key];},clear:function(){this.files={};}};/**
* @author mrdoob / http://mrdoob.com/
*/function LoadingManager(onLoad,onProgress,onError){var scope=this;var isLoading=false;var itemsLoaded=0;var itemsTotal=0;var urlModifier=undefined;this.onStart=undefined;this.onLoad=onLoad;this.onProgress=onProgress;this.onError=onError;this.itemStart=function(url){itemsTotal++;if(isLoading===false){if(scope.onStart!==undefined){scope.onStart(url,itemsLoaded,itemsTotal);}}isLoading=true;};this.itemEnd=function(url){itemsLoaded++;if(scope.onProgress!==undefined){scope.onProgress(url,itemsLoaded,itemsTotal);}if(itemsLoaded===itemsTotal){isLoading=false;if(scope.onLoad!==undefined){scope.onLoad();}}};this.itemError=function(url){if(scope.onError!==undefined){scope.onError(url);}};this.resolveURL=function(url){if(urlModifier){return urlModifier(url);}return url;};this.setURLModifier=function(transform){urlModifier=transform;return this;};}var DefaultLoadingManager=new LoadingManager();/**
* @author mrdoob / http://mrdoob.com/
*/var loading={};function FileLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;}Object.assign(FileLoader.prototype,{load:function(url,onLoad,onProgress,onError){if(url===undefined)url='';if(this.path!==undefined)url=this.path+url;url=this.manager.resolveURL(url);var scope=this;var cached=Cache.get(url);if(cached!==undefined){scope.manager.itemStart(url);setTimeout(function(){if(onLoad)onLoad(cached);scope.manager.itemEnd(url);},0);return cached;}// Check if request is duplicate
if(loading[url]!==undefined){loading[url].push({onLoad:onLoad,onProgress:onProgress,onError:onError});return;}// Check for data: URI
var dataUriRegex=/^data:(.*?)(;base64)?,(.*)$/;var dataUriRegexResult=url.match(dataUriRegex);// Safari can not handle Data URIs through XMLHttpRequest so process manually
if(dataUriRegexResult){var mimeType=dataUriRegexResult[1];var isBase64=!!dataUriRegexResult[2];var data=dataUriRegexResult[3];data=window.decodeURIComponent(data);if(isBase64)data=window.atob(data);try{var response;var responseType=(this.responseType||'').toLowerCase();switch(responseType){case'arraybuffer':case'blob':var view=new Uint8Array(data.length);for(var i=0;i<data.length;i++){view[i]=data.charCodeAt(i);}if(responseType==='blob'){response=new Blob([view.buffer],{type:mimeType});}else{response=view.buffer;}break;case'document':var parser=new DOMParser();response=parser.parseFromString(data,mimeType);break;case'json':response=JSON.parse(data);break;default:// 'text' or other
response=data;break;}// Wait for next browser tick like standard XMLHttpRequest event dispatching does
window.setTimeout(function(){if(onLoad)onLoad(response);scope.manager.itemEnd(url);},0);}catch(error){// Wait for next browser tick like standard XMLHttpRequest event dispatching does
window.setTimeout(function(){if(onError)onError(error);scope.manager.itemEnd(url);scope.manager.itemError(url);},0);}}else{// Initialise array for duplicate requests
loading[url]=[];loading[url].push({onLoad:onLoad,onProgress:onProgress,onError:onError});var request=new XMLHttpRequest();request.open('GET',url,true);request.addEventListener('load',function(event){var response=this.response;Cache.add(url,response);var callbacks=loading[url];delete loading[url];if(this.status===200){for(var i=0,il=callbacks.length;i<il;i++){var callback=callbacks[i];if(callback.onLoad)callback.onLoad(response);}scope.manager.itemEnd(url);}else if(this.status===0){// Some browsers return HTTP Status 0 when using non-http protocol
// e.g. 'file://' or 'data://'. Handle as success.
console.warn('THREE.FileLoader: HTTP Status 0 received.');for(var i=0,il=callbacks.length;i<il;i++){var callback=callbacks[i];if(callback.onLoad)callback.onLoad(response);}scope.manager.itemEnd(url);}else{for(var i=0,il=callbacks.length;i<il;i++){var callback=callbacks[i];if(callback.onError)callback.onError(event);}scope.manager.itemEnd(url);scope.manager.itemError(url);}},false);request.addEventListener('progress',function(event){var callbacks=loading[url];for(var i=0,il=callbacks.length;i<il;i++){var callback=callbacks[i];if(callback.onProgress)callback.onProgress(event);}},false);request.addEventListener('error',function(event){var callbacks=loading[url];delete loading[url];for(var i=0,il=callbacks.length;i<il;i++){var callback=callbacks[i];if(callback.onError)callback.onError(event);}scope.manager.itemEnd(url);scope.manager.itemError(url);},false);if(this.responseType!==undefined)request.responseType=this.responseType;if(this.withCredentials!==undefined)request.withCredentials=this.withCredentials;if(request.overrideMimeType)request.overrideMimeType(this.mimeType!==undefined?this.mimeType:'text/plain');for(var header in this.requestHeader){request.setRequestHeader(header,this.requestHeader[header]);}request.send(null);}scope.manager.itemStart(url);return request;},setPath:function(value){this.path=value;return this;},setResponseType:function(value){this.responseType=value;return this;},setWithCredentials:function(value){this.withCredentials=value;return this;},setMimeType:function(value){this.mimeType=value;return this;},setRequestHeader:function(value){this.requestHeader=value;return this;}});/**
* @author mrdoob / http://mrdoob.com/
*
* Abstract Base class to block based textures loader (dds, pvr, ...)
*/function CompressedTextureLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;// override in sub classes
this._parser=null;}Object.assign(CompressedTextureLoader.prototype,{load:function(url,onLoad,onProgress,onError){var scope=this;var images=[];var texture=new CompressedTexture();texture.image=images;var loader=new FileLoader(this.manager);loader.setPath(this.path);loader.setResponseType('arraybuffer');function loadTexture(i){loader.load(url[i],function(buffer){var texDatas=scope._parser(buffer,true);images[i]={width:texDatas.width,height:texDatas.height,format:texDatas.format,mipmaps:texDatas.mipmaps};loaded+=1;if(loaded===6){if(texDatas.mipmapCount===1)texture.minFilter=LinearFilter;texture.format=texDatas.format;texture.needsUpdate=true;if(onLoad)onLoad(texture);}},onProgress,onError);}if(Array.isArray(url)){var loaded=0;for(var i=0,il=url.length;i<il;++i){loadTexture(i);}}else{// compressed cubemap texture stored in a single DDS file
loader.load(url,function(buffer){var texDatas=scope._parser(buffer,true);if(texDatas.isCubemap){var faces=texDatas.mipmaps.length/texDatas.mipmapCount;for(var f=0;f<faces;f++){images[f]={mipmaps:[]};for(var i=0;i<texDatas.mipmapCount;i++){images[f].mipmaps.push(texDatas.mipmaps[f*texDatas.mipmapCount+i]);images[f].format=texDatas.format;images[f].width=texDatas.width;images[f].height=texDatas.height;}}}else{texture.image.width=texDatas.width;texture.image.height=texDatas.height;texture.mipmaps=texDatas.mipmaps;}if(texDatas.mipmapCount===1){texture.minFilter=LinearFilter;}texture.format=texDatas.format;texture.needsUpdate=true;if(onLoad)onLoad(texture);},onProgress,onError);}return texture;},setPath:function(value){this.path=value;return this;}});/**
* @author Nikos M. / https://github.com/foo123/
*
* Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)
*/function DataTextureLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;// override in sub classes
this._parser=null;}Object.assign(DataTextureLoader.prototype,{load:function(url,onLoad,onProgress,onError){var scope=this;var texture=new DataTexture();var loader=new FileLoader(this.manager);loader.setResponseType('arraybuffer');loader.load(url,function(buffer){var texData=scope._parser(buffer);if(!texData)return;if(undefined!==texData.image){texture.image=texData.image;}else if(undefined!==texData.data){texture.image.width=texData.width;texture.image.height=texData.height;texture.image.data=texData.data;}texture.wrapS=undefined!==texData.wrapS?texData.wrapS:ClampToEdgeWrapping;texture.wrapT=undefined!==texData.wrapT?texData.wrapT:ClampToEdgeWrapping;texture.magFilter=undefined!==texData.magFilter?texData.magFilter:LinearFilter;texture.minFilter=undefined!==texData.minFilter?texData.minFilter:LinearMipMapLinearFilter;texture.anisotropy=undefined!==texData.anisotropy?texData.anisotropy:1;if(undefined!==texData.format){texture.format=texData.format;}if(undefined!==texData.type){texture.type=texData.type;}if(undefined!==texData.mipmaps){texture.mipmaps=texData.mipmaps;}if(1===texData.mipmapCount){texture.minFilter=LinearFilter;}texture.needsUpdate=true;if(onLoad)onLoad(texture,texData);},onProgress,onError);return texture;}});/**
* @author mrdoob / http://mrdoob.com/
*/function ImageLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;}Object.assign(ImageLoader.prototype,{crossOrigin:'Anonymous',load:function(url,onLoad,onProgress,onError){if(url===undefined)url='';if(this.path!==undefined)url=this.path+url;url=this.manager.resolveURL(url);var scope=this;var cached=Cache.get(url);if(cached!==undefined){scope.manager.itemStart(url);setTimeout(function(){if(onLoad)onLoad(cached);scope.manager.itemEnd(url);},0);return cached;}var image=document.createElementNS('http://www.w3.org/1999/xhtml','img');image.addEventListener('load',function(){Cache.add(url,this);if(onLoad)onLoad(this);scope.manager.itemEnd(url);},false);/*
image.addEventListener( 'progress', function ( event ) {
if ( onProgress ) onProgress( event );
}, false );
*/image.addEventListener('error',function(event){if(onError)onError(event);scope.manager.itemEnd(url);scope.manager.itemError(url);},false);if(url.substr(0,5)!=='data:'){if(this.crossOrigin!==undefined)image.crossOrigin=this.crossOrigin;}scope.manager.itemStart(url);image.src=url;return image;},setCrossOrigin:function(value){this.crossOrigin=value;return this;},setPath:function(value){this.path=value;return this;}});/**
* @author mrdoob / http://mrdoob.com/
*/function CubeTextureLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;}Object.assign(CubeTextureLoader.prototype,{crossOrigin:'Anonymous',load:function(urls,onLoad,onProgress,onError){var texture=new CubeTexture();var loader=new ImageLoader(this.manager);loader.setCrossOrigin(this.crossOrigin);loader.setPath(this.path);var loaded=0;function loadTexture(i){loader.load(urls[i],function(image){texture.images[i]=image;loaded++;if(loaded===6){texture.needsUpdate=true;if(onLoad)onLoad(texture);}},undefined,onError);}for(var i=0;i<urls.length;++i){loadTexture(i);}return texture;},setCrossOrigin:function(value){this.crossOrigin=value;return this;},setPath:function(value){this.path=value;return this;}});/**
* @author mrdoob / http://mrdoob.com/
*/function TextureLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;}Object.assign(TextureLoader.prototype,{crossOrigin:'Anonymous',load:function(url,onLoad,onProgress,onError){var texture=new Texture();var loader=new ImageLoader(this.manager);loader.setCrossOrigin(this.crossOrigin);loader.setPath(this.path);loader.load(url,function(image){texture.image=image;// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.
var isJPEG=url.search(/\.(jpg|jpeg)$/)>0||url.search(/^data\:image\/jpeg/)===0;texture.format=isJPEG?RGBFormat:RGBAFormat;texture.needsUpdate=true;if(onLoad!==undefined){onLoad(texture);}},onProgress,onError);return texture;},setCrossOrigin:function(value){this.crossOrigin=value;return this;},setPath:function(value){this.path=value;return this;}});/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* Extensible curve object
*
* Some common of curve methods:
* .getPoint( t, optionalTarget ), .getTangent( t )
* .getPointAt( u, optionalTarget ), .getTangentAt( u )
* .getPoints(), .getSpacedPoints()
* .getLength()
* .updateArcLengths()
*
* This following curves inherit from THREE.Curve:
*
* -- 2D curves --
* THREE.ArcCurve
* THREE.CubicBezierCurve
* THREE.EllipseCurve
* THREE.LineCurve
* THREE.QuadraticBezierCurve
* THREE.SplineCurve
*
* -- 3D curves --
* THREE.CatmullRomCurve3
* THREE.CubicBezierCurve3
* THREE.LineCurve3
* THREE.QuadraticBezierCurve3
*
* A series of curves can be represented as a THREE.CurvePath.
*
**/ /**************************************************************
* Abstract Curve base class
**************************************************************/function Curve(){this.type='Curve';this.arcLengthDivisions=200;}Object.assign(Curve.prototype,{// Virtual base class method to overwrite and implement in subclasses
// - t [0 .. 1]
getPoint:function()/* t, optionalTarget */{console.warn('THREE.Curve: .getPoint() not implemented.');return null;},// Get point at relative position in curve according to arc length
// - u [0 .. 1]
getPointAt:function(u,optionalTarget){var t=this.getUtoTmapping(u);return this.getPoint(t,optionalTarget);},// Get sequence of points using getPoint( t )
getPoints:function(divisions){if(divisions===undefined)divisions=5;var points=[];for(var d=0;d<=divisions;d++){points.push(this.getPoint(d/divisions));}return points;},// Get sequence of points using getPointAt( u )
getSpacedPoints:function(divisions){if(divisions===undefined)divisions=5;var points=[];for(var d=0;d<=divisions;d++){points.push(this.getPointAt(d/divisions));}return points;},// Get total curve arc length
getLength:function(){var lengths=this.getLengths();return lengths[lengths.length-1];},// Get list of cumulative segment lengths
getLengths:function(divisions){if(divisions===undefined)divisions=this.arcLengthDivisions;if(this.cacheArcLengths&&this.cacheArcLengths.length===divisions+1&&!this.needsUpdate){return this.cacheArcLengths;}this.needsUpdate=false;var cache=[];var current,last=this.getPoint(0);var p,sum=0;cache.push(0);for(p=1;p<=divisions;p++){current=this.getPoint(p/divisions);sum+=current.distanceTo(last);cache.push(sum);last=current;}this.cacheArcLengths=cache;return cache;// { sums: cache, sum: sum }; Sum is in the last element.
},updateArcLengths:function(){this.needsUpdate=true;this.getLengths();},// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant
getUtoTmapping:function(u,distance){var arcLengths=this.getLengths();var i=0,il=arcLengths.length;var targetArcLength;// The targeted u distance value to get
if(distance){targetArcLength=distance;}else{targetArcLength=u*arcLengths[il-1];}// binary search for the index with largest value smaller than target u distance
var low=0,high=il-1,comparison;while(low<=high){i=Math.floor(low+(high-low)/2);// less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats
comparison=arcLengths[i]-targetArcLength;if(comparison<0){low=i+1;}else if(comparison>0){high=i-1;}else{high=i;break;// DONE
}}i=high;if(arcLengths[i]===targetArcLength){return i/(il-1);}// we could get finer grain at lengths, or use simple interpolation between two points
var lengthBefore=arcLengths[i];var lengthAfter=arcLengths[i+1];var segmentLength=lengthAfter-lengthBefore;// determine where we are between the 'before' and 'after' points
var segmentFraction=(targetArcLength-lengthBefore)/segmentLength;// add that fractional amount to t
var t=(i+segmentFraction)/(il-1);return t;},// Returns a unit vector tangent at t
// In case any sub curve does not implement its tangent derivation,
// 2 points a small delta apart will be used to find its gradient
// which seems to give a reasonable approximation
getTangent:function(t){var delta=0.0001;var t1=t-delta;var t2=t+delta;// Capping in case of danger
if(t1<0)t1=0;if(t2>1)t2=1;var pt1=this.getPoint(t1);var pt2=this.getPoint(t2);var vec=pt2.clone().sub(pt1);return vec.normalize();},getTangentAt:function(u){var t=this.getUtoTmapping(u);return this.getTangent(t);},computeFrenetFrames:function(segments,closed){// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf
var normal=new Vector3();var tangents=[];var normals=[];var binormals=[];var vec=new Vector3();var mat=new Matrix4();var i,u,theta;// compute the tangent vectors for each segment on the curve
for(i=0;i<=segments;i++){u=i/segments;tangents[i]=this.getTangentAt(u);tangents[i].normalize();}// select an initial normal vector perpendicular to the first tangent vector,
// and in the direction of the minimum tangent xyz component
normals[0]=new Vector3();binormals[0]=new Vector3();var min=Number.MAX_VALUE;var tx=Math.abs(tangents[0].x);var ty=Math.abs(tangents[0].y);var tz=Math.abs(tangents[0].z);if(tx<=min){min=tx;normal.set(1,0,0);}if(ty<=min){min=ty;normal.set(0,1,0);}if(tz<=min){normal.set(0,0,1);}vec.crossVectors(tangents[0],normal).normalize();normals[0].crossVectors(tangents[0],vec);binormals[0].crossVectors(tangents[0],normals[0]);// compute the slowly-varying normal and binormal vectors for each segment on the curve
for(i=1;i<=segments;i++){normals[i]=normals[i-1].clone();binormals[i]=binormals[i-1].clone();vec.crossVectors(tangents[i-1],tangents[i]);if(vec.length()>Number.EPSILON){vec.normalize();theta=Math.acos(_Math.clamp(tangents[i-1].dot(tangents[i]),-1,1));// clamp for floating pt errors
normals[i].applyMatrix4(mat.makeRotationAxis(vec,theta));}binormals[i].crossVectors(tangents[i],normals[i]);}// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same
if(closed===true){theta=Math.acos(_Math.clamp(normals[0].dot(normals[segments]),-1,1));theta/=segments;if(tangents[0].dot(vec.crossVectors(normals[0],normals[segments]))>0){theta=-theta;}for(i=1;i<=segments;i++){// twist a little...
normals[i].applyMatrix4(mat.makeRotationAxis(tangents[i],theta*i));binormals[i].crossVectors(tangents[i],normals[i]);}}return {tangents:tangents,normals:normals,binormals:binormals};},clone:function(){return new this.constructor().copy(this);},copy:function(source){this.arcLengthDivisions=source.arcLengthDivisions;return this;},toJSON:function(){var data={metadata:{version:4.5,type:'Curve',generator:'Curve.toJSON'}};data.arcLengthDivisions=this.arcLengthDivisions;data.type=this.type;return data;},fromJSON:function(json){this.arcLengthDivisions=json.arcLengthDivisions;return this;}});function EllipseCurve(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation){Curve.call(this);this.type='EllipseCurve';this.aX=aX||0;this.aY=aY||0;this.xRadius=xRadius||1;this.yRadius=yRadius||1;this.aStartAngle=aStartAngle||0;this.aEndAngle=aEndAngle||2*Math.PI;this.aClockwise=aClockwise||false;this.aRotation=aRotation||0;}EllipseCurve.prototype=Object.create(Curve.prototype);EllipseCurve.prototype.constructor=EllipseCurve;EllipseCurve.prototype.isEllipseCurve=true;EllipseCurve.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector2();var twoPi=Math.PI*2;var deltaAngle=this.aEndAngle-this.aStartAngle;var samePoints=Math.abs(deltaAngle)<Number.EPSILON;// ensures that deltaAngle is 0 .. 2 PI
while(deltaAngle<0)deltaAngle+=twoPi;while(deltaAngle>twoPi)deltaAngle-=twoPi;if(deltaAngle<Number.EPSILON){if(samePoints){deltaAngle=0;}else{deltaAngle=twoPi;}}if(this.aClockwise===true&&!samePoints){if(deltaAngle===twoPi){deltaAngle=-twoPi;}else{deltaAngle=deltaAngle-twoPi;}}var angle=this.aStartAngle+t*deltaAngle;var x=this.aX+this.xRadius*Math.cos(angle);var y=this.aY+this.yRadius*Math.sin(angle);if(this.aRotation!==0){var cos=Math.cos(this.aRotation);var sin=Math.sin(this.aRotation);var tx=x-this.aX;var ty=y-this.aY;// Rotate the point about the center of the ellipse.
x=tx*cos-ty*sin+this.aX;y=tx*sin+ty*cos+this.aY;}return point.set(x,y);};EllipseCurve.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.aX=source.aX;this.aY=source.aY;this.xRadius=source.xRadius;this.yRadius=source.yRadius;this.aStartAngle=source.aStartAngle;this.aEndAngle=source.aEndAngle;this.aClockwise=source.aClockwise;this.aRotation=source.aRotation;return this;};EllipseCurve.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.aX=this.aX;data.aY=this.aY;data.xRadius=this.xRadius;data.yRadius=this.yRadius;data.aStartAngle=this.aStartAngle;data.aEndAngle=this.aEndAngle;data.aClockwise=this.aClockwise;data.aRotation=this.aRotation;return data;};EllipseCurve.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.aX=json.aX;this.aY=json.aY;this.xRadius=json.xRadius;this.yRadius=json.yRadius;this.aStartAngle=json.aStartAngle;this.aEndAngle=json.aEndAngle;this.aClockwise=json.aClockwise;this.aRotation=json.aRotation;return this;};function ArcCurve(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){EllipseCurve.call(this,aX,aY,aRadius,aRadius,aStartAngle,aEndAngle,aClockwise);this.type='ArcCurve';}ArcCurve.prototype=Object.create(EllipseCurve.prototype);ArcCurve.prototype.constructor=ArcCurve;ArcCurve.prototype.isArcCurve=true;/**
* @author zz85 https://github.com/zz85
*
* Centripetal CatmullRom Curve - which is useful for avoiding
* cusps and self-intersections in non-uniform catmull rom curves.
* http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf
*
* curve.type accepts centripetal(default), chordal and catmullrom
* curve.tension is used for catmullrom which defaults to 0.5
*/ /*
Based on an optimized c++ solution in
- http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/
- http://ideone.com/NoEbVM
This CubicPoly class could be used for reusing some variables and calculations,
but for three.js curve use, it could be possible inlined and flatten into a single function call
which can be placed in CurveUtils.
*/function CubicPoly(){var c0=0,c1=0,c2=0,c3=0;/*
* Compute coefficients for a cubic polynomial
* p(s) = c0 + c1*s + c2*s^2 + c3*s^3
* such that
* p(0) = x0, p(1) = x1
* and
* p'(0) = t0, p'(1) = t1.
*/function init(x0,x1,t0,t1){c0=x0;c1=t0;c2=-3*x0+3*x1-2*t0-t1;c3=2*x0-2*x1+t0+t1;}return {initCatmullRom:function(x0,x1,x2,x3,tension){init(x1,x2,tension*(x2-x0),tension*(x3-x1));},initNonuniformCatmullRom:function(x0,x1,x2,x3,dt0,dt1,dt2){// compute tangents when parameterized in [t1,t2]
var t1=(x1-x0)/dt0-(x2-x0)/(dt0+dt1)+(x2-x1)/dt1;var t2=(x2-x1)/dt1-(x3-x1)/(dt1+dt2)+(x3-x2)/dt2;// rescale tangents for parametrization in [0,1]
t1*=dt1;t2*=dt1;init(x1,x2,t1,t2);},calc:function(t){var t2=t*t;var t3=t2*t;return c0+c1*t+c2*t2+c3*t3;}};}//
var tmp=new Vector3();var px$1=new CubicPoly();var py=new CubicPoly();var pz=new CubicPoly();function CatmullRomCurve3(points,closed,curveType,tension){Curve.call(this);this.type='CatmullRomCurve3';this.points=points||[];this.closed=closed||false;this.curveType=curveType||'centripetal';this.tension=tension||0.5;}CatmullRomCurve3.prototype=Object.create(Curve.prototype);CatmullRomCurve3.prototype.constructor=CatmullRomCurve3;CatmullRomCurve3.prototype.isCatmullRomCurve3=true;CatmullRomCurve3.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector3();var points=this.points;var l=points.length;var p=(l-(this.closed?0:1))*t;var intPoint=Math.floor(p);var weight=p-intPoint;if(this.closed){intPoint+=intPoint>0?0:(Math.floor(Math.abs(intPoint)/l)+1)*l;}else if(weight===0&&intPoint===l-1){intPoint=l-2;weight=1;}var p0,p1,p2,p3;// 4 points
if(this.closed||intPoint>0){p0=points[(intPoint-1)%l];}else{// extrapolate first point
tmp.subVectors(points[0],points[1]).add(points[0]);p0=tmp;}p1=points[intPoint%l];p2=points[(intPoint+1)%l];if(this.closed||intPoint+2<l){p3=points[(intPoint+2)%l];}else{// extrapolate last point
tmp.subVectors(points[l-1],points[l-2]).add(points[l-1]);p3=tmp;}if(this.curveType==='centripetal'||this.curveType==='chordal'){// init Centripetal / Chordal Catmull-Rom
var pow=this.curveType==='chordal'?0.5:0.25;var dt0=Math.pow(p0.distanceToSquared(p1),pow);var dt1=Math.pow(p1.distanceToSquared(p2),pow);var dt2=Math.pow(p2.distanceToSquared(p3),pow);// safety check for repeated points
if(dt1<1e-4)dt1=1.0;if(dt0<1e-4)dt0=dt1;if(dt2<1e-4)dt2=dt1;px$1.initNonuniformCatmullRom(p0.x,p1.x,p2.x,p3.x,dt0,dt1,dt2);py.initNonuniformCatmullRom(p0.y,p1.y,p2.y,p3.y,dt0,dt1,dt2);pz.initNonuniformCatmullRom(p0.z,p1.z,p2.z,p3.z,dt0,dt1,dt2);}else if(this.curveType==='catmullrom'){px$1.initCatmullRom(p0.x,p1.x,p2.x,p3.x,this.tension);py.initCatmullRom(p0.y,p1.y,p2.y,p3.y,this.tension);pz.initCatmullRom(p0.z,p1.z,p2.z,p3.z,this.tension);}point.set(px$1.calc(weight),py.calc(weight),pz.calc(weight));return point;};CatmullRomCurve3.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.points=[];for(var i=0,l=source.points.length;i<l;i++){var point=source.points[i];this.points.push(point.clone());}this.closed=source.closed;this.curveType=source.curveType;this.tension=source.tension;return this;};CatmullRomCurve3.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.points=[];for(var i=0,l=this.points.length;i<l;i++){var point=this.points[i];data.points.push(point.toArray());}data.closed=this.closed;data.curveType=this.curveType;data.tension=this.tension;return data;};CatmullRomCurve3.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.points=[];for(var i=0,l=json.points.length;i<l;i++){var point=json.points[i];this.points.push(new Vector3().fromArray(point));}this.closed=json.closed;this.curveType=json.curveType;this.tension=json.tension;return this;};/**
* @author zz85 / http://www.lab4games.net/zz85/blog
*
* Bezier Curves formulas obtained from
* http://en.wikipedia.org/wiki/Bézier_curve
*/function CatmullRom(t,p0,p1,p2,p3){var v0=(p2-p0)*0.5;var v1=(p3-p1)*0.5;var t2=t*t;var t3=t*t2;return (2*p1-2*p2+v0+v1)*t3+(-3*p1+3*p2-2*v0-v1)*t2+v0*t+p1;}//
function QuadraticBezierP0(t,p){var k=1-t;return k*k*p;}function QuadraticBezierP1(t,p){return 2*(1-t)*t*p;}function QuadraticBezierP2(t,p){return t*t*p;}function QuadraticBezier(t,p0,p1,p2){return QuadraticBezierP0(t,p0)+QuadraticBezierP1(t,p1)+QuadraticBezierP2(t,p2);}//
function CubicBezierP0(t,p){var k=1-t;return k*k*k*p;}function CubicBezierP1(t,p){var k=1-t;return 3*k*k*t*p;}function CubicBezierP2(t,p){return 3*(1-t)*t*t*p;}function CubicBezierP3(t,p){return t*t*t*p;}function CubicBezier(t,p0,p1,p2,p3){return CubicBezierP0(t,p0)+CubicBezierP1(t,p1)+CubicBezierP2(t,p2)+CubicBezierP3(t,p3);}function CubicBezierCurve(v0,v1,v2,v3){Curve.call(this);this.type='CubicBezierCurve';this.v0=v0||new Vector2();this.v1=v1||new Vector2();this.v2=v2||new Vector2();this.v3=v3||new Vector2();}CubicBezierCurve.prototype=Object.create(Curve.prototype);CubicBezierCurve.prototype.constructor=CubicBezierCurve;CubicBezierCurve.prototype.isCubicBezierCurve=true;CubicBezierCurve.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector2();var v0=this.v0,v1=this.v1,v2=this.v2,v3=this.v3;point.set(CubicBezier(t,v0.x,v1.x,v2.x,v3.x),CubicBezier(t,v0.y,v1.y,v2.y,v3.y));return point;};CubicBezierCurve.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.v0.copy(source.v0);this.v1.copy(source.v1);this.v2.copy(source.v2);this.v3.copy(source.v3);return this;};CubicBezierCurve.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.v0=this.v0.toArray();data.v1=this.v1.toArray();data.v2=this.v2.toArray();data.v3=this.v3.toArray();return data;};CubicBezierCurve.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.v0.fromArray(json.v0);this.v1.fromArray(json.v1);this.v2.fromArray(json.v2);this.v3.fromArray(json.v3);return this;};function CubicBezierCurve3(v0,v1,v2,v3){Curve.call(this);this.type='CubicBezierCurve3';this.v0=v0||new Vector3();this.v1=v1||new Vector3();this.v2=v2||new Vector3();this.v3=v3||new Vector3();}CubicBezierCurve3.prototype=Object.create(Curve.prototype);CubicBezierCurve3.prototype.constructor=CubicBezierCurve3;CubicBezierCurve3.prototype.isCubicBezierCurve3=true;CubicBezierCurve3.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector3();var v0=this.v0,v1=this.v1,v2=this.v2,v3=this.v3;point.set(CubicBezier(t,v0.x,v1.x,v2.x,v3.x),CubicBezier(t,v0.y,v1.y,v2.y,v3.y),CubicBezier(t,v0.z,v1.z,v2.z,v3.z));return point;};CubicBezierCurve3.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.v0.copy(source.v0);this.v1.copy(source.v1);this.v2.copy(source.v2);this.v3.copy(source.v3);return this;};CubicBezierCurve3.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.v0=this.v0.toArray();data.v1=this.v1.toArray();data.v2=this.v2.toArray();data.v3=this.v3.toArray();return data;};CubicBezierCurve3.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.v0.fromArray(json.v0);this.v1.fromArray(json.v1);this.v2.fromArray(json.v2);this.v3.fromArray(json.v3);return this;};function LineCurve(v1,v2){Curve.call(this);this.type='LineCurve';this.v1=v1||new Vector2();this.v2=v2||new Vector2();}LineCurve.prototype=Object.create(Curve.prototype);LineCurve.prototype.constructor=LineCurve;LineCurve.prototype.isLineCurve=true;LineCurve.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector2();if(t===1){point.copy(this.v2);}else{point.copy(this.v2).sub(this.v1);point.multiplyScalar(t).add(this.v1);}return point;};// Line curve is linear, so we can overwrite default getPointAt
LineCurve.prototype.getPointAt=function(u,optionalTarget){return this.getPoint(u,optionalTarget);};LineCurve.prototype.getTangent=function()/* t */{var tangent=this.v2.clone().sub(this.v1);return tangent.normalize();};LineCurve.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.v1.copy(source.v1);this.v2.copy(source.v2);return this;};LineCurve.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.v1=this.v1.toArray();data.v2=this.v2.toArray();return data;};LineCurve.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.v1.fromArray(json.v1);this.v2.fromArray(json.v2);return this;};function LineCurve3(v1,v2){Curve.call(this);this.type='LineCurve3';this.v1=v1||new Vector3();this.v2=v2||new Vector3();}LineCurve3.prototype=Object.create(Curve.prototype);LineCurve3.prototype.constructor=LineCurve3;LineCurve3.prototype.isLineCurve3=true;LineCurve3.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector3();if(t===1){point.copy(this.v2);}else{point.copy(this.v2).sub(this.v1);point.multiplyScalar(t).add(this.v1);}return point;};// Line curve is linear, so we can overwrite default getPointAt
LineCurve3.prototype.getPointAt=function(u,optionalTarget){return this.getPoint(u,optionalTarget);};LineCurve3.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.v1.copy(source.v1);this.v2.copy(source.v2);return this;};LineCurve3.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.v1=this.v1.toArray();data.v2=this.v2.toArray();return data;};LineCurve3.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.v1.fromArray(json.v1);this.v2.fromArray(json.v2);return this;};function QuadraticBezierCurve(v0,v1,v2){Curve.call(this);this.type='QuadraticBezierCurve';this.v0=v0||new Vector2();this.v1=v1||new Vector2();this.v2=v2||new Vector2();}QuadraticBezierCurve.prototype=Object.create(Curve.prototype);QuadraticBezierCurve.prototype.constructor=QuadraticBezierCurve;QuadraticBezierCurve.prototype.isQuadraticBezierCurve=true;QuadraticBezierCurve.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector2();var v0=this.v0,v1=this.v1,v2=this.v2;point.set(QuadraticBezier(t,v0.x,v1.x,v2.x),QuadraticBezier(t,v0.y,v1.y,v2.y));return point;};QuadraticBezierCurve.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.v0.copy(source.v0);this.v1.copy(source.v1);this.v2.copy(source.v2);return this;};QuadraticBezierCurve.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.v0=this.v0.toArray();data.v1=this.v1.toArray();data.v2=this.v2.toArray();return data;};QuadraticBezierCurve.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.v0.fromArray(json.v0);this.v1.fromArray(json.v1);this.v2.fromArray(json.v2);return this;};function QuadraticBezierCurve3(v0,v1,v2){Curve.call(this);this.type='QuadraticBezierCurve3';this.v0=v0||new Vector3();this.v1=v1||new Vector3();this.v2=v2||new Vector3();}QuadraticBezierCurve3.prototype=Object.create(Curve.prototype);QuadraticBezierCurve3.prototype.constructor=QuadraticBezierCurve3;QuadraticBezierCurve3.prototype.isQuadraticBezierCurve3=true;QuadraticBezierCurve3.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector3();var v0=this.v0,v1=this.v1,v2=this.v2;point.set(QuadraticBezier(t,v0.x,v1.x,v2.x),QuadraticBezier(t,v0.y,v1.y,v2.y),QuadraticBezier(t,v0.z,v1.z,v2.z));return point;};QuadraticBezierCurve3.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.v0.copy(source.v0);this.v1.copy(source.v1);this.v2.copy(source.v2);return this;};QuadraticBezierCurve3.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.v0=this.v0.toArray();data.v1=this.v1.toArray();data.v2=this.v2.toArray();return data;};QuadraticBezierCurve3.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.v0.fromArray(json.v0);this.v1.fromArray(json.v1);this.v2.fromArray(json.v2);return this;};function SplineCurve(points/* array of Vector2 */){Curve.call(this);this.type='SplineCurve';this.points=points||[];}SplineCurve.prototype=Object.create(Curve.prototype);SplineCurve.prototype.constructor=SplineCurve;SplineCurve.prototype.isSplineCurve=true;SplineCurve.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector2();var points=this.points;var p=(points.length-1)*t;var intPoint=Math.floor(p);var weight=p-intPoint;var p0=points[intPoint===0?intPoint:intPoint-1];var p1=points[intPoint];var p2=points[intPoint>points.length-2?points.length-1:intPoint+1];var p3=points[intPoint>points.length-3?points.length-1:intPoint+2];point.set(CatmullRom(weight,p0.x,p1.x,p2.x,p3.x),CatmullRom(weight,p0.y,p1.y,p2.y,p3.y));return point;};SplineCurve.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.points=[];for(var i=0,l=source.points.length;i<l;i++){var point=source.points[i];this.points.push(point.clone());}return this;};SplineCurve.prototype.toJSON=function(){var data=Curve.prototype.toJSON.call(this);data.points=[];for(var i=0,l=this.points.length;i<l;i++){var point=this.points[i];data.points.push(point.toArray());}return data;};SplineCurve.prototype.fromJSON=function(json){Curve.prototype.fromJSON.call(this,json);this.points=[];for(var i=0,l=json.points.length;i<l;i++){var point=json.points[i];this.points.push(new Vector2().fromArray(point));}return this;};var Curves=Object.freeze({ArcCurve:ArcCurve,CatmullRomCurve3:CatmullRomCurve3,CubicBezierCurve:CubicBezierCurve,CubicBezierCurve3:CubicBezierCurve3,EllipseCurve:EllipseCurve,LineCurve:LineCurve,LineCurve3:LineCurve3,QuadraticBezierCurve:QuadraticBezierCurve,QuadraticBezierCurve3:QuadraticBezierCurve3,SplineCurve:SplineCurve});/**
* @author zz85 / http://www.lab4games.net/zz85/blog
*
**/ /**************************************************************
* Curved Path - a curve path is simply a array of connected
* curves, but retains the api of a curve
**************************************************************/function CurvePath(){Curve.call(this);this.type='CurvePath';this.curves=[];this.autoClose=false;// Automatically closes the path
}CurvePath.prototype=Object.assign(Object.create(Curve.prototype),{constructor:CurvePath,add:function(curve){this.curves.push(curve);},closePath:function(){// Add a line curve if start and end of lines are not connected
var startPoint=this.curves[0].getPoint(0);var endPoint=this.curves[this.curves.length-1].getPoint(1);if(!startPoint.equals(endPoint)){this.curves.push(new LineCurve(endPoint,startPoint));}},// To get accurate point with reference to
// entire path distance at time t,
// following has to be done:
// 1. Length of each sub path have to be known
// 2. Locate and identify type of curve
// 3. Get t for the curve
// 4. Return curve.getPointAt(t')
getPoint:function(t){var d=t*this.getLength();var curveLengths=this.getCurveLengths();var i=0;// To think about boundaries points.
while(i<curveLengths.length){if(curveLengths[i]>=d){var diff=curveLengths[i]-d;var curve=this.curves[i];var segmentLength=curve.getLength();var u=segmentLength===0?0:1-diff/segmentLength;return curve.getPointAt(u);}i++;}return null;// loop where sum != 0, sum > d , sum+1 <d
},// We cannot use the default THREE.Curve getPoint() with getLength() because in
// THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath
// getPoint() depends on getLength
getLength:function(){var lens=this.getCurveLengths();return lens[lens.length-1];},// cacheLengths must be recalculated.
updateArcLengths:function(){this.needsUpdate=true;this.cacheLengths=null;this.getCurveLengths();},// Compute lengths and cache them
// We cannot overwrite getLengths() because UtoT mapping uses it.
getCurveLengths:function(){// We use cache values if curves and cache array are same length
if(this.cacheLengths&&this.cacheLengths.length===this.curves.length){return this.cacheLengths;}// Get length of sub-curve
// Push sums into cached array
var lengths=[],sums=0;for(var i=0,l=this.curves.length;i<l;i++){sums+=this.curves[i].getLength();lengths.push(sums);}this.cacheLengths=lengths;return lengths;},getSpacedPoints:function(divisions){if(divisions===undefined)divisions=40;var points=[];for(var i=0;i<=divisions;i++){points.push(this.getPoint(i/divisions));}if(this.autoClose){points.push(points[0]);}return points;},getPoints:function(divisions){divisions=divisions||12;var points=[],last;for(var i=0,curves=this.curves;i<curves.length;i++){var curve=curves[i];var resolution=curve&&curve.isEllipseCurve?divisions*2:curve&&curve.isLineCurve?1:curve&&curve.isSplineCurve?divisions*curve.points.length:divisions;var pts=curve.getPoints(resolution);for(var j=0;j<pts.length;j++){var point=pts[j];if(last&&last.equals(point))continue;// ensures no consecutive points are duplicates
points.push(point);last=point;}}if(this.autoClose&&points.length>1&&!points[points.length-1].equals(points[0])){points.push(points[0]);}return points;},copy:function(source){Curve.prototype.copy.call(this,source);this.curves=[];for(var i=0,l=source.curves.length;i<l;i++){var curve=source.curves[i];this.curves.push(curve.clone());}this.autoClose=source.autoClose;return this;},toJSON:function(){var data=Curve.prototype.toJSON.call(this);data.autoClose=this.autoClose;data.curves=[];for(var i=0,l=this.curves.length;i<l;i++){var curve=this.curves[i];data.curves.push(curve.toJSON());}return data;},fromJSON:function(json){Curve.prototype.fromJSON.call(this,json);this.autoClose=json.autoClose;this.curves=[];for(var i=0,l=json.curves.length;i<l;i++){var curve=json.curves[i];this.curves.push(new Curves[curve.type]().fromJSON(curve));}return this;}});/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* Creates free form 2d path using series of points, lines or curves.
**/function Path(points){CurvePath.call(this);this.type='Path';this.currentPoint=new Vector2();if(points){this.setFromPoints(points);}}Path.prototype=Object.assign(Object.create(CurvePath.prototype),{constructor:Path,setFromPoints:function(points){this.moveTo(points[0].x,points[0].y);for(var i=1,l=points.length;i<l;i++){this.lineTo(points[i].x,points[i].y);}},moveTo:function(x,y){this.currentPoint.set(x,y);// TODO consider referencing vectors instead of copying?
},lineTo:function(x,y){var curve=new LineCurve(this.currentPoint.clone(),new Vector2(x,y));this.curves.push(curve);this.currentPoint.set(x,y);},quadraticCurveTo:function(aCPx,aCPy,aX,aY){var curve=new QuadraticBezierCurve(this.currentPoint.clone(),new Vector2(aCPx,aCPy),new Vector2(aX,aY));this.curves.push(curve);this.currentPoint.set(aX,aY);},bezierCurveTo:function(aCP1x,aCP1y,aCP2x,aCP2y,aX,aY){var curve=new CubicBezierCurve(this.currentPoint.clone(),new Vector2(aCP1x,aCP1y),new Vector2(aCP2x,aCP2y),new Vector2(aX,aY));this.curves.push(curve);this.currentPoint.set(aX,aY);},splineThru:function(pts/*Array of Vector*/){var npts=[this.currentPoint.clone()].concat(pts);var curve=new SplineCurve(npts);this.curves.push(curve);this.currentPoint.copy(pts[pts.length-1]);},arc:function(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){var x0=this.currentPoint.x;var y0=this.currentPoint.y;this.absarc(aX+x0,aY+y0,aRadius,aStartAngle,aEndAngle,aClockwise);},absarc:function(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){this.absellipse(aX,aY,aRadius,aRadius,aStartAngle,aEndAngle,aClockwise);},ellipse:function(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation){var x0=this.currentPoint.x;var y0=this.currentPoint.y;this.absellipse(aX+x0,aY+y0,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation);},absellipse:function(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation){var curve=new EllipseCurve(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation);if(this.curves.length>0){// if a previous curve is present, attempt to join
var firstPoint=curve.getPoint(0);if(!firstPoint.equals(this.currentPoint)){this.lineTo(firstPoint.x,firstPoint.y);}}this.curves.push(curve);var lastPoint=curve.getPoint(1);this.currentPoint.copy(lastPoint);},copy:function(source){CurvePath.prototype.copy.call(this,source);this.currentPoint.copy(source.currentPoint);return this;},toJSON:function(){var data=CurvePath.prototype.toJSON.call(this);data.currentPoint=this.currentPoint.toArray();return data;},fromJSON:function(json){CurvePath.prototype.fromJSON.call(this,json);this.currentPoint.fromArray(json.currentPoint);return this;}});/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* Defines a 2d shape plane using paths.
**/ // STEP 1 Create a path.
// STEP 2 Turn path into shape.
// STEP 3 ExtrudeGeometry takes in Shape/Shapes
// STEP 3a - Extract points from each shape, turn to vertices
// STEP 3b - Triangulate each shape, add faces.
function Shape(points){Path.call(this,points);this.uuid=_Math.generateUUID();this.type='Shape';this.holes=[];}Shape.prototype=Object.assign(Object.create(Path.prototype),{constructor:Shape,getPointsHoles:function(divisions){var holesPts=[];for(var i=0,l=this.holes.length;i<l;i++){holesPts[i]=this.holes[i].getPoints(divisions);}return holesPts;},// get points of shape and holes (keypoints based on segments parameter)
extractPoints:function(divisions){return {shape:this.getPoints(divisions),holes:this.getPointsHoles(divisions)};},copy:function(source){Path.prototype.copy.call(this,source);this.holes=[];for(var i=0,l=source.holes.length;i<l;i++){var hole=source.holes[i];this.holes.push(hole.clone());}return this;},toJSON:function(){var data=Path.prototype.toJSON.call(this);data.uuid=this.uuid;data.holes=[];for(var i=0,l=this.holes.length;i<l;i++){var hole=this.holes[i];data.holes.push(hole.toJSON());}return data;},fromJSON:function(json){Path.prototype.fromJSON.call(this,json);this.uuid=json.uuid;this.holes=[];for(var i=0,l=json.holes.length;i<l;i++){var hole=json.holes[i];this.holes.push(new Path().fromJSON(hole));}return this;}});/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/function Light(color,intensity){Object3D.call(this);this.type='Light';this.color=new Color(color);this.intensity=intensity!==undefined?intensity:1;this.receiveShadow=undefined;}Light.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Light,isLight:true,copy:function(source){Object3D.prototype.copy.call(this,source);this.color.copy(source.color);this.intensity=source.intensity;return this;},toJSON:function(meta){var data=Object3D.prototype.toJSON.call(this,meta);data.object.color=this.color.getHex();data.object.intensity=this.intensity;if(this.groundColor!==undefined)data.object.groundColor=this.groundColor.getHex();if(this.distance!==undefined)data.object.distance=this.distance;if(this.angle!==undefined)data.object.angle=this.angle;if(this.decay!==undefined)data.object.decay=this.decay;if(this.penumbra!==undefined)data.object.penumbra=this.penumbra;if(this.shadow!==undefined)data.object.shadow=this.shadow.toJSON();return data;}});/**
* @author alteredq / http://alteredqualia.com/
*/function HemisphereLight(skyColor,groundColor,intensity){Light.call(this,skyColor,intensity);this.type='HemisphereLight';this.castShadow=undefined;this.position.copy(Object3D.DefaultUp);this.updateMatrix();this.groundColor=new Color(groundColor);}HemisphereLight.prototype=Object.assign(Object.create(Light.prototype),{constructor:HemisphereLight,isHemisphereLight:true,copy:function(source){Light.prototype.copy.call(this,source);this.groundColor.copy(source.groundColor);return this;}});/**
* @author mrdoob / http://mrdoob.com/
*/function LightShadow(camera){this.camera=camera;this.bias=0;this.radius=1;this.mapSize=new Vector2(512,512);this.map=null;this.matrix=new Matrix4();}Object.assign(LightShadow.prototype,{copy:function(source){this.camera=source.camera.clone();this.bias=source.bias;this.radius=source.radius;this.mapSize.copy(source.mapSize);return this;},clone:function(){return new this.constructor().copy(this);},toJSON:function(){var object={};if(this.bias!==0)object.bias=this.bias;if(this.radius!==1)object.radius=this.radius;if(this.mapSize.x!==512||this.mapSize.y!==512)object.mapSize=this.mapSize.toArray();object.camera=this.camera.toJSON(false).object;delete object.camera.matrix;return object;}});/**
* @author mrdoob / http://mrdoob.com/
*/function SpotLightShadow(){LightShadow.call(this,new PerspectiveCamera(50,1,0.5,500));}SpotLightShadow.prototype=Object.assign(Object.create(LightShadow.prototype),{constructor:SpotLightShadow,isSpotLightShadow:true,update:function(light){var camera=this.camera;var fov=_Math.RAD2DEG*2*light.angle;var aspect=this.mapSize.width/this.mapSize.height;var far=light.distance||camera.far;if(fov!==camera.fov||aspect!==camera.aspect||far!==camera.far){camera.fov=fov;camera.aspect=aspect;camera.far=far;camera.updateProjectionMatrix();}}});/**
* @author alteredq / http://alteredqualia.com/
*/function SpotLight(color,intensity,distance,angle,penumbra,decay){Light.call(this,color,intensity);this.type='SpotLight';this.position.copy(Object3D.DefaultUp);this.updateMatrix();this.target=new Object3D();Object.defineProperty(this,'power',{get:function(){// intensity = power per solid angle.
// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
return this.intensity*Math.PI;},set:function(power){// intensity = power per solid angle.
// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
this.intensity=power/Math.PI;}});this.distance=distance!==undefined?distance:0;this.angle=angle!==undefined?angle:Math.PI/3;this.penumbra=penumbra!==undefined?penumbra:0;this.decay=decay!==undefined?decay:1;// for physically correct lights, should be 2.
this.shadow=new SpotLightShadow();}SpotLight.prototype=Object.assign(Object.create(Light.prototype),{constructor:SpotLight,isSpotLight:true,copy:function(source){Light.prototype.copy.call(this,source);this.distance=source.distance;this.angle=source.angle;this.penumbra=source.penumbra;this.decay=source.decay;this.target=source.target.clone();this.shadow=source.shadow.clone();return this;}});/**
* @author mrdoob / http://mrdoob.com/
*/function PointLight(color,intensity,distance,decay){Light.call(this,color,intensity);this.type='PointLight';Object.defineProperty(this,'power',{get:function(){// intensity = power per solid angle.
// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
return this.intensity*4*Math.PI;},set:function(power){// intensity = power per solid angle.
// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf
this.intensity=power/(4*Math.PI);}});this.distance=distance!==undefined?distance:0;this.decay=decay!==undefined?decay:1;// for physically correct lights, should be 2.
this.shadow=new LightShadow(new PerspectiveCamera(90,1,0.5,500));}PointLight.prototype=Object.assign(Object.create(Light.prototype),{constructor:PointLight,isPointLight:true,copy:function(source){Light.prototype.copy.call(this,source);this.distance=source.distance;this.decay=source.decay;this.shadow=source.shadow.clone();return this;}});/**
* @author mrdoob / http://mrdoob.com/
*/function DirectionalLightShadow(){LightShadow.call(this,new OrthographicCamera(-5,5,5,-5,0.5,500));}DirectionalLightShadow.prototype=Object.assign(Object.create(LightShadow.prototype),{constructor:DirectionalLightShadow});/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/function DirectionalLight(color,intensity){Light.call(this,color,intensity);this.type='DirectionalLight';this.position.copy(Object3D.DefaultUp);this.updateMatrix();this.target=new Object3D();this.shadow=new DirectionalLightShadow();}DirectionalLight.prototype=Object.assign(Object.create(Light.prototype),{constructor:DirectionalLight,isDirectionalLight:true,copy:function(source){Light.prototype.copy.call(this,source);this.target=source.target.clone();this.shadow=source.shadow.clone();return this;}});/**
* @author mrdoob / http://mrdoob.com/
*/function AmbientLight(color,intensity){Light.call(this,color,intensity);this.type='AmbientLight';this.castShadow=undefined;}AmbientLight.prototype=Object.assign(Object.create(Light.prototype),{constructor:AmbientLight,isAmbientLight:true});/**
* @author abelnation / http://github.com/abelnation
*/function RectAreaLight(color,intensity,width,height){Light.call(this,color,intensity);this.type='RectAreaLight';this.width=width!==undefined?width:10;this.height=height!==undefined?height:10;}RectAreaLight.prototype=Object.assign(Object.create(Light.prototype),{constructor:RectAreaLight,isRectAreaLight:true,copy:function(source){Light.prototype.copy.call(this,source);this.width=source.width;this.height=source.height;return this;},toJSON:function(meta){var data=Light.prototype.toJSON.call(this,meta);data.object.width=this.width;data.object.height=this.height;return data;}});/**
*
* A Track that interpolates Strings
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/function StringKeyframeTrack(name,times,values,interpolation){KeyframeTrack.call(this,name,times,values,interpolation);}StringKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype),{constructor:StringKeyframeTrack,ValueTypeName:'string',ValueBufferType:Array,DefaultInterpolation:InterpolateDiscrete,InterpolantFactoryMethodLinear:undefined,InterpolantFactoryMethodSmooth:undefined});/**
*
* A Track of Boolean keyframe values.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/function BooleanKeyframeTrack(name,times,values){KeyframeTrack.call(this,name,times,values);}BooleanKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype),{constructor:BooleanKeyframeTrack,ValueTypeName:'bool',ValueBufferType:Array,DefaultInterpolation:InterpolateDiscrete,InterpolantFactoryMethodLinear:undefined,InterpolantFactoryMethodSmooth:undefined// Note: Actually this track could have a optimized / compressed
// representation of a single value and a custom interpolant that
// computes "firstValue ^ isOdd( index )".
});/**
* Abstract base class of interpolants over parametric samples.
*
* The parameter domain is one dimensional, typically the time or a path
* along a curve defined by the data.
*
* The sample values can have any dimensionality and derived classes may
* apply special interpretations to the data.
*
* This class provides the interval seek in a Template Method, deferring
* the actual interpolation to derived classes.
*
* Time complexity is O(1) for linear access crossing at most two points
* and O(log N) for random access, where N is the number of positions.
*
* References:
*
* http://www.oodesign.com/template-method-pattern.html
*
* @author tschw
*/function Interpolant(parameterPositions,sampleValues,sampleSize,resultBuffer){this.parameterPositions=parameterPositions;this._cachedIndex=0;this.resultBuffer=resultBuffer!==undefined?resultBuffer:new sampleValues.constructor(sampleSize);this.sampleValues=sampleValues;this.valueSize=sampleSize;}Object.assign(Interpolant.prototype,{evaluate:function(t){var pp=this.parameterPositions,i1=this._cachedIndex,t1=pp[i1],t0=pp[i1-1];validate_interval:{seek:{var right;linear_scan:{//- See http://jsperf.com/comparison-to-undefined/3
//- slower code:
//-
//- if ( t >= t1 || t1 === undefined ) {
forward_scan:if(!(t<t1)){for(var giveUpAt=i1+2;;){if(t1===undefined){if(t<t0)break forward_scan;// after end
i1=pp.length;this._cachedIndex=i1;return this.afterEnd_(i1-1,t,t0);}if(i1===giveUpAt)break;// this loop
t0=t1;t1=pp[++i1];if(t<t1){// we have arrived at the sought interval
break seek;}}// prepare binary search on the right side of the index
right=pp.length;break linear_scan;}//- slower code:
//- if ( t < t0 || t0 === undefined ) {
if(!(t>=t0)){// looping?
var t1global=pp[1];if(t<t1global){i1=2;// + 1, using the scan for the details
t0=t1global;}// linear reverse scan
for(var giveUpAt=i1-2;;){if(t0===undefined){// before start
this._cachedIndex=0;return this.beforeStart_(0,t,t1);}if(i1===giveUpAt)break;// this loop
t1=t0;t0=pp[--i1-1];if(t>=t0){// we have arrived at the sought interval
break seek;}}// prepare binary search on the left side of the index
right=i1;i1=0;break linear_scan;}// the interval is valid
break validate_interval;}// linear scan
// binary search
while(i1<right){var mid=i1+right>>>1;if(t<pp[mid]){right=mid;}else{i1=mid+1;}}t1=pp[i1];t0=pp[i1-1];// check boundary cases, again
if(t0===undefined){this._cachedIndex=0;return this.beforeStart_(0,t,t1);}if(t1===undefined){i1=pp.length;this._cachedIndex=i1;return this.afterEnd_(i1-1,t0,t);}}// seek
this._cachedIndex=i1;this.intervalChanged_(i1,t0,t1);}// validate_interval
return this.interpolate_(i1,t0,t,t1);},settings:null,// optional, subclass-specific settings structure
// Note: The indirection allows central control of many interpolants.
// --- Protected interface
DefaultSettings_:{},getSettings_:function(){return this.settings||this.DefaultSettings_;},copySampleValue_:function(index){// copies a sample value to the result buffer
var result=this.resultBuffer,values=this.sampleValues,stride=this.valueSize,offset=index*stride;for(var i=0;i!==stride;++i){result[i]=values[offset+i];}return result;},// Template methods for derived classes:
interpolate_:function()/* i1, t0, t, t1 */{throw new Error('call to abstract method');// implementations shall return this.resultBuffer
},intervalChanged_:function()/* i1, t0, t1 */{// empty
}});//!\ DECLARE ALIAS AFTER assign prototype !
Object.assign(Interpolant.prototype,{//( 0, t, t0 ), returns this.resultBuffer
beforeStart_:Interpolant.prototype.copySampleValue_,//( N-1, tN-1, t ), returns this.resultBuffer
afterEnd_:Interpolant.prototype.copySampleValue_});/**
* Spherical linear unit quaternion interpolant.
*
* @author tschw
*/function QuaternionLinearInterpolant(parameterPositions,sampleValues,sampleSize,resultBuffer){Interpolant.call(this,parameterPositions,sampleValues,sampleSize,resultBuffer);}QuaternionLinearInterpolant.prototype=Object.assign(Object.create(Interpolant.prototype),{constructor:QuaternionLinearInterpolant,interpolate_:function(i1,t0,t,t1){var result=this.resultBuffer,values=this.sampleValues,stride=this.valueSize,offset=i1*stride,alpha=(t-t0)/(t1-t0);for(var end=offset+stride;offset!==end;offset+=4){Quaternion.slerpFlat(result,0,values,offset-stride,values,offset,alpha);}return result;}});/**
*
* A Track of quaternion keyframe values.
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/function QuaternionKeyframeTrack(name,times,values,interpolation){KeyframeTrack.call(this,name,times,values,interpolation);}QuaternionKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype),{constructor:QuaternionKeyframeTrack,ValueTypeName:'quaternion',// ValueBufferType is inherited
DefaultInterpolation:InterpolateLinear,InterpolantFactoryMethodLinear:function(result){return new QuaternionLinearInterpolant(this.times,this.values,this.getValueSize(),result);},InterpolantFactoryMethodSmooth:undefined// not yet implemented
});/**
*
* A Track of keyframe values that represent color.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/function ColorKeyframeTrack(name,times,values,interpolation){KeyframeTrack.call(this,name,times,values,interpolation);}ColorKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype),{constructor:ColorKeyframeTrack,ValueTypeName:'color'// ValueBufferType is inherited
// DefaultInterpolation is inherited
// Note: Very basic implementation and nothing special yet.
// However, this is the place for color space parameterization.
});/**
*
* A Track of numeric keyframe values.
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/function NumberKeyframeTrack(name,times,values,interpolation){KeyframeTrack.call(this,name,times,values,interpolation);}NumberKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype),{constructor:NumberKeyframeTrack,ValueTypeName:'number'// ValueBufferType is inherited
// DefaultInterpolation is inherited
});/**
* Fast and simple cubic spline interpolant.
*
* It was derived from a Hermitian construction setting the first derivative
* at each sample position to the linear slope between neighboring positions
* over their parameter interval.
*
* @author tschw
*/function CubicInterpolant(parameterPositions,sampleValues,sampleSize,resultBuffer){Interpolant.call(this,parameterPositions,sampleValues,sampleSize,resultBuffer);this._weightPrev=-0;this._offsetPrev=-0;this._weightNext=-0;this._offsetNext=-0;}CubicInterpolant.prototype=Object.assign(Object.create(Interpolant.prototype),{constructor:CubicInterpolant,DefaultSettings_:{endingStart:ZeroCurvatureEnding,endingEnd:ZeroCurvatureEnding},intervalChanged_:function(i1,t0,t1){var pp=this.parameterPositions,iPrev=i1-2,iNext=i1+1,tPrev=pp[iPrev],tNext=pp[iNext];if(tPrev===undefined){switch(this.getSettings_().endingStart){case ZeroSlopeEnding:// f'(t0) = 0
iPrev=i1;tPrev=2*t0-t1;break;case WrapAroundEnding:// use the other end of the curve
iPrev=pp.length-2;tPrev=t0+pp[iPrev]-pp[iPrev+1];break;default:// ZeroCurvatureEnding
// f''(t0) = 0 a.k.a. Natural Spline
iPrev=i1;tPrev=t1;}}if(tNext===undefined){switch(this.getSettings_().endingEnd){case ZeroSlopeEnding:// f'(tN) = 0
iNext=i1;tNext=2*t1-t0;break;case WrapAroundEnding:// use the other end of the curve
iNext=1;tNext=t1+pp[1]-pp[0];break;default:// ZeroCurvatureEnding
// f''(tN) = 0, a.k.a. Natural Spline
iNext=i1-1;tNext=t0;}}var halfDt=(t1-t0)*0.5,stride=this.valueSize;this._weightPrev=halfDt/(t0-tPrev);this._weightNext=halfDt/(tNext-t1);this._offsetPrev=iPrev*stride;this._offsetNext=iNext*stride;},interpolate_:function(i1,t0,t,t1){var result=this.resultBuffer,values=this.sampleValues,stride=this.valueSize,o1=i1*stride,o0=o1-stride,oP=this._offsetPrev,oN=this._offsetNext,wP=this._weightPrev,wN=this._weightNext,p=(t-t0)/(t1-t0),pp=p*p,ppp=pp*p;// evaluate polynomials
var sP=-wP*ppp+2*wP*pp-wP*p;var s0=(1+wP)*ppp+(-1.5-2*wP)*pp+(-0.5+wP)*p+1;var s1=(-1-wN)*ppp+(1.5+wN)*pp+0.5*p;var sN=wN*ppp-wN*pp;// combine data linearly
for(var i=0;i!==stride;++i){result[i]=sP*values[oP+i]+s0*values[o0+i]+s1*values[o1+i]+sN*values[oN+i];}return result;}});/**
* @author tschw
*/function LinearInterpolant(parameterPositions,sampleValues,sampleSize,resultBuffer){Interpolant.call(this,parameterPositions,sampleValues,sampleSize,resultBuffer);}LinearInterpolant.prototype=Object.assign(Object.create(Interpolant.prototype),{constructor:LinearInterpolant,interpolate_:function(i1,t0,t,t1){var result=this.resultBuffer,values=this.sampleValues,stride=this.valueSize,offset1=i1*stride,offset0=offset1-stride,weight1=(t-t0)/(t1-t0),weight0=1-weight1;for(var i=0;i!==stride;++i){result[i]=values[offset0+i]*weight0+values[offset1+i]*weight1;}return result;}});/**
*
* Interpolant that evaluates to the sample value at the position preceeding
* the parameter.
*
* @author tschw
*/function DiscreteInterpolant(parameterPositions,sampleValues,sampleSize,resultBuffer){Interpolant.call(this,parameterPositions,sampleValues,sampleSize,resultBuffer);}DiscreteInterpolant.prototype=Object.assign(Object.create(Interpolant.prototype),{constructor:DiscreteInterpolant,interpolate_:function(i1/*, t0, t, t1 */){return this.copySampleValue_(i1-1);}});/**
* @author tschw
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
*/var AnimationUtils={// same as Array.prototype.slice, but also works on typed arrays
arraySlice:function(array,from,to){if(AnimationUtils.isTypedArray(array)){// in ios9 array.subarray(from, undefined) will return empty array
// but array.subarray(from) or array.subarray(from, len) is correct
return new array.constructor(array.subarray(from,to!==undefined?to:array.length));}return array.slice(from,to);},// converts an array to a specific type
convertArray:function(array,type,forceClone){if(!array||// let 'undefined' and 'null' pass
!forceClone&&array.constructor===type)return array;if(typeof type.BYTES_PER_ELEMENT==='number'){return new type(array);// create typed array
}return Array.prototype.slice.call(array);// create Array
},isTypedArray:function(object){return ArrayBuffer.isView(object)&&!(object instanceof DataView);},// returns an array by which times and values can be sorted
getKeyframeOrder:function(times){function compareTime(i,j){return times[i]-times[j];}var n=times.length;var result=new Array(n);for(var i=0;i!==n;++i)result[i]=i;result.sort(compareTime);return result;},// uses the array previously returned by 'getKeyframeOrder' to sort data
sortedArray:function(values,stride,order){var nValues=values.length;var result=new values.constructor(nValues);for(var i=0,dstOffset=0;dstOffset!==nValues;++i){var srcOffset=order[i]*stride;for(var j=0;j!==stride;++j){result[dstOffset++]=values[srcOffset+j];}}return result;},// function for parsing AOS keyframe formats
flattenJSON:function(jsonKeys,times,values,valuePropertyName){var i=1,key=jsonKeys[0];while(key!==undefined&&key[valuePropertyName]===undefined){key=jsonKeys[i++];}if(key===undefined)return;// no data
var value=key[valuePropertyName];if(value===undefined)return;// no data
if(Array.isArray(value)){do{value=key[valuePropertyName];if(value!==undefined){times.push(key.time);values.push.apply(values,value);// push all elements
}key=jsonKeys[i++];}while(key!==undefined);}else if(value.toArray!==undefined){// ...assume THREE.Math-ish
do{value=key[valuePropertyName];if(value!==undefined){times.push(key.time);value.toArray(values,values.length);}key=jsonKeys[i++];}while(key!==undefined);}else{// otherwise push as-is
do{value=key[valuePropertyName];if(value!==undefined){times.push(key.time);values.push(value);}key=jsonKeys[i++];}while(key!==undefined);}}};/**
*
* A timed sequence of keyframes for a specific property.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/function KeyframeTrack(name,times,values,interpolation){if(name===undefined)throw new Error('THREE.KeyframeTrack: track name is undefined');if(times===undefined||times.length===0)throw new Error('THREE.KeyframeTrack: no keyframes in track named '+name);this.name=name;this.times=AnimationUtils.convertArray(times,this.TimeBufferType);this.values=AnimationUtils.convertArray(values,this.ValueBufferType);this.setInterpolation(interpolation||this.DefaultInterpolation);this.validate();this.optimize();}// Static methods:
Object.assign(KeyframeTrack,{// Serialization (in static context, because of constructor invocation
// and automatic invocation of .toJSON):
parse:function(json){if(json.type===undefined){throw new Error('THREE.KeyframeTrack: track type undefined, can not parse');}var trackType=KeyframeTrack._getTrackTypeForValueTypeName(json.type);if(json.times===undefined){var times=[],values=[];AnimationUtils.flattenJSON(json.keys,times,values,'value');json.times=times;json.values=values;}// derived classes can define a static parse method
if(trackType.parse!==undefined){return trackType.parse(json);}else{// by default, we assume a constructor compatible with the base
return new trackType(json.name,json.times,json.values,json.interpolation);}},toJSON:function(track){var trackType=track.constructor;var json;// derived classes can define a static toJSON method
if(trackType.toJSON!==undefined){json=trackType.toJSON(track);}else{// by default, we assume the data can be serialized as-is
json={'name':track.name,'times':AnimationUtils.convertArray(track.times,Array),'values':AnimationUtils.convertArray(track.values,Array)};var interpolation=track.getInterpolation();if(interpolation!==track.DefaultInterpolation){json.interpolation=interpolation;}}json.type=track.ValueTypeName;// mandatory
return json;},_getTrackTypeForValueTypeName:function(typeName){switch(typeName.toLowerCase()){case'scalar':case'double':case'float':case'number':case'integer':return NumberKeyframeTrack;case'vector':case'vector2':case'vector3':case'vector4':return VectorKeyframeTrack;case'color':return ColorKeyframeTrack;case'quaternion':return QuaternionKeyframeTrack;case'bool':case'boolean':return BooleanKeyframeTrack;case'string':return StringKeyframeTrack;}throw new Error('THREE.KeyframeTrack: Unsupported typeName: '+typeName);}});Object.assign(KeyframeTrack.prototype,{constructor:KeyframeTrack,TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:InterpolateLinear,InterpolantFactoryMethodDiscrete:function(result){return new DiscreteInterpolant(this.times,this.values,this.getValueSize(),result);},InterpolantFactoryMethodLinear:function(result){return new LinearInterpolant(this.times,this.values,this.getValueSize(),result);},InterpolantFactoryMethodSmooth:function(result){return new CubicInterpolant(this.times,this.values,this.getValueSize(),result);},setInterpolation:function(interpolation){var factoryMethod;switch(interpolation){case InterpolateDiscrete:factoryMethod=this.InterpolantFactoryMethodDiscrete;break;case InterpolateLinear:factoryMethod=this.InterpolantFactoryMethodLinear;break;case InterpolateSmooth:factoryMethod=this.InterpolantFactoryMethodSmooth;break;}if(factoryMethod===undefined){var message="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(this.createInterpolant===undefined){// fall back to default, unless the default itself is messed up
if(interpolation!==this.DefaultInterpolation){this.setInterpolation(this.DefaultInterpolation);}else{throw new Error(message);// fatal, in this case
}}console.warn('THREE.KeyframeTrack:',message);return;}this.createInterpolant=factoryMethod;},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return InterpolateDiscrete;case this.InterpolantFactoryMethodLinear:return InterpolateLinear;case this.InterpolantFactoryMethodSmooth:return InterpolateSmooth;}},getValueSize:function(){return this.values.length/this.times.length;},// move all keyframes either forwards or backwards in time
shift:function(timeOffset){if(timeOffset!==0.0){var times=this.times;for(var i=0,n=times.length;i!==n;++i){times[i]+=timeOffset;}}return this;},// scale all keyframe times by a factor (useful for frame <-> seconds conversions)
scale:function(timeScale){if(timeScale!==1.0){var times=this.times;for(var i=0,n=times.length;i!==n;++i){times[i]*=timeScale;}}return this;},// removes keyframes before and after animation without changing any values within the range [startTime, endTime].
// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values
trim:function(startTime,endTime){var times=this.times,nKeys=times.length,from=0,to=nKeys-1;while(from!==nKeys&&times[from]<startTime){++from;}while(to!==-1&&times[to]>endTime){--to;}++to;// inclusive -> exclusive bound
if(from!==0||to!==nKeys){// empty tracks are forbidden, so keep at least one keyframe
if(from>=to)to=Math.max(to,1),from=to-1;var stride=this.getValueSize();this.times=AnimationUtils.arraySlice(times,from,to);this.values=AnimationUtils.arraySlice(this.values,from*stride,to*stride);}return this;},// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable
validate:function(){var valid=true;var valueSize=this.getValueSize();if(valueSize-Math.floor(valueSize)!==0){console.error('THREE.KeyframeTrack: Invalid value size in track.',this);valid=false;}var times=this.times,values=this.values,nKeys=times.length;if(nKeys===0){console.error('THREE.KeyframeTrack: Track is empty.',this);valid=false;}var prevTime=null;for(var i=0;i!==nKeys;i++){var currTime=times[i];if(typeof currTime==='number'&&isNaN(currTime)){console.error('THREE.KeyframeTrack: Time is not a valid number.',this,i,currTime);valid=false;break;}if(prevTime!==null&&prevTime>currTime){console.error('THREE.KeyframeTrack: Out of order keys.',this,i,currTime,prevTime);valid=false;break;}prevTime=currTime;}if(values!==undefined){if(AnimationUtils.isTypedArray(values)){for(var i=0,n=values.length;i!==n;++i){var value=values[i];if(isNaN(value)){console.error('THREE.KeyframeTrack: Value is not a valid number.',this,i,value);valid=false;break;}}}}return valid;},// removes equivalent sequential keys as common in morph target sequences
// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)
optimize:function(){var times=this.times,values=this.values,stride=this.getValueSize(),smoothInterpolation=this.getInterpolation()===InterpolateSmooth,writeIndex=1,lastIndex=times.length-1;for(var i=1;i<lastIndex;++i){var keep=false;var time=times[i];var timeNext=times[i+1];// remove adjacent keyframes scheduled at the same time
if(time!==timeNext&&(i!==1||time!==time[0])){if(!smoothInterpolation){// remove unnecessary keyframes same as their neighbors
var offset=i*stride,offsetP=offset-stride,offsetN=offset+stride;for(var j=0;j!==stride;++j){var value=values[offset+j];if(value!==values[offsetP+j]||value!==values[offsetN+j]){keep=true;break;}}}else{keep=true;}}// in-place compaction
if(keep){if(i!==writeIndex){times[writeIndex]=times[i];var readOffset=i*stride,writeOffset=writeIndex*stride;for(var j=0;j!==stride;++j){values[writeOffset+j]=values[readOffset+j];}}++writeIndex;}}// flush last keyframe (compaction looks ahead)
if(lastIndex>0){times[writeIndex]=times[lastIndex];for(var readOffset=lastIndex*stride,writeOffset=writeIndex*stride,j=0;j!==stride;++j){values[writeOffset+j]=values[readOffset+j];}++writeIndex;}if(writeIndex!==times.length){this.times=AnimationUtils.arraySlice(times,0,writeIndex);this.values=AnimationUtils.arraySlice(values,0,writeIndex*stride);}return this;}});/**
*
* A Track of vectored keyframe values.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/function VectorKeyframeTrack(name,times,values,interpolation){KeyframeTrack.call(this,name,times,values,interpolation);}VectorKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype),{constructor:VectorKeyframeTrack,ValueTypeName:'vector'// ValueBufferType is inherited
// DefaultInterpolation is inherited
});/**
*
* Reusable set of Tracks that represent an animation.
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
*/function AnimationClip(name,duration,tracks){this.name=name;this.tracks=tracks;this.duration=duration!==undefined?duration:-1;this.uuid=_Math.generateUUID();// this means it should figure out its duration by scanning the tracks
if(this.duration<0){this.resetDuration();}this.optimize();}Object.assign(AnimationClip,{parse:function(json){var tracks=[],jsonTracks=json.tracks,frameTime=1.0/(json.fps||1.0);for(var i=0,n=jsonTracks.length;i!==n;++i){tracks.push(KeyframeTrack.parse(jsonTracks[i]).scale(frameTime));}return new AnimationClip(json.name,json.duration,tracks);},toJSON:function(clip){var tracks=[],clipTracks=clip.tracks;var json={'name':clip.name,'duration':clip.duration,'tracks':tracks};for(var i=0,n=clipTracks.length;i!==n;++i){tracks.push(KeyframeTrack.toJSON(clipTracks[i]));}return json;},CreateFromMorphTargetSequence:function(name,morphTargetSequence,fps,noLoop){var numMorphTargets=morphTargetSequence.length;var tracks=[];for(var i=0;i<numMorphTargets;i++){var times=[];var values=[];times.push((i+numMorphTargets-1)%numMorphTargets,i,(i+1)%numMorphTargets);values.push(0,1,0);var order=AnimationUtils.getKeyframeOrder(times);times=AnimationUtils.sortedArray(times,1,order);values=AnimationUtils.sortedArray(values,1,order);// if there is a key at the first frame, duplicate it as the
// last frame as well for perfect loop.
if(!noLoop&&times[0]===0){times.push(numMorphTargets);values.push(values[0]);}tracks.push(new NumberKeyframeTrack('.morphTargetInfluences['+morphTargetSequence[i].name+']',times,values).scale(1.0/fps));}return new AnimationClip(name,-1,tracks);},findByName:function(objectOrClipArray,name){var clipArray=objectOrClipArray;if(!Array.isArray(objectOrClipArray)){var o=objectOrClipArray;clipArray=o.geometry&&o.geometry.animations||o.animations;}for(var i=0;i<clipArray.length;i++){if(clipArray[i].name===name){return clipArray[i];}}return null;},CreateClipsFromMorphTargetSequences:function(morphTargets,fps,noLoop){var animationToMorphTargets={};// tested with https://regex101.com/ on trick sequences
// such flamingo_flyA_003, flamingo_run1_003, crdeath0059
var pattern=/^([\w-]*?)([\d]+)$/;// sort morph target names into animation groups based
// patterns like Walk_001, Walk_002, Run_001, Run_002
for(var i=0,il=morphTargets.length;i<il;i++){var morphTarget=morphTargets[i];var parts=morphTarget.name.match(pattern);if(parts&&parts.length>1){var name=parts[1];var animationMorphTargets=animationToMorphTargets[name];if(!animationMorphTargets){animationToMorphTargets[name]=animationMorphTargets=[];}animationMorphTargets.push(morphTarget);}}var clips=[];for(var name in animationToMorphTargets){clips.push(AnimationClip.CreateFromMorphTargetSequence(name,animationToMorphTargets[name],fps,noLoop));}return clips;},// parse the animation.hierarchy format
parseAnimation:function(animation,bones){if(!animation){console.error('THREE.AnimationClip: No animation in JSONLoader data.');return null;}var addNonemptyTrack=function(trackType,trackName,animationKeys,propertyName,destTracks){// only return track if there are actually keys.
if(animationKeys.length!==0){var times=[];var values=[];AnimationUtils.flattenJSON(animationKeys,times,values,propertyName);// empty keys are filtered out, so check again
if(times.length!==0){destTracks.push(new trackType(trackName,times,values));}}};var tracks=[];var clipName=animation.name||'default';// automatic length determination in AnimationClip.
var duration=animation.length||-1;var fps=animation.fps||30;var hierarchyTracks=animation.hierarchy||[];for(var h=0;h<hierarchyTracks.length;h++){var animationKeys=hierarchyTracks[h].keys;// skip empty tracks
if(!animationKeys||animationKeys.length===0)continue;// process morph targets
if(animationKeys[0].morphTargets){// figure out all morph targets used in this track
var morphTargetNames={};for(var k=0;k<animationKeys.length;k++){if(animationKeys[k].morphTargets){for(var m=0;m<animationKeys[k].morphTargets.length;m++){morphTargetNames[animationKeys[k].morphTargets[m]]=-1;}}}// create a track for each morph target with all zero
// morphTargetInfluences except for the keys in which
// the morphTarget is named.
for(var morphTargetName in morphTargetNames){var times=[];var values=[];for(var m=0;m!==animationKeys[k].morphTargets.length;++m){var animationKey=animationKeys[k];times.push(animationKey.time);values.push(animationKey.morphTarget===morphTargetName?1:0);}tracks.push(new NumberKeyframeTrack('.morphTargetInfluence['+morphTargetName+']',times,values));}duration=morphTargetNames.length*(fps||1.0);}else{// ...assume skeletal animation
var boneName='.bones['+bones[h].name+']';addNonemptyTrack(VectorKeyframeTrack,boneName+'.position',animationKeys,'pos',tracks);addNonemptyTrack(QuaternionKeyframeTrack,boneName+'.quaternion',animationKeys,'rot',tracks);addNonemptyTrack(VectorKeyframeTrack,boneName+'.scale',animationKeys,'scl',tracks);}}if(tracks.length===0){return null;}var clip=new AnimationClip(clipName,duration,tracks);return clip;}});Object.assign(AnimationClip.prototype,{resetDuration:function(){var tracks=this.tracks,duration=0;for(var i=0,n=tracks.length;i!==n;++i){var track=this.tracks[i];duration=Math.max(duration,track.times[track.times.length-1]);}this.duration=duration;},trim:function(){for(var i=0;i<this.tracks.length;i++){this.tracks[i].trim(0,this.duration);}return this;},optimize:function(){for(var i=0;i<this.tracks.length;i++){this.tracks[i].optimize();}return this;}});/**
* @author mrdoob / http://mrdoob.com/
*/function MaterialLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;this.textures={};}Object.assign(MaterialLoader.prototype,{load:function(url,onLoad,onProgress,onError){var scope=this;var loader=new FileLoader(scope.manager);loader.load(url,function(text){onLoad(scope.parse(JSON.parse(text)));},onProgress,onError);},setTextures:function(value){this.textures=value;},parse:function(json){var textures=this.textures;function getTexture(name){if(textures[name]===undefined){console.warn('THREE.MaterialLoader: Undefined texture',name);}return textures[name];}var material=new Materials[json.type]();if(json.uuid!==undefined)material.uuid=json.uuid;if(json.name!==undefined)material.name=json.name;if(json.color!==undefined)material.color.setHex(json.color);if(json.roughness!==undefined)material.roughness=json.roughness;if(json.metalness!==undefined)material.metalness=json.metalness;if(json.emissive!==undefined)material.emissive.setHex(json.emissive);if(json.specular!==undefined)material.specular.setHex(json.specular);if(json.shininess!==undefined)material.shininess=json.shininess;if(json.clearCoat!==undefined)material.clearCoat=json.clearCoat;if(json.clearCoatRoughness!==undefined)material.clearCoatRoughness=json.clearCoatRoughness;if(json.uniforms!==undefined)material.uniforms=json.uniforms;if(json.vertexShader!==undefined)material.vertexShader=json.vertexShader;if(json.fragmentShader!==undefined)material.fragmentShader=json.fragmentShader;if(json.vertexColors!==undefined)material.vertexColors=json.vertexColors;if(json.fog!==undefined)material.fog=json.fog;if(json.flatShading!==undefined)material.flatShading=json.flatShading;if(json.blending!==undefined)material.blending=json.blending;if(json.side!==undefined)material.side=json.side;if(json.opacity!==undefined)material.opacity=json.opacity;if(json.transparent!==undefined)material.transparent=json.transparent;if(json.alphaTest!==undefined)material.alphaTest=json.alphaTest;if(json.depthTest!==undefined)material.depthTest=json.depthTest;if(json.depthWrite!==undefined)material.depthWrite=json.depthWrite;if(json.colorWrite!==undefined)material.colorWrite=json.colorWrite;if(json.wireframe!==undefined)material.wireframe=json.wireframe;if(json.wireframeLinewidth!==undefined)material.wireframeLinewidth=json.wireframeLinewidth;if(json.wireframeLinecap!==undefined)material.wireframeLinecap=json.wireframeLinecap;if(json.wireframeLinejoin!==undefined)material.wireframeLinejoin=json.wireframeLinejoin;if(json.rotation!==undefined)material.rotation=json.rotation;if(json.linewidth!==1)material.linewidth=json.linewidth;if(json.dashSize!==undefined)material.dashSize=json.dashSize;if(json.gapSize!==undefined)material.gapSize=json.gapSize;if(json.scale!==undefined)material.scale=json.scale;if(json.polygonOffset!==undefined)material.polygonOffset=json.polygonOffset;if(json.polygonOffsetFactor!==undefined)material.polygonOffsetFactor=json.polygonOffsetFactor;if(json.polygonOffsetUnits!==undefined)material.polygonOffsetUnits=json.polygonOffsetUnits;if(json.skinning!==undefined)material.skinning=json.skinning;if(json.morphTargets!==undefined)material.morphTargets=json.morphTargets;if(json.dithering!==undefined)material.dithering=json.dithering;if(json.visible!==undefined)material.visible=json.visible;if(json.userData!==undefined)material.userData=json.userData;// Deprecated
if(json.shading!==undefined)material.flatShading=json.shading===1;// THREE.FlatShading
// for PointsMaterial
if(json.size!==undefined)material.size=json.size;if(json.sizeAttenuation!==undefined)material.sizeAttenuation=json.sizeAttenuation;// maps
if(json.map!==undefined)material.map=getTexture(json.map);if(json.alphaMap!==undefined){material.alphaMap=getTexture(json.alphaMap);material.transparent=true;}if(json.bumpMap!==undefined)material.bumpMap=getTexture(json.bumpMap);if(json.bumpScale!==undefined)material.bumpScale=json.bumpScale;if(json.normalMap!==undefined)material.normalMap=getTexture(json.normalMap);if(json.normalScale!==undefined){var normalScale=json.normalScale;if(Array.isArray(normalScale)===false){// Blender exporter used to export a scalar. See #7459
normalScale=[normalScale,normalScale];}material.normalScale=new Vector2().fromArray(normalScale);}if(json.displacementMap!==undefined)material.displacementMap=getTexture(json.displacementMap);if(json.displacementScale!==undefined)material.displacementScale=json.displacementScale;if(json.displacementBias!==undefined)material.displacementBias=json.displacementBias;if(json.roughnessMap!==undefined)material.roughnessMap=getTexture(json.roughnessMap);if(json.metalnessMap!==undefined)material.metalnessMap=getTexture(json.metalnessMap);if(json.emissiveMap!==undefined)material.emissiveMap=getTexture(json.emissiveMap);if(json.emissiveIntensity!==undefined)material.emissiveIntensity=json.emissiveIntensity;if(json.specularMap!==undefined)material.specularMap=getTexture(json.specularMap);if(json.envMap!==undefined)material.envMap=getTexture(json.envMap);if(json.reflectivity!==undefined)material.reflectivity=json.reflectivity;if(json.lightMap!==undefined)material.lightMap=getTexture(json.lightMap);if(json.lightMapIntensity!==undefined)material.lightMapIntensity=json.lightMapIntensity;if(json.aoMap!==undefined)material.aoMap=getTexture(json.aoMap);if(json.aoMapIntensity!==undefined)material.aoMapIntensity=json.aoMapIntensity;if(json.gradientMap!==undefined)material.gradientMap=getTexture(json.gradientMap);return material;}});/**
* @author mrdoob / http://mrdoob.com/
*/function BufferGeometryLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;}Object.assign(BufferGeometryLoader.prototype,{load:function(url,onLoad,onProgress,onError){var scope=this;var loader=new FileLoader(scope.manager);loader.load(url,function(text){onLoad(scope.parse(JSON.parse(text)));},onProgress,onError);},parse:function(json){var geometry=new BufferGeometry();var index=json.data.index;if(index!==undefined){var typedArray=new TYPED_ARRAYS[index.type](index.array);geometry.setIndex(new BufferAttribute(typedArray,1));}var attributes=json.data.attributes;for(var key in attributes){var attribute=attributes[key];var typedArray=new TYPED_ARRAYS[attribute.type](attribute.array);geometry.addAttribute(key,new BufferAttribute(typedArray,attribute.itemSize,attribute.normalized));}var groups=json.data.groups||json.data.drawcalls||json.data.offsets;if(groups!==undefined){for(var i=0,n=groups.length;i!==n;++i){var group=groups[i];geometry.addGroup(group.start,group.count,group.materialIndex);}}var boundingSphere=json.data.boundingSphere;if(boundingSphere!==undefined){var center=new Vector3();if(boundingSphere.center!==undefined){center.fromArray(boundingSphere.center);}geometry.boundingSphere=new Sphere(center,boundingSphere.radius);}return geometry;}});var TYPED_ARRAYS={Int8Array:Int8Array,Uint8Array:Uint8Array,// Workaround for IE11 pre KB2929437. See #11440
Uint8ClampedArray:typeof Uint8ClampedArray!=='undefined'?Uint8ClampedArray:Uint8Array,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};/**
* @author alteredq / http://alteredqualia.com/
*/function Loader(){}Loader.Handlers={handlers:[],add:function(regex,loader){this.handlers.push(regex,loader);},get:function(file){var handlers=this.handlers;for(var i=0,l=handlers.length;i<l;i+=2){var regex=handlers[i];var loader=handlers[i+1];if(regex.test(file)){return loader;}}return null;}};Object.assign(Loader.prototype,{crossOrigin:undefined,onLoadStart:function(){},onLoadProgress:function(){},onLoadComplete:function(){},initMaterials:function(materials,texturePath,crossOrigin){var array=[];for(var i=0;i<materials.length;++i){array[i]=this.createMaterial(materials[i],texturePath,crossOrigin);}return array;},createMaterial:function(){var BlendingMode={NoBlending:NoBlending,NormalBlending:NormalBlending,AdditiveBlending:AdditiveBlending,SubtractiveBlending:SubtractiveBlending,MultiplyBlending:MultiplyBlending,CustomBlending:CustomBlending};var color=new Color();var textureLoader=new TextureLoader();var materialLoader=new MaterialLoader();return function createMaterial(m,texturePath,crossOrigin){// convert from old material format
var textures={};function loadTexture(path,repeat,offset,wrap,anisotropy){var fullPath=texturePath+path;var loader=Loader.Handlers.get(fullPath);var texture;if(loader!==null){texture=loader.load(fullPath);}else{textureLoader.setCrossOrigin(crossOrigin);texture=textureLoader.load(fullPath);}if(repeat!==undefined){texture.repeat.fromArray(repeat);if(repeat[0]!==1)texture.wrapS=RepeatWrapping;if(repeat[1]!==1)texture.wrapT=RepeatWrapping;}if(offset!==undefined){texture.offset.fromArray(offset);}if(wrap!==undefined){if(wrap[0]==='repeat')texture.wrapS=RepeatWrapping;if(wrap[0]==='mirror')texture.wrapS=MirroredRepeatWrapping;if(wrap[1]==='repeat')texture.wrapT=RepeatWrapping;if(wrap[1]==='mirror')texture.wrapT=MirroredRepeatWrapping;}if(anisotropy!==undefined){texture.anisotropy=anisotropy;}var uuid=_Math.generateUUID();textures[uuid]=texture;return uuid;}//
var json={uuid:_Math.generateUUID(),type:'MeshLambertMaterial'};for(var name in m){var value=m[name];switch(name){case'DbgColor':case'DbgIndex':case'opticalDensity':case'illumination':break;case'DbgName':json.name=value;break;case'blending':json.blending=BlendingMode[value];break;case'colorAmbient':case'mapAmbient':console.warn('THREE.Loader.createMaterial:',name,'is no longer supported.');break;case'colorDiffuse':json.color=color.fromArray(value).getHex();break;case'colorSpecular':json.specular=color.fromArray(value).getHex();break;case'colorEmissive':json.emissive=color.fromArray(value).getHex();break;case'specularCoef':json.shininess=value;break;case'shading':if(value.toLowerCase()==='basic')json.type='MeshBasicMaterial';if(value.toLowerCase()==='phong')json.type='MeshPhongMaterial';if(value.toLowerCase()==='standard')json.type='MeshStandardMaterial';break;case'mapDiffuse':json.map=loadTexture(value,m.mapDiffuseRepeat,m.mapDiffuseOffset,m.mapDiffuseWrap,m.mapDiffuseAnisotropy);break;case'mapDiffuseRepeat':case'mapDiffuseOffset':case'mapDiffuseWrap':case'mapDiffuseAnisotropy':break;case'mapEmissive':json.emissiveMap=loadTexture(value,m.mapEmissiveRepeat,m.mapEmissiveOffset,m.mapEmissiveWrap,m.mapEmissiveAnisotropy);break;case'mapEmissiveRepeat':case'mapEmissiveOffset':case'mapEmissiveWrap':case'mapEmissiveAnisotropy':break;case'mapLight':json.lightMap=loadTexture(value,m.mapLightRepeat,m.mapLightOffset,m.mapLightWrap,m.mapLightAnisotropy);break;case'mapLightRepeat':case'mapLightOffset':case'mapLightWrap':case'mapLightAnisotropy':break;case'mapAO':json.aoMap=loadTexture(value,m.mapAORepeat,m.mapAOOffset,m.mapAOWrap,m.mapAOAnisotropy);break;case'mapAORepeat':case'mapAOOffset':case'mapAOWrap':case'mapAOAnisotropy':break;case'mapBump':json.bumpMap=loadTexture(value,m.mapBumpRepeat,m.mapBumpOffset,m.mapBumpWrap,m.mapBumpAnisotropy);break;case'mapBumpScale':json.bumpScale=value;break;case'mapBumpRepeat':case'mapBumpOffset':case'mapBumpWrap':case'mapBumpAnisotropy':break;case'mapNormal':json.normalMap=loadTexture(value,m.mapNormalRepeat,m.mapNormalOffset,m.mapNormalWrap,m.mapNormalAnisotropy);break;case'mapNormalFactor':json.normalScale=value;break;case'mapNormalRepeat':case'mapNormalOffset':case'mapNormalWrap':case'mapNormalAnisotropy':break;case'mapSpecular':json.specularMap=loadTexture(value,m.mapSpecularRepeat,m.mapSpecularOffset,m.mapSpecularWrap,m.mapSpecularAnisotropy);break;case'mapSpecularRepeat':case'mapSpecularOffset':case'mapSpecularWrap':case'mapSpecularAnisotropy':break;case'mapMetalness':json.metalnessMap=loadTexture(value,m.mapMetalnessRepeat,m.mapMetalnessOffset,m.mapMetalnessWrap,m.mapMetalnessAnisotropy);break;case'mapMetalnessRepeat':case'mapMetalnessOffset':case'mapMetalnessWrap':case'mapMetalnessAnisotropy':break;case'mapRoughness':json.roughnessMap=loadTexture(value,m.mapRoughnessRepeat,m.mapRoughnessOffset,m.mapRoughnessWrap,m.mapRoughnessAnisotropy);break;case'mapRoughnessRepeat':case'mapRoughnessOffset':case'mapRoughnessWrap':case'mapRoughnessAnisotropy':break;case'mapAlpha':json.alphaMap=loadTexture(value,m.mapAlphaRepeat,m.mapAlphaOffset,m.mapAlphaWrap,m.mapAlphaAnisotropy);break;case'mapAlphaRepeat':case'mapAlphaOffset':case'mapAlphaWrap':case'mapAlphaAnisotropy':break;case'flipSided':json.side=BackSide;break;case'doubleSided':json.side=DoubleSide;break;case'transparency':console.warn('THREE.Loader.createMaterial: transparency has been renamed to opacity');json.opacity=value;break;case'depthTest':case'depthWrite':case'colorWrite':case'opacity':case'reflectivity':case'transparent':case'visible':case'wireframe':json[name]=value;break;case'vertexColors':if(value===true)json.vertexColors=VertexColors;if(value==='face')json.vertexColors=FaceColors;break;default:console.error('THREE.Loader.createMaterial: Unsupported',name,value);break;}}if(json.type==='MeshBasicMaterial')delete json.emissive;if(json.type!=='MeshPhongMaterial')delete json.specular;if(json.opacity<1)json.transparent=true;materialLoader.setTextures(textures);return materialLoader.parse(json);};}()});/**
* @author Don McCurdy / https://www.donmccurdy.com
*/var LoaderUtils={decodeText:function(array){if(typeof TextDecoder!=='undefined'){return new TextDecoder().decode(array);}// Avoid the String.fromCharCode.apply(null, array) shortcut, which
// throws a "maximum call stack size exceeded" error for large arrays.
var s='';for(var i=0,il=array.length;i<il;i++){// Implicitly assumes little-endian.
s+=String.fromCharCode(array[i]);}// Merges multi-byte utf-8 characters.
return decodeURIComponent(escape(s));},extractUrlBase:function(url){var index=url.lastIndexOf('/');if(index===-1)return './';return url.substr(0,index+1);}};/**
* @author mrdoob / http://mrdoob.com/
* @author alteredq / http://alteredqualia.com/
*/function JSONLoader(manager){if(typeof manager==='boolean'){console.warn('THREE.JSONLoader: showStatus parameter has been removed from constructor.');manager=undefined;}this.manager=manager!==undefined?manager:DefaultLoadingManager;this.withCredentials=false;}Object.assign(JSONLoader.prototype,{load:function(url,onLoad,onProgress,onError){var scope=this;var texturePath=this.texturePath&&typeof this.texturePath==='string'?this.texturePath:LoaderUtils.extractUrlBase(url);var loader=new FileLoader(this.manager);loader.setWithCredentials(this.withCredentials);loader.load(url,function(text){var json=JSON.parse(text);var metadata=json.metadata;if(metadata!==undefined){var type=metadata.type;if(type!==undefined){if(type.toLowerCase()==='object'){console.error('THREE.JSONLoader: '+url+' should be loaded with THREE.ObjectLoader instead.');return;}}}var object=scope.parse(json,texturePath);onLoad(object.geometry,object.materials);},onProgress,onError);},setTexturePath:function(value){this.texturePath=value;},parse:function(){function parseModel(json,geometry){function isBitSet(value,position){return value&1<<position;}var i,j,fi,offset,zLength,colorIndex,normalIndex,uvIndex,materialIndex,type,isQuad,hasMaterial,hasFaceVertexUv,hasFaceNormal,hasFaceVertexNormal,hasFaceColor,hasFaceVertexColor,vertex,face,faceA,faceB,hex,normal,uvLayer,uv,u,v,faces=json.faces,vertices=json.vertices,normals=json.normals,colors=json.colors,scale=json.scale,nUvLayers=0;if(json.uvs!==undefined){// disregard empty arrays
for(i=0;i<json.uvs.length;i++){if(json.uvs[i].length)nUvLayers++;}for(i=0;i<nUvLayers;i++){geometry.faceVertexUvs[i]=[];}}offset=0;zLength=vertices.length;while(offset<zLength){vertex=new Vector3();vertex.x=vertices[offset++]*scale;vertex.y=vertices[offset++]*scale;vertex.z=vertices[offset++]*scale;geometry.vertices.push(vertex);}offset=0;zLength=faces.length;while(offset<zLength){type=faces[offset++];isQuad=isBitSet(type,0);hasMaterial=isBitSet(type,1);hasFaceVertexUv=isBitSet(type,3);hasFaceNormal=isBitSet(type,4);hasFaceVertexNormal=isBitSet(type,5);hasFaceColor=isBitSet(type,6);hasFaceVertexColor=isBitSet(type,7);// console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);
if(isQuad){faceA=new Face3();faceA.a=faces[offset];faceA.b=faces[offset+1];faceA.c=faces[offset+3];faceB=new Face3();faceB.a=faces[offset+1];faceB.b=faces[offset+2];faceB.c=faces[offset+3];offset+=4;if(hasMaterial){materialIndex=faces[offset++];faceA.materialIndex=materialIndex;faceB.materialIndex=materialIndex;}// to get face <=> uv index correspondence
fi=geometry.faces.length;if(hasFaceVertexUv){for(i=0;i<nUvLayers;i++){uvLayer=json.uvs[i];geometry.faceVertexUvs[i][fi]=[];geometry.faceVertexUvs[i][fi+1]=[];for(j=0;j<4;j++){uvIndex=faces[offset++];u=uvLayer[uvIndex*2];v=uvLayer[uvIndex*2+1];uv=new Vector2(u,v);if(j!==2)geometry.faceVertexUvs[i][fi].push(uv);if(j!==0)geometry.faceVertexUvs[i][fi+1].push(uv);}}}if(hasFaceNormal){normalIndex=faces[offset++]*3;faceA.normal.set(normals[normalIndex++],normals[normalIndex++],normals[normalIndex]);faceB.normal.copy(faceA.normal);}if(hasFaceVertexNormal){for(i=0;i<4;i++){normalIndex=faces[offset++]*3;normal=new Vector3(normals[normalIndex++],normals[normalIndex++],normals[normalIndex]);if(i!==2)faceA.vertexNormals.push(normal);if(i!==0)faceB.vertexNormals.push(normal);}}if(hasFaceColor){colorIndex=faces[offset++];hex=colors[colorIndex];faceA.color.setHex(hex);faceB.color.setHex(hex);}if(hasFaceVertexColor){for(i=0;i<4;i++){colorIndex=faces[offset++];hex=colors[colorIndex];if(i!==2)faceA.vertexColors.push(new Color(hex));if(i!==0)faceB.vertexColors.push(new Color(hex));}}geometry.faces.push(faceA);geometry.faces.push(faceB);}else{face=new Face3();face.a=faces[offset++];face.b=faces[offset++];face.c=faces[offset++];if(hasMaterial){materialIndex=faces[offset++];face.materialIndex=materialIndex;}// to get face <=> uv index correspondence
fi=geometry.faces.length;if(hasFaceVertexUv){for(i=0;i<nUvLayers;i++){uvLayer=json.uvs[i];geometry.faceVertexUvs[i][fi]=[];for(j=0;j<3;j++){uvIndex=faces[offset++];u=uvLayer[uvIndex*2];v=uvLayer[uvIndex*2+1];uv=new Vector2(u,v);geometry.faceVertexUvs[i][fi].push(uv);}}}if(hasFaceNormal){normalIndex=faces[offset++]*3;face.normal.set(normals[normalIndex++],normals[normalIndex++],normals[normalIndex]);}if(hasFaceVertexNormal){for(i=0;i<3;i++){normalIndex=faces[offset++]*3;normal=new Vector3(normals[normalIndex++],normals[normalIndex++],normals[normalIndex]);face.vertexNormals.push(normal);}}if(hasFaceColor){colorIndex=faces[offset++];face.color.setHex(colors[colorIndex]);}if(hasFaceVertexColor){for(i=0;i<3;i++){colorIndex=faces[offset++];face.vertexColors.push(new Color(colors[colorIndex]));}}geometry.faces.push(face);}}}function parseSkin(json,geometry){var influencesPerVertex=json.influencesPerVertex!==undefined?json.influencesPerVertex:2;if(json.skinWeights){for(var i=0,l=json.skinWeights.length;i<l;i+=influencesPerVertex){var x=json.skinWeights[i];var y=influencesPerVertex>1?json.skinWeights[i+1]:0;var z=influencesPerVertex>2?json.skinWeights[i+2]:0;var w=influencesPerVertex>3?json.skinWeights[i+3]:0;geometry.skinWeights.push(new Vector4(x,y,z,w));}}if(json.skinIndices){for(var i=0,l=json.skinIndices.length;i<l;i+=influencesPerVertex){var a=json.skinIndices[i];var b=influencesPerVertex>1?json.skinIndices[i+1]:0;var c=influencesPerVertex>2?json.skinIndices[i+2]:0;var d=influencesPerVertex>3?json.skinIndices[i+3]:0;geometry.skinIndices.push(new Vector4(a,b,c,d));}}geometry.bones=json.bones;if(geometry.bones&&geometry.bones.length>0&&(geometry.skinWeights.length!==geometry.skinIndices.length||geometry.skinIndices.length!==geometry.vertices.length)){console.warn('When skinning, number of vertices ('+geometry.vertices.length+'), skinIndices ('+geometry.skinIndices.length+'), and skinWeights ('+geometry.skinWeights.length+') should match.');}}function parseMorphing(json,geometry){var scale=json.scale;if(json.morphTargets!==undefined){for(var i=0,l=json.morphTargets.length;i<l;i++){geometry.morphTargets[i]={};geometry.morphTargets[i].name=json.morphTargets[i].name;geometry.morphTargets[i].vertices=[];var dstVertices=geometry.morphTargets[i].vertices;var srcVertices=json.morphTargets[i].vertices;for(var v=0,vl=srcVertices.length;v<vl;v+=3){var vertex=new Vector3();vertex.x=srcVertices[v]*scale;vertex.y=srcVertices[v+1]*scale;vertex.z=srcVertices[v+2]*scale;dstVertices.push(vertex);}}}if(json.morphColors!==undefined&&json.morphColors.length>0){console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.');var faces=geometry.faces;var morphColors=json.morphColors[0].colors;for(var i=0,l=faces.length;i<l;i++){faces[i].color.fromArray(morphColors,i*3);}}}function parseAnimations(json,geometry){var outputAnimations=[];// parse old style Bone/Hierarchy animations
var animations=[];if(json.animation!==undefined){animations.push(json.animation);}if(json.animations!==undefined){if(json.animations.length){animations=animations.concat(json.animations);}else{animations.push(json.animations);}}for(var i=0;i<animations.length;i++){var clip=AnimationClip.parseAnimation(animations[i],geometry.bones);if(clip)outputAnimations.push(clip);}// parse implicit morph animations
if(geometry.morphTargets){// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.
var morphAnimationClips=AnimationClip.CreateClipsFromMorphTargetSequences(geometry.morphTargets,10);outputAnimations=outputAnimations.concat(morphAnimationClips);}if(outputAnimations.length>0)geometry.animations=outputAnimations;}return function parse(json,texturePath){if(json.data!==undefined){// Geometry 4.0 spec
json=json.data;}if(json.scale!==undefined){json.scale=1.0/json.scale;}else{json.scale=1.0;}var geometry=new Geometry();parseModel(json,geometry);parseSkin(json,geometry);parseMorphing(json,geometry);parseAnimations(json,geometry);geometry.computeFaceNormals();geometry.computeBoundingSphere();if(json.materials===undefined||json.materials.length===0){return {geometry:geometry};}else{var materials=Loader.prototype.initMaterials(json.materials,texturePath,this.crossOrigin);return {geometry:geometry,materials:materials};}};}()});/**
* @author mrdoob / http://mrdoob.com/
*/function ObjectLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;this.texturePath='';}Object.assign(ObjectLoader.prototype,{load:function(url,onLoad,onProgress,onError){if(this.texturePath===''){this.texturePath=url.substring(0,url.lastIndexOf('/')+1);}var scope=this;var loader=new FileLoader(scope.manager);loader.load(url,function(text){var json=null;try{json=JSON.parse(text);}catch(error){if(onError!==undefined)onError(error);console.error('THREE:ObjectLoader: Can\'t parse '+url+'.',error.message);return;}var metadata=json.metadata;if(metadata===undefined||metadata.type===undefined||metadata.type.toLowerCase()==='geometry'){console.error('THREE.ObjectLoader: Can\'t load '+url+'. Use THREE.JSONLoader instead.');return;}scope.parse(json,onLoad);},onProgress,onError);},setTexturePath:function(value){this.texturePath=value;},setCrossOrigin:function(value){this.crossOrigin=value;},parse:function(json,onLoad){var shapes=this.parseShape(json.shapes);var geometries=this.parseGeometries(json.geometries,shapes);var images=this.parseImages(json.images,function(){if(onLoad!==undefined)onLoad(object);});var textures=this.parseTextures(json.textures,images);var materials=this.parseMaterials(json.materials,textures);var object=this.parseObject(json.object,geometries,materials);if(json.animations){object.animations=this.parseAnimations(json.animations);}if(json.images===undefined||json.images.length===0){if(onLoad!==undefined)onLoad(object);}return object;},parseShape:function(json){var shapes={};if(json!==undefined){for(var i=0,l=json.length;i<l;i++){var shape=new Shape().fromJSON(json[i]);shapes[shape.uuid]=shape;}}return shapes;},parseGeometries:function(json,shapes){var geometries={};if(json!==undefined){var geometryLoader=new JSONLoader();var bufferGeometryLoader=new BufferGeometryLoader();for(var i=0,l=json.length;i<l;i++){var geometry;var data=json[i];switch(data.type){case'PlaneGeometry':case'PlaneBufferGeometry':geometry=new Geometries[data.type](data.width,data.height,data.widthSegments,data.heightSegments);break;case'BoxGeometry':case'BoxBufferGeometry':case'CubeGeometry':// backwards compatible
geometry=new Geometries[data.type](data.width,data.height,data.depth,data.widthSegments,data.heightSegments,data.depthSegments);break;case'CircleGeometry':case'CircleBufferGeometry':geometry=new Geometries[data.type](data.radius,data.segments,data.thetaStart,data.thetaLength);break;case'CylinderGeometry':case'CylinderBufferGeometry':geometry=new Geometries[data.type](data.radiusTop,data.radiusBottom,data.height,data.radialSegments,data.heightSegments,data.openEnded,data.thetaStart,data.thetaLength);break;case'ConeGeometry':case'ConeBufferGeometry':geometry=new Geometries[data.type](data.radius,data.height,data.radialSegments,data.heightSegments,data.openEnded,data.thetaStart,data.thetaLength);break;case'SphereGeometry':case'SphereBufferGeometry':geometry=new Geometries[data.type](data.radius,data.widthSegments,data.heightSegments,data.phiStart,data.phiLength,data.thetaStart,data.thetaLength);break;case'DodecahedronGeometry':case'DodecahedronBufferGeometry':case'IcosahedronGeometry':case'IcosahedronBufferGeometry':case'OctahedronGeometry':case'OctahedronBufferGeometry':case'TetrahedronGeometry':case'TetrahedronBufferGeometry':geometry=new Geometries[data.type](data.radius,data.detail);break;case'RingGeometry':case'RingBufferGeometry':geometry=new Geometries[data.type](data.innerRadius,data.outerRadius,data.thetaSegments,data.phiSegments,data.thetaStart,data.thetaLength);break;case'TorusGeometry':case'TorusBufferGeometry':geometry=new Geometries[data.type](data.radius,data.tube,data.radialSegments,data.tubularSegments,data.arc);break;case'TorusKnotGeometry':case'TorusKnotBufferGeometry':geometry=new Geometries[data.type](data.radius,data.tube,data.tubularSegments,data.radialSegments,data.p,data.q);break;case'LatheGeometry':case'LatheBufferGeometry':geometry=new Geometries[data.type](data.points,data.segments,data.phiStart,data.phiLength);break;case'PolyhedronGeometry':case'PolyhedronBufferGeometry':geometry=new Geometries[data.type](data.vertices,data.indices,data.radius,data.details);break;case'ShapeGeometry':case'ShapeBufferGeometry':var geometryShapes=[];for(var j=0,jl=data.shapes.length;j<jl;j++){var shape=shapes[data.shapes[j]];geometryShapes.push(shape);}geometry=new Geometries[data.type](geometryShapes,data.curveSegments);break;case'BufferGeometry':geometry=bufferGeometryLoader.parse(data);break;case'Geometry':geometry=geometryLoader.parse(data,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+data.type+'"');continue;}geometry.uuid=data.uuid;if(data.name!==undefined)geometry.name=data.name;geometries[data.uuid]=geometry;}}return geometries;},parseMaterials:function(json,textures){var materials={};if(json!==undefined){var loader=new MaterialLoader();loader.setTextures(textures);for(var i=0,l=json.length;i<l;i++){var data=json[i];if(data.type==='MultiMaterial'){// Deprecated
var array=[];for(var j=0;j<data.materials.length;j++){array.push(loader.parse(data.materials[j]));}materials[data.uuid]=array;}else{materials[data.uuid]=loader.parse(data);}}}return materials;},parseAnimations:function(json){var animations=[];for(var i=0;i<json.length;i++){var clip=AnimationClip.parse(json[i]);animations.push(clip);}return animations;},parseImages:function(json,onLoad){var scope=this;var images={};function loadImage(url){scope.manager.itemStart(url);return loader.load(url,function(){scope.manager.itemEnd(url);},undefined,function(){scope.manager.itemEnd(url);scope.manager.itemError(url);});}if(json!==undefined&&json.length>0){var manager=new LoadingManager(onLoad);var loader=new ImageLoader(manager);loader.setCrossOrigin(this.crossOrigin);for(var i=0,l=json.length;i<l;i++){var image=json[i];var path=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(image.url)?image.url:scope.texturePath+image.url;images[image.uuid]=loadImage(path);}}return images;},parseTextures:function(json,images){function parseConstant(value,type){if(typeof value==='number')return value;console.warn('THREE.ObjectLoader.parseTexture: Constant should be in numeric form.',value);return type[value];}var textures={};if(json!==undefined){for(var i=0,l=json.length;i<l;i++){var data=json[i];if(data.image===undefined){console.warn('THREE.ObjectLoader: No "image" specified for',data.uuid);}if(images[data.image]===undefined){console.warn('THREE.ObjectLoader: Undefined image',data.image);}var texture=new Texture(images[data.image]);texture.needsUpdate=true;texture.uuid=data.uuid;if(data.name!==undefined)texture.name=data.name;if(data.mapping!==undefined)texture.mapping=parseConstant(data.mapping,TEXTURE_MAPPING);if(data.offset!==undefined)texture.offset.fromArray(data.offset);if(data.repeat!==undefined)texture.repeat.fromArray(data.repeat);if(data.center!==undefined)texture.center.fromArray(data.center);if(data.rotation!==undefined)texture.rotation=data.rotation;if(data.wrap!==undefined){texture.wrapS=parseConstant(data.wrap[0],TEXTURE_WRAPPING);texture.wrapT=parseConstant(data.wrap[1],TEXTURE_WRAPPING);}if(data.format!==undefined)texture.format=data.format;if(data.minFilter!==undefined)texture.minFilter=parseConstant(data.minFilter,TEXTURE_FILTER);if(data.magFilter!==undefined)texture.magFilter=parseConstant(data.magFilter,TEXTURE_FILTER);if(data.anisotropy!==undefined)texture.anisotropy=data.anisotropy;if(data.flipY!==undefined)texture.flipY=data.flipY;textures[data.uuid]=texture;}}return textures;},parseObject:function(data,geometries,materials){var object;function getGeometry(name){if(geometries[name]===undefined){console.warn('THREE.ObjectLoader: Undefined geometry',name);}return geometries[name];}function getMaterial(name){if(name===undefined)return undefined;if(Array.isArray(name)){var array=[];for(var i=0,l=name.length;i<l;i++){var uuid=name[i];if(materials[uuid]===undefined){console.warn('THREE.ObjectLoader: Undefined material',uuid);}array.push(materials[uuid]);}return array;}if(materials[name]===undefined){console.warn('THREE.ObjectLoader: Undefined material',name);}return materials[name];}switch(data.type){case'Scene':object=new Scene();if(data.background!==undefined){if(Number.isInteger(data.background)){object.background=new Color(data.background);}}if(data.fog!==undefined){if(data.fog.type==='Fog'){object.fog=new Fog(data.fog.color,data.fog.near,data.fog.far);}else if(data.fog.type==='FogExp2'){object.fog=new FogExp2(data.fog.color,data.fog.density);}}break;case'PerspectiveCamera':object=new PerspectiveCamera(data.fov,data.aspect,data.near,data.far);if(data.focus!==undefined)object.focus=data.focus;if(data.zoom!==undefined)object.zoom=data.zoom;if(data.filmGauge!==undefined)object.filmGauge=data.filmGauge;if(data.filmOffset!==undefined)object.filmOffset=data.filmOffset;if(data.view!==undefined)object.view=Object.assign({},data.view);break;case'OrthographicCamera':object=new OrthographicCamera(data.left,data.right,data.top,data.bottom,data.near,data.far);if(data.zoom!==undefined)object.zoom=data.zoom;if(data.view!==undefined)object.view=Object.assign({},data.view);break;case'AmbientLight':object=new AmbientLight(data.color,data.intensity);break;case'DirectionalLight':object=new DirectionalLight(data.color,data.intensity);break;case'PointLight':object=new PointLight(data.color,data.intensity,data.distance,data.decay);break;case'RectAreaLight':object=new RectAreaLight(data.color,data.intensity,data.width,data.height);break;case'SpotLight':object=new SpotLight(data.color,data.intensity,data.distance,data.angle,data.penumbra,data.decay);break;case'HemisphereLight':object=new HemisphereLight(data.color,data.groundColor,data.intensity);break;case'SkinnedMesh':console.warn('THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.');case'Mesh':var geometry=getGeometry(data.geometry);var material=getMaterial(data.material);if(geometry.bones&&geometry.bones.length>0){object=new SkinnedMesh(geometry,material);}else{object=new Mesh(geometry,material);}break;case'LOD':object=new LOD();break;case'Line':object=new Line(getGeometry(data.geometry),getMaterial(data.material),data.mode);break;case'LineLoop':object=new LineLoop(getGeometry(data.geometry),getMaterial(data.material));break;case'LineSegments':object=new LineSegments(getGeometry(data.geometry),getMaterial(data.material));break;case'PointCloud':case'Points':object=new Points(getGeometry(data.geometry),getMaterial(data.material));break;case'Sprite':object=new Sprite(getMaterial(data.material));break;case'Group':object=new Group();break;default:object=new Object3D();}object.uuid=data.uuid;if(data.name!==undefined)object.name=data.name;if(data.matrix!==undefined){object.matrix.fromArray(data.matrix);if(data.matrixAutoUpdate!==undefined)object.matrixAutoUpdate=data.matrixAutoUpdate;if(object.matrixAutoUpdate)object.matrix.decompose(object.position,object.quaternion,object.scale);}else{if(data.position!==undefined)object.position.fromArray(data.position);if(data.rotation!==undefined)object.rotation.fromArray(data.rotation);if(data.quaternion!==undefined)object.quaternion.fromArray(data.quaternion);if(data.scale!==undefined)object.scale.fromArray(data.scale);}if(data.castShadow!==undefined)object.castShadow=data.castShadow;if(data.receiveShadow!==undefined)object.receiveShadow=data.receiveShadow;if(data.shadow){if(data.shadow.bias!==undefined)object.shadow.bias=data.shadow.bias;if(data.shadow.radius!==undefined)object.shadow.radius=data.shadow.radius;if(data.shadow.mapSize!==undefined)object.shadow.mapSize.fromArray(data.shadow.mapSize);if(data.shadow.camera!==undefined)object.shadow.camera=this.parseObject(data.shadow.camera);}if(data.visible!==undefined)object.visible=data.visible;if(data.frustumCulled!==undefined)object.frustumCulled=data.frustumCulled;if(data.renderOrder!==undefined)object.renderOrder=data.renderOrder;if(data.userData!==undefined)object.userData=data.userData;if(data.children!==undefined){var children=data.children;for(var i=0;i<children.length;i++){object.add(this.parseObject(children[i],geometries,materials));}}if(data.type==='LOD'){var levels=data.levels;for(var l=0;l<levels.length;l++){var level=levels[l];var child=object.getObjectByProperty('uuid',level.object);if(child!==undefined){object.addLevel(child,level.distance);}}}return object;}});var TEXTURE_MAPPING={UVMapping:UVMapping,CubeReflectionMapping:CubeReflectionMapping,CubeRefractionMapping:CubeRefractionMapping,EquirectangularReflectionMapping:EquirectangularReflectionMapping,EquirectangularRefractionMapping:EquirectangularRefractionMapping,SphericalReflectionMapping:SphericalReflectionMapping,CubeUVReflectionMapping:CubeUVReflectionMapping,CubeUVRefractionMapping:CubeUVRefractionMapping};var TEXTURE_WRAPPING={RepeatWrapping:RepeatWrapping,ClampToEdgeWrapping:ClampToEdgeWrapping,MirroredRepeatWrapping:MirroredRepeatWrapping};var TEXTURE_FILTER={NearestFilter:NearestFilter,NearestMipMapNearestFilter:NearestMipMapNearestFilter,NearestMipMapLinearFilter:NearestMipMapLinearFilter,LinearFilter:LinearFilter,LinearMipMapNearestFilter:LinearMipMapNearestFilter,LinearMipMapLinearFilter:LinearMipMapLinearFilter};/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* minimal class for proxing functions to Path. Replaces old "extractSubpaths()"
**/function ShapePath(){this.type='ShapePath';this.color=new Color();this.subPaths=[];this.currentPath=null;}Object.assign(ShapePath.prototype,{moveTo:function(x,y){this.currentPath=new Path();this.subPaths.push(this.currentPath);this.currentPath.moveTo(x,y);},lineTo:function(x,y){this.currentPath.lineTo(x,y);},quadraticCurveTo:function(aCPx,aCPy,aX,aY){this.currentPath.quadraticCurveTo(aCPx,aCPy,aX,aY);},bezierCurveTo:function(aCP1x,aCP1y,aCP2x,aCP2y,aX,aY){this.currentPath.bezierCurveTo(aCP1x,aCP1y,aCP2x,aCP2y,aX,aY);},splineThru:function(pts){this.currentPath.splineThru(pts);},toShapes:function(isCCW,noHoles){function toShapesNoHoles(inSubpaths){var shapes=[];for(var i=0,l=inSubpaths.length;i<l;i++){var tmpPath=inSubpaths[i];var tmpShape=new Shape();tmpShape.curves=tmpPath.curves;shapes.push(tmpShape);}return shapes;}function isPointInsidePolygon(inPt,inPolygon){var polyLen=inPolygon.length;// inPt on polygon contour => immediate success or
// toggling of inside/outside at every single! intersection point of an edge
// with the horizontal line through inPt, left of inPt
// not counting lowerY endpoints of edges and whole edges on that line
var inside=false;for(var p=polyLen-1,q=0;q<polyLen;p=q++){var edgeLowPt=inPolygon[p];var edgeHighPt=inPolygon[q];var edgeDx=edgeHighPt.x-edgeLowPt.x;var edgeDy=edgeHighPt.y-edgeLowPt.y;if(Math.abs(edgeDy)>Number.EPSILON){// not parallel
if(edgeDy<0){edgeLowPt=inPolygon[q];edgeDx=-edgeDx;edgeHighPt=inPolygon[p];edgeDy=-edgeDy;}if(inPt.y<edgeLowPt.y||inPt.y>edgeHighPt.y)continue;if(inPt.y===edgeLowPt.y){if(inPt.x===edgeLowPt.x)return true;// inPt is on contour ?
// continue; // no intersection or edgeLowPt => doesn't count !!!
}else{var perpEdge=edgeDy*(inPt.x-edgeLowPt.x)-edgeDx*(inPt.y-edgeLowPt.y);if(perpEdge===0)return true;// inPt is on contour ?
if(perpEdge<0)continue;inside=!inside;// true intersection left of inPt
}}else{// parallel or collinear
if(inPt.y!==edgeLowPt.y)continue;// parallel
// edge lies on the same horizontal line as inPt
if(edgeHighPt.x<=inPt.x&&inPt.x<=edgeLowPt.x||edgeLowPt.x<=inPt.x&&inPt.x<=edgeHighPt.x)return true;// inPt: Point on contour !
// continue;
}}return inside;}var isClockWise=ShapeUtils.isClockWise;var subPaths=this.subPaths;if(subPaths.length===0)return [];if(noHoles===true)return toShapesNoHoles(subPaths);var solid,tmpPath,tmpShape,shapes=[];if(subPaths.length===1){tmpPath=subPaths[0];tmpShape=new Shape();tmpShape.curves=tmpPath.curves;shapes.push(tmpShape);return shapes;}var holesFirst=!isClockWise(subPaths[0].getPoints());holesFirst=isCCW?!holesFirst:holesFirst;// console.log("Holes first", holesFirst);
var betterShapeHoles=[];var newShapes=[];var newShapeHoles=[];var mainIdx=0;var tmpPoints;newShapes[mainIdx]=undefined;newShapeHoles[mainIdx]=[];for(var i=0,l=subPaths.length;i<l;i++){tmpPath=subPaths[i];tmpPoints=tmpPath.getPoints();solid=isClockWise(tmpPoints);solid=isCCW?!solid:solid;if(solid){if(!holesFirst&&newShapes[mainIdx])mainIdx++;newShapes[mainIdx]={s:new Shape(),p:tmpPoints};newShapes[mainIdx].s.curves=tmpPath.curves;if(holesFirst)mainIdx++;newShapeHoles[mainIdx]=[];//console.log('cw', i);
}else{newShapeHoles[mainIdx].push({h:tmpPath,p:tmpPoints[0]});//console.log('ccw', i);
}}// only Holes? -> probably all Shapes with wrong orientation
if(!newShapes[0])return toShapesNoHoles(subPaths);if(newShapes.length>1){var ambiguous=false;var toChange=[];for(var sIdx=0,sLen=newShapes.length;sIdx<sLen;sIdx++){betterShapeHoles[sIdx]=[];}for(var sIdx=0,sLen=newShapes.length;sIdx<sLen;sIdx++){var sho=newShapeHoles[sIdx];for(var hIdx=0;hIdx<sho.length;hIdx++){var ho=sho[hIdx];var hole_unassigned=true;for(var s2Idx=0;s2Idx<newShapes.length;s2Idx++){if(isPointInsidePolygon(ho.p,newShapes[s2Idx].p)){if(sIdx!==s2Idx)toChange.push({froms:sIdx,tos:s2Idx,hole:hIdx});if(hole_unassigned){hole_unassigned=false;betterShapeHoles[s2Idx].push(ho);}else{ambiguous=true;}}}if(hole_unassigned){betterShapeHoles[sIdx].push(ho);}}}// console.log("ambiguous: ", ambiguous);
if(toChange.length>0){// console.log("to change: ", toChange);
if(!ambiguous)newShapeHoles=betterShapeHoles;}}var tmpHoles;for(var i=0,il=newShapes.length;i<il;i++){tmpShape=newShapes[i].s;shapes.push(tmpShape);tmpHoles=newShapeHoles[i];for(var j=0,jl=tmpHoles.length;j<jl;j++){tmpShape.holes.push(tmpHoles[j].h);}}//console.log("shape", shapes);
return shapes;}});/**
* @author zz85 / http://www.lab4games.net/zz85/blog
* @author mrdoob / http://mrdoob.com/
*/function Font(data){this.type='Font';this.data=data;}Object.assign(Font.prototype,{isFont:true,generateShapes:function(text,size,divisions){if(size===undefined)size=100;if(divisions===undefined)divisions=4;var shapes=[];var paths=createPaths(text,size,divisions,this.data);for(var p=0,pl=paths.length;p<pl;p++){Array.prototype.push.apply(shapes,paths[p].toShapes());}return shapes;}});function createPaths(text,size,divisions,data){var chars=String(text).split('');var scale=size/data.resolution;var line_height=(data.boundingBox.yMax-data.boundingBox.yMin+data.underlineThickness)*scale;var paths=[];var offsetX=0,offsetY=0;for(var i=0;i<chars.length;i++){var char=chars[i];if(char==='\n'){offsetX=0;offsetY-=line_height;}else{var ret=createPath(char,divisions,scale,offsetX,offsetY,data);offsetX+=ret.offsetX;paths.push(ret.path);}}return paths;}function createPath(char,divisions,scale,offsetX,offsetY,data){var glyph=data.glyphs[char]||data.glyphs['?'];if(!glyph)return;var path=new ShapePath();var x,y,cpx,cpy,cpx1,cpy1,cpx2,cpy2;if(glyph.o){var outline=glyph._cachedOutline||(glyph._cachedOutline=glyph.o.split(' '));for(var i=0,l=outline.length;i<l;){var action=outline[i++];switch(action){case'm':// moveTo
x=outline[i++]*scale+offsetX;y=outline[i++]*scale+offsetY;path.moveTo(x,y);break;case'l':// lineTo
x=outline[i++]*scale+offsetX;y=outline[i++]*scale+offsetY;path.lineTo(x,y);break;case'q':// quadraticCurveTo
cpx=outline[i++]*scale+offsetX;cpy=outline[i++]*scale+offsetY;cpx1=outline[i++]*scale+offsetX;cpy1=outline[i++]*scale+offsetY;path.quadraticCurveTo(cpx1,cpy1,cpx,cpy);break;case'b':// bezierCurveTo
cpx=outline[i++]*scale+offsetX;cpy=outline[i++]*scale+offsetY;cpx1=outline[i++]*scale+offsetX;cpy1=outline[i++]*scale+offsetY;cpx2=outline[i++]*scale+offsetX;cpy2=outline[i++]*scale+offsetY;path.bezierCurveTo(cpx1,cpy1,cpx2,cpy2,cpx,cpy);break;}}}return {offsetX:glyph.ha*scale,path:path};}/**
* @author mrdoob / http://mrdoob.com/
*/function FontLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;}Object.assign(FontLoader.prototype,{load:function(url,onLoad,onProgress,onError){var scope=this;var loader=new FileLoader(this.manager);loader.setPath(this.path);loader.load(url,function(text){var json;try{json=JSON.parse(text);}catch(e){console.warn('THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.');json=JSON.parse(text.substring(65,text.length-2));}var font=scope.parse(json);if(onLoad)onLoad(font);},onProgress,onError);},parse:function(json){return new Font(json);},setPath:function(value){this.path=value;return this;}});/**
* @author mrdoob / http://mrdoob.com/
*/var context;var AudioContext={getContext:function(){if(context===undefined){context=new(window.AudioContext||window.webkitAudioContext)();}return context;},setContext:function(value){context=value;}};/**
* @author Reece Aaron Lecrivain / http://reecenotes.com/
*/function AudioLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;}Object.assign(AudioLoader.prototype,{load:function(url,onLoad,onProgress,onError){var loader=new FileLoader(this.manager);loader.setResponseType('arraybuffer');loader.load(url,function(buffer){var context=AudioContext.getContext();context.decodeAudioData(buffer,function(audioBuffer){onLoad(audioBuffer);});},onProgress,onError);}});/**
* @author mrdoob / http://mrdoob.com/
*/function StereoCamera(){this.type='StereoCamera';this.aspect=1;this.eyeSep=0.064;this.cameraL=new PerspectiveCamera();this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=false;this.cameraR=new PerspectiveCamera();this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=false;}Object.assign(StereoCamera.prototype,{update:function(){var instance,focus,fov,aspect,near,far,zoom,eyeSep;var eyeRight=new Matrix4();var eyeLeft=new Matrix4();return function update(camera){var needsUpdate=instance!==this||focus!==camera.focus||fov!==camera.fov||aspect!==camera.aspect*this.aspect||near!==camera.near||far!==camera.far||zoom!==camera.zoom||eyeSep!==this.eyeSep;if(needsUpdate){instance=this;focus=camera.focus;fov=camera.fov;aspect=camera.aspect*this.aspect;near=camera.near;far=camera.far;zoom=camera.zoom;// Off-axis stereoscopic effect based on
// http://paulbourke.net/stereographics/stereorender/
var projectionMatrix=camera.projectionMatrix.clone();eyeSep=this.eyeSep/2;var eyeSepOnProjection=eyeSep*near/focus;var ymax=near*Math.tan(_Math.DEG2RAD*fov*0.5)/zoom;var xmin,xmax;// translate xOffset
eyeLeft.elements[12]=-eyeSep;eyeRight.elements[12]=eyeSep;// for left eye
xmin=-ymax*aspect+eyeSepOnProjection;xmax=ymax*aspect+eyeSepOnProjection;projectionMatrix.elements[0]=2*near/(xmax-xmin);projectionMatrix.elements[8]=(xmax+xmin)/(xmax-xmin);this.cameraL.projectionMatrix.copy(projectionMatrix);// for right eye
xmin=-ymax*aspect-eyeSepOnProjection;xmax=ymax*aspect-eyeSepOnProjection;projectionMatrix.elements[0]=2*near/(xmax-xmin);projectionMatrix.elements[8]=(xmax+xmin)/(xmax-xmin);this.cameraR.projectionMatrix.copy(projectionMatrix);}this.cameraL.matrixWorld.copy(camera.matrixWorld).multiply(eyeLeft);this.cameraR.matrixWorld.copy(camera.matrixWorld).multiply(eyeRight);};}()});/**
* Camera for rendering cube maps
* - renders scene into axis-aligned cube
*
* @author alteredq / http://alteredqualia.com/
*/function CubeCamera(near,far,cubeResolution){Object3D.call(this);this.type='CubeCamera';var fov=90,aspect=1;var cameraPX=new PerspectiveCamera(fov,aspect,near,far);cameraPX.up.set(0,-1,0);cameraPX.lookAt(new Vector3(1,0,0));this.add(cameraPX);var cameraNX=new PerspectiveCamera(fov,aspect,near,far);cameraNX.up.set(0,-1,0);cameraNX.lookAt(new Vector3(-1,0,0));this.add(cameraNX);var cameraPY=new PerspectiveCamera(fov,aspect,near,far);cameraPY.up.set(0,0,1);cameraPY.lookAt(new Vector3(0,1,0));this.add(cameraPY);var cameraNY=new PerspectiveCamera(fov,aspect,near,far);cameraNY.up.set(0,0,-1);cameraNY.lookAt(new Vector3(0,-1,0));this.add(cameraNY);var cameraPZ=new PerspectiveCamera(fov,aspect,near,far);cameraPZ.up.set(0,-1,0);cameraPZ.lookAt(new Vector3(0,0,1));this.add(cameraPZ);var cameraNZ=new PerspectiveCamera(fov,aspect,near,far);cameraNZ.up.set(0,-1,0);cameraNZ.lookAt(new Vector3(0,0,-1));this.add(cameraNZ);var options={format:RGBFormat,magFilter:LinearFilter,minFilter:LinearFilter};this.renderTarget=new WebGLRenderTargetCube(cubeResolution,cubeResolution,options);this.renderTarget.texture.name="CubeCamera";this.update=function(renderer,scene){if(this.parent===null)this.updateMatrixWorld();var renderTarget=this.renderTarget;var generateMipmaps=renderTarget.texture.generateMipmaps;renderTarget.texture.generateMipmaps=false;renderTarget.activeCubeFace=0;renderer.render(scene,cameraPX,renderTarget);renderTarget.activeCubeFace=1;renderer.render(scene,cameraNX,renderTarget);renderTarget.activeCubeFace=2;renderer.render(scene,cameraPY,renderTarget);renderTarget.activeCubeFace=3;renderer.render(scene,cameraNY,renderTarget);renderTarget.activeCubeFace=4;renderer.render(scene,cameraPZ,renderTarget);renderTarget.texture.generateMipmaps=generateMipmaps;renderTarget.activeCubeFace=5;renderer.render(scene,cameraNZ,renderTarget);renderer.setRenderTarget(null);};this.clear=function(renderer,color,depth,stencil){var renderTarget=this.renderTarget;for(var i=0;i<6;i++){renderTarget.activeCubeFace=i;renderer.setRenderTarget(renderTarget);renderer.clear(color,depth,stencil);}renderer.setRenderTarget(null);};}CubeCamera.prototype=Object.create(Object3D.prototype);CubeCamera.prototype.constructor=CubeCamera;/**
* @author mrdoob / http://mrdoob.com/
*/function AudioListener(){Object3D.call(this);this.type='AudioListener';this.context=AudioContext.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null;}AudioListener.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:AudioListener,getInput:function(){return this.gain;},removeFilter:function(){if(this.filter!==null){this.gain.disconnect(this.filter);this.filter.disconnect(this.context.destination);this.gain.connect(this.context.destination);this.filter=null;}},getFilter:function(){return this.filter;},setFilter:function(value){if(this.filter!==null){this.gain.disconnect(this.filter);this.filter.disconnect(this.context.destination);}else{this.gain.disconnect(this.context.destination);}this.filter=value;this.gain.connect(this.filter);this.filter.connect(this.context.destination);},getMasterVolume:function(){return this.gain.gain.value;},setMasterVolume:function(value){this.gain.gain.setTargetAtTime(value,this.context.currentTime,0.01);},updateMatrixWorld:function(){var position=new Vector3();var quaternion=new Quaternion();var scale=new Vector3();var orientation=new Vector3();return function updateMatrixWorld(force){Object3D.prototype.updateMatrixWorld.call(this,force);var listener=this.context.listener;var up=this.up;this.matrixWorld.decompose(position,quaternion,scale);orientation.set(0,0,-1).applyQuaternion(quaternion);if(listener.positionX){listener.positionX.setValueAtTime(position.x,this.context.currentTime);listener.positionY.setValueAtTime(position.y,this.context.currentTime);listener.positionZ.setValueAtTime(position.z,this.context.currentTime);listener.forwardX.setValueAtTime(orientation.x,this.context.currentTime);listener.forwardY.setValueAtTime(orientation.y,this.context.currentTime);listener.forwardZ.setValueAtTime(orientation.z,this.context.currentTime);listener.upX.setValueAtTime(up.x,this.context.currentTime);listener.upY.setValueAtTime(up.y,this.context.currentTime);listener.upZ.setValueAtTime(up.z,this.context.currentTime);}else{listener.setPosition(position.x,position.y,position.z);listener.setOrientation(orientation.x,orientation.y,orientation.z,up.x,up.y,up.z);}};}()});/**
* @author mrdoob / http://mrdoob.com/
* @author Reece Aaron Lecrivain / http://reecenotes.com/
*/function Audio(listener){Object3D.call(this);this.type='Audio';this.context=listener.context;this.gain=this.context.createGain();this.gain.connect(listener.getInput());this.autoplay=false;this.buffer=null;this.loop=false;this.startTime=0;this.offset=0;this.playbackRate=1;this.isPlaying=false;this.hasPlaybackControl=true;this.sourceType='empty';this.filters=[];}Audio.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Audio,getOutput:function(){return this.gain;},setNodeSource:function(audioNode){this.hasPlaybackControl=false;this.sourceType='audioNode';this.source=audioNode;this.connect();return this;},setBuffer:function(audioBuffer){this.buffer=audioBuffer;this.sourceType='buffer';if(this.autoplay)this.play();return this;},play:function(){if(this.isPlaying===true){console.warn('THREE.Audio: Audio is already playing.');return;}if(this.hasPlaybackControl===false){console.warn('THREE.Audio: this Audio has no playback control.');return;}var source=this.context.createBufferSource();source.buffer=this.buffer;source.loop=this.loop;source.onended=this.onEnded.bind(this);source.playbackRate.setValueAtTime(this.playbackRate,this.startTime);this.startTime=this.context.currentTime;source.start(this.startTime,this.offset);this.isPlaying=true;this.source=source;return this.connect();},pause:function(){if(this.hasPlaybackControl===false){console.warn('THREE.Audio: this Audio has no playback control.');return;}if(this.isPlaying===true){this.source.stop();this.offset+=(this.context.currentTime-this.startTime)*this.playbackRate;this.isPlaying=false;}return this;},stop:function(){if(this.hasPlaybackControl===false){console.warn('THREE.Audio: this Audio has no playback control.');return;}this.source.stop();this.offset=0;this.isPlaying=false;return this;},connect:function(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(var i=1,l=this.filters.length;i<l;i++){this.filters[i-1].connect(this.filters[i]);}this.filters[this.filters.length-1].connect(this.getOutput());}else{this.source.connect(this.getOutput());}return this;},disconnect:function(){if(this.filters.length>0){this.source.disconnect(this.filters[0]);for(var i=1,l=this.filters.length;i<l;i++){this.filters[i-1].disconnect(this.filters[i]);}this.filters[this.filters.length-1].disconnect(this.getOutput());}else{this.source.disconnect(this.getOutput());}return this;},getFilters:function(){return this.filters;},setFilters:function(value){if(!value)value=[];if(this.isPlaying===true){this.disconnect();this.filters=value;this.connect();}else{this.filters=value;}return this;},getFilter:function(){return this.getFilters()[0];},setFilter:function(filter){return this.setFilters(filter?[filter]:[]);},setPlaybackRate:function(value){if(this.hasPlaybackControl===false){console.warn('THREE.Audio: this Audio has no playback control.');return;}this.playbackRate=value;if(this.isPlaying===true){this.source.playbackRate.setValueAtTime(this.playbackRate,this.context.currentTime);}return this;},getPlaybackRate:function(){return this.playbackRate;},onEnded:function(){this.isPlaying=false;},getLoop:function(){if(this.hasPlaybackControl===false){console.warn('THREE.Audio: this Audio has no playback control.');return false;}return this.loop;},setLoop:function(value){if(this.hasPlaybackControl===false){console.warn('THREE.Audio: this Audio has no playback control.');return;}this.loop=value;if(this.isPlaying===true){this.source.loop=this.loop;}return this;},getVolume:function(){return this.gain.gain.value;},setVolume:function(value){this.gain.gain.setTargetAtTime(value,this.context.currentTime,0.01);return this;}});/**
* @author mrdoob / http://mrdoob.com/
*/function PositionalAudio(listener){Audio.call(this,listener);this.panner=this.context.createPanner();this.panner.connect(this.gain);}PositionalAudio.prototype=Object.assign(Object.create(Audio.prototype),{constructor:PositionalAudio,getOutput:function(){return this.panner;},getRefDistance:function(){return this.panner.refDistance;},setRefDistance:function(value){this.panner.refDistance=value;},getRolloffFactor:function(){return this.panner.rolloffFactor;},setRolloffFactor:function(value){this.panner.rolloffFactor=value;},getDistanceModel:function(){return this.panner.distanceModel;},setDistanceModel:function(value){this.panner.distanceModel=value;},getMaxDistance:function(){return this.panner.maxDistance;},setMaxDistance:function(value){this.panner.maxDistance=value;},updateMatrixWorld:function(){var position=new Vector3();return function updateMatrixWorld(force){Object3D.prototype.updateMatrixWorld.call(this,force);position.setFromMatrixPosition(this.matrixWorld);this.panner.setPosition(position.x,position.y,position.z);};}()});/**
* @author mrdoob / http://mrdoob.com/
*/function AudioAnalyser(audio,fftSize){this.analyser=audio.context.createAnalyser();this.analyser.fftSize=fftSize!==undefined?fftSize:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);audio.getOutput().connect(this.analyser);}Object.assign(AudioAnalyser.prototype,{getFrequencyData:function(){this.analyser.getByteFrequencyData(this.data);return this.data;},getAverageFrequency:function(){var value=0,data=this.getFrequencyData();for(var i=0;i<data.length;i++){value+=data[i];}return value/data.length;}});/**
*
* Buffered scene graph property that allows weighted accumulation.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/function PropertyMixer(binding,typeName,valueSize){this.binding=binding;this.valueSize=valueSize;var bufferType=Float64Array,mixFunction;switch(typeName){case'quaternion':mixFunction=this._slerp;break;case'string':case'bool':bufferType=Array;mixFunction=this._select;break;default:mixFunction=this._lerp;}this.buffer=new bufferType(valueSize*4);// layout: [ incoming | accu0 | accu1 | orig ]
//
// interpolators can use .buffer as their .result
// the data then goes to 'incoming'
//
// 'accu0' and 'accu1' are used frame-interleaved for
// the cumulative result and are compared to detect
// changes
//
// 'orig' stores the original state of the property
this._mixBufferRegion=mixFunction;this.cumulativeWeight=0;this.useCount=0;this.referenceCount=0;}Object.assign(PropertyMixer.prototype,{// accumulate data in the 'incoming' region into 'accu<i>'
accumulate:function(accuIndex,weight){// note: happily accumulating nothing when weight = 0, the caller knows
// the weight and shouldn't have made the call in the first place
var buffer=this.buffer,stride=this.valueSize,offset=accuIndex*stride+stride,currentWeight=this.cumulativeWeight;if(currentWeight===0){// accuN := incoming * weight
for(var i=0;i!==stride;++i){buffer[offset+i]=buffer[i];}currentWeight=weight;}else{// accuN := accuN + incoming * weight
currentWeight+=weight;var mix=weight/currentWeight;this._mixBufferRegion(buffer,offset,0,mix,stride);}this.cumulativeWeight=currentWeight;},// apply the state of 'accu<i>' to the binding when accus differ
apply:function(accuIndex){var stride=this.valueSize,buffer=this.buffer,offset=accuIndex*stride+stride,weight=this.cumulativeWeight,binding=this.binding;this.cumulativeWeight=0;if(weight<1){// accuN := accuN + original * ( 1 - cumulativeWeight )
var originalValueOffset=stride*3;this._mixBufferRegion(buffer,offset,originalValueOffset,1-weight,stride);}for(var i=stride,e=stride+stride;i!==e;++i){if(buffer[i]!==buffer[i+stride]){// value has changed -> update scene graph
binding.setValue(buffer,offset);break;}}},// remember the state of the bound property and copy it to both accus
saveOriginalState:function(){var binding=this.binding;var buffer=this.buffer,stride=this.valueSize,originalValueOffset=stride*3;binding.getValue(buffer,originalValueOffset);// accu[0..1] := orig -- initially detect changes against the original
for(var i=stride,e=originalValueOffset;i!==e;++i){buffer[i]=buffer[originalValueOffset+i%stride];}this.cumulativeWeight=0;},// apply the state previously taken via 'saveOriginalState' to the binding
restoreOriginalState:function(){var originalValueOffset=this.valueSize*3;this.binding.setValue(this.buffer,originalValueOffset);},// mix functions
_select:function(buffer,dstOffset,srcOffset,t,stride){if(t>=0.5){for(var i=0;i!==stride;++i){buffer[dstOffset+i]=buffer[srcOffset+i];}}},_slerp:function(buffer,dstOffset,srcOffset,t){Quaternion.slerpFlat(buffer,dstOffset,buffer,dstOffset,buffer,srcOffset,t);},_lerp:function(buffer,dstOffset,srcOffset,t,stride){var s=1-t;for(var i=0;i!==stride;++i){var j=dstOffset+i;buffer[j]=buffer[j]*s+buffer[srcOffset+i]*t;}}});/**
*
* A reference to a real property in the scene graph.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/ // Characters [].:/ are reserved for track binding syntax.
var RESERVED_CHARS_RE='\\[\\]\\.:\\/';function Composite(targetGroup,path,optionalParsedPath){var parsedPath=optionalParsedPath||PropertyBinding.parseTrackName(path);this._targetGroup=targetGroup;this._bindings=targetGroup.subscribe_(path,parsedPath);}Object.assign(Composite.prototype,{getValue:function(array,offset){this.bind();// bind all binding
var firstValidIndex=this._targetGroup.nCachedObjects_,binding=this._bindings[firstValidIndex];// and only call .getValue on the first
if(binding!==undefined)binding.getValue(array,offset);},setValue:function(array,offset){var bindings=this._bindings;for(var i=this._targetGroup.nCachedObjects_,n=bindings.length;i!==n;++i){bindings[i].setValue(array,offset);}},bind:function(){var bindings=this._bindings;for(var i=this._targetGroup.nCachedObjects_,n=bindings.length;i!==n;++i){bindings[i].bind();}},unbind:function(){var bindings=this._bindings;for(var i=this._targetGroup.nCachedObjects_,n=bindings.length;i!==n;++i){bindings[i].unbind();}}});function PropertyBinding(rootNode,path,parsedPath){this.path=path;this.parsedPath=parsedPath||PropertyBinding.parseTrackName(path);this.node=PropertyBinding.findNode(rootNode,this.parsedPath.nodeName)||rootNode;this.rootNode=rootNode;}Object.assign(PropertyBinding,{Composite:Composite,create:function(root,path,parsedPath){if(!(root&&root.isAnimationObjectGroup)){return new PropertyBinding(root,path,parsedPath);}else{return new PropertyBinding.Composite(root,path,parsedPath);}},/**
* Replaces spaces with underscores and removes unsupported characters from
* node names, to ensure compatibility with parseTrackName().
*
* @param {string} name Node name to be sanitized.
* @return {string}
*/sanitizeNodeName:function(){var reservedRe=new RegExp('['+RESERVED_CHARS_RE+']','g');return function sanitizeNodeName(name){return name.replace(/\s/g,'_').replace(reservedRe,'');};}(),parseTrackName:function(){// Attempts to allow node names from any language. ES5's `\w` regexp matches
// only latin characters, and the unicode \p{L} is not yet supported. So
// instead, we exclude reserved characters and match everything else.
var wordChar='[^'+RESERVED_CHARS_RE+']';var wordCharOrDot='[^'+RESERVED_CHARS_RE.replace('\\.','')+']';// Parent directories, delimited by '/' or ':'. Currently unused, but must
// be matched to parse the rest of the track name.
var directoryRe=/((?:WC+[\/:])*)/.source.replace('WC',wordChar);// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.
var nodeRe=/(WCOD+)?/.source.replace('WCOD',wordCharOrDot);// Object on target node, and accessor. May not contain reserved
// characters. Accessor may contain any character except closing bracket.
var objectRe=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace('WC',wordChar);// Property and accessor. May not contain reserved characters. Accessor may
// contain any non-bracket characters.
var propertyRe=/\.(WC+)(?:\[(.+)\])?/.source.replace('WC',wordChar);var trackRe=new RegExp(''+'^'+directoryRe+nodeRe+objectRe+propertyRe+'$');var supportedObjectNames=['material','materials','bones'];return function parseTrackName(trackName){var matches=trackRe.exec(trackName);if(!matches){throw new Error('PropertyBinding: Cannot parse trackName: '+trackName);}var results={// directoryName: matches[ 1 ], // (tschw) currently unused
nodeName:matches[2],objectName:matches[3],objectIndex:matches[4],propertyName:matches[5],// required
propertyIndex:matches[6]};var lastDot=results.nodeName&&results.nodeName.lastIndexOf('.');if(lastDot!==undefined&&lastDot!==-1){var objectName=results.nodeName.substring(lastDot+1);// Object names must be checked against a whitelist. Otherwise, there
// is no way to parse 'foo.bar.baz': 'baz' must be a property, but
// 'bar' could be the objectName, or part of a nodeName (which can
// include '.' characters).
if(supportedObjectNames.indexOf(objectName)!==-1){results.nodeName=results.nodeName.substring(0,lastDot);results.objectName=objectName;}}if(results.propertyName===null||results.propertyName.length===0){throw new Error('PropertyBinding: can not parse propertyName from trackName: '+trackName);}return results;};}(),findNode:function(root,nodeName){if(!nodeName||nodeName===""||nodeName==="root"||nodeName==="."||nodeName===-1||nodeName===root.name||nodeName===root.uuid){return root;}// search into skeleton bones.
if(root.skeleton){var bone=root.skeleton.getBoneByName(nodeName);if(bone!==undefined){return bone;}}// search into node subtree.
if(root.children){var searchNodeSubtree=function(children){for(var i=0;i<children.length;i++){var childNode=children[i];if(childNode.name===nodeName||childNode.uuid===nodeName){return childNode;}var result=searchNodeSubtree(childNode.children);if(result)return result;}return null;};var subTreeNode=searchNodeSubtree(root.children);if(subTreeNode){return subTreeNode;}}return null;}});Object.assign(PropertyBinding.prototype,{// prototype, continued
// these are used to "bind" a nonexistent property
_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function getValue_direct(buffer,offset){buffer[offset]=this.node[this.propertyName];},function getValue_array(buffer,offset){var source=this.resolvedProperty;for(var i=0,n=source.length;i!==n;++i){buffer[offset++]=source[i];}},function getValue_arrayElement(buffer,offset){buffer[offset]=this.resolvedProperty[this.propertyIndex];},function getValue_toArray(buffer,offset){this.resolvedProperty.toArray(buffer,offset);}],SetterByBindingTypeAndVersioning:[[// Direct
function setValue_direct(buffer,offset){this.targetObject[this.propertyName]=buffer[offset];},function setValue_direct_setNeedsUpdate(buffer,offset){this.targetObject[this.propertyName]=buffer[offset];this.targetObject.needsUpdate=true;},function setValue_direct_setMatrixWorldNeedsUpdate(buffer,offset){this.targetObject[this.propertyName]=buffer[offset];this.targetObject.matrixWorldNeedsUpdate=true;}],[// EntireArray
function setValue_array(buffer,offset){var dest=this.resolvedProperty;for(var i=0,n=dest.length;i!==n;++i){dest[i]=buffer[offset++];}},function setValue_array_setNeedsUpdate(buffer,offset){var dest=this.resolvedProperty;for(var i=0,n=dest.length;i!==n;++i){dest[i]=buffer[offset++];}this.targetObject.needsUpdate=true;},function setValue_array_setMatrixWorldNeedsUpdate(buffer,offset){var dest=this.resolvedProperty;for(var i=0,n=dest.length;i!==n;++i){dest[i]=buffer[offset++];}this.targetObject.matrixWorldNeedsUpdate=true;}],[// ArrayElement
function setValue_arrayElement(buffer,offset){this.resolvedProperty[this.propertyIndex]=buffer[offset];},function setValue_arrayElement_setNeedsUpdate(buffer,offset){this.resolvedProperty[this.propertyIndex]=buffer[offset];this.targetObject.needsUpdate=true;},function setValue_arrayElement_setMatrixWorldNeedsUpdate(buffer,offset){this.resolvedProperty[this.propertyIndex]=buffer[offset];this.targetObject.matrixWorldNeedsUpdate=true;}],[// HasToFromArray
function setValue_fromArray(buffer,offset){this.resolvedProperty.fromArray(buffer,offset);},function setValue_fromArray_setNeedsUpdate(buffer,offset){this.resolvedProperty.fromArray(buffer,offset);this.targetObject.needsUpdate=true;},function setValue_fromArray_setMatrixWorldNeedsUpdate(buffer,offset){this.resolvedProperty.fromArray(buffer,offset);this.targetObject.matrixWorldNeedsUpdate=true;}]],getValue:function getValue_unbound(targetArray,offset){this.bind();this.getValue(targetArray,offset);// Note: This class uses a State pattern on a per-method basis:
// 'bind' sets 'this.getValue' / 'setValue' and shadows the
// prototype version of these methods with one that represents
// the bound state. When the property is not found, the methods
// become no-ops.
},setValue:function getValue_unbound(sourceArray,offset){this.bind();this.setValue(sourceArray,offset);},// create getter / setter pair for a property in the scene graph
bind:function(){var targetObject=this.node,parsedPath=this.parsedPath,objectName=parsedPath.objectName,propertyName=parsedPath.propertyName,propertyIndex=parsedPath.propertyIndex;if(!targetObject){targetObject=PropertyBinding.findNode(this.rootNode,parsedPath.nodeName)||this.rootNode;this.node=targetObject;}// set fail state so we can just 'return' on error
this.getValue=this._getValue_unavailable;this.setValue=this._setValue_unavailable;// ensure there is a value node
if(!targetObject){console.error('THREE.PropertyBinding: Trying to update node for track: '+this.path+' but it wasn\'t found.');return;}if(objectName){var objectIndex=parsedPath.objectIndex;// special cases were we need to reach deeper into the hierarchy to get the face materials....
switch(objectName){case'materials':if(!targetObject.material){console.error('THREE.PropertyBinding: Can not bind to material as node does not have a material.',this);return;}if(!targetObject.material.materials){console.error('THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.',this);return;}targetObject=targetObject.material.materials;break;case'bones':if(!targetObject.skeleton){console.error('THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.',this);return;}// potential future optimization: skip this if propertyIndex is already an integer
// and convert the integer string to a true integer.
targetObject=targetObject.skeleton.bones;// support resolving morphTarget names into indices.
for(var i=0;i<targetObject.length;i++){if(targetObject[i].name===objectIndex){objectIndex=i;break;}}break;default:if(targetObject[objectName]===undefined){console.error('THREE.PropertyBinding: Can not bind to objectName of node undefined.',this);return;}targetObject=targetObject[objectName];}if(objectIndex!==undefined){if(targetObject[objectIndex]===undefined){console.error('THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.',this,targetObject);return;}targetObject=targetObject[objectIndex];}}// resolve property
var nodeProperty=targetObject[propertyName];if(nodeProperty===undefined){var nodeName=parsedPath.nodeName;console.error('THREE.PropertyBinding: Trying to update property for track: '+nodeName+'.'+propertyName+' but it wasn\'t found.',targetObject);return;}// determine versioning scheme
var versioning=this.Versioning.None;if(targetObject.needsUpdate!==undefined){// material
versioning=this.Versioning.NeedsUpdate;this.targetObject=targetObject;}else if(targetObject.matrixWorldNeedsUpdate!==undefined){// node transform
versioning=this.Versioning.MatrixWorldNeedsUpdate;this.targetObject=targetObject;}// determine how the property gets bound
var bindingType=this.BindingType.Direct;if(propertyIndex!==undefined){// access a sub element of the property array (only primitives are supported right now)
if(propertyName==="morphTargetInfluences"){// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.
// support resolving morphTarget names into indices.
if(!targetObject.geometry){console.error('THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.',this);return;}if(targetObject.geometry.isBufferGeometry){if(!targetObject.geometry.morphAttributes){console.error('THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.',this);return;}for(var i=0;i<this.node.geometry.morphAttributes.position.length;i++){if(targetObject.geometry.morphAttributes.position[i].name===propertyIndex){propertyIndex=i;break;}}}else{if(!targetObject.geometry.morphTargets){console.error('THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.',this);return;}for(var i=0;i<this.node.geometry.morphTargets.length;i++){if(targetObject.geometry.morphTargets[i].name===propertyIndex){propertyIndex=i;break;}}}}bindingType=this.BindingType.ArrayElement;this.resolvedProperty=nodeProperty;this.propertyIndex=propertyIndex;}else if(nodeProperty.fromArray!==undefined&&nodeProperty.toArray!==undefined){// must use copy for Object3D.Euler/Quaternion
bindingType=this.BindingType.HasFromToArray;this.resolvedProperty=nodeProperty;}else if(Array.isArray(nodeProperty)){bindingType=this.BindingType.EntireArray;this.resolvedProperty=nodeProperty;}else{this.propertyName=propertyName;}// select getter / setter
this.getValue=this.GetterByBindingType[bindingType];this.setValue=this.SetterByBindingTypeAndVersioning[bindingType][versioning];},unbind:function(){this.node=null;// back to the prototype version of getValue / setValue
// note: avoiding to mutate the shape of 'this' via 'delete'
this.getValue=this._getValue_unbound;this.setValue=this._setValue_unbound;}});//!\ DECLARE ALIAS AFTER assign prototype !
Object.assign(PropertyBinding.prototype,{// initial state of these methods that calls 'bind'
_getValue_unbound:PropertyBinding.prototype.getValue,_setValue_unbound:PropertyBinding.prototype.setValue});/**
*
* A group of objects that receives a shared animation state.
*
* Usage:
*
* - Add objects you would otherwise pass as 'root' to the
* constructor or the .clipAction method of AnimationMixer.
*
* - Instead pass this object as 'root'.
*
* - You can also add and remove objects later when the mixer
* is running.
*
* Note:
*
* Objects of this class appear as one object to the mixer,
* so cache control of the individual objects must be done
* on the group.
*
* Limitation:
*
* - The animated properties must be compatible among the
* all objects in the group.
*
* - A single property can either be controlled through a
* target group or directly, but not both.
*
* @author tschw
*/function AnimationObjectGroup(){this.uuid=_Math.generateUUID();// cached objects followed by the active ones
this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;// threshold
// note: read by PropertyBinding.Composite
var indices={};this._indicesByUUID=indices;// for bookkeeping
for(var i=0,n=arguments.length;i!==n;++i){indices[arguments[i].uuid]=i;}this._paths=[];// inside: string
this._parsedPaths=[];// inside: { we don't care, here }
this._bindings=[];// inside: Array< PropertyBinding >
this._bindingsIndicesByPath={};// inside: indices in these arrays
var scope=this;this.stats={objects:{get total(){return scope._objects.length;},get inUse(){return this.total-scope.nCachedObjects_;}},get bindingsPerObject(){return scope._bindings.length;}};}Object.assign(AnimationObjectGroup.prototype,{isAnimationObjectGroup:true,add:function(){var objects=this._objects,nObjects=objects.length,nCachedObjects=this.nCachedObjects_,indicesByUUID=this._indicesByUUID,paths=this._paths,parsedPaths=this._parsedPaths,bindings=this._bindings,nBindings=bindings.length,knownObject=undefined;for(var i=0,n=arguments.length;i!==n;++i){var object=arguments[i],uuid=object.uuid,index=indicesByUUID[uuid];if(index===undefined){// unknown object -> add it to the ACTIVE region
index=nObjects++;indicesByUUID[uuid]=index;objects.push(object);// accounting is done, now do the same for all bindings
for(var j=0,m=nBindings;j!==m;++j){bindings[j].push(new PropertyBinding(object,paths[j],parsedPaths[j]));}}else if(index<nCachedObjects){knownObject=objects[index];// move existing object to the ACTIVE region
var firstActiveIndex=--nCachedObjects,lastCachedObject=objects[firstActiveIndex];indicesByUUID[lastCachedObject.uuid]=index;objects[index]=lastCachedObject;indicesByUUID[uuid]=firstActiveIndex;objects[firstActiveIndex]=object;// accounting is done, now do the same for all bindings
for(var j=0,m=nBindings;j!==m;++j){var bindingsForPath=bindings[j],lastCached=bindingsForPath[firstActiveIndex],binding=bindingsForPath[index];bindingsForPath[index]=lastCached;if(binding===undefined){// since we do not bother to create new bindings
// for objects that are cached, the binding may
// or may not exist
binding=new PropertyBinding(object,paths[j],parsedPaths[j]);}bindingsForPath[firstActiveIndex]=binding;}}else if(objects[index]!==knownObject){console.error('THREE.AnimationObjectGroup: Different objects with the same UUID '+'detected. Clean the caches or recreate your infrastructure when reloading scenes.');}// else the object is already where we want it to be
}// for arguments
this.nCachedObjects_=nCachedObjects;},remove:function(){var objects=this._objects,nCachedObjects=this.nCachedObjects_,indicesByUUID=this._indicesByUUID,bindings=this._bindings,nBindings=bindings.length;for(var i=0,n=arguments.length;i!==n;++i){var object=arguments[i],uuid=object.uuid,index=indicesByUUID[uuid];if(index!==undefined&&index>=nCachedObjects){// move existing object into the CACHED region
var lastCachedIndex=nCachedObjects++,firstActiveObject=objects[lastCachedIndex];indicesByUUID[firstActiveObject.uuid]=index;objects[index]=firstActiveObject;indicesByUUID[uuid]=lastCachedIndex;objects[lastCachedIndex]=object;// accounting is done, now do the same for all bindings
for(var j=0,m=nBindings;j!==m;++j){var bindingsForPath=bindings[j],firstActive=bindingsForPath[lastCachedIndex],binding=bindingsForPath[index];bindingsForPath[index]=firstActive;bindingsForPath[lastCachedIndex]=binding;}}}// for arguments
this.nCachedObjects_=nCachedObjects;},// remove & forget
uncache:function(){var objects=this._objects,nObjects=objects.length,nCachedObjects=this.nCachedObjects_,indicesByUUID=this._indicesByUUID,bindings=this._bindings,nBindings=bindings.length;for(var i=0,n=arguments.length;i!==n;++i){var object=arguments[i],uuid=object.uuid,index=indicesByUUID[uuid];if(index!==undefined){delete indicesByUUID[uuid];if(index<nCachedObjects){// object is cached, shrink the CACHED region
var firstActiveIndex=--nCachedObjects,lastCachedObject=objects[firstActiveIndex],lastIndex=--nObjects,lastObject=objects[lastIndex];// last cached object takes this object's place
indicesByUUID[lastCachedObject.uuid]=index;objects[index]=lastCachedObject;// last object goes to the activated slot and pop
indicesByUUID[lastObject.uuid]=firstActiveIndex;objects[firstActiveIndex]=lastObject;objects.pop();// accounting is done, now do the same for all bindings
for(var j=0,m=nBindings;j!==m;++j){var bindingsForPath=bindings[j],lastCached=bindingsForPath[firstActiveIndex],last=bindingsForPath[lastIndex];bindingsForPath[index]=lastCached;bindingsForPath[firstActiveIndex]=last;bindingsForPath.pop();}}else{// object is active, just swap with the last and pop
var lastIndex=--nObjects,lastObject=objects[lastIndex];indicesByUUID[lastObject.uuid]=index;objects[index]=lastObject;objects.pop();// accounting is done, now do the same for all bindings
for(var j=0,m=nBindings;j!==m;++j){var bindingsForPath=bindings[j];bindingsForPath[index]=bindingsForPath[lastIndex];bindingsForPath.pop();}}// cached or active
}// if object is known
}// for arguments
this.nCachedObjects_=nCachedObjects;},// Internal interface used by befriended PropertyBinding.Composite:
subscribe_:function(path,parsedPath){// returns an array of bindings for the given path that is changed
// according to the contained objects in the group
var indicesByPath=this._bindingsIndicesByPath,index=indicesByPath[path],bindings=this._bindings;if(index!==undefined)return bindings[index];var paths=this._paths,parsedPaths=this._parsedPaths,objects=this._objects,nObjects=objects.length,nCachedObjects=this.nCachedObjects_,bindingsForPath=new Array(nObjects);index=bindings.length;indicesByPath[path]=index;paths.push(path);parsedPaths.push(parsedPath);bindings.push(bindingsForPath);for(var i=nCachedObjects,n=objects.length;i!==n;++i){var object=objects[i];bindingsForPath[i]=new PropertyBinding(object,path,parsedPath);}return bindingsForPath;},unsubscribe_:function(path){// tells the group to forget about a property path and no longer
// update the array previously obtained with 'subscribe_'
var indicesByPath=this._bindingsIndicesByPath,index=indicesByPath[path];if(index!==undefined){var paths=this._paths,parsedPaths=this._parsedPaths,bindings=this._bindings,lastBindingsIndex=bindings.length-1,lastBindings=bindings[lastBindingsIndex],lastBindingsPath=path[lastBindingsIndex];indicesByPath[lastBindingsPath]=index;bindings[index]=lastBindings;bindings.pop();parsedPaths[index]=parsedPaths[lastBindingsIndex];parsedPaths.pop();paths[index]=paths[lastBindingsIndex];paths.pop();}}});/**
*
* Action provided by AnimationMixer for scheduling clip playback on specific
* objects.
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*
*/function AnimationAction(mixer,clip,localRoot){this._mixer=mixer;this._clip=clip;this._localRoot=localRoot||null;var tracks=clip.tracks,nTracks=tracks.length,interpolants=new Array(nTracks);var interpolantSettings={endingStart:ZeroCurvatureEnding,endingEnd:ZeroCurvatureEnding};for(var i=0;i!==nTracks;++i){var interpolant=tracks[i].createInterpolant(null);interpolants[i]=interpolant;interpolant.settings=interpolantSettings;}this._interpolantSettings=interpolantSettings;this._interpolants=interpolants;// bound by the mixer
// inside: PropertyMixer (managed by the mixer)
this._propertyBindings=new Array(nTracks);this._cacheIndex=null;// for the memory manager
this._byClipCacheIndex=null;// for the memory manager
this._timeScaleInterpolant=null;this._weightInterpolant=null;this.loop=LoopRepeat;this._loopCount=-1;// global mixer time when the action is to be started
// it's set back to 'null' upon start of the action
this._startTime=null;// scaled local time of the action
// gets clamped or wrapped to 0..clip.duration according to loop
this.time=0;this.timeScale=1;this._effectiveTimeScale=1;this.weight=1;this._effectiveWeight=1;this.repetitions=Infinity;// no. of repetitions when looping
this.paused=false;// true -> zero effective time scale
this.enabled=true;// false -> zero effective weight
this.clampWhenFinished=false;// keep feeding the last frame?
this.zeroSlopeAtStart=true;// for smooth interpolation w/o separate
this.zeroSlopeAtEnd=true;// clips for start, loop and end
}Object.assign(AnimationAction.prototype,{// State & Scheduling
play:function(){this._mixer._activateAction(this);return this;},stop:function(){this._mixer._deactivateAction(this);return this.reset();},reset:function(){this.paused=false;this.enabled=true;this.time=0;// restart clip
this._loopCount=-1;// forget previous loops
this._startTime=null;// forget scheduling
return this.stopFading().stopWarping();},isRunning:function(){return this.enabled&&!this.paused&&this.timeScale!==0&&this._startTime===null&&this._mixer._isActiveAction(this);},// return true when play has been called
isScheduled:function(){return this._mixer._isActiveAction(this);},startAt:function(time){this._startTime=time;return this;},setLoop:function(mode,repetitions){this.loop=mode;this.repetitions=repetitions;return this;},// Weight
// set the weight stopping any scheduled fading
// although .enabled = false yields an effective weight of zero, this
// method does *not* change .enabled, because it would be confusing
setEffectiveWeight:function(weight){this.weight=weight;// note: same logic as when updated at runtime
this._effectiveWeight=this.enabled?weight:0;return this.stopFading();},// return the weight considering fading and .enabled
getEffectiveWeight:function(){return this._effectiveWeight;},fadeIn:function(duration){return this._scheduleFading(duration,0,1);},fadeOut:function(duration){return this._scheduleFading(duration,1,0);},crossFadeFrom:function(fadeOutAction,duration,warp){fadeOutAction.fadeOut(duration);this.fadeIn(duration);if(warp){var fadeInDuration=this._clip.duration,fadeOutDuration=fadeOutAction._clip.duration,startEndRatio=fadeOutDuration/fadeInDuration,endStartRatio=fadeInDuration/fadeOutDuration;fadeOutAction.warp(1.0,startEndRatio,duration);this.warp(endStartRatio,1.0,duration);}return this;},crossFadeTo:function(fadeInAction,duration,warp){return fadeInAction.crossFadeFrom(this,duration,warp);},stopFading:function(){var weightInterpolant=this._weightInterpolant;if(weightInterpolant!==null){this._weightInterpolant=null;this._mixer._takeBackControlInterpolant(weightInterpolant);}return this;},// Time Scale Control
// set the time scale stopping any scheduled warping
// although .paused = true yields an effective time scale of zero, this
// method does *not* change .paused, because it would be confusing
setEffectiveTimeScale:function(timeScale){this.timeScale=timeScale;this._effectiveTimeScale=this.paused?0:timeScale;return this.stopWarping();},// return the time scale considering warping and .paused
getEffectiveTimeScale:function(){return this._effectiveTimeScale;},setDuration:function(duration){this.timeScale=this._clip.duration/duration;return this.stopWarping();},syncWith:function(action){this.time=action.time;this.timeScale=action.timeScale;return this.stopWarping();},halt:function(duration){return this.warp(this._effectiveTimeScale,0,duration);},warp:function(startTimeScale,endTimeScale,duration){var mixer=this._mixer,now=mixer.time,interpolant=this._timeScaleInterpolant,timeScale=this.timeScale;if(interpolant===null){interpolant=mixer._lendControlInterpolant();this._timeScaleInterpolant=interpolant;}var times=interpolant.parameterPositions,values=interpolant.sampleValues;times[0]=now;times[1]=now+duration;values[0]=startTimeScale/timeScale;values[1]=endTimeScale/timeScale;return this;},stopWarping:function(){var timeScaleInterpolant=this._timeScaleInterpolant;if(timeScaleInterpolant!==null){this._timeScaleInterpolant=null;this._mixer._takeBackControlInterpolant(timeScaleInterpolant);}return this;},// Object Accessors
getMixer:function(){return this._mixer;},getClip:function(){return this._clip;},getRoot:function(){return this._localRoot||this._mixer._root;},// Interna
_update:function(time,deltaTime,timeDirection,accuIndex){// called by the mixer
if(!this.enabled){// call ._updateWeight() to update ._effectiveWeight
this._updateWeight(time);return;}var startTime=this._startTime;if(startTime!==null){// check for scheduled start of action
var timeRunning=(time-startTime)*timeDirection;if(timeRunning<0||timeDirection===0){return;// yet to come / don't decide when delta = 0
}// start
this._startTime=null;// unschedule
deltaTime=timeDirection*timeRunning;}// apply time scale and advance time
deltaTime*=this._updateTimeScale(time);var clipTime=this._updateTime(deltaTime);// note: _updateTime may disable the action resulting in
// an effective weight of 0
var weight=this._updateWeight(time);if(weight>0){var interpolants=this._interpolants;var propertyMixers=this._propertyBindings;for(var j=0,m=interpolants.length;j!==m;++j){interpolants[j].evaluate(clipTime);propertyMixers[j].accumulate(accuIndex,weight);}}},_updateWeight:function(time){var weight=0;if(this.enabled){weight=this.weight;var interpolant=this._weightInterpolant;if(interpolant!==null){var interpolantValue=interpolant.evaluate(time)[0];weight*=interpolantValue;if(time>interpolant.parameterPositions[1]){this.stopFading();if(interpolantValue===0){// faded out, disable
this.enabled=false;}}}}this._effectiveWeight=weight;return weight;},_updateTimeScale:function(time){var timeScale=0;if(!this.paused){timeScale=this.timeScale;var interpolant=this._timeScaleInterpolant;if(interpolant!==null){var interpolantValue=interpolant.evaluate(time)[0];timeScale*=interpolantValue;if(time>interpolant.parameterPositions[1]){this.stopWarping();if(timeScale===0){// motion has halted, pause
this.paused=true;}else{// warp done - apply final time scale
this.timeScale=timeScale;}}}}this._effectiveTimeScale=timeScale;return timeScale;},_updateTime:function(deltaTime){var time=this.time+deltaTime;if(deltaTime===0)return time;var duration=this._clip.duration,loop=this.loop,loopCount=this._loopCount;if(loop===LoopOnce){if(loopCount===-1){// just started
this._loopCount=0;this._setEndings(true,true,false);}handle_stop:{if(time>=duration){time=duration;}else if(time<0){time=0;}else break handle_stop;if(this.clampWhenFinished)this.paused=true;else this.enabled=false;this._mixer.dispatchEvent({type:'finished',action:this,direction:deltaTime<0?-1:1});}}else{// repetitive Repeat or PingPong
var pingPong=loop===LoopPingPong;if(loopCount===-1){// just started
if(deltaTime>=0){loopCount=0;this._setEndings(true,this.repetitions===0,pingPong);}else{// when looping in reverse direction, the initial
// transition through zero counts as a repetition,
// so leave loopCount at -1
this._setEndings(this.repetitions===0,true,pingPong);}}if(time>=duration||time<0){// wrap around
var loopDelta=Math.floor(time/duration);// signed
time-=duration*loopDelta;loopCount+=Math.abs(loopDelta);var pending=this.repetitions-loopCount;if(pending<=0){// have to stop (switch state, clamp time, fire event)
if(this.clampWhenFinished)this.paused=true;else this.enabled=false;time=deltaTime>0?duration:0;this._mixer.dispatchEvent({type:'finished',action:this,direction:deltaTime>0?1:-1});}else{// keep running
if(pending===1){// entering the last round
var atStart=deltaTime<0;this._setEndings(atStart,!atStart,pingPong);}else{this._setEndings(false,false,pingPong);}this._loopCount=loopCount;this._mixer.dispatchEvent({type:'loop',action:this,loopDelta:loopDelta});}}if(pingPong&&(loopCount&1)===1){// invert time for the "pong round"
this.time=time;return duration-time;}}this.time=time;return time;},_setEndings:function(atStart,atEnd,pingPong){var settings=this._interpolantSettings;if(pingPong){settings.endingStart=ZeroSlopeEnding;settings.endingEnd=ZeroSlopeEnding;}else{// assuming for LoopOnce atStart == atEnd == true
if(atStart){settings.endingStart=this.zeroSlopeAtStart?ZeroSlopeEnding:ZeroCurvatureEnding;}else{settings.endingStart=WrapAroundEnding;}if(atEnd){settings.endingEnd=this.zeroSlopeAtEnd?ZeroSlopeEnding:ZeroCurvatureEnding;}else{settings.endingEnd=WrapAroundEnding;}}},_scheduleFading:function(duration,weightNow,weightThen){var mixer=this._mixer,now=mixer.time,interpolant=this._weightInterpolant;if(interpolant===null){interpolant=mixer._lendControlInterpolant();this._weightInterpolant=interpolant;}var times=interpolant.parameterPositions,values=interpolant.sampleValues;times[0]=now;values[0]=weightNow;times[1]=now+duration;values[1]=weightThen;return this;}});/**
*
* Player for AnimationClips.
*
*
* @author Ben Houston / http://clara.io/
* @author David Sarno / http://lighthaus.us/
* @author tschw
*/function AnimationMixer(root){this._root=root;this._initMemoryManager();this._accuIndex=0;this.time=0;this.timeScale=1.0;}AnimationMixer.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:AnimationMixer,_bindAction:function(action,prototypeAction){var root=action._localRoot||this._root,tracks=action._clip.tracks,nTracks=tracks.length,bindings=action._propertyBindings,interpolants=action._interpolants,rootUuid=root.uuid,bindingsByRoot=this._bindingsByRootAndName,bindingsByName=bindingsByRoot[rootUuid];if(bindingsByName===undefined){bindingsByName={};bindingsByRoot[rootUuid]=bindingsByName;}for(var i=0;i!==nTracks;++i){var track=tracks[i],trackName=track.name,binding=bindingsByName[trackName];if(binding!==undefined){bindings[i]=binding;}else{binding=bindings[i];if(binding!==undefined){// existing binding, make sure the cache knows
if(binding._cacheIndex===null){++binding.referenceCount;this._addInactiveBinding(binding,rootUuid,trackName);}continue;}var path=prototypeAction&&prototypeAction._propertyBindings[i].binding.parsedPath;binding=new PropertyMixer(PropertyBinding.create(root,trackName,path),track.ValueTypeName,track.getValueSize());++binding.referenceCount;this._addInactiveBinding(binding,rootUuid,trackName);bindings[i]=binding;}interpolants[i].resultBuffer=binding.buffer;}},_activateAction:function(action){if(!this._isActiveAction(action)){if(action._cacheIndex===null){// this action has been forgotten by the cache, but the user
// appears to be still using it -> rebind
var rootUuid=(action._localRoot||this._root).uuid,clipUuid=action._clip.uuid,actionsForClip=this._actionsByClip[clipUuid];this._bindAction(action,actionsForClip&&actionsForClip.knownActions[0]);this._addInactiveAction(action,clipUuid,rootUuid);}var bindings=action._propertyBindings;// increment reference counts / sort out state
for(var i=0,n=bindings.length;i!==n;++i){var binding=bindings[i];if(binding.useCount++===0){this._lendBinding(binding);binding.saveOriginalState();}}this._lendAction(action);}},_deactivateAction:function(action){if(this._isActiveAction(action)){var bindings=action._propertyBindings;// decrement reference counts / sort out state
for(var i=0,n=bindings.length;i!==n;++i){var binding=bindings[i];if(--binding.useCount===0){binding.restoreOriginalState();this._takeBackBinding(binding);}}this._takeBackAction(action);}},// Memory manager
_initMemoryManager:function(){this._actions=[];// 'nActiveActions' followed by inactive ones
this._nActiveActions=0;this._actionsByClip={};// inside:
// {
// knownActions: Array< AnimationAction > - used as prototypes
// actionByRoot: AnimationAction - lookup
// }
this._bindings=[];// 'nActiveBindings' followed by inactive ones
this._nActiveBindings=0;this._bindingsByRootAndName={};// inside: Map< name, PropertyMixer >
this._controlInterpolants=[];// same game as above
this._nActiveControlInterpolants=0;var scope=this;this.stats={actions:{get total(){return scope._actions.length;},get inUse(){return scope._nActiveActions;}},bindings:{get total(){return scope._bindings.length;},get inUse(){return scope._nActiveBindings;}},controlInterpolants:{get total(){return scope._controlInterpolants.length;},get inUse(){return scope._nActiveControlInterpolants;}}};},// Memory management for AnimationAction objects
_isActiveAction:function(action){var index=action._cacheIndex;return index!==null&&index<this._nActiveActions;},_addInactiveAction:function(action,clipUuid,rootUuid){var actions=this._actions,actionsByClip=this._actionsByClip,actionsForClip=actionsByClip[clipUuid];if(actionsForClip===undefined){actionsForClip={knownActions:[action],actionByRoot:{}};action._byClipCacheIndex=0;actionsByClip[clipUuid]=actionsForClip;}else{var knownActions=actionsForClip.knownActions;action._byClipCacheIndex=knownActions.length;knownActions.push(action);}action._cacheIndex=actions.length;actions.push(action);actionsForClip.actionByRoot[rootUuid]=action;},_removeInactiveAction:function(action){var actions=this._actions,lastInactiveAction=actions[actions.length-1],cacheIndex=action._cacheIndex;lastInactiveAction._cacheIndex=cacheIndex;actions[cacheIndex]=lastInactiveAction;actions.pop();action._cacheIndex=null;var clipUuid=action._clip.uuid,actionsByClip=this._actionsByClip,actionsForClip=actionsByClip[clipUuid],knownActionsForClip=actionsForClip.knownActions,lastKnownAction=knownActionsForClip[knownActionsForClip.length-1],byClipCacheIndex=action._byClipCacheIndex;lastKnownAction._byClipCacheIndex=byClipCacheIndex;knownActionsForClip[byClipCacheIndex]=lastKnownAction;knownActionsForClip.pop();action._byClipCacheIndex=null;var actionByRoot=actionsForClip.actionByRoot,rootUuid=(action._localRoot||this._root).uuid;delete actionByRoot[rootUuid];if(knownActionsForClip.length===0){delete actionsByClip[clipUuid];}this._removeInactiveBindingsForAction(action);},_removeInactiveBindingsForAction:function(action){var bindings=action._propertyBindings;for(var i=0,n=bindings.length;i!==n;++i){var binding=bindings[i];if(--binding.referenceCount===0){this._removeInactiveBinding(binding);}}},_lendAction:function(action){// [ active actions | inactive actions ]
// [ active actions >| inactive actions ]
// s a
// <-swap->
// a s
var actions=this._actions,prevIndex=action._cacheIndex,lastActiveIndex=this._nActiveActions++,firstInactiveAction=actions[lastActiveIndex];action._cacheIndex=lastActiveIndex;actions[lastActiveIndex]=action;firstInactiveAction._cacheIndex=prevIndex;actions[prevIndex]=firstInactiveAction;},_takeBackAction:function(action){// [ active actions | inactive actions ]
// [ active actions |< inactive actions ]
// a s
// <-swap->
// s a
var actions=this._actions,prevIndex=action._cacheIndex,firstInactiveIndex=--this._nActiveActions,lastActiveAction=actions[firstInactiveIndex];action._cacheIndex=firstInactiveIndex;actions[firstInactiveIndex]=action;lastActiveAction._cacheIndex=prevIndex;actions[prevIndex]=lastActiveAction;},// Memory management for PropertyMixer objects
_addInactiveBinding:function(binding,rootUuid,trackName){var bindingsByRoot=this._bindingsByRootAndName,bindingByName=bindingsByRoot[rootUuid],bindings=this._bindings;if(bindingByName===undefined){bindingByName={};bindingsByRoot[rootUuid]=bindingByName;}bindingByName[trackName]=binding;binding._cacheIndex=bindings.length;bindings.push(binding);},_removeInactiveBinding:function(binding){var bindings=this._bindings,propBinding=binding.binding,rootUuid=propBinding.rootNode.uuid,trackName=propBinding.path,bindingsByRoot=this._bindingsByRootAndName,bindingByName=bindingsByRoot[rootUuid],lastInactiveBinding=bindings[bindings.length-1],cacheIndex=binding._cacheIndex;lastInactiveBinding._cacheIndex=cacheIndex;bindings[cacheIndex]=lastInactiveBinding;bindings.pop();delete bindingByName[trackName];remove_empty_map:{for(var _ in bindingByName)break remove_empty_map;// eslint-disable-line no-unused-vars
delete bindingsByRoot[rootUuid];}},_lendBinding:function(binding){var bindings=this._bindings,prevIndex=binding._cacheIndex,lastActiveIndex=this._nActiveBindings++,firstInactiveBinding=bindings[lastActiveIndex];binding._cacheIndex=lastActiveIndex;bindings[lastActiveIndex]=binding;firstInactiveBinding._cacheIndex=prevIndex;bindings[prevIndex]=firstInactiveBinding;},_takeBackBinding:function(binding){var bindings=this._bindings,prevIndex=binding._cacheIndex,firstInactiveIndex=--this._nActiveBindings,lastActiveBinding=bindings[firstInactiveIndex];binding._cacheIndex=firstInactiveIndex;bindings[firstInactiveIndex]=binding;lastActiveBinding._cacheIndex=prevIndex;bindings[prevIndex]=lastActiveBinding;},// Memory management of Interpolants for weight and time scale
_lendControlInterpolant:function(){var interpolants=this._controlInterpolants,lastActiveIndex=this._nActiveControlInterpolants++,interpolant=interpolants[lastActiveIndex];if(interpolant===undefined){interpolant=new LinearInterpolant(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer);interpolant.__cacheIndex=lastActiveIndex;interpolants[lastActiveIndex]=interpolant;}return interpolant;},_takeBackControlInterpolant:function(interpolant){var interpolants=this._controlInterpolants,prevIndex=interpolant.__cacheIndex,firstInactiveIndex=--this._nActiveControlInterpolants,lastActiveInterpolant=interpolants[firstInactiveIndex];interpolant.__cacheIndex=firstInactiveIndex;interpolants[firstInactiveIndex]=interpolant;lastActiveInterpolant.__cacheIndex=prevIndex;interpolants[prevIndex]=lastActiveInterpolant;},_controlInterpolantsResultBuffer:new Float32Array(1),// return an action for a clip optionally using a custom root target
// object (this method allocates a lot of dynamic memory in case a
// previously unknown clip/root combination is specified)
clipAction:function(clip,optionalRoot){var root=optionalRoot||this._root,rootUuid=root.uuid,clipObject=typeof clip==='string'?AnimationClip.findByName(root,clip):clip,clipUuid=clipObject!==null?clipObject.uuid:clip,actionsForClip=this._actionsByClip[clipUuid],prototypeAction=null;if(actionsForClip!==undefined){var existingAction=actionsForClip.actionByRoot[rootUuid];if(existingAction!==undefined){return existingAction;}// we know the clip, so we don't have to parse all
// the bindings again but can just copy
prototypeAction=actionsForClip.knownActions[0];// also, take the clip from the prototype action
if(clipObject===null)clipObject=prototypeAction._clip;}// clip must be known when specified via string
if(clipObject===null)return null;// allocate all resources required to run it
var newAction=new AnimationAction(this,clipObject,optionalRoot);this._bindAction(newAction,prototypeAction);// and make the action known to the memory manager
this._addInactiveAction(newAction,clipUuid,rootUuid);return newAction;},// get an existing action
existingAction:function(clip,optionalRoot){var root=optionalRoot||this._root,rootUuid=root.uuid,clipObject=typeof clip==='string'?AnimationClip.findByName(root,clip):clip,clipUuid=clipObject?clipObject.uuid:clip,actionsForClip=this._actionsByClip[clipUuid];if(actionsForClip!==undefined){return actionsForClip.actionByRoot[rootUuid]||null;}return null;},// deactivates all previously scheduled actions
stopAllAction:function(){var actions=this._actions,nActions=this._nActiveActions,bindings=this._bindings,nBindings=this._nActiveBindings;this._nActiveActions=0;this._nActiveBindings=0;for(var i=0;i!==nActions;++i){actions[i].reset();}for(var i=0;i!==nBindings;++i){bindings[i].useCount=0;}return this;},// advance the time and update apply the animation
update:function(deltaTime){deltaTime*=this.timeScale;var actions=this._actions,nActions=this._nActiveActions,time=this.time+=deltaTime,timeDirection=Math.sign(deltaTime),accuIndex=this._accuIndex^=1;// run active actions
for(var i=0;i!==nActions;++i){var action=actions[i];action._update(time,deltaTime,timeDirection,accuIndex);}// update scene graph
var bindings=this._bindings,nBindings=this._nActiveBindings;for(var i=0;i!==nBindings;++i){bindings[i].apply(accuIndex);}return this;},// return this mixer's root target object
getRoot:function(){return this._root;},// free all resources specific to a particular clip
uncacheClip:function(clip){var actions=this._actions,clipUuid=clip.uuid,actionsByClip=this._actionsByClip,actionsForClip=actionsByClip[clipUuid];if(actionsForClip!==undefined){// note: just calling _removeInactiveAction would mess up the
// iteration state and also require updating the state we can
// just throw away
var actionsToRemove=actionsForClip.knownActions;for(var i=0,n=actionsToRemove.length;i!==n;++i){var action=actionsToRemove[i];this._deactivateAction(action);var cacheIndex=action._cacheIndex,lastInactiveAction=actions[actions.length-1];action._cacheIndex=null;action._byClipCacheIndex=null;lastInactiveAction._cacheIndex=cacheIndex;actions[cacheIndex]=lastInactiveAction;actions.pop();this._removeInactiveBindingsForAction(action);}delete actionsByClip[clipUuid];}},// free all resources specific to a particular root target object
uncacheRoot:function(root){var rootUuid=root.uuid,actionsByClip=this._actionsByClip;for(var clipUuid in actionsByClip){var actionByRoot=actionsByClip[clipUuid].actionByRoot,action=actionByRoot[rootUuid];if(action!==undefined){this._deactivateAction(action);this._removeInactiveAction(action);}}var bindingsByRoot=this._bindingsByRootAndName,bindingByName=bindingsByRoot[rootUuid];if(bindingByName!==undefined){for(var trackName in bindingByName){var binding=bindingByName[trackName];binding.restoreOriginalState();this._removeInactiveBinding(binding);}}},// remove a targeted clip from the cache
uncacheAction:function(clip,optionalRoot){var action=this.existingAction(clip,optionalRoot);if(action!==null){this._deactivateAction(action);this._removeInactiveAction(action);}}});/**
* @author mrdoob / http://mrdoob.com/
*/function Uniform(value){if(typeof value==='string'){console.warn('THREE.Uniform: Type parameter is no longer needed.');value=arguments[1];}this.value=value;}Uniform.prototype.clone=function(){return new Uniform(this.value.clone===undefined?this.value:this.value.clone());};/**
* @author benaadams / https://twitter.com/ben_a_adams
*/function InstancedBufferGeometry(){BufferGeometry.call(this);this.type='InstancedBufferGeometry';this.maxInstancedCount=undefined;}InstancedBufferGeometry.prototype=Object.assign(Object.create(BufferGeometry.prototype),{constructor:InstancedBufferGeometry,isInstancedBufferGeometry:true,copy:function(source){BufferGeometry.prototype.copy.call(this,source);this.maxInstancedCount=source.maxInstancedCount;return this;},clone:function(){return new this.constructor().copy(this);}});/**
* @author benaadams / https://twitter.com/ben_a_adams
*/function InterleavedBufferAttribute(interleavedBuffer,itemSize,offset,normalized){this.data=interleavedBuffer;this.itemSize=itemSize;this.offset=offset;this.normalized=normalized===true;}Object.defineProperties(InterleavedBufferAttribute.prototype,{count:{get:function(){return this.data.count;}},array:{get:function(){return this.data.array;}}});Object.assign(InterleavedBufferAttribute.prototype,{isInterleavedBufferAttribute:true,setX:function(index,x){this.data.array[index*this.data.stride+this.offset]=x;return this;},setY:function(index,y){this.data.array[index*this.data.stride+this.offset+1]=y;return this;},setZ:function(index,z){this.data.array[index*this.data.stride+this.offset+2]=z;return this;},setW:function(index,w){this.data.array[index*this.data.stride+this.offset+3]=w;return this;},getX:function(index){return this.data.array[index*this.data.stride+this.offset];},getY:function(index){return this.data.array[index*this.data.stride+this.offset+1];},getZ:function(index){return this.data.array[index*this.data.stride+this.offset+2];},getW:function(index){return this.data.array[index*this.data.stride+this.offset+3];},setXY:function(index,x,y){index=index*this.data.stride+this.offset;this.data.array[index+0]=x;this.data.array[index+1]=y;return this;},setXYZ:function(index,x,y,z){index=index*this.data.stride+this.offset;this.data.array[index+0]=x;this.data.array[index+1]=y;this.data.array[index+2]=z;return this;},setXYZW:function(index,x,y,z,w){index=index*this.data.stride+this.offset;this.data.array[index+0]=x;this.data.array[index+1]=y;this.data.array[index+2]=z;this.data.array[index+3]=w;return this;}});/**
* @author benaadams / https://twitter.com/ben_a_adams
*/function InterleavedBuffer(array,stride){this.array=array;this.stride=stride;this.count=array!==undefined?array.length/stride:0;this.dynamic=false;this.updateRange={offset:0,count:-1};this.version=0;}Object.defineProperty(InterleavedBuffer.prototype,'needsUpdate',{set:function(value){if(value===true)this.version++;}});Object.assign(InterleavedBuffer.prototype,{isInterleavedBuffer:true,onUploadCallback:function(){},setArray:function(array){if(Array.isArray(array)){throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.');}this.count=array!==undefined?array.length/this.stride:0;this.array=array;return this;},setDynamic:function(value){this.dynamic=value;return this;},copy:function(source){this.array=new source.array.constructor(source.array);this.count=source.count;this.stride=source.stride;this.dynamic=source.dynamic;return this;},copyAt:function(index1,attribute,index2){index1*=this.stride;index2*=attribute.stride;for(var i=0,l=this.stride;i<l;i++){this.array[index1+i]=attribute.array[index2+i];}return this;},set:function(value,offset){if(offset===undefined)offset=0;this.array.set(value,offset);return this;},clone:function(){return new this.constructor().copy(this);},onUpload:function(callback){this.onUploadCallback=callback;return this;}});/**
* @author benaadams / https://twitter.com/ben_a_adams
*/function InstancedInterleavedBuffer(array,stride,meshPerAttribute){InterleavedBuffer.call(this,array,stride);this.meshPerAttribute=meshPerAttribute||1;}InstancedInterleavedBuffer.prototype=Object.assign(Object.create(InterleavedBuffer.prototype),{constructor:InstancedInterleavedBuffer,isInstancedInterleavedBuffer:true,copy:function(source){InterleavedBuffer.prototype.copy.call(this,source);this.meshPerAttribute=source.meshPerAttribute;return this;}});/**
* @author benaadams / https://twitter.com/ben_a_adams
*/function InstancedBufferAttribute(array,itemSize,meshPerAttribute){BufferAttribute.call(this,array,itemSize);this.meshPerAttribute=meshPerAttribute||1;}InstancedBufferAttribute.prototype=Object.assign(Object.create(BufferAttribute.prototype),{constructor:InstancedBufferAttribute,isInstancedBufferAttribute:true,copy:function(source){BufferAttribute.prototype.copy.call(this,source);this.meshPerAttribute=source.meshPerAttribute;return this;}});/**
* @author mrdoob / http://mrdoob.com/
* @author bhouston / http://clara.io/
* @author stephomi / http://stephaneginier.com/
*/function Raycaster(origin,direction,near,far){this.ray=new Ray(origin,direction);// direction is assumed to be normalized (for accurate distance calculations)
this.near=near||0;this.far=far||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn('THREE.Raycaster: params.PointCloud has been renamed to params.Points.');return this.Points;}}});}function ascSort(a,b){return a.distance-b.distance;}function intersectObject(object,raycaster,intersects,recursive){if(object.visible===false)return;object.raycast(raycaster,intersects);if(recursive===true){var children=object.children;for(var i=0,l=children.length;i<l;i++){intersectObject(children[i],raycaster,intersects,true);}}}Object.assign(Raycaster.prototype,{linePrecision:1,set:function(origin,direction){// direction is assumed to be normalized (for accurate distance calculations)
this.ray.set(origin,direction);},setFromCamera:function(coords,camera){if(camera&&camera.isPerspectiveCamera){this.ray.origin.setFromMatrixPosition(camera.matrixWorld);this.ray.direction.set(coords.x,coords.y,0.5).unproject(camera).sub(this.ray.origin).normalize();}else if(camera&&camera.isOrthographicCamera){this.ray.origin.set(coords.x,coords.y,(camera.near+camera.far)/(camera.near-camera.far)).unproject(camera);// set origin in plane of camera
this.ray.direction.set(0,0,-1).transformDirection(camera.matrixWorld);}else{console.error('THREE.Raycaster: Unsupported camera type.');}},intersectObject:function(object,recursive,optionalTarget){var intersects=optionalTarget||[];intersectObject(object,this,intersects,recursive);intersects.sort(ascSort);return intersects;},intersectObjects:function(objects,recursive,optionalTarget){var intersects=optionalTarget||[];if(Array.isArray(objects)===false){console.warn('THREE.Raycaster.intersectObjects: objects is not an Array.');return intersects;}for(var i=0,l=objects.length;i<l;i++){intersectObject(objects[i],this,intersects,recursive);}intersects.sort(ascSort);return intersects;}});/**
* @author alteredq / http://alteredqualia.com/
*/function Clock(autoStart){this.autoStart=autoStart!==undefined?autoStart:true;this.startTime=0;this.oldTime=0;this.elapsedTime=0;this.running=false;}Object.assign(Clock.prototype,{start:function(){this.startTime=(typeof performance==='undefined'?Date:performance).now();// see #10732
this.oldTime=this.startTime;this.elapsedTime=0;this.running=true;},stop:function(){this.getElapsedTime();this.running=false;this.autoStart=false;},getElapsedTime:function(){this.getDelta();return this.elapsedTime;},getDelta:function(){var diff=0;if(this.autoStart&&!this.running){this.start();return 0;}if(this.running){var newTime=(typeof performance==='undefined'?Date:performance).now();diff=(newTime-this.oldTime)/1000;this.oldTime=newTime;this.elapsedTime+=diff;}return diff;}});/**
* @author bhouston / http://clara.io
* @author WestLangley / http://github.com/WestLangley
*
* Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system
*
* The poles (phi) are at the positive and negative y axis.
* The equator starts at positive z.
*/function Spherical(radius,phi,theta){this.radius=radius!==undefined?radius:1.0;this.phi=phi!==undefined?phi:0;// up / down towards top and bottom pole
this.theta=theta!==undefined?theta:0;// around the equator of the sphere
return this;}Object.assign(Spherical.prototype,{set:function(radius,phi,theta){this.radius=radius;this.phi=phi;this.theta=theta;return this;},clone:function(){return new this.constructor().copy(this);},copy:function(other){this.radius=other.radius;this.phi=other.phi;this.theta=other.theta;return this;},// restrict phi to be betwee EPS and PI-EPS
makeSafe:function(){var EPS=0.000001;this.phi=Math.max(EPS,Math.min(Math.PI-EPS,this.phi));return this;},setFromVector3:function(vec3){this.radius=vec3.length();if(this.radius===0){this.theta=0;this.phi=0;}else{this.theta=Math.atan2(vec3.x,vec3.z);// equator angle around y-up axis
this.phi=Math.acos(_Math.clamp(vec3.y/this.radius,-1,1));// polar angle
}return this;}});/**
* @author Mugen87 / https://github.com/Mugen87
*
* Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system
*
*/function Cylindrical(radius,theta,y){this.radius=radius!==undefined?radius:1.0;// distance from the origin to a point in the x-z plane
this.theta=theta!==undefined?theta:0;// counterclockwise angle in the x-z plane measured in radians from the positive z-axis
this.y=y!==undefined?y:0;// height above the x-z plane
return this;}Object.assign(Cylindrical.prototype,{set:function(radius,theta,y){this.radius=radius;this.theta=theta;this.y=y;return this;},clone:function(){return new this.constructor().copy(this);},copy:function(other){this.radius=other.radius;this.theta=other.theta;this.y=other.y;return this;},setFromVector3:function(vec3){this.radius=Math.sqrt(vec3.x*vec3.x+vec3.z*vec3.z);this.theta=Math.atan2(vec3.x,vec3.z);this.y=vec3.y;return this;}});/**
* @author bhouston / http://clara.io
*/function Box2(min,max){this.min=min!==undefined?min:new Vector2(+Infinity,+Infinity);this.max=max!==undefined?max:new Vector2(-Infinity,-Infinity);}Object.assign(Box2.prototype,{set:function(min,max){this.min.copy(min);this.max.copy(max);return this;},setFromPoints:function(points){this.makeEmpty();for(var i=0,il=points.length;i<il;i++){this.expandByPoint(points[i]);}return this;},setFromCenterAndSize:function(){var v1=new Vector2();return function setFromCenterAndSize(center,size){var halfSize=v1.copy(size).multiplyScalar(0.5);this.min.copy(center).sub(halfSize);this.max.copy(center).add(halfSize);return this;};}(),clone:function(){return new this.constructor().copy(this);},copy:function(box){this.min.copy(box.min);this.max.copy(box.max);return this;},makeEmpty:function(){this.min.x=this.min.y=+Infinity;this.max.x=this.max.y=-Infinity;return this;},isEmpty:function(){// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
return this.max.x<this.min.x||this.max.y<this.min.y;},getCenter:function(target){if(target===undefined){console.warn('THREE.Box2: .getCenter() target is now required');target=new Vector2();}return this.isEmpty()?target.set(0,0):target.addVectors(this.min,this.max).multiplyScalar(0.5);},getSize:function(target){if(target===undefined){console.warn('THREE.Box2: .getSize() target is now required');target=new Vector2();}return this.isEmpty()?target.set(0,0):target.subVectors(this.max,this.min);},expandByPoint:function(point){this.min.min(point);this.max.max(point);return this;},expandByVector:function(vector){this.min.sub(vector);this.max.add(vector);return this;},expandByScalar:function(scalar){this.min.addScalar(-scalar);this.max.addScalar(scalar);return this;},containsPoint:function(point){return point.x<this.min.x||point.x>this.max.x||point.y<this.min.y||point.y>this.max.y?false:true;},containsBox:function(box){return this.min.x<=box.min.x&&box.max.x<=this.max.x&&this.min.y<=box.min.y&&box.max.y<=this.max.y;},getParameter:function(point,target){// This can potentially have a divide by zero if the box
// has a size dimension of 0.
if(target===undefined){console.warn('THREE.Box2: .getParameter() target is now required');target=new Vector2();}return target.set((point.x-this.min.x)/(this.max.x-this.min.x),(point.y-this.min.y)/(this.max.y-this.min.y));},intersectsBox:function(box){// using 4 splitting planes to rule out intersections
return box.max.x<this.min.x||box.min.x>this.max.x||box.max.y<this.min.y||box.min.y>this.max.y?false:true;},clampPoint:function(point,target){if(target===undefined){console.warn('THREE.Box2: .clampPoint() target is now required');target=new Vector2();}return target.copy(point).clamp(this.min,this.max);},distanceToPoint:function(){var v1=new Vector2();return function distanceToPoint(point){var clampedPoint=v1.copy(point).clamp(this.min,this.max);return clampedPoint.sub(point).length();};}(),intersect:function(box){this.min.max(box.min);this.max.min(box.max);return this;},union:function(box){this.min.min(box.min);this.max.max(box.max);return this;},translate:function(offset){this.min.add(offset);this.max.add(offset);return this;},equals:function(box){return box.min.equals(this.min)&&box.max.equals(this.max);}});/**
* @author alteredq / http://alteredqualia.com/
*/function ImmediateRenderObject(material){Object3D.call(this);this.material=material;this.render=function()/* renderCallback */{};}ImmediateRenderObject.prototype=Object.create(Object3D.prototype);ImmediateRenderObject.prototype.constructor=ImmediateRenderObject;ImmediateRenderObject.prototype.isImmediateRenderObject=true;/**
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
*/function VertexNormalsHelper(object,size,hex,linewidth){this.object=object;this.size=size!==undefined?size:1;var color=hex!==undefined?hex:0xff0000;var width=linewidth!==undefined?linewidth:1;//
var nNormals=0;var objGeometry=this.object.geometry;if(objGeometry&&objGeometry.isGeometry){nNormals=objGeometry.faces.length*3;}else if(objGeometry&&objGeometry.isBufferGeometry){nNormals=objGeometry.attributes.normal.count;}//
var geometry=new BufferGeometry();var positions=new Float32BufferAttribute(nNormals*2*3,3);geometry.addAttribute('position',positions);LineSegments.call(this,geometry,new LineBasicMaterial({color:color,linewidth:width}));//
this.matrixAutoUpdate=false;this.update();}VertexNormalsHelper.prototype=Object.create(LineSegments.prototype);VertexNormalsHelper.prototype.constructor=VertexNormalsHelper;VertexNormalsHelper.prototype.update=function(){var v1=new Vector3();var v2=new Vector3();var normalMatrix=new Matrix3();return function update(){var keys=['a','b','c'];this.object.updateMatrixWorld(true);normalMatrix.getNormalMatrix(this.object.matrixWorld);var matrixWorld=this.object.matrixWorld;var position=this.geometry.attributes.position;//
var objGeometry=this.object.geometry;if(objGeometry&&objGeometry.isGeometry){var vertices=objGeometry.vertices;var faces=objGeometry.faces;var idx=0;for(var i=0,l=faces.length;i<l;i++){var face=faces[i];for(var j=0,jl=face.vertexNormals.length;j<jl;j++){var vertex=vertices[face[keys[j]]];var normal=face.vertexNormals[j];v1.copy(vertex).applyMatrix4(matrixWorld);v2.copy(normal).applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1);position.setXYZ(idx,v1.x,v1.y,v1.z);idx=idx+1;position.setXYZ(idx,v2.x,v2.y,v2.z);idx=idx+1;}}}else if(objGeometry&&objGeometry.isBufferGeometry){var objPos=objGeometry.attributes.position;var objNorm=objGeometry.attributes.normal;var idx=0;// for simplicity, ignore index and drawcalls, and render every normal
for(var j=0,jl=objPos.count;j<jl;j++){v1.set(objPos.getX(j),objPos.getY(j),objPos.getZ(j)).applyMatrix4(matrixWorld);v2.set(objNorm.getX(j),objNorm.getY(j),objNorm.getZ(j));v2.applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1);position.setXYZ(idx,v1.x,v1.y,v1.z);idx=idx+1;position.setXYZ(idx,v2.x,v2.y,v2.z);idx=idx+1;}}position.needsUpdate=true;};}();/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
*/function SpotLightHelper(light,color){Object3D.call(this);this.light=light;this.light.updateMatrixWorld();this.matrix=light.matrixWorld;this.matrixAutoUpdate=false;this.color=color;var geometry=new BufferGeometry();var positions=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(var i=0,j=1,l=32;i<l;i++,j++){var p1=i/l*Math.PI*2;var p2=j/l*Math.PI*2;positions.push(Math.cos(p1),Math.sin(p1),1,Math.cos(p2),Math.sin(p2),1);}geometry.addAttribute('position',new Float32BufferAttribute(positions,3));var material=new LineBasicMaterial({fog:false});this.cone=new LineSegments(geometry,material);this.add(this.cone);this.update();}SpotLightHelper.prototype=Object.create(Object3D.prototype);SpotLightHelper.prototype.constructor=SpotLightHelper;SpotLightHelper.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose();};SpotLightHelper.prototype.update=function(){var vector=new Vector3();var vector2=new Vector3();return function update(){this.light.updateMatrixWorld();var coneLength=this.light.distance?this.light.distance:1000;var coneWidth=coneLength*Math.tan(this.light.angle);this.cone.scale.set(coneWidth,coneWidth,coneLength);vector.setFromMatrixPosition(this.light.matrixWorld);vector2.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(vector2.sub(vector));if(this.color!==undefined){this.cone.material.color.set(this.color);}else{this.cone.material.color.copy(this.light.color);}};}();/**
* @author Sean Griffin / http://twitter.com/sgrif
* @author Michael Guerrero / http://realitymeltdown.com
* @author mrdoob / http://mrdoob.com/
* @author ikerr / http://verold.com
* @author Mugen87 / https://github.com/Mugen87
*/function getBoneList(object){var boneList=[];if(object&&object.isBone){boneList.push(object);}for(var i=0;i<object.children.length;i++){boneList.push.apply(boneList,getBoneList(object.children[i]));}return boneList;}function SkeletonHelper(object){var bones=getBoneList(object);var geometry=new BufferGeometry();var vertices=[];var colors=[];var color1=new Color(0,0,1);var color2=new Color(0,1,0);for(var i=0;i<bones.length;i++){var bone=bones[i];if(bone.parent&&bone.parent.isBone){vertices.push(0,0,0);vertices.push(0,0,0);colors.push(color1.r,color1.g,color1.b);colors.push(color2.r,color2.g,color2.b);}}geometry.addAttribute('position',new Float32BufferAttribute(vertices,3));geometry.addAttribute('color',new Float32BufferAttribute(colors,3));var material=new LineBasicMaterial({vertexColors:VertexColors,depthTest:false,depthWrite:false,transparent:true});LineSegments.call(this,geometry,material);this.root=object;this.bones=bones;this.matrix=object.matrixWorld;this.matrixAutoUpdate=false;}SkeletonHelper.prototype=Object.create(LineSegments.prototype);SkeletonHelper.prototype.constructor=SkeletonHelper;SkeletonHelper.prototype.updateMatrixWorld=function(){var vector=new Vector3();var boneMatrix=new Matrix4();var matrixWorldInv=new Matrix4();return function updateMatrixWorld(force){var bones=this.bones;var geometry=this.geometry;var position=geometry.getAttribute('position');matrixWorldInv.getInverse(this.root.matrixWorld);for(var i=0,j=0;i<bones.length;i++){var bone=bones[i];if(bone.parent&&bone.parent.isBone){boneMatrix.multiplyMatrices(matrixWorldInv,bone.matrixWorld);vector.setFromMatrixPosition(boneMatrix);position.setXYZ(j,vector.x,vector.y,vector.z);boneMatrix.multiplyMatrices(matrixWorldInv,bone.parent.matrixWorld);vector.setFromMatrixPosition(boneMatrix);position.setXYZ(j+1,vector.x,vector.y,vector.z);j+=2;}}geometry.getAttribute('position').needsUpdate=true;Object3D.prototype.updateMatrixWorld.call(this,force);};}();/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
*/function PointLightHelper(light,sphereSize,color){this.light=light;this.light.updateMatrixWorld();this.color=color;var geometry=new SphereBufferGeometry(sphereSize,4,2);var material=new MeshBasicMaterial({wireframe:true,fog:false});Mesh.call(this,geometry,material);this.matrix=this.light.matrixWorld;this.matrixAutoUpdate=false;this.update();/*
var distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );
var distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );
this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );
this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );
var d = light.distance;
if ( d === 0.0 ) {
this.lightDistance.visible = false;
} else {
this.lightDistance.scale.set( d, d, d );
}
this.add( this.lightDistance );
*/}PointLightHelper.prototype=Object.create(Mesh.prototype);PointLightHelper.prototype.constructor=PointLightHelper;PointLightHelper.prototype.dispose=function(){this.geometry.dispose();this.material.dispose();};PointLightHelper.prototype.update=function(){if(this.color!==undefined){this.material.color.set(this.color);}else{this.material.color.copy(this.light.color);}/*
var d = this.light.distance;
if ( d === 0.0 ) {
this.lightDistance.visible = false;
} else {
this.lightDistance.visible = true;
this.lightDistance.scale.set( d, d, d );
}
*/};/**
* @author abelnation / http://github.com/abelnation
* @author Mugen87 / http://github.com/Mugen87
* @author WestLangley / http://github.com/WestLangley
*/function RectAreaLightHelper(light,color){Object3D.call(this);this.light=light;this.light.updateMatrixWorld();this.matrix=light.matrixWorld;this.matrixAutoUpdate=false;this.color=color;var material=new LineBasicMaterial({fog:false});var geometry=new BufferGeometry();geometry.addAttribute('position',new BufferAttribute(new Float32Array(5*3),3));this.line=new Line(geometry,material);this.add(this.line);this.update();}RectAreaLightHelper.prototype=Object.create(Object3D.prototype);RectAreaLightHelper.prototype.constructor=RectAreaLightHelper;RectAreaLightHelper.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose();};RectAreaLightHelper.prototype.update=function(){// calculate new dimensions of the helper
var hx=this.light.width*0.5;var hy=this.light.height*0.5;var position=this.line.geometry.attributes.position;var array=position.array;// update vertices
array[0]=hx;array[1]=-hy;array[2]=0;array[3]=hx;array[4]=hy;array[5]=0;array[6]=-hx;array[7]=hy;array[8]=0;array[9]=-hx;array[10]=-hy;array[11]=0;array[12]=hx;array[13]=-hy;array[14]=0;position.needsUpdate=true;if(this.color!==undefined){this.line.material.color.set(this.color);}else{this.line.material.color.copy(this.light.color);}};/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / https://github.com/Mugen87
*/function HemisphereLightHelper(light,size,color){Object3D.call(this);this.light=light;this.light.updateMatrixWorld();this.matrix=light.matrixWorld;this.matrixAutoUpdate=false;this.color=color;var geometry=new OctahedronBufferGeometry(size);geometry.rotateY(Math.PI*0.5);this.material=new MeshBasicMaterial({wireframe:true,fog:false});if(this.color===undefined)this.material.vertexColors=VertexColors;var position=geometry.getAttribute('position');var colors=new Float32Array(position.count*3);geometry.addAttribute('color',new BufferAttribute(colors,3));this.add(new Mesh(geometry,this.material));this.update();}HemisphereLightHelper.prototype=Object.create(Object3D.prototype);HemisphereLightHelper.prototype.constructor=HemisphereLightHelper;HemisphereLightHelper.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose();};HemisphereLightHelper.prototype.update=function(){var vector=new Vector3();var color1=new Color();var color2=new Color();return function update(){var mesh=this.children[0];if(this.color!==undefined){this.material.color.set(this.color);}else{var colors=mesh.geometry.getAttribute('color');color1.copy(this.light.color);color2.copy(this.light.groundColor);for(var i=0,l=colors.count;i<l;i++){var color=i<l/2?color1:color2;colors.setXYZ(i,color.r,color.g,color.b);}colors.needsUpdate=true;}mesh.lookAt(vector.setFromMatrixPosition(this.light.matrixWorld).negate());};}();/**
* @author mrdoob / http://mrdoob.com/
*/function GridHelper(size,divisions,color1,color2){size=size||10;divisions=divisions||10;color1=new Color(color1!==undefined?color1:0x444444);color2=new Color(color2!==undefined?color2:0x888888);var center=divisions/2;var step=size/divisions;var halfSize=size/2;var vertices=[],colors=[];for(var i=0,j=0,k=-halfSize;i<=divisions;i++,k+=step){vertices.push(-halfSize,0,k,halfSize,0,k);vertices.push(k,0,-halfSize,k,0,halfSize);var color=i===center?color1:color2;color.toArray(colors,j);j+=3;color.toArray(colors,j);j+=3;color.toArray(colors,j);j+=3;color.toArray(colors,j);j+=3;}var geometry=new BufferGeometry();geometry.addAttribute('position',new Float32BufferAttribute(vertices,3));geometry.addAttribute('color',new Float32BufferAttribute(colors,3));var material=new LineBasicMaterial({vertexColors:VertexColors});LineSegments.call(this,geometry,material);}GridHelper.prototype=Object.create(LineSegments.prototype);GridHelper.prototype.constructor=GridHelper;/**
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / http://github.com/Mugen87
* @author Hectate / http://www.github.com/Hectate
*/function PolarGridHelper(radius,radials,circles,divisions,color1,color2){radius=radius||10;radials=radials||16;circles=circles||8;divisions=divisions||64;color1=new Color(color1!==undefined?color1:0x444444);color2=new Color(color2!==undefined?color2:0x888888);var vertices=[];var colors=[];var x,z;var v,i,j,r,color;// create the radials
for(i=0;i<=radials;i++){v=i/radials*(Math.PI*2);x=Math.sin(v)*radius;z=Math.cos(v)*radius;vertices.push(0,0,0);vertices.push(x,0,z);color=i&1?color1:color2;colors.push(color.r,color.g,color.b);colors.push(color.r,color.g,color.b);}// create the circles
for(i=0;i<=circles;i++){color=i&1?color1:color2;r=radius-radius/circles*i;for(j=0;j<divisions;j++){// first vertex
v=j/divisions*(Math.PI*2);x=Math.sin(v)*r;z=Math.cos(v)*r;vertices.push(x,0,z);colors.push(color.r,color.g,color.b);// second vertex
v=(j+1)/divisions*(Math.PI*2);x=Math.sin(v)*r;z=Math.cos(v)*r;vertices.push(x,0,z);colors.push(color.r,color.g,color.b);}}var geometry=new BufferGeometry();geometry.addAttribute('position',new Float32BufferAttribute(vertices,3));geometry.addAttribute('color',new Float32BufferAttribute(colors,3));var material=new LineBasicMaterial({vertexColors:VertexColors});LineSegments.call(this,geometry,material);}PolarGridHelper.prototype=Object.create(LineSegments.prototype);PolarGridHelper.prototype.constructor=PolarGridHelper;/**
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
*/function FaceNormalsHelper(object,size,hex,linewidth){// FaceNormalsHelper only supports THREE.Geometry
this.object=object;this.size=size!==undefined?size:1;var color=hex!==undefined?hex:0xffff00;var width=linewidth!==undefined?linewidth:1;//
var nNormals=0;var objGeometry=this.object.geometry;if(objGeometry&&objGeometry.isGeometry){nNormals=objGeometry.faces.length;}else{console.warn('THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.');}//
var geometry=new BufferGeometry();var positions=new Float32BufferAttribute(nNormals*2*3,3);geometry.addAttribute('position',positions);LineSegments.call(this,geometry,new LineBasicMaterial({color:color,linewidth:width}));//
this.matrixAutoUpdate=false;this.update();}FaceNormalsHelper.prototype=Object.create(LineSegments.prototype);FaceNormalsHelper.prototype.constructor=FaceNormalsHelper;FaceNormalsHelper.prototype.update=function(){var v1=new Vector3();var v2=new Vector3();var normalMatrix=new Matrix3();return function update(){this.object.updateMatrixWorld(true);normalMatrix.getNormalMatrix(this.object.matrixWorld);var matrixWorld=this.object.matrixWorld;var position=this.geometry.attributes.position;//
var objGeometry=this.object.geometry;var vertices=objGeometry.vertices;var faces=objGeometry.faces;var idx=0;for(var i=0,l=faces.length;i<l;i++){var face=faces[i];var normal=face.normal;v1.copy(vertices[face.a]).add(vertices[face.b]).add(vertices[face.c]).divideScalar(3).applyMatrix4(matrixWorld);v2.copy(normal).applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1);position.setXYZ(idx,v1.x,v1.y,v1.z);idx=idx+1;position.setXYZ(idx,v2.x,v2.y,v2.z);idx=idx+1;}position.needsUpdate=true;};}();/**
* @author alteredq / http://alteredqualia.com/
* @author mrdoob / http://mrdoob.com/
* @author WestLangley / http://github.com/WestLangley
*/function DirectionalLightHelper(light,size,color){Object3D.call(this);this.light=light;this.light.updateMatrixWorld();this.matrix=light.matrixWorld;this.matrixAutoUpdate=false;this.color=color;if(size===undefined)size=1;var geometry=new BufferGeometry();geometry.addAttribute('position',new Float32BufferAttribute([-size,size,0,size,size,0,size,-size,0,-size,-size,0,-size,size,0],3));var material=new LineBasicMaterial({fog:false});this.lightPlane=new Line(geometry,material);this.add(this.lightPlane);geometry=new BufferGeometry();geometry.addAttribute('position',new Float32BufferAttribute([0,0,0,0,0,1],3));this.targetLine=new Line(geometry,material);this.add(this.targetLine);this.update();}DirectionalLightHelper.prototype=Object.create(Object3D.prototype);DirectionalLightHelper.prototype.constructor=DirectionalLightHelper;DirectionalLightHelper.prototype.dispose=function(){this.lightPlane.geometry.dispose();this.lightPlane.material.dispose();this.targetLine.geometry.dispose();this.targetLine.material.dispose();};DirectionalLightHelper.prototype.update=function(){var v1=new Vector3();var v2=new Vector3();var v3=new Vector3();return function update(){v1.setFromMatrixPosition(this.light.matrixWorld);v2.setFromMatrixPosition(this.light.target.matrixWorld);v3.subVectors(v2,v1);this.lightPlane.lookAt(v3);if(this.color!==undefined){this.lightPlane.material.color.set(this.color);this.targetLine.material.color.set(this.color);}else{this.lightPlane.material.color.copy(this.light.color);this.targetLine.material.color.copy(this.light.color);}this.targetLine.lookAt(v3);this.targetLine.scale.z=v3.length();};}();/**
* @author alteredq / http://alteredqualia.com/
* @author Mugen87 / https://github.com/Mugen87
*
* - shows frustum, line of sight and up of the camera
* - suitable for fast updates
* - based on frustum visualization in lightgl.js shadowmap example
* http://evanw.github.com/lightgl.js/tests/shadowmap.html
*/function CameraHelper(camera){var geometry=new BufferGeometry();var material=new LineBasicMaterial({color:0xffffff,vertexColors:FaceColors});var vertices=[];var colors=[];var pointMap={};// colors
var colorFrustum=new Color(0xffaa00);var colorCone=new Color(0xff0000);var colorUp=new Color(0x00aaff);var colorTarget=new Color(0xffffff);var colorCross=new Color(0x333333);// near
addLine('n1','n2',colorFrustum);addLine('n2','n4',colorFrustum);addLine('n4','n3',colorFrustum);addLine('n3','n1',colorFrustum);// far
addLine('f1','f2',colorFrustum);addLine('f2','f4',colorFrustum);addLine('f4','f3',colorFrustum);addLine('f3','f1',colorFrustum);// sides
addLine('n1','f1',colorFrustum);addLine('n2','f2',colorFrustum);addLine('n3','f3',colorFrustum);addLine('n4','f4',colorFrustum);// cone
addLine('p','n1',colorCone);addLine('p','n2',colorCone);addLine('p','n3',colorCone);addLine('p','n4',colorCone);// up
addLine('u1','u2',colorUp);addLine('u2','u3',colorUp);addLine('u3','u1',colorUp);// target
addLine('c','t',colorTarget);addLine('p','c',colorCross);// cross
addLine('cn1','cn2',colorCross);addLine('cn3','cn4',colorCross);addLine('cf1','cf2',colorCross);addLine('cf3','cf4',colorCross);function addLine(a,b,color){addPoint(a,color);addPoint(b,color);}function addPoint(id,color){vertices.push(0,0,0);colors.push(color.r,color.g,color.b);if(pointMap[id]===undefined){pointMap[id]=[];}pointMap[id].push(vertices.length/3-1);}geometry.addAttribute('position',new Float32BufferAttribute(vertices,3));geometry.addAttribute('color',new Float32BufferAttribute(colors,3));LineSegments.call(this,geometry,material);this.camera=camera;if(this.camera.updateProjectionMatrix)this.camera.updateProjectionMatrix();this.matrix=camera.matrixWorld;this.matrixAutoUpdate=false;this.pointMap=pointMap;this.update();}CameraHelper.prototype=Object.create(LineSegments.prototype);CameraHelper.prototype.constructor=CameraHelper;CameraHelper.prototype.update=function(){var geometry,pointMap;var vector=new Vector3();var camera=new Camera();function setPoint(point,x,y,z){vector.set(x,y,z).unproject(camera);var points=pointMap[point];if(points!==undefined){var position=geometry.getAttribute('position');for(var i=0,l=points.length;i<l;i++){position.setXYZ(points[i],vector.x,vector.y,vector.z);}}}return function update(){geometry=this.geometry;pointMap=this.pointMap;var w=1,h=1;// we need just camera projection matrix
// world matrix must be identity
camera.projectionMatrix.copy(this.camera.projectionMatrix);// center / target
setPoint('c',0,0,-1);setPoint('t',0,0,1);// near
setPoint('n1',-w,-h,-1);setPoint('n2',w,-h,-1);setPoint('n3',-w,h,-1);setPoint('n4',w,h,-1);// far
setPoint('f1',-w,-h,1);setPoint('f2',w,-h,1);setPoint('f3',-w,h,1);setPoint('f4',w,h,1);// up
setPoint('u1',w*0.7,h*1.1,-1);setPoint('u2',-w*0.7,h*1.1,-1);setPoint('u3',0,h*2,-1);// cross
setPoint('cf1',-w,0,1);setPoint('cf2',w,0,1);setPoint('cf3',0,-h,1);setPoint('cf4',0,h,1);setPoint('cn1',-w,0,-1);setPoint('cn2',w,0,-1);setPoint('cn3',0,-h,-1);setPoint('cn4',0,h,-1);geometry.getAttribute('position').needsUpdate=true;};}();/**
* @author mrdoob / http://mrdoob.com/
* @author Mugen87 / http://github.com/Mugen87
*/function BoxHelper(object,color){this.object=object;if(color===undefined)color=0xffff00;var indices=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var positions=new Float32Array(8*3);var geometry=new BufferGeometry();geometry.setIndex(new BufferAttribute(indices,1));geometry.addAttribute('position',new BufferAttribute(positions,3));LineSegments.call(this,geometry,new LineBasicMaterial({color:color}));this.matrixAutoUpdate=false;this.update();}BoxHelper.prototype=Object.create(LineSegments.prototype);BoxHelper.prototype.constructor=BoxHelper;BoxHelper.prototype.update=function(){var box=new Box3();return function update(object){if(object!==undefined){console.warn('THREE.BoxHelper: .update() has no longer arguments.');}if(this.object!==undefined){box.setFromObject(this.object);}if(box.isEmpty())return;var min=box.min;var max=box.max;/*
5____4
1/___0/|
| 6__|_7
2/___3/
0: max.x, max.y, max.z
1: min.x, max.y, max.z
2: min.x, min.y, max.z
3: max.x, min.y, max.z
4: max.x, max.y, min.z
5: min.x, max.y, min.z
6: min.x, min.y, min.z
7: max.x, min.y, min.z
*/var position=this.geometry.attributes.position;var array=position.array;array[0]=max.x;array[1]=max.y;array[2]=max.z;array[3]=min.x;array[4]=max.y;array[5]=max.z;array[6]=min.x;array[7]=min.y;array[8]=max.z;array[9]=max.x;array[10]=min.y;array[11]=max.z;array[12]=max.x;array[13]=max.y;array[14]=min.z;array[15]=min.x;array[16]=max.y;array[17]=min.z;array[18]=min.x;array[19]=min.y;array[20]=min.z;array[21]=max.x;array[22]=min.y;array[23]=min.z;position.needsUpdate=true;this.geometry.computeBoundingSphere();};}();BoxHelper.prototype.setFromObject=function(object){this.object=object;this.update();return this;};/**
* @author WestLangley / http://github.com/WestLangley
*/function Box3Helper(box,hex){this.type='Box3Helper';this.box=box;var color=hex!==undefined?hex:0xffff00;var indices=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var positions=[1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1];var geometry=new BufferGeometry();geometry.setIndex(new BufferAttribute(indices,1));geometry.addAttribute('position',new Float32BufferAttribute(positions,3));LineSegments.call(this,geometry,new LineBasicMaterial({color:color}));this.geometry.computeBoundingSphere();}Box3Helper.prototype=Object.create(LineSegments.prototype);Box3Helper.prototype.constructor=Box3Helper;Box3Helper.prototype.updateMatrixWorld=function(force){var box=this.box;if(box.isEmpty())return;box.getCenter(this.position);box.getSize(this.scale);this.scale.multiplyScalar(0.5);Object3D.prototype.updateMatrixWorld.call(this,force);};/**
* @author WestLangley / http://github.com/WestLangley
*/function PlaneHelper(plane,size,hex){this.type='PlaneHelper';this.plane=plane;this.size=size===undefined?1:size;var color=hex!==undefined?hex:0xffff00;var positions=[1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0];var geometry=new BufferGeometry();geometry.addAttribute('position',new Float32BufferAttribute(positions,3));geometry.computeBoundingSphere();Line.call(this,geometry,new LineBasicMaterial({color:color}));//
var positions2=[1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1];var geometry2=new BufferGeometry();geometry2.addAttribute('position',new Float32BufferAttribute(positions2,3));geometry2.computeBoundingSphere();this.add(new Mesh(geometry2,new MeshBasicMaterial({color:color,opacity:0.2,transparent:true,depthWrite:false})));}PlaneHelper.prototype=Object.create(Line.prototype);PlaneHelper.prototype.constructor=PlaneHelper;PlaneHelper.prototype.updateMatrixWorld=function(force){var scale=-this.plane.constant;if(Math.abs(scale)<1e-8)scale=1e-8;// sign does not matter
this.scale.set(0.5*this.size,0.5*this.size,scale);this.lookAt(this.plane.normal);Object3D.prototype.updateMatrixWorld.call(this,force);};/**
* @author WestLangley / http://github.com/WestLangley
* @author zz85 / http://github.com/zz85
* @author bhouston / http://clara.io
*
* Creates an arrow for visualizing directions
*
* Parameters:
* dir - Vector3
* origin - Vector3
* length - Number
* color - color in hex value
* headLength - Number
* headWidth - Number
*/var lineGeometry;var coneGeometry;function ArrowHelper(dir,origin,length,color,headLength,headWidth){// dir is assumed to be normalized
Object3D.call(this);if(color===undefined)color=0xffff00;if(length===undefined)length=1;if(headLength===undefined)headLength=0.2*length;if(headWidth===undefined)headWidth=0.2*headLength;if(lineGeometry===undefined){lineGeometry=new BufferGeometry();lineGeometry.addAttribute('position',new Float32BufferAttribute([0,0,0,0,1,0],3));coneGeometry=new CylinderBufferGeometry(0,0.5,1,5,1);coneGeometry.translate(0,-0.5,0);}this.position.copy(origin);this.line=new Line(lineGeometry,new LineBasicMaterial({color:color}));this.line.matrixAutoUpdate=false;this.add(this.line);this.cone=new Mesh(coneGeometry,new MeshBasicMaterial({color:color}));this.cone.matrixAutoUpdate=false;this.add(this.cone);this.setDirection(dir);this.setLength(length,headLength,headWidth);}ArrowHelper.prototype=Object.create(Object3D.prototype);ArrowHelper.prototype.constructor=ArrowHelper;ArrowHelper.prototype.setDirection=function(){var axis=new Vector3();var radians;return function setDirection(dir){// dir is assumed to be normalized
if(dir.y>0.99999){this.quaternion.set(0,0,0,1);}else if(dir.y<-0.99999){this.quaternion.set(1,0,0,0);}else{axis.set(dir.z,0,-dir.x).normalize();radians=Math.acos(dir.y);this.quaternion.setFromAxisAngle(axis,radians);}};}();ArrowHelper.prototype.setLength=function(length,headLength,headWidth){if(headLength===undefined)headLength=0.2*length;if(headWidth===undefined)headWidth=0.2*headLength;this.line.scale.set(1,Math.max(0,length-headLength),1);this.line.updateMatrix();this.cone.scale.set(headWidth,headLength,headWidth);this.cone.position.y=length;this.cone.updateMatrix();};ArrowHelper.prototype.setColor=function(color){this.line.material.color.copy(color);this.cone.material.color.copy(color);};/**
* @author sroucheray / http://sroucheray.org/
* @author mrdoob / http://mrdoob.com/
*/function AxesHelper(size){size=size||1;var vertices=[0,0,0,size,0,0,0,0,0,0,size,0,0,0,0,0,0,size];var colors=[1,0,0,1,0.6,0,0,1,0,0.6,1,0,0,0,1,0,0.6,1];var geometry=new BufferGeometry();geometry.addAttribute('position',new Float32BufferAttribute(vertices,3));geometry.addAttribute('color',new Float32BufferAttribute(colors,3));var material=new LineBasicMaterial({vertexColors:VertexColors});LineSegments.call(this,geometry,material);}AxesHelper.prototype=Object.create(LineSegments.prototype);AxesHelper.prototype.constructor=AxesHelper;//
Curve.create=function(construct,getPoint){console.log('THREE.Curve.create() has been deprecated');construct.prototype=Object.create(Curve.prototype);construct.prototype.constructor=construct;construct.prototype.getPoint=getPoint;return construct;};//
Object.assign(CurvePath.prototype,{createPointsGeometry:function(divisions){console.warn('THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.');// generate geometry from path points (for Line or Points objects)
var pts=this.getPoints(divisions);return this.createGeometry(pts);},createSpacedPointsGeometry:function(divisions){console.warn('THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.');// generate geometry from equidistant sampling along the path
var pts=this.getSpacedPoints(divisions);return this.createGeometry(pts);},createGeometry:function(points){console.warn('THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.');var geometry=new Geometry();for(var i=0,l=points.length;i<l;i++){var point=points[i];geometry.vertices.push(new Vector3(point.x,point.y,point.z||0));}return geometry;}});//
Object.assign(Path.prototype,{fromPoints:function(points){console.warn('THREE.Path: .fromPoints() has been renamed to .setFromPoints().');this.setFromPoints(points);}});//
function Spline(points){console.warn('THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.');CatmullRomCurve3.call(this,points);this.type='catmullrom';}Spline.prototype=Object.create(CatmullRomCurve3.prototype);Object.assign(Spline.prototype,{initFromArray:function()/* a */{console.error('THREE.Spline: .initFromArray() has been removed.');},getControlPointsArray:function()/* optionalTarget */{console.error('THREE.Spline: .getControlPointsArray() has been removed.');},reparametrizeByArcLength:function()/* samplingCoef */{console.error('THREE.Spline: .reparametrizeByArcLength() has been removed.');}});GridHelper.prototype.setColors=function(){console.error('THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.');};SkeletonHelper.prototype.update=function(){console.error('THREE.SkeletonHelper: update() no longer needs to be called.');};//
Object.assign(Loader.prototype,{extractUrlBase:function(url){console.warn('THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.');return LoaderUtils.extractUrlBase(url);}});//
Object.assign(Box2.prototype,{center:function(optionalTarget){console.warn('THREE.Box2: .center() has been renamed to .getCenter().');return this.getCenter(optionalTarget);},empty:function(){console.warn('THREE.Box2: .empty() has been renamed to .isEmpty().');return this.isEmpty();},isIntersectionBox:function(box){console.warn('THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().');return this.intersectsBox(box);},size:function(optionalTarget){console.warn('THREE.Box2: .size() has been renamed to .getSize().');return this.getSize(optionalTarget);}});Object.assign(Box3.prototype,{center:function(optionalTarget){console.warn('THREE.Box3: .center() has been renamed to .getCenter().');return this.getCenter(optionalTarget);},empty:function(){console.warn('THREE.Box3: .empty() has been renamed to .isEmpty().');return this.isEmpty();},isIntersectionBox:function(box){console.warn('THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().');return this.intersectsBox(box);},isIntersectionSphere:function(sphere){console.warn('THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().');return this.intersectsSphere(sphere);},size:function(optionalTarget){console.warn('THREE.Box3: .size() has been renamed to .getSize().');return this.getSize(optionalTarget);}});Line3.prototype.center=function(optionalTarget){console.warn('THREE.Line3: .center() has been renamed to .getCenter().');return this.getCenter(optionalTarget);};Object.assign(_Math,{random16:function(){console.warn('THREE.Math: .random16() has been deprecated. Use Math.random() instead.');return Math.random();},nearestPowerOfTwo:function(value){console.warn('THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().');return _Math.floorPowerOfTwo(value);},nextPowerOfTwo:function(value){console.warn('THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().');return _Math.ceilPowerOfTwo(value);}});Object.assign(Matrix3.prototype,{flattenToArrayOffset:function(array,offset){console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(array,offset);},multiplyVector3:function(vector){console.warn('THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.');return vector.applyMatrix3(this);},multiplyVector3Array:function()/* a */{console.error('THREE.Matrix3: .multiplyVector3Array() has been removed.');},applyToBuffer:function(buffer/*, offset, length */){console.warn('THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.');return this.applyToBufferAttribute(buffer);},applyToVector3Array:function()/* array, offset, length */{console.error('THREE.Matrix3: .applyToVector3Array() has been removed.');}});Object.assign(Matrix4.prototype,{extractPosition:function(m){console.warn('THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().');return this.copyPosition(m);},flattenToArrayOffset:function(array,offset){console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(array,offset);},getPosition:function(){var v1;return function getPosition(){if(v1===undefined)v1=new Vector3();console.warn('THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.');return v1.setFromMatrixColumn(this,3);};}(),setRotationFromQuaternion:function(q){console.warn('THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().');return this.makeRotationFromQuaternion(q);},multiplyToArray:function(){console.warn('THREE.Matrix4: .multiplyToArray() has been removed.');},multiplyVector3:function(vector){console.warn('THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.');return vector.applyMatrix4(this);},multiplyVector4:function(vector){console.warn('THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.');return vector.applyMatrix4(this);},multiplyVector3Array:function()/* a */{console.error('THREE.Matrix4: .multiplyVector3Array() has been removed.');},rotateAxis:function(v){console.warn('THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.');v.transformDirection(this);},crossVector:function(vector){console.warn('THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.');return vector.applyMatrix4(this);},translate:function(){console.error('THREE.Matrix4: .translate() has been removed.');},rotateX:function(){console.error('THREE.Matrix4: .rotateX() has been removed.');},rotateY:function(){console.error('THREE.Matrix4: .rotateY() has been removed.');},rotateZ:function(){console.error('THREE.Matrix4: .rotateZ() has been removed.');},rotateByAxis:function(){console.error('THREE.Matrix4: .rotateByAxis() has been removed.');},applyToBuffer:function(buffer/*, offset, length */){console.warn('THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.');return this.applyToBufferAttribute(buffer);},applyToVector3Array:function()/* array, offset, length */{console.error('THREE.Matrix4: .applyToVector3Array() has been removed.');},makeFrustum:function(left,right,bottom,top,near,far){console.warn('THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.');return this.makePerspective(left,right,top,bottom,near,far);}});Plane.prototype.isIntersectionLine=function(line){console.warn('THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().');return this.intersectsLine(line);};Quaternion.prototype.multiplyVector3=function(vector){console.warn('THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.');return vector.applyQuaternion(this);};Object.assign(Ray.prototype,{isIntersectionBox:function(box){console.warn('THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().');return this.intersectsBox(box);},isIntersectionPlane:function(plane){console.warn('THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().');return this.intersectsPlane(plane);},isIntersectionSphere:function(sphere){console.warn('THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().');return this.intersectsSphere(sphere);}});Object.assign(Triangle.prototype,{area:function(){console.warn('THREE.Triangle: .area() has been renamed to .getArea().');return this.getArea();},barycoordFromPoint:function(point,target){console.warn('THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().');return this.getBarycoord(point,target);},midpoint:function(target){console.warn('THREE.Triangle: .midpoint() has been renamed to .getMidpoint().');return this.getMidpoint(target);},normal:function(target){console.warn('THREE.Triangle: .normal() has been renamed to .getNormal().');return this.getNormal(target);},plane:function(target){console.warn('THREE.Triangle: .plane() has been renamed to .getPlane().');return this.getPlane(target);}});Object.assign(Triangle,{barycoordFromPoint:function(point,a,b,c,target){console.warn('THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().');return Triangle.getBarycoord(point,a,b,c,target);},normal:function(a,b,c,target){console.warn('THREE.Triangle: .normal() has been renamed to .getNormal().');return Triangle.getNormal(a,b,c,target);}});Object.assign(Shape.prototype,{extractAllPoints:function(divisions){console.warn('THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.');return this.extractPoints(divisions);},extrude:function(options){console.warn('THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.');return new ExtrudeGeometry(this,options);},makeGeometry:function(options){console.warn('THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.');return new ShapeGeometry(this,options);}});Object.assign(Vector2.prototype,{fromAttribute:function(attribute,index,offset){console.warn('THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().');return this.fromBufferAttribute(attribute,index,offset);},distanceToManhattan:function(v){console.warn('THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().');return this.manhattanDistanceTo(v);},lengthManhattan:function(){console.warn('THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().');return this.manhattanLength();}});Object.assign(Vector3.prototype,{setEulerFromRotationMatrix:function(){console.error('THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.');},setEulerFromQuaternion:function(){console.error('THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.');},getPositionFromMatrix:function(m){console.warn('THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().');return this.setFromMatrixPosition(m);},getScaleFromMatrix:function(m){console.warn('THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().');return this.setFromMatrixScale(m);},getColumnFromMatrix:function(index,matrix){console.warn('THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().');return this.setFromMatrixColumn(matrix,index);},applyProjection:function(m){console.warn('THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.');return this.applyMatrix4(m);},fromAttribute:function(attribute,index,offset){console.warn('THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().');return this.fromBufferAttribute(attribute,index,offset);},distanceToManhattan:function(v){console.warn('THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().');return this.manhattanDistanceTo(v);},lengthManhattan:function(){console.warn('THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().');return this.manhattanLength();}});Object.assign(Vector4.prototype,{fromAttribute:function(attribute,index,offset){console.warn('THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().');return this.fromBufferAttribute(attribute,index,offset);},lengthManhattan:function(){console.warn('THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().');return this.manhattanLength();}});//
Object.assign(Geometry.prototype,{computeTangents:function(){console.error('THREE.Geometry: .computeTangents() has been removed.');},computeLineDistances:function(){console.error('THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.');}});Object.assign(Object3D.prototype,{getChildByName:function(name){console.warn('THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().');return this.getObjectByName(name);},renderDepth:function(){console.warn('THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.');},translate:function(distance,axis){console.warn('THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.');return this.translateOnAxis(axis,distance);},getWorldRotation:function(){console.error('THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.');}});Object.defineProperties(Object3D.prototype,{eulerOrder:{get:function(){console.warn('THREE.Object3D: .eulerOrder is now .rotation.order.');return this.rotation.order;},set:function(value){console.warn('THREE.Object3D: .eulerOrder is now .rotation.order.');this.rotation.order=value;}},useQuaternion:{get:function(){console.warn('THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.');},set:function(){console.warn('THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.');}}});Object.defineProperties(LOD.prototype,{objects:{get:function(){console.warn('THREE.LOD: .objects has been renamed to .levels.');return this.levels;}}});Object.defineProperty(Skeleton.prototype,'useVertexTexture',{get:function(){console.warn('THREE.Skeleton: useVertexTexture has been removed.');},set:function(){console.warn('THREE.Skeleton: useVertexTexture has been removed.');}});Object.defineProperty(Curve.prototype,'__arcLengthDivisions',{get:function(){console.warn('THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.');return this.arcLengthDivisions;},set:function(value){console.warn('THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.');this.arcLengthDivisions=value;}});//
PerspectiveCamera.prototype.setLens=function(focalLength,filmGauge){console.warn("THREE.PerspectiveCamera.setLens is deprecated. "+"Use .setFocalLength and .filmGauge for a photographic setup.");if(filmGauge!==undefined)this.filmGauge=filmGauge;this.setFocalLength(focalLength);};//
Object.defineProperties(Light.prototype,{onlyShadow:{set:function(){console.warn('THREE.Light: .onlyShadow has been removed.');}},shadowCameraFov:{set:function(value){console.warn('THREE.Light: .shadowCameraFov is now .shadow.camera.fov.');this.shadow.camera.fov=value;}},shadowCameraLeft:{set:function(value){console.warn('THREE.Light: .shadowCameraLeft is now .shadow.camera.left.');this.shadow.camera.left=value;}},shadowCameraRight:{set:function(value){console.warn('THREE.Light: .shadowCameraRight is now .shadow.camera.right.');this.shadow.camera.right=value;}},shadowCameraTop:{set:function(value){console.warn('THREE.Light: .shadowCameraTop is now .shadow.camera.top.');this.shadow.camera.top=value;}},shadowCameraBottom:{set:function(value){console.warn('THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.');this.shadow.camera.bottom=value;}},shadowCameraNear:{set:function(value){console.warn('THREE.Light: .shadowCameraNear is now .shadow.camera.near.');this.shadow.camera.near=value;}},shadowCameraFar:{set:function(value){console.warn('THREE.Light: .shadowCameraFar is now .shadow.camera.far.');this.shadow.camera.far=value;}},shadowCameraVisible:{set:function(){console.warn('THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.');}},shadowBias:{set:function(value){console.warn('THREE.Light: .shadowBias is now .shadow.bias.');this.shadow.bias=value;}},shadowDarkness:{set:function(){console.warn('THREE.Light: .shadowDarkness has been removed.');}},shadowMapWidth:{set:function(value){console.warn('THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.');this.shadow.mapSize.width=value;}},shadowMapHeight:{set:function(value){console.warn('THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.');this.shadow.mapSize.height=value;}}});//
Object.defineProperties(BufferAttribute.prototype,{length:{get:function(){console.warn('THREE.BufferAttribute: .length has been deprecated. Use .count instead.');return this.array.length;}},copyIndicesArray:function()/* indices */{console.error('THREE.BufferAttribute: .copyIndicesArray() has been removed.');}});Object.assign(BufferGeometry.prototype,{addIndex:function(index){console.warn('THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().');this.setIndex(index);},addDrawCall:function(start,count,indexOffset){if(indexOffset!==undefined){console.warn('THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.');}console.warn('THREE.BufferGeometry: .addDrawCall() is now .addGroup().');this.addGroup(start,count);},clearDrawCalls:function(){console.warn('THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().');this.clearGroups();},computeTangents:function(){console.warn('THREE.BufferGeometry: .computeTangents() has been removed.');},computeOffsets:function(){console.warn('THREE.BufferGeometry: .computeOffsets() has been removed.');}});Object.defineProperties(BufferGeometry.prototype,{drawcalls:{get:function(){console.error('THREE.BufferGeometry: .drawcalls has been renamed to .groups.');return this.groups;}},offsets:{get:function(){console.warn('THREE.BufferGeometry: .offsets has been renamed to .groups.');return this.groups;}}});//
Object.assign(ExtrudeBufferGeometry.prototype,{getArrays:function(){console.error('THREE.ExtrudeBufferGeometry: .getArrays() has been removed.');},addShapeList:function(){console.error('THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.');},addShape:function(){console.error('THREE.ExtrudeBufferGeometry: .addShape() has been removed.');}});//
Object.defineProperties(Uniform.prototype,{dynamic:{set:function(){console.warn('THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.');}},onUpdate:{value:function(){console.warn('THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.');return this;}}});//
Object.defineProperties(Material.prototype,{wrapAround:{get:function(){console.warn('THREE.Material: .wrapAround has been removed.');},set:function(){console.warn('THREE.Material: .wrapAround has been removed.');}},wrapRGB:{get:function(){console.warn('THREE.Material: .wrapRGB has been removed.');return new Color();}},shading:{get:function(){console.error('THREE.'+this.type+': .shading has been removed. Use the boolean .flatShading instead.');},set:function(value){console.warn('THREE.'+this.type+': .shading has been removed. Use the boolean .flatShading instead.');this.flatShading=value===FlatShading;}}});Object.defineProperties(MeshPhongMaterial.prototype,{metal:{get:function(){console.warn('THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.');return false;},set:function(){console.warn('THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead');}}});Object.defineProperties(ShaderMaterial.prototype,{derivatives:{get:function(){console.warn('THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.');return this.extensions.derivatives;},set:function(value){console.warn('THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.');this.extensions.derivatives=value;}}});//
Object.assign(WebGLRenderer.prototype,{getCurrentRenderTarget:function(){console.warn('THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().');return this.getRenderTarget();},getMaxAnisotropy:function(){console.warn('THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().');return this.capabilities.getMaxAnisotropy();},getPrecision:function(){console.warn('THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.');return this.capabilities.precision;},resetGLState:function(){console.warn('THREE.WebGLRenderer: .resetGLState() is now .state.reset().');return this.state.reset();},supportsFloatTextures:function(){console.warn('THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).');return this.extensions.get('OES_texture_float');},supportsHalfFloatTextures:function(){console.warn('THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).');return this.extensions.get('OES_texture_half_float');},supportsStandardDerivatives:function(){console.warn('THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).');return this.extensions.get('OES_standard_derivatives');},supportsCompressedTextureS3TC:function(){console.warn('THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).');return this.extensions.get('WEBGL_compressed_texture_s3tc');},supportsCompressedTexturePVRTC:function(){console.warn('THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).');return this.extensions.get('WEBGL_compressed_texture_pvrtc');},supportsBlendMinMax:function(){console.warn('THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).');return this.extensions.get('EXT_blend_minmax');},supportsVertexTextures:function(){console.warn('THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.');return this.capabilities.vertexTextures;},supportsInstancedArrays:function(){console.warn('THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).');return this.extensions.get('ANGLE_instanced_arrays');},enableScissorTest:function(boolean){console.warn('THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().');this.setScissorTest(boolean);},initMaterial:function(){console.warn('THREE.WebGLRenderer: .initMaterial() has been removed.');},addPrePlugin:function(){console.warn('THREE.WebGLRenderer: .addPrePlugin() has been removed.');},addPostPlugin:function(){console.warn('THREE.WebGLRenderer: .addPostPlugin() has been removed.');},updateShadowMap:function(){console.warn('THREE.WebGLRenderer: .updateShadowMap() has been removed.');},setFaceCulling:function(){console.warn('THREE.WebGLRenderer: .setFaceCulling() has been removed.');}});Object.defineProperties(WebGLRenderer.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled;},set:function(value){console.warn('THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.');this.shadowMap.enabled=value;}},shadowMapType:{get:function(){return this.shadowMap.type;},set:function(value){console.warn('THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.');this.shadowMap.type=value;}},shadowMapCullFace:{get:function(){console.warn('THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.');return undefined;},set:function()/* value */{console.warn('THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.');}}});Object.defineProperties(WebGLShadowMap.prototype,{cullFace:{get:function(){console.warn('THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.');return undefined;},set:function()/* cullFace */{console.warn('THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.');}},renderReverseSided:{get:function(){console.warn('THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.');return undefined;},set:function(){console.warn('THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.');}},renderSingleSided:{get:function(){console.warn('THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.');return undefined;},set:function(){console.warn('THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.');}}});//
Object.defineProperties(WebGLRenderTarget.prototype,{wrapS:{get:function(){console.warn('THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.');return this.texture.wrapS;},set:function(value){console.warn('THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.');this.texture.wrapS=value;}},wrapT:{get:function(){console.warn('THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.');return this.texture.wrapT;},set:function(value){console.warn('THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.');this.texture.wrapT=value;}},magFilter:{get:function(){console.warn('THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.');return this.texture.magFilter;},set:function(value){console.warn('THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.');this.texture.magFilter=value;}},minFilter:{get:function(){console.warn('THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.');return this.texture.minFilter;},set:function(value){console.warn('THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.');this.texture.minFilter=value;}},anisotropy:{get:function(){console.warn('THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.');return this.texture.anisotropy;},set:function(value){console.warn('THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.');this.texture.anisotropy=value;}},offset:{get:function(){console.warn('THREE.WebGLRenderTarget: .offset is now .texture.offset.');return this.texture.offset;},set:function(value){console.warn('THREE.WebGLRenderTarget: .offset is now .texture.offset.');this.texture.offset=value;}},repeat:{get:function(){console.warn('THREE.WebGLRenderTarget: .repeat is now .texture.repeat.');return this.texture.repeat;},set:function(value){console.warn('THREE.WebGLRenderTarget: .repeat is now .texture.repeat.');this.texture.repeat=value;}},format:{get:function(){console.warn('THREE.WebGLRenderTarget: .format is now .texture.format.');return this.texture.format;},set:function(value){console.warn('THREE.WebGLRenderTarget: .format is now .texture.format.');this.texture.format=value;}},type:{get:function(){console.warn('THREE.WebGLRenderTarget: .type is now .texture.type.');return this.texture.type;},set:function(value){console.warn('THREE.WebGLRenderTarget: .type is now .texture.type.');this.texture.type=value;}},generateMipmaps:{get:function(){console.warn('THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.');return this.texture.generateMipmaps;},set:function(value){console.warn('THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.');this.texture.generateMipmaps=value;}}});//
Object.defineProperties(WebVRManager.prototype,{standing:{set:function()/* value */{console.warn('THREE.WebVRManager: .standing has been removed.');}}});//
Audio.prototype.load=function(file){console.warn('THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.');var scope=this;var audioLoader=new AudioLoader();audioLoader.load(file,function(buffer){scope.setBuffer(buffer);});return this;};AudioAnalyser.prototype.getData=function(){console.warn('THREE.AudioAnalyser: .getData() is now .getFrequencyData().');return this.getFrequencyData();};//
CubeCamera.prototype.updateCubeMap=function(renderer,scene){console.warn('THREE.CubeCamera: .updateCubeMap() is now .update().');return this.update(renderer,scene);};var minivents_commonjs=function Events(target){var events={},empty=[];target=target||this;/**
* On: listen to events
*/target.on=function(type,func,ctx){(events[type]=events[type]||[]).push([func,ctx]);return target;};/**
* Off: stop listening to event / specific callback
*/target.off=function(type,func){type||(events={});var list=events[type]||empty,i=list.length=func?list.length:0;while(i--)func==list[i][0]&&list.splice(i,1);return target;};/**
* Emit: send event, callbacks will be triggered
*/target.emit=function(type){var e=events[type]||empty,list=e.length>0?e.slice(0,e.length):e,i=0,j;while(j=list[i++])j[0].apply(j[1],empty.slice.call(arguments,1));return target;};};// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
_export(_export.S,'Object',{create:_objectCreate});var $Object$2=_core.Object;var create=function create(P,D){return $Object$2.create(P,D);};var create$1=create;var _validateCollection=function(it,TYPE){if(!_isObject(it)||it._t!==TYPE)throw TypeError('Incompatible receiver, '+TYPE+' required!');return it;};var dP$2=_objectDp.f;var fastKey=_meta.fastKey;var SIZE=_descriptors?'_s':'size';var getEntry=function(that,key){// fast case
var index=fastKey(key);var entry;if(index!=='F')return that._i[index];// frozen object case
for(entry=that._f;entry;entry=entry.n){if(entry.k==key)return entry;}};var _collectionStrong={getConstructor:function(wrapper,NAME,IS_MAP,ADDER){var C=wrapper(function(that,iterable){_anInstance(that,C,NAME,'_i');that._t=NAME;// collection type
that._i=_objectCreate(null);// index
that._f=undefined;// first entry
that._l=undefined;// last entry
that[SIZE]=0;// size
if(iterable!=undefined)_forOf(iterable,IS_MAP,that[ADDER],that);});_redefineAll(C.prototype,{// 23.1.3.1 Map.prototype.clear()
// 23.2.3.2 Set.prototype.clear()
clear:function clear(){for(var that=_validateCollection(this,NAME),data=that._i,entry=that._f;entry;entry=entry.n){entry.r=true;if(entry.p)entry.p=entry.p.n=undefined;delete data[entry.i];}that._f=that._l=undefined;that[SIZE]=0;},// 23.1.3.3 Map.prototype.delete(key)
// 23.2.3.4 Set.prototype.delete(value)
'delete':function(key){var that=_validateCollection(this,NAME);var entry=getEntry(that,key);if(entry){var next=entry.n;var prev=entry.p;delete that._i[entry.i];entry.r=true;if(prev)prev.n=next;if(next)next.p=prev;if(that._f==entry)that._f=next;if(that._l==entry)that._l=prev;that[SIZE]--;}return !!entry;},// 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
// 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
forEach:function forEach(callbackfn/* , that = undefined */){_validateCollection(this,NAME);var f=_ctx(callbackfn,arguments.length>1?arguments[1]:undefined,3);var entry;while(entry=entry?entry.n:this._f){f(entry.v,entry.k,this);// revert to the last existing entry
while(entry&&entry.r)entry=entry.p;}},// 23.1.3.7 Map.prototype.has(key)
// 23.2.3.7 Set.prototype.has(value)
has:function has(key){return !!getEntry(_validateCollection(this,NAME),key);}});if(_descriptors)dP$2(C.prototype,'size',{get:function(){return _validateCollection(this,NAME)[SIZE];}});return C;},def:function(that,key,value){var entry=getEntry(that,key);var prev,index;// change existing entry
if(entry){entry.v=value;// create new entry
}else{that._l=entry={i:index=fastKey(key,true),// <- index
k:key,// <- key
v:value,// <- value
p:prev=that._l,// <- previous entry
n:undefined,// <- next entry
r:false// <- removed
};if(!that._f)that._f=entry;if(prev)prev.n=entry;that[SIZE]++;// add to index
if(index!=='F')that._i[index]=entry;}return that;},getEntry:getEntry,setStrong:function(C,NAME,IS_MAP){// add .keys, .values, .entries, [@@iterator]
// 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11
_iterDefine(C,NAME,function(iterated,kind){this._t=_validateCollection(iterated,NAME);// target
this._k=kind;// kind
this._l=undefined;// previous
},function(){var that=this;var kind=that._k;var entry=that._l;// revert to the last existing entry
while(entry&&entry.r)entry=entry.p;// get next entry
if(!that._t||!(that._l=entry=entry?entry.n:that._t._f)){// or finish the iteration
that._t=undefined;return _iterStep(1);}// return step by kind
if(kind=='keys')return _iterStep(0,entry.k);if(kind=='values')return _iterStep(0,entry.v);return _iterStep(0,[entry.k,entry.v]);},IS_MAP?'entries':'values',!IS_MAP,true);// add [@@species], 23.1.2.2, 23.2.2.2
_setSpecies(NAME);}};var SPECIES$2=_wks('species');var _arraySpeciesConstructor=function(original){var C;if(_isArray(original)){C=original.constructor;// cross-realm fallback
if(typeof C=='function'&&(C===Array||_isArray(C.prototype)))C=undefined;if(_isObject(C)){C=C[SPECIES$2];if(C===null)C=undefined;}}return C===undefined?Array:C;};// 9.4.2.3 ArraySpeciesCreate(originalArray, length)
var _arraySpeciesCreate=function(original,length){return new(_arraySpeciesConstructor(original))(length);};// 0 -> Array#forEach
// 1 -> Array#map
// 2 -> Array#filter
// 3 -> Array#some
// 4 -> Array#every
// 5 -> Array#find
// 6 -> Array#findIndex
var _arrayMethods=function(TYPE,$create){var IS_MAP=TYPE==1;var IS_FILTER=TYPE==2;var IS_SOME=TYPE==3;var IS_EVERY=TYPE==4;var IS_FIND_INDEX=TYPE==6;var NO_HOLES=TYPE==5||IS_FIND_INDEX;var create=$create||_arraySpeciesCreate;return function($this,callbackfn,that){var O=_toObject($this);var self=_iobject(O);var f=_ctx(callbackfn,that,3);var length=_toLength(self.length);var index=0;var result=IS_MAP?create($this,length):IS_FILTER?create($this,0):undefined;var val,res;for(;length>index;index++)if(NO_HOLES||index in self){val=self[index];res=f(val,index,O);if(TYPE){if(IS_MAP)result[index]=res;// map
else if(res)switch(TYPE){case 3:return true;// some
case 5:return val;// find
case 6:return index;// findIndex
case 2:result.push(val);// filter
}else if(IS_EVERY)return false;// every
}}return IS_FIND_INDEX?-1:IS_SOME||IS_EVERY?IS_EVERY:result;};};var dP$3=_objectDp.f;var each=_arrayMethods(0);var _collection=function(NAME,wrapper,methods,common,IS_MAP,IS_WEAK){var Base=_global[NAME];var C=Base;var ADDER=IS_MAP?'set':'add';var proto=C&&C.prototype;var O={};if(!_descriptors||typeof C!='function'||!(IS_WEAK||proto.forEach&&!_fails(function(){new C().entries().next();}))){// create collection constructor
C=common.getConstructor(wrapper,NAME,IS_MAP,ADDER);_redefineAll(C.prototype,methods);_meta.NEED=true;}else{C=wrapper(function(target,iterable){_anInstance(target,C,NAME,'_c');target._c=new Base();if(iterable!=undefined)_forOf(iterable,IS_MAP,target[ADDER],target);});each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','),function(KEY){var IS_ADDER=KEY=='add'||KEY=='set';if(KEY in proto&&!(IS_WEAK&&KEY=='clear'))_hide(C.prototype,KEY,function(a,b){_anInstance(this,C,KEY);if(!IS_ADDER&&IS_WEAK&&!_isObject(a))return KEY=='get'?undefined:false;var result=this._c[KEY](a===0?0:a,b);return IS_ADDER?this:result;});});IS_WEAK||dP$3(C.prototype,'size',{get:function(){return this._c.size;}});}_setToStringTag(C,NAME);O[NAME]=C;_export(_export.G+_export.W+_export.F,O);if(!IS_WEAK)common.setStrong(C,NAME,IS_MAP);return C;};var MAP='Map';// 23.1 Map Objects
var es6_map=_collection(MAP,function(get){return function Map(){return get(this,arguments.length>0?arguments[0]:undefined);};},{// 23.1.3.6 Map.prototype.get(key)
get:function get(key){var entry=_collectionStrong.getEntry(_validateCollection(this,MAP),key);return entry&&entry.v;},// 23.1.3.9 Map.prototype.set(key, value)
set:function set(key,value){return _collectionStrong.def(_validateCollection(this,MAP),key===0?0:key,value);}},_collectionStrong,true);var _arrayFromIterable=function(iter,ITERATOR){var result=[];_forOf(iter,false,result.push,result,ITERATOR);return result;};// https://github.com/DavidBruant/Map-Set.prototype.toJSON
var _collectionToJson=function(NAME){return function toJSON(){if(_classof(this)!=NAME)throw TypeError(NAME+"#toJSON isn't generic");return _arrayFromIterable(this);};};// https://github.com/DavidBruant/Map-Set.prototype.toJSON
_export(_export.P+_export.R,'Map',{toJSON:_collectionToJson('Map')});// https://tc39.github.io/proposal-setmap-offrom/
var _setCollectionOf=function(COLLECTION){_export(_export.S,COLLECTION,{of:function of(){var length=arguments.length;var A=new Array(length);while(length--)A[length]=arguments[length];return new this(A);}});};// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of
_setCollectionOf('Map');// https://tc39.github.io/proposal-setmap-offrom/
var _setCollectionFrom=function(COLLECTION){_export(_export.S,COLLECTION,{from:function from(source/* , mapFn, thisArg */){var mapFn=arguments[1];var mapping,A,n,cb;_aFunction(this);mapping=mapFn!==undefined;if(mapping)_aFunction(mapFn);if(source==undefined)return new this();A=[];if(mapping){n=0;cb=_ctx(mapFn,arguments[2],2);_forOf(source,false,function(nextItem){A.push(cb(nextItem,n++));});}else{_forOf(source,false,A.push,A);}return new this(A);}});};// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from
_setCollectionFrom('Map');var map=_core.Map;var map$1=map;var arraySlice=[].slice;var factories={};var construct=function(F,len,args){if(!(len in factories)){for(var n=[],i=0;i<len;i++)n[i]='a['+i+']';// eslint-disable-next-line no-new-func
factories[len]=Function('F,a','return new F('+n.join(',')+')');}return factories[len](F,args);};var _bind=Function.bind||function bind(that/* , ...args */){var fn=_aFunction(this);var partArgs=arraySlice.call(arguments,1);var bound=function()/* args... */{var args=partArgs.concat(arraySlice.call(arguments));return this instanceof bound?construct(fn,args.length,args):_invoke(fn,args,that);};if(_isObject(fn.prototype))bound.prototype=fn.prototype;return bound;};// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])
var rConstruct=(_global.Reflect||{}).construct;// MS Edge supports only 2 arguments and argumentsList argument is optional
// FF Nightly sets third argument as `new.target`, but does not create `this` from it
var NEW_TARGET_BUG=_fails(function(){function F(){/* empty */}return !(rConstruct(function(){/* empty */},[],F)instanceof F);});var ARGS_BUG=!_fails(function(){rConstruct(function(){/* empty */});});_export(_export.S+_export.F*(NEW_TARGET_BUG||ARGS_BUG),'Reflect',{construct:function construct(Target,args/* , newTarget */){_aFunction(Target);_anObject(args);var newTarget=arguments.length<3?Target:_aFunction(arguments[2]);if(ARGS_BUG&&!NEW_TARGET_BUG)return rConstruct(Target,args,newTarget);if(Target==newTarget){// w/o altered newTarget, optimization for 0-4 arguments
switch(args.length){case 0:return new Target();case 1:return new Target(args[0]);case 2:return new Target(args[0],args[1]);case 3:return new Target(args[0],args[1],args[2]);case 4:return new Target(args[0],args[1],args[2],args[3]);}// w/o altered newTarget, lot of arguments case
var $args=[null];$args.push.apply($args,args);return new(_bind.apply(Target,$args))();}// with altered newTarget, not support built-in constructors
var proto=newTarget.prototype;var instance=_objectCreate(_isObject(proto)?proto:Object.prototype);var result=Function.apply.call(Target,instance,args);return _isObject(result)?result:instance;}});var construct$1=_core.Reflect.construct;var construct$2=construct$1;var construct$3=createCommonjsModule(function(module){function _construct$$1(Parent,args,Class){if(typeof Reflect!=="undefined"&&construct$2){module.exports=_construct$$1=construct$2;}else{module.exports=_construct$$1=function _construct$$1(Parent,args,Class){var a=[null];a.push.apply(a,args);var Constructor=Parent.bind.apply(Parent,a);var instance=new Constructor();if(Class)setPrototypeOf$2(instance,Class.prototype);return instance;};}return _construct$$1.apply(null,arguments);}module.exports=_construct$$1;});var wrapNativeSuper=createCommonjsModule(function(module){function _wrapNativeSuper$$1(Class){var _cache=typeof map$1==="function"?new map$1():undefined;module.exports=_wrapNativeSuper$$1=function _wrapNativeSuper$$1(Class){if(typeof Class!=="function"){throw new TypeError("Super expression must either be null or a function");}if(typeof _cache!=="undefined"){if(_cache.has(Class))return _cache.get(Class);_cache.set(Class,Wrapper);}function Wrapper(){}Wrapper.prototype=create$1(Class.prototype,{constructor:{value:Wrapper,enumerable:false,writable:true,configurable:true}});return setPrototypeOf$2(Wrapper,setPrototypeOf$2(function Super(){return construct$3(Class,arguments,getPrototypeOf$2(this).constructor);},Class));};return _wrapNativeSuper$$1(Class);}module.exports=_wrapNativeSuper$$1;});var CompositionError$1=/*#__PURE__*/function(_Error){function CompositionError(classInstance,message,component){var _this;classCallCheck(this,CompositionError);_this=possibleConstructorReturn(this,getPrototypeOf$2(CompositionError).call(this,"@".concat(classInstance,": ").concat(message)));var stackArray=_this.stack.split('\n');stackArray.splice(1,2);_this.stack=stackArray.join('\n');if(console)console.error('Component:',component);_this.name='CompositionError';return _this;}inherits(CompositionError,_Error);return CompositionError;}(wrapNativeSuper(Error));var DependencyError=/*#__PURE__*/function(_Error2){function DependencyError(classInstance,message,activeModule){var _this2;var dependencyModule=arguments.length>3&&arguments[3]!==undefined?arguments[3]:false;classCallCheck(this,DependencyError);_this2=possibleConstructorReturn(this,getPrototypeOf$2(DependencyError).call(this,"@".concat(classInstance,": ").concat(message)));var stackArray=_this2.stack.split('\n');stackArray.splice(1,2);_this2.stack=stackArray.join('\n');if(console)console.error('Active module:',activeModule);if(console&&dependencyModule)console.error('Dependency published by module:',dependencyModule);_this2.name='DependencyError';return _this2;}inherits(DependencyError,_Error2);return DependencyError;}(wrapNativeSuper(Error));var ManagerError=/*#__PURE__*/function(_Error3){function ManagerError(classInstance,message,component){var _this3;var activeModule=arguments.length>3&&arguments[3]!==undefined?arguments[3]:false;classCallCheck(this,ManagerError);_this3=possibleConstructorReturn(this,getPrototypeOf$2(ManagerError).call(this,"@".concat(classInstance,": ").concat(message)));var stackArray=_this3.stack.split('\n');stackArray.splice(1,2);_this3.stack=stackArray.join('\n');if(console)console.error('Component:',component);if(console&&activeModule)console.error('Active module:',activeModule);_this3.name='ManagerError';return _this3;}inherits(ManagerError,_Error3);return ManagerError;}(wrapNativeSuper(Error));var warnDeps=function warnDeps(){throw new Error('WhitestormJS Framework requ ires Three.js r92. https://threejs.org/');};try{}catch(err){warnDeps();}/**
* @class ModuleSystem
* @category core
* @description Provides API for classes that will use Modules.<br/>
* This class includes basic event system with those supported methods:
* <pre>.on()</pre><pre>.off()</pre><pre>.emit()</pre>
* @extends Events
* @memberof module:core
*/var ModuleSystem=/*#__PURE__*/function(_Events){function ModuleSystem(){classCallCheck(this,ModuleSystem);return possibleConstructorReturn(this,getPrototypeOf$2(ModuleSystem).apply(this,arguments));}createClass(ModuleSystem,[{key:"integrateModules",// INTEGRATING
/**
* @method integrateModules
* @instance
* @description This method applies all modules from .modules collection.
* @param {Object} [source] If source (should be a component) is provided, will replace .modules with source's one before executing modules.
* @memberof module:core.ModuleSystem
*/value:function integrateModules(source){if(!this.modules&&!source)return;if(source&&source.modules)this.modules=source.modules.slice(0);if(this.modules){for(var i=0,max=this.modules.length;i<max;i++){this.applyModule(this.modules[i],false);}}if(source)this.applyBridge({onCopy:source});}// APPLYING MODULE (...and a "bridge" for module)
/**
* @method applyBridge
* @instance
* @description Makes component-specific API to work with modules.
* @param {Object} bridgeMap
* @return {Object} Returns object with modified values.
* @memberof module:core.ModuleSystem
*/},{key:"applyBridge",value:function applyBridge(){var bridgeMap=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var modules=this.modules;if(!modules)return bridgeMap;for(var i=0,max=modules.length;i<max;i++){for(var key in bridgeMap){if(bridgeMap[key]){var module=modules[i];if(module&&module.bridge&&module.bridge[key])bridgeMap[key]=module.bridge[key].apply(this,[bridgeMap[key],module]);}}}return bridgeMap;}/**
* @method applyCommand
* @instance
* @description .applyCommand runs a method called `name` on all modules.
* @param {String} name the method name.
* @param {Function} [cb=(func, moduleScope) => func.apply(this, [moduleScope])] How the function is wrapped/
* @memberof module:core.ModuleSystem
*/},{key:"applyCommand",value:function applyCommand(name){var _this=this;var cb=arguments.length>1&&arguments[1]!==undefined?arguments[1]:function(func,moduleScope){return func.apply(_this,[moduleScope]);};var modules=this.modules;if(!modules)return;for(var i=0,max=modules.length;i<max;i++){var module=modules[i];if(name in module)cb(module[name],module);}}/**
* @method applyModule
* @instance
* @description .applyModule is also used in .integrateModules() function.
* It does exactly what its name says (applies module to component or app).
* @param {Object} module the module to apply
* @param {Boolean} [push=true]
* @return {Object} Returns module that was applied.
* @throws {ManagerError}
* @memberof module:core.ModuleSystem
*/},{key:"applyModule",value:function applyModule(module){var push=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;if(!module)return;if(push&&this.modules)this.modules.push(module);else if(push)this.modules=[module];if(this.manager)this.manager.active(module);if(module.manager&&this.manager)module.manager(this.manager);else if(module.manager){throw new ManagerError('Component',"Module requires ModuleManager that is turned off for this component",this,module);}if(module.integrate)module.integrate.bind(this)(module);return module;}/**
* @method disposeModules
* @instance
* @description Disposes of all modules
* @memberof module:core.ModuleSystem
*/},{key:"disposeModules",value:function disposeModules(){while(this.modules.length){this.disposeModule(this.modules[0]);}}/**
* @method disposeModule
* @instance
* @description Disposes of the given module
* @param {Object} module the module to dispose
* @return {Module} Returns module that was removed.
* @memberof module:core.ModuleSystem
*/},{key:"disposeModule",value:function disposeModule(module){if(!module)return;this.modules.splice(this.modules.indexOf(module),1);if(module.dispose)module.dispose.bind(this)(module);return module;}// PIPED METHOD
/**
* @method module
* @instance
* @description piped version of .applyModule().
* @param {Object} module the module to apply
* @return {this} returns this - app/component
* @throws {ManagerError}
* @memberof module:core.ModuleSystem
* @example <caption>Piped modules</caption>
* component
* .module(new Module1())
* .module(new Module2())
* .module(new Module3())
*/},{key:"module",value:function module(_module){this.applyModule(_module);return this;}}]);inherits(ModuleSystem,_Events);return ModuleSystem;}(minivents_commonjs);function _arrayWithHoles$1(arr){if(Array.isArray(arr))return arr;}var arrayWithHoles=_arrayWithHoles$1;var core_getIterator=_core.getIterator=function(it){var iterFn=core_getIteratorMethod(it);if(typeof iterFn!='function')throw TypeError(it+' is not iterable!');return _anObject(iterFn.call(it));};var getIterator=core_getIterator;var getIterator$1=getIterator;function _iterableToArrayLimit$1(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=getIterator$1(arr),_s;!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break;}}catch(err){_d=true;_e=err;}finally{try{if(!_n&&_i["return"]!=null)_i["return"]();}finally{if(_d)throw _e;}}return _arr;}var iterableToArrayLimit=_iterableToArrayLimit$1;function _nonIterableRest$1(){throw new TypeError("Invalid attempt to destructure non-iterable instance");}var nonIterableRest=_nonIterableRest$1;function _slicedToArray$1(arr,i){return arrayWithHoles(arr)||iterableToArrayLimit(arr,i)||nonIterableRest();}var slicedToArray=_slicedToArray$1;function symbolObservablePonyfill(root){var result;var Symbol=root.Symbol;if(typeof Symbol==='function'){if(Symbol.observable){result=Symbol.observable;}else{result=Symbol('observable');Symbol.observable=result;}}else{result='@@observable';}return result;}/* global window */var root;if(typeof self!=='undefined'){root=self;}else if(typeof window!=='undefined'){root=window;}else if(typeof global!=='undefined'){root=global;}else if(typeof module!=='undefined'){root=module;}else{root=Function('return this')();}var result=symbolObservablePonyfill(root);/**
* These are private action types reserved by Redux.
* For any unknown actions, you must return the current state.
* If the current state is undefined, you must return the initial state.
* Do not reference these action types directly in your code.
*/var ActionTypes={INIT:'@@redux/INIT'+Math.random().toString(36).substring(7).split('').join('.'),REPLACE:'@@redux/REPLACE'+Math.random().toString(36).substring(7).split('').join('.')};var _typeof$1=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};/**
* @param {any} obj The object to inspect.
* @returns {boolean} True if the argument appears to be a plain object.
*/function isPlainObject(obj){if((typeof obj==='undefined'?'undefined':_typeof$1(obj))!=='object'||obj===null)return false;var proto=obj;while(Object.getPrototypeOf(proto)!==null){proto=Object.getPrototypeOf(proto);}return Object.getPrototypeOf(obj)===proto;}/**
* Creates a Redux store that holds the state tree.
* The only way to change the data in the store is to call `dispatch()` on it.
*
* There should only be a single store in your app. To specify how different
* parts of the state tree respond to actions, you may combine several reducers
* into a single reducer function by using `combineReducers`.
*
* @param {Function} reducer A function that returns the next state tree, given
* the current state tree and the action to handle.
*
* @param {any} [preloadedState] The initial state. You may optionally specify it
* to hydrate the state from the server in universal apps, or to restore a
* previously serialized user session.
* If you use `combineReducers` to produce the root reducer function, this must be
* an object with the same shape as `combineReducers` keys.
*
* @param {Function} [enhancer] The store enhancer. You may optionally specify it
* to enhance the store with third-party capabilities such as middleware,
* time travel, persistence, etc. The only store enhancer that ships with Redux
* is `applyMiddleware()`.
*
* @returns {Store} A Redux store that lets you read the state, dispatch actions
* and subscribe to changes.
*/function createStore(reducer,preloadedState,enhancer){var _ref2;if(typeof preloadedState==='function'&&typeof enhancer==='undefined'){enhancer=preloadedState;preloadedState=undefined;}if(typeof enhancer!=='undefined'){if(typeof enhancer!=='function'){throw new Error('Expected the enhancer to be a function.');}return enhancer(createStore)(reducer,preloadedState);}if(typeof reducer!=='function'){throw new Error('Expected the reducer to be a function.');}var currentReducer=reducer;var currentState=preloadedState;var currentListeners=[];var nextListeners=currentListeners;var isDispatching=false;function ensureCanMutateNextListeners(){if(nextListeners===currentListeners){nextListeners=currentListeners.slice();}}/**
* Reads the state tree managed by the store.
*
* @returns {any} The current state tree of your application.
*/function getState(){if(isDispatching){throw new Error('You may not call store.getState() while the reducer is executing. '+'The reducer has already received the state as an argument. '+'Pass it down from the top reducer instead of reading it from the store.');}return currentState;}/**
* Adds a change listener. It will be called any time an action is dispatched,
* and some part of the state tree may potentially have changed. You may then
* call `getState()` to read the current state tree inside the callback.
*
* You may call `dispatch()` from a change listener, with the following
* caveats:
*
* 1. The subscriptions are snapshotted just before every `dispatch()` call.
* If you subscribe or unsubscribe while the listeners are being invoked, this
* will not have any effect on the `dispatch()` that is currently in progress.
* However, the next `dispatch()` call, whether nested or not, will use a more
* recent snapshot of the subscription list.
*
* 2. The listener should not expect to see all state changes, as the state
* might have been updated multiple times during a nested `dispatch()` before
* the listener is called. It is, however, guaranteed that all subscribers
* registered before the `dispatch()` started will be called with the latest
* state by the time it exits.
*
* @param {Function} listener A callback to be invoked on every dispatch.
* @returns {Function} A function to remove this change listener.
*/function subscribe(listener){if(typeof listener!=='function'){throw new Error('Expected the listener to be a function.');}if(isDispatching){throw new Error('You may not call store.subscribe() while the reducer is executing. '+'If you would like to be notified after the store has been updated, subscribe from a '+'component and invoke store.getState() in the callback to access the latest state. '+'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');}var isSubscribed=true;ensureCanMutateNextListeners();nextListeners.push(listener);return function unsubscribe(){if(!isSubscribed){return;}if(isDispatching){throw new Error('You may not unsubscribe from a store listener while the reducer is executing. '+'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');}isSubscribed=false;ensureCanMutateNextListeners();var index=nextListeners.indexOf(listener);nextListeners.splice(index,1);};}/**
* Dispatches an action. It is the only way to trigger a state change.
*
* The `reducer` function, used to create the store, will be called with the
* current state tree and the given `action`. Its return value will
* be considered the **next** state of the tree, and the change listeners
* will be notified.
*
* The base implementation only supports plain object actions. If you want to
* dispatch a Promise, an Observable, a thunk, or something else, you need to
* wrap your store creating function into the corresponding middleware. For
* example, see the documentation for the `redux-thunk` package. Even the
* middleware will eventually dispatch plain object actions using this method.
*
* @param {Object} action A plain object representing “what changed”. It is
* a good idea to keep actions serializable so you can record and replay user
* sessions, or use the time travelling `redux-devtools`. An action must have
* a `type` property which may not be `undefined`. It is a good idea to use
* string constants for action types.
*
* @returns {Object} For convenience, the same action object you dispatched.
*
* Note that, if you use a custom middleware, it may wrap `dispatch()` to
* return something else (for example, a Promise you can await).
*/function dispatch(action){if(!isPlainObject(action)){throw new Error('Actions must be plain objects. '+'Use custom middleware for async actions.');}if(typeof action.type==='undefined'){throw new Error('Actions may not have an undefined "type" property. '+'Have you misspelled a constant?');}if(isDispatching){throw new Error('Reducers may not dispatch actions.');}try{isDispatching=true;currentState=currentReducer(currentState,action);}finally{isDispatching=false;}var listeners=currentListeners=nextListeners;for(var i=0;i<listeners.length;i++){var listener=listeners[i];listener();}return action;}/**
* Replaces the reducer currently used by the store to calculate the state.
*
* You might need this if your app implements code splitting and you want to
* load some of the reducers dynamically. You might also need this if you
* implement a hot reloading mechanism for Redux.
*
* @param {Function} nextReducer The reducer for the store to use instead.
* @returns {void}
*/function replaceReducer(nextReducer){if(typeof nextReducer!=='function'){throw new Error('Expected the nextReducer to be a function.');}currentReducer=nextReducer;dispatch({type:ActionTypes.REPLACE});}/**
* Interoperability point for observable/reactive libraries.
* @returns {observable} A minimal observable of state changes.
* For more information, see the observable proposal:
* https://github.com/tc39/proposal-observable
*/function observable(){var _ref;var outerSubscribe=subscribe;return _ref={/**
* The minimal observable subscription method.
* @param {Object} observer Any object that can be used as an observer.
* The observer object should have a `next` method.
* @returns {subscription} An object with an `unsubscribe` method that can
* be used to unsubscribe the observable from the store, and prevent further
* emission of values from the observable.
*/subscribe:function subscribe(observer){if((typeof observer==='undefined'?'undefined':_typeof$1(observer))!=='object'||observer===null){throw new TypeError('Expected the observer to be an object.');}function observeState(){if(observer.next){observer.next(getState());}}observeState();var unsubscribe=outerSubscribe(observeState);return {unsubscribe:unsubscribe};}},_ref[result]=function(){return this;},_ref;}// When a store is created, an "INIT" action is dispatched so that every
// reducer returns their initial state. This effectively populates
// the initial state tree.
dispatch({type:ActionTypes.INIT});return _ref2={dispatch:dispatch,subscribe:subscribe,getState:getState,replaceReducer:replaceReducer},_ref2[result]=observable,_ref2;}/**
* @class ModuleManager
* @category core
* @param {Object} object handler
* @description Solves modules dependencies
* @memberof module:core
*/var ModuleManager=/*#__PURE__*/function(){function ModuleManager(object){classCallCheck(this,ModuleManager);this.handler=object;this.currentModule=null;this.store=createStore(function(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[{},''];var action=arguments.length>1?arguments[1]:undefined;state[0][action.key]=action.data;state[1]=action.key;return state;});this.modules={};}/**
* @method active
* @instance
* @description Sets .currentModule to provided module.
* @param {Object} module the module to make current
* @memberof module:core.ModuleManager
*/createClass(ModuleManager,[{key:"active",value:function active(module){this.currentModule=module;}/**
* @method reset
* @instance
* @description Set's .currentModule to null.
* @memberof module:core.ModuleManager
*/},{key:"reset",value:function reset(){this.currentModule=null;}/**
* @method define
* @instance
* @description Define the module in manager
* @param name The module name
* @memberof module:core.ModuleManager
*/},{key:"define",value:function define(name){this.modules[name]=this.currentModule;}/**
* @method use
* @instance
* @description Get the defined module from manager
* @param name The module name
* @memberof module:core.ModuleManager
*/},{key:"use",value:function use(name){return this.modules[name];}/**
* @method set
* @instance
* @description An alias for .add() <br/><br/>
* Use this method if you know that you will overwrite existing dependency.<br/>
* Use it in your app, but not in module that you provide to other people.
* @param {String} key the key of the dependency
* @param {Object} data the value of the dependency
* @memberof module:core.ModuleManager
*/},{key:"set",value:function set(key,data){this.store.dispatch({type:'ADD',key:key,data:data});}/**
* @method get
* @instance
* @description Returns dependency in store object, by key.
* @param {String} key the key of the dependency
* @memberof module:core.ModuleManager
* @return {Object|Module}
* @throws {DependencyError} if dependency is not in the store
* @example <caption>Get the 'hello' dependency</caption>
* manager.get('hello'); // -> {world: true}
*/},{key:"get",value:function get(key){if(!this.store.getState()[0][key]){throw new DependencyError('ModuleManager',"Module requires '".concat(key,"' dependency"),this.currentModule);}return this.store.getState()[0][key];}/**
* @method has
* @instance
* @description Returns whether manager has a dependency with the given key
* @param {String} key the key of the dependency
* @memberof module:core.ModuleManager
* @return {Boolean} Promise that is resolved when all promises completed.
* @example <caption>Check whether the store has the 'hello' dependency</caption>
* manager.has('hello'); // -> true
*/},{key:"has",value:function has(key){return Boolean(this.store.getState()[0][key]);}/**
* @method update
* @instance
* @description Updates deps
* @param {Object} [depsMap={}]
* @memberof module:core.ModuleManager
*/},{key:"update",value:function update(){var _this=this;var depsMap=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};this.store.subscribe(function(){var _this$store$getState=_this.store.getState(),_this$store$getState2=slicedToArray(_this$store$getState,2),data=_this$store$getState2[0],changedKey=_this$store$getState2[1];var callback=depsMap[changedKey];if(callback)callback(data[changedKey]);});}/**
* @method add
* @alias module:core.ModuleManager#set
* @memberof module:core.ModuleManager
*/},{key:"add",value:function add(){console.warn('.add() method is deprecated. Use .set() instead');return this.set.apply(this,arguments);}/**
* @method require
* @instance
* @description Require module
* @param {String} name Defined name
* @param {Function} moduleExecutor Function that returns applied module
* @memberof module:core.ModuleManager
*/},{key:"require",value:function require(name,moduleExecutor){if(this.use(name)===undefined)this.handler.applyModule(moduleExecutor());}}]);return ModuleManager;}();/**
* @class Component
* @category core
* @param {Object} [params] - The parameters object.
* @param {Object} [instructions] - The instructions object.
* @extends ModuleSystem
* @memberof module:core
*/var Component=/*#__PURE__*/function(_ModuleSystem){/**
* Default values for parameters
* @member {Object} module:core.Component#defaults
* @static
* @default {
* modules: [],
* manager: true
* }
*/ /**
* Static instructions
* @member {Object} module:core.Component#instructions
* @static
* @default {}
*/ /**
* Array of promises that should be resolved before Component is ready.
* @member {Array} module:core.Component#_wait
* @private
*/ // Collection of promises;
/**
* Collection of `modules`.
* @member {Array} module:core.Component#modules
* @public
*/ // Collection of modules;
/**
* Collection of `child` Components.
* @member {Array} module:core.Component#children
* @public
*/ // For keeping children components;
function Component(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var defaults=arguments.length>1&&arguments[1]!==undefined?arguments[1]:Component.defaults;var instructions=arguments.length>2&&arguments[2]!==undefined?arguments[2]:Component.instructions;classCallCheck(this,Component);_this=possibleConstructorReturn(this,getPrototypeOf$2(Component).call(this));// Apply polyfilled parameters to .params;
defineProperty$3(defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)),"_wait",[]),"modules",[]),"children",[]);_this.params=extend(transformData(params,instructions),defaults);if(_this.params.manager)_this.manager=new ModuleManager(assertThisInitialized(assertThisInitialized(_this)));_this.modules=_this.params.modules;_this.integrateModules();return _this;}/**
* @method wait
* @instance
* @description Wait for a promise.
* @param {Promise} [promise] - The promise that should be added to a queue.
* @return {Promise} Promise that is resolved when all promises completed.
* @memberof module:core.Component
*/createClass(Component,[{key:"wait",value:function wait(promise){if(promise)this._wait.push(promise);return Promise.all(this._wait);}/**
* @method defer
* @instance
* @description Execute `func` (Callback) when Component is ready.
* @param {Function} func - Callback.
* @memberof module:core.Component
*/},{key:"defer",value:function defer(func){var _this2=this;if(this.isDeffered)this.wait().then(function(){return func(_this2);});else func(this);}// PARAMETERS
/**
* @method updateParams
* @instance
* @description Updates parameters of the Component.
* @return {Object} Params of this Component
* @memberof module:core.Component
*/},{key:"updateParams",value:function updateParams(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};this.params=extend(params,this.params);return this.params;}// COPYING & CLONING
/**
* @method clone
* @instance
* @description Clone this component
* @return {object} a cloned component with all its source component' params copied.
* @memberof module:core.Component
*/},{key:"clone",value:function clone(){return new this.constructor(this.params).copy(this);}/**
* @method copy
* @instance
* @description Copy source native and integrate `modules` to it.
* @param {Component} source - Source component that is used for `copy()` action.
* @param {Function} [customize] - Callback executed before modules integration process.
* @return {this} Component
* @memberof module:core.Component
*/},{key:"copy",value:function copy(source,customize){this.params=objectSpread({},source.params);if(source.native)this.native=source.native.clone(source.params);if(customize)customize();this.integrateModules(source);return this;}/**
* @method add
* @instance
* @description Add a child `Component`.
* @param {Component} object - Component that should be added as a `child`.
* @return {Promise} Resolved when action is done.
* @memberof module:core.Component
*/},{key:"add",value:function(){var _add=asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee(object){return regenerator.wrap(function _callee$(_context){while(1){switch(_context.prev=_context.next){case 0:if(!object.parent){_context.next=3;break;}_context.next=3;return object.parent.remove(object);case 3:_context.next=5;return this.wait();case 5:_context.next=7;return object.wait();case 7:if(object.native){_context.next=9;break;}throw new CompositionError$1('Component','there is no object.native',this);case 9:object.parent=this;_context.next=12;return this.applyBridge({onAdd:object}).onAdd;case 12:this.native.add(object.native);this.children.push(object);return _context.abrupt("return",object);case 15:case"end":return _context.stop();}}},_callee,this);}));return function add(_x){return _add.apply(this,arguments);};}()/**
* @method remove
* @instance
* @description Remove a child `Component`.
* @param {Component} object - Component that should be a **child** of this Component.
* @return {Promise} Resolved when action is done.
* @memberof module:core.Component
*/},{key:"remove",value:function(){var _remove=asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee2(object){return regenerator.wrap(function _callee2$(_context2){while(1){switch(_context2.prev=_context2.next){case 0:if(!(object.parent!==this)){_context2.next=2;break;}return _context2.abrupt("return");case 2:_context2.next=4;return this.wait();case 4:_context2.next=6;return object.wait();case 6:object.parent=null;this.native.remove(object.native);this.children.splice(this.children.indexOf(object),1);case 9:case"end":return _context2.stop();}}},_callee2,this);}));return function remove(_x2){return _remove.apply(this,arguments);};}()/**
* @method addTo
* @instance
* @description Adds `this` Component to specified `App`/`Component`.
* @param {Component} object - Component that will be a parent of `this`.
* @memberof module:core.Component
*/},{key:"addTo",value:function addTo(object){return object.add(this);}},{key:"get",value:function get(key){return this.manager.get(key);}},{key:"use",value:function use(key){return this.manager.use(key);}/**
* Returns whether the object is `async` (`wait` promises are more than `0`).
* @member {Boolean} module:core.Component#isDeffered
*/},{key:"isDeffered",get:function get(){return this._wait.length>0;}/**
* Returns the `ModuleManager` used for this component.
* @member {ModuleManager} module:core.Component#manager
* @throws {ManagerError}
*/},{key:"manager",get:function get(){if(this._manager)return this._manager;throw new ManagerError('Component',"ModuleManager is not used in this component. 'manager' parameter should be set as 'true'",this);},set:function set(manager){this._manager=manager;}/**
* Returns the `native` object used for this component.
* @member {Object} module:core.Component#native
*/},{key:"native",get:function get(){return this._native;},set:function set(mesh){this._native=mesh;this._native.component=this;return this._native;}}]);inherits(Component,_ModuleSystem);return Component;}(ModuleSystem);defineProperty$3(defineProperty$3(Component,"defaults",{modules:null,manager:true}),"instructions",{});// 26.1.6 Reflect.get(target, propertyKey [, receiver])
function get(target,propertyKey/* , receiver */){var receiver=arguments.length<3?target:arguments[2];var desc,proto;if(_anObject(target)===receiver)return target[propertyKey];if(desc=_objectGopd.f(target,propertyKey))return _has(desc,'value')?desc.value:desc.get!==undefined?desc.get.call(receiver):undefined;if(_isObject(proto=_objectGpo(target)))return get(proto,propertyKey,receiver);}_export(_export.S,'Reflect',{get:get});var get$1=_core.Reflect.get;var get$2=get$1;function _superPropBase$1(object,property){while(!Object.prototype.hasOwnProperty.call(object,property)){object=getPrototypeOf$2(object);if(object===null)break;}return object;}var superPropBase=_superPropBase$1;var get$3=createCommonjsModule(function(module){function _get$$1(target,property,receiver){if(typeof Reflect!=="undefined"&&get$2){module.exports=_get$$1=get$2;}else{module.exports=_get$$1=function _get$$1(target,property,receiver){var base=superPropBase(target,property);if(!base)return;var desc=getOwnPropertyDescriptor$1(base,property);if(desc.get){return desc.get.call(receiver);}return desc.value;};}return _get$$1(target,property,receiver||target);}module.exports=_get$$1;});function attributes(){for(var _len=arguments.length,mappers=new Array(_len),_key=0;_key<_len;_key++){mappers[_key]=arguments[_key];}return function(target){for(var i=0;i<mappers.length;i++){var mapper=mappers[i];for(var k=0;k<mapper.map.length;k++){var attribute=mapper.map[k];Object.defineProperty(target.prototype,attribute,{get:mapper.getter(attribute),set:mapper.setter(attribute),configurable:mapper.configurable,enumerable:mapper.enumerable});}}};}function copy(){for(var _len2=arguments.length,map=new Array(_len2),_key2=0;_key2<_len2;_key2++){map[_key2]=arguments[_key2];}return {map:map,getter:function getter(name){return function(){return this.native[name];};},setter:function setter(name){return function(value){this.native[name].copy(value);};},configurable:true,enumerable:true};}function mirror(){for(var _len3=arguments.length,map=new Array(_len3),_key3=0;_key3<_len3;_key3++){map[_key3]=arguments[_key3];}return {map:map,getter:function getter(name){return function(){return this.native[name];};},setter:function setter(name){return function(value){this.native[name]=value;};},configurable:true,enumerable:true};}var _dec,_class;var/**
* @class MeshComponent
* @category core
* @param {Object} [params] - The parameters object.
* @param {Object} [instructions] - The instructions object.
* @extends module:core.Component
* @memberof module:core
*/MeshComponent=(_dec=attributes(copy('position','rotation','quaternion','scale'),mirror('material','geometry')),_dec(_class=/*#__PURE__*/function(_Component){createClass(MeshComponent,null,[{key:"custom",/**
* Default values for parameters
* @member {Object} module:core.MeshComponent#defaults
* @static
* @default
* {
* build: true,
* geometry: {},
* material: false,
*
* shadow: {
* cast: true,
* receive: true
* },
*
* position: {x: 0, y: 0, z: 0},
* rotation: {x: 0, y: 0, z: 0},
* scale: {x: 1, y: 1, z: 1}
* }
*/ /**
* Static instructions
* @member {Object} module:core.MeshComponent#instructions
* @static
* @default
* {
* position: ['x', 'y', 'z'],
* rotation: ['x', 'y', 'z'],
* scale: ['x', 'y', 'z']
* }
*/ // CUSTOM GEOMETRY HANDLING
value:function custom(geom){var constructor=arguments.length>1&&arguments[1]!==undefined?arguments[1]:Mesh;return(/*#__PURE__*/function(_MeshComponent){function _class2(){classCallCheck(this,_class2);return possibleConstructorReturn(this,getPrototypeOf$2(_class2).apply(this,arguments));}createClass(_class2,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:geom,material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new constructor(geometry,material)}).mesh;}}]);inherits(_class2,_MeshComponent);return _class2;}(MeshComponent));}},{key:"create",value:function create(geom,params,constructor){return new(MeshComponent.custom(geom,constructor))(params);}},{key:"from",value:function from(mesh){var params=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};params.build=false;var component=new MeshComponent(params);component.native=mesh;component.wrap();return component;}}]);function MeshComponent(params){var _this;var defaults=arguments.length>1&&arguments[1]!==undefined?arguments[1]:MeshComponent.defaults;var instructions=arguments.length>2&&arguments[2]!==undefined?arguments[2]:MeshComponent.instructions;classCallCheck(this,MeshComponent);_this=possibleConstructorReturn(this,getPrototypeOf$2(MeshComponent).call(this,params,defaults,instructions));if(_this.params.build){var build=_this.build(_this.params);if(!build){throw new CompositionError$1('MeshComponent','.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.',assertThisInitialized(assertThisInitialized(_this)));}if(build instanceof Promise){_this.wait(build);_this.wait(new Promise(function(resolve){build.then(function(native){_this.native=native;_this.wrap().then(resolve);});}));}else{_this.native=build;_this.wait(_this.wrap());}}_this.applyCommand('postIntegrate');return _this;}// BUILDING & WRAPPING
/**
* @method build
* @description Build livecycle should return a native object.
* @throws {CompositionError}
* @memberof module:core.MeshComponent
*/createClass(MeshComponent,[{key:"build",value:function build(){throw new CompositionError$1('MeshComponent','Instance should have it\'s own .build().',this);}/**
* @method wrap
* @instance
* @description Wraps transforms (`position` & `rotation`)
* @return {Promise} Resolved when action is completed
* @memberof module:core.MeshComponent
*/},{key:"wrap",value:function wrap(){var _this2=this;return new Promise(function(resolve){// TODO: Fix defer with physics
// this.defer(() => {
var _this2$params=_this2.params,position=_this2$params.position,rotation=_this2$params.rotation,scale=_this2$params.scale,shadow=_this2$params.shadow;_this2.position.set(position.x,position.y,position.z);_this2.rotation.set(rotation.x,rotation.y,rotation.z);_this2.scale.set(scale.x,scale.y,scale.z);_this2.native.castShadow=shadow.cast;_this2.native.receiveShadow=shadow.receive;_this2.applyBridge({onWrap:1});resolve(_this2);// });
});}// COPYING & CLONING
/**
* @method copy
* @instance
* @description Copy source transforms & execute `Component.copy()`
* @return {this} MeshComponent
* @memberof module:core.MeshComponent
*/},{key:"copy",value:function copy$$1(source){var _this3=this;return get$3(getPrototypeOf$2(MeshComponent.prototype),"copy",this).call(this,source,function(){_this3.position.copy(source.position);_this3.rotation.copy(source.rotation);_this3.quaternion.copy(source.quaternion);});}/**
* @method clone
* @instance
* @description Make a clone of this MeshComponent using `.copy()`
* @return {MeshComponent} clone of this object
* @memberof module:core.MeshComponent
*/},{key:"clone",value:function clone(geometry,material){var dest=new this.constructor({build:false}).copy(this);if(geometry)dest.geometry=dest.geometry.clone();if(material)dest.material=dest.material.clone();return dest;}}]);inherits(MeshComponent,_Component);return MeshComponent;}(Component))||_class);defineProperty$3(defineProperty$3(MeshComponent,"defaults",objectSpread({},Component.defaults,{build:true,geometry:{},material:false,shadow:{cast:true,receive:true},position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0},scale:{x:1,y:1,z:1}})),"instructions",{position:['x','y','z'],rotation:['x','y','z'],scale:['x','y','z']});var _dec$1,_class$1;var/**
* @class LightComponent
* @category core
* @param {Object} [params] - The parameters object.
* @param {Object} [instructions] - The instructions object.
* @extends module:core.Component
* @memberof module:core
*/LightComponent=(_dec$1=attributes(copy('position','rotation','quaternion','target')),_dec$1(_class$1=/*#__PURE__*/function(_Component){createClass(LightComponent,null,[{key:"from",/**
* Default values for parameters
* @member {Object} module:core.LightComponent#defaults
* @static
* @default
* {
* build: true,
*
* shadow: {
* cast: true,
*
* bias: 0,
* radius: 1,
*
* mapSize: {
* width: 1024,
* height: 1024
* },
*
* camera: {
* near: true,
* far: 400,
* fov: 90,
*
* top: 200,
* bottom: -200,
* left: -200,
* right: 200
* }
* },
*
* position: {x: 0, y: 0, z: 0},
* rotation: {x: 0, y: 0, z: 0}
* }
*/ /**
* Static instructions
* @member {Object} module:core.LightComponent#instructions
* @static
* @default
* {
* position: ['x', 'y', 'z'],
* rotation: ['x', 'y', 'z']
* }
*/value:function from(light){var params=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var wrapShadow=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;params.build=false;var component=new LightComponent(params);component.native=light;component.wrap();if(wrapShadow)component.wrapShadow();return component;}}]);function LightComponent(params){var _this;var defaults=arguments.length>1&&arguments[1]!==undefined?arguments[1]:LightComponent.defaults;var instructions=arguments.length>2&&arguments[2]!==undefined?arguments[2]:LightComponent.instructions;classCallCheck(this,LightComponent);_this=possibleConstructorReturn(this,getPrototypeOf$2(LightComponent).call(this,params,defaults,instructions));if(_this.params.build){var build=_this.build(_this.params);if(!build){throw new CompositionError$1('LightComponent','.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.',assertThisInitialized(assertThisInitialized(_this)));}if(build instanceof Promise){build.then(function(native){_this.native=native;});}else _this.native=build;_this.wait(_this.wrap());}_this.applyCommand('postIntegrate');return _this;}// BUILDING & WRAPPING
/**
* @method build
* @instance
* @description Build livecycle should return a native object.
* @throws {CompositionError}
* @memberof module:core.LightComponent
*/createClass(LightComponent,[{key:"build",value:function build(){throw new CompositionError$1('MeshComponent','Instance should have it\'s own .build().',this);}/**
* @method wrap
* @instance
* @description Wraps transforms (`position` & `rotation`)
* @return {Promise} Resolved when action is completed
* @memberof module:core.LightComponent
*/},{key:"wrap",value:function wrap(){var _this2=this;return new Promise(function(resolve){_this2.defer(function(){var _this2$params=_this2.params,position=_this2$params.position,rotation=_this2$params.rotation;_this2.position.set(position.x,position.y,position.z);_this2.rotation.set(rotation.x,rotation.y,rotation.z);_this2.applyBridge({onWrap:1});resolve(_this2);});});}/**
* @method wrapShadow
* @instance
* @description Wraps shadow properties
* @memberof module:core.LightComponent
*/},{key:"wrapShadow",value:function wrapShadow(){var native=this.native,shadow=this.params.shadow;native.castShadow=shadow.cast;native.shadow.mapSize.width=shadow.mapSize.width;native.shadow.mapSize.height=shadow.mapSize.height;native.shadow.bias=shadow.bias;native.shadow.radius=shadow.radius;var shadowCamera=native.shadow.camera;var camera=shadow.camera;shadowCamera.near=camera.near;shadowCamera.far=camera.far;shadowCamera.fov=camera.fov;shadowCamera.left=camera.left;shadowCamera.right=camera.right;shadowCamera.top=camera.top;shadowCamera.bottom=camera.bottom;}// COPYING & CLONING
/**
* @method copy
* @instance
* @description Copy source transforms & execute `Component.copy()`
* @return {this} LightComponent
* @memberof module:core.LightComponent
*/},{key:"copy",value:function copy$$1(source){var _this3=this;return get$3(getPrototypeOf$2(LightComponent.prototype),"copy",this).call(this,source,function(){if(_this3.target)_this3.target.copy(source.target());_this3.position.copy(source.position);_this3.rotation.copy(source.rotation);_this3.quaternion.copy(source.quaternion);});}/**
* @method clone
* @instance
* @description Make a clone of this LightComponent using `.copy()`
* @return {LightComponent} clone of this object
* @memberof module:core.LightComponent
*/},{key:"clone",value:function clone(){return new this.constructor({build:false}).copy(this);}}]);inherits(LightComponent,_Component);return LightComponent;}(Component))||_class$1);defineProperty$3(defineProperty$3(LightComponent,"defaults",objectSpread({},Component.defaults,{build:true,shadow:{cast:true,bias:0,radius:1,mapSize:{width:1024,height:1024},camera:{near:true,far:400,fov:90,top:200,bottom:-200,left:-200,right:200}},position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0}})),"instructions",{position:['x','y','z'],rotation:['x','y','z']});var _dec$2,_class$2;var/**
* @class CameraComponent
* @category core
* @param {Object} [params] - The parameters object.
* @param {Object} [instructions] - The instructions object.
* @extends module:core.Component
* @memberof module:core
*/CameraComponent=(_dec$2=attributes(copy('position','rotation','quaternion','target')),_dec$2(_class$2=/*#__PURE__*/function(_Component){createClass(CameraComponent,null,[{key:"from",/**
* Default values for parameters
* @member {Object} module:core.CameraComponent#defaults
* @static
* @default
* {
* build: true,
*
* position: {x: 0, y: 0, z: 0},
* rotation: {x: 0, y: 0, z: 0}
* }
*/ /**
* Static instructions
* @member {Object} module:core.CameraComponent#instructions
* @static
* @default
* {
* position: ['x', 'y', 'z'],
* rotation: ['x', 'y', 'z'],
* scale: ['x', 'y', 'z']
* }
*/value:function from(camera){var params=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};params.build=false;var component=new CameraComponent(params);component.native=camera;component.wrap();return component;}}]);function CameraComponent(params){var _this;var defaults=arguments.length>1&&arguments[1]!==undefined?arguments[1]:CameraComponent.defaults;var instructions=arguments.length>2&&arguments[2]!==undefined?arguments[2]:CameraComponent.instructions;classCallCheck(this,CameraComponent);_this=possibleConstructorReturn(this,getPrototypeOf$2(CameraComponent).call(this,params,defaults,instructions));if(_this.params.build){var build=_this.build(_this.params);if(!build){throw new CompositionError$1('CameraComponent','.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.',assertThisInitialized(assertThisInitialized(_this)));}if(build instanceof Promise){build.then(function(native){_this.native=native;});}else _this.native=build;_this.wait(_this.wrap());}_this.applyCommand('postIntegrate');return _this;}// BUILDING & WRAPPING
/**
* @method build
* @instance
* @description Build livecycle should return a native object.
* @throws {CompositionError}
* @memberof module:core.CameraComponent
*/createClass(CameraComponent,[{key:"build",value:function build(){throw new CompositionError$1('CameraComponent','Instance should have it\'s own .build().',this);}/**
* @method wrap
* @instance
* @description Wraps transforms (`position` & `rotation`)
* @return {Promise} Resolved when action is completed
* @memberof module:core.CameraComponent
*/},{key:"wrap",value:function wrap(){var _this2=this;return new Promise(function(resolve){_this2.defer(function(){_this2.position.set(_this2.params.position.x,_this2.params.position.y,_this2.params.position.z);_this2.rotation.set(_this2.params.rotation.x,_this2.params.rotation.y,_this2.params.rotation.z);_this2.applyBridge({onWrap:1});resolve(_this2);});});}/**
* @method copy
* @instance
* @description Copy source transforms & execute `Component.copy()`
* @return {this} CameraComponent
* @memberof module:core.CameraComponent
*/},{key:"copy",value:function copy$$1(source){var _this3=this;return get$3(getPrototypeOf$2(CameraComponent.prototype),"copy",this).call(this,source,function(){if(_this3.target)_this3.target.copy(source.target());_this3.position.copy(source.position);_this3.rotation.copy(source.rotation);_this3.quaternion.copy(source.quaternion);});}/**
* @method clone
* @instance
* @description Make a clone of this CameraComponent using `.copy()`
* @return {CameraComponent} clone of this object
* @memberof module:core.CameraComponent
*/},{key:"clone",value:function clone(){return new this.constructor({build:false}).copy(this);}}]);inherits(CameraComponent,_Component);return CameraComponent;}(Component))||_class$2);defineProperty$3(defineProperty$3(CameraComponent,"defaults",objectSpread({},Component.defaults,{build:true,position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0}})),"instructions",{position:['x','y','z'],rotation:['x','y','z'],scale:['x','y','z']});const version="2.2.0-alpha.0";var system={window:typeof window==='undefined'?global:window};/**
* @class App
* @category core
* @description This component is used to prepare a world scene, setup physics, camera, renderer and all other things that you usually do before making meshes.
* @param {Array} [modules=[]] - Array of Modules
* @extends ModuleSystem
* @memberof module:core
*/var App=/*#__PURE__*/function(_ModuleSystem){/**
* @description Defines whether the scene should render or not
* @member {Boolean} module:core.App#enabled
* @public
*/ /**
* Loops in this app
* @description Array of loops that are executed by this app.
* @member {Array} module:core.App#loops
* @public
*/function App(){var _this;var modules=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];classCallCheck(this,App);console.log("WHS.App ".concat(version));_this=possibleConstructorReturn(this,getPrototypeOf$2(App).call(this));defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)),"enabled",true),"loops",[]);_this.manager=new ModuleManager(assertThisInitialized(assertThisInitialized(_this)));_this.modules=modules;_this.integrateModules();return _this;}// CONTROLS & UPDATING
/**
* @method start
* @description Start rendering loop and physics simulation (if you use version with physics).
* @memberof module:core.App
*/createClass(App,[{key:"start",value:function start(){var requestAnimFrame=function(){return system.window.requestAnimationFrame||system.window.webkitRequestAnimationFrame||system.window.mozRequestAnimationFrame||function(callback){system.window.setTimeout(callback,1000/60);};}();var loops=this.loops,enabled=this.enabled;function process(){requestAnimFrame(process);if(!enabled)return;for(var i=0,ll=loops.length;i<ll;i++){var e=loops[i];if(e.enabled)e.execute(e.clock);}}this.enabled=true;process();}/**
* @method stop
* @description Stops rendering loops
* @memberof module:core.App
*/},{key:"stop",value:function stop(){this.enabled=false;}/**
* @method addLoop
* @description Adds loop to this app.
* @param {Object} loop - the loop to add
* @return {Promise} Promise that is resolved when promises completed.
* @memberof module:core.App
* @example <caption>Adding a loop to an app</caption>
* const loop = new Loop(() => {
* // ...
* });
*
* const app = new App();
*
* app.addLoop(loop);
* loop.start();
*/},{key:"addLoop",value:function addLoop(loop){var _this2=this;return new Promise(function(resolve){_this2.loops.push(loop);resolve(loop);});}/**
* @method removeLoop
* @description Removes loop from this app.
* @param {Object} loop - the loop to remove
* @return {Promise} Promise that is resolved when promises completed.
* @memberof module:core.App
*/},{key:"removeLoop",value:function removeLoop(loop){var _this3=this;return new Promise(function(resolve){var index=_this3.loops.indexOf(loop);if(index!==-1)_this3.loops.splice(index,1);resolve(loop);});}},{key:"get",value:function get(key){return this.manager.get(key);}},{key:"use",value:function use(key){return this.manager.use(key);}}]);inherits(App,_ModuleSystem);return App;}(ModuleSystem);/**
* @class Loop
* @category core
* @param {Function} func function to execute on each animation frame
* @param {Boolean} [useClock=true] passes a Clock to the function when called, if true
* @memberof module:core
*/var Loop=/*#__PURE__*/function(){function Loop(func){var useClock=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;classCallCheck(this,Loop);this.func=func;this.clock=useClock?new Clock():null;this.enabled=false;}// CONTROLS
/**
* @method start
* @instance
* @description Starts this loop, clock if it has one. Won't do anything if loop enabled already.
* @param {Component} [world] app to add this loop to, if provided.
* @memberof module:core.Loop
*/createClass(Loop,[{key:"start",value:function start(world){if(this.enabled)return;if(world)world.addLoop(this);if(this.clock)this.clock.start();this.enabled=true;}/**
* @method stop
* @instance
* @description Stops this loop and its clock if it has one, won't do anything if this loop is not enabled)
* @param {Component} [world] app to remove this loop from, if provided.
* @memberof module:core.Loop
*/},{key:"stop",value:function stop(world){if(!this.enabled)return;if(this.clock)this.clock.stop();this.enabled=false;if(world)world.removeLoop(this);}// EXECUTION
/**
* @method execute
* @instance
* @description Executes the function of this loop
* @memberof module:core.Loop
* @returns {*} whatever the function of this loop returns
*/},{key:"execute",value:function execute(){return this.func(this.clock);}}]);return Loop;}();/** @module core */ /**
* @class AmbientLight
* @category components/lights
* @description AmbientLight is a simple class, it extends Light and inherits all its methods.
* AmbientLight creates basic light around all scene, so it doesn't need properties like pos or target.
* It supports only color and intensity as parameters, which defines the color of the surrounded light and intensity of light.
* @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params.
* @extends module:core.LightComponent
* @memberof module:components/lights
* @example <caption>Creating an AmbientLight </caption>
* new AmbientLight({
* color: 0xffffff,
* intensity: 0.2
* }).addTo(world);
*/var AmbientLight$1=/*#__PURE__*/function(_LightComponent){function AmbientLight$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,AmbientLight$$1);return possibleConstructorReturn(this,getPrototypeOf$2(AmbientLight$$1).call(this,params,AmbientLight$$1.defaults));}createClass(AmbientLight$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new AmbientLight(params.color,params.intensity)}).light;}}]);inherits(AmbientLight$$1,_LightComponent);return AmbientLight$$1;}(LightComponent);defineProperty$3(AmbientLight$1,"defaults",objectSpread({},LightComponent.defaults,{color:0xffffff,intensity:1}));/**
* @class DirectionalLight
* @category components/lights
* @description DirectinalLight creates a light that shines from a specific direction not from a specific position.<br/><br/>
* This light will behave as though it is infinitely far away and the rays produced from it are all parallel. <br/><br/>
* The best analogy would be a light source that acts like the sun: the sun is so far away that all sunlight hitting objects comes from the same angle.<br/><br/>
* It has the same options as AmbientLight in light paramater, but it also supports pos and target paramaters.
* @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params.
* @extends module:core.LightComponent
* @memberof module:components/lights
* @example <caption>Creating a DirectionalLight to fall down from vec3(10, 20, 10) to vec3(0, 0, 0)</caption>
* new DirectionalLight({
* color: 0xffffff,
* intensity: 0.2,
*
* position: [10, 20, 10]
* }).addTo(app);
*/var DirectionalLight$1=/*#__PURE__*/function(_LightComponent){function DirectionalLight$$1(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,DirectionalLight$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(DirectionalLight$$1).call(this,params,DirectionalLight$$1.defaults));_this.wrapShadow();return _this;}createClass(DirectionalLight$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new DirectionalLight(params.color,params.intensity)}).light;}}]);inherits(DirectionalLight$$1,_LightComponent);return DirectionalLight$$1;}(LightComponent);defineProperty$3(DirectionalLight$1,"defaults",objectSpread({},LightComponent.defaults,{color:0xffffff,intensity:1}));/**
* @class HemisphereLight
* @category components/lights
* @description HemisphereLight is a light source positioned directly above the scene.<br/>
* It also doesn't need position and target properties.
* @classDesc
* <iframe src="https://threejs.org/examples/webgl_lights_hemisphere.html"></iframe>
* @param {Object} [params={light: {skyColor: 0xffffff, groundColor: 0xffffff, intensity: 1}}] - The params.
* @extends module:core.LightComponent
* @memberof module:components/lights
* @example <caption>Creating a HemisphereLight</caption>
* new HemisphereLight({
* skyColor: 0xff0000,
* groundColor: 0x0000ff,
* intensity: 0.2
* }).addTo(app);
*/var HemisphereLight$1=/*#__PURE__*/function(_LightComponent){function HemisphereLight$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,HemisphereLight$$1);return possibleConstructorReturn(this,getPrototypeOf$2(HemisphereLight$$1).call(this,params,HemisphereLight$$1.defaults));}createClass(HemisphereLight$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new HemisphereLight(params.skyColor,params.groundColor,params.intensity)}).light;}}]);inherits(HemisphereLight$$1,_LightComponent);return HemisphereLight$$1;}(LightComponent);defineProperty$3(HemisphereLight$1,"defaults",objectSpread({},LightComponent.defaults,{skyColor:0xffffff,groundColor:0xffffff,intensity:1}));/**
* @class PointLight
* @category components/lights
* @description PointLight creates a light at a specific position in the scene. The light shines in all directions (roughly similar to a light bulb.)<br/><br/>
* It has the same options as AmbientLight in light paramater, but it also supports position, distance and decay.<br/>
* @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, decay: 1}}] - The params.
* @extends LightComponent
* @memberof module:components/lights
* @example <caption>Creating a PointLight</caption>
* new PointLight( {
* color: 0xff0000,
* intensity: 2,
* distance: 300
*
* position: [10, 20, 10]
* }).addTo(app);
*/var PointLight$1=/*#__PURE__*/function(_LightComponent){function PointLight$$1(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,PointLight$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(PointLight$$1).call(this,params,PointLight$$1.defaults));_this.wrapShadow();return _this;}createClass(PointLight$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new PointLight(params.color,params.intensity,params.distance,params.decay)}).light;}}]);inherits(PointLight$$1,_LightComponent);return PointLight$$1;}(LightComponent);defineProperty$3(PointLight$1,"defaults",objectSpread({},LightComponent.defaults,{color:0xffffff,intensity:1,distance:100,decay:1}));/**
* @class SpotLight
* @category components/lights
* @description SpotLight creates spot light that can cast shadow in one direction. <br/><br/>
* It has the same parameters as AmbientLight in light, but it also supports pos and target. <br/><br/>
* SpotLight affects meshes with lambert and phong material.
* @classDesc
* <iframe src="https://threejs.org/examples/webgl_lights_spotlight.html"></iframe>
* @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, angle: Math.PI / 3, exponent: 0, decay: 1}}] - The params.
* @extends module:core.LightComponent
* @memberof module:components/lights
* @example <caption>Creating a SpotLight that falls down from vec3(10, 20, 10) to vec3(0, 0, 0)</caption>
* new SpotLight({
* color: 0x00ff00,
* intensity: 3,
* distance: 1000
*
* position: [10, 20, 10]
* }).addTo(app);
*/var SpotLight$1=/*#__PURE__*/function(_LightComponent){function SpotLight$$1(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,SpotLight$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(SpotLight$$1).call(this,params,SpotLight$$1.defaults));_this.wrapShadow();return _this;}createClass(SpotLight$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new SpotLight(params.color,params.intensity,params.distance,params.angle,params.exponent,params.decay)}).light;}}]);inherits(SpotLight$$1,_LightComponent);return SpotLight$$1;}(LightComponent);defineProperty$3(SpotLight$1,"defaults",objectSpread({},LightComponent.defaults,{color:0xffffff,intensity:1,distance:100,angle:Math.PI/3,exponent:0,decay:1}));var AreaLight=/*#__PURE__*/function(_LightComponent){function AreaLight(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,AreaLight);return possibleConstructorReturn(this,getPrototypeOf$2(AreaLight).call(this,params,AreaLight.defaults));}createClass(AreaLight,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new RectAreaLight(params.color,params.intensity,params.width,params.height)}).light;}}]);inherits(AreaLight,_LightComponent);return AreaLight;}(LightComponent);defineProperty$3(AreaLight,"defaults",objectSpread({},LightComponent.defaults,{color:0xffffff,intensity:1,width:10,height:10}));/** @module components/lights */ /**
* @class CubeCamera
* @category components/cameras
* @description Creates 6 cameras that render to a WebGLRenderTargetCube
* @param {Object} [params] - The parameters object.
* @memberof module:components/cameras
* @extends module:core.CameraComponent
* @example <caption>Creates a CubeCamera and set it as app's camera</caption>
* const camera = new CubeCamera({
* camera: {
* cubeResolution: 256
* },
*
* position: {
* x: 0,
* y: 100,
* z: 0
* }
* });
*
* app.camera = camera;
*/var CubeCamera$1=/*#__PURE__*/function(_CameraComponent){/**
* Default values for parameters
* @member {Object} module:components/cameras.CubeCamera#defaults
* @static
* @default <pre>
* {
* camera: {
* near: 1,
* far: 1000,
* cubeResolution: 128
* }
* }</pre>
*/function CubeCamera$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,CubeCamera$$1);return possibleConstructorReturn(this,getPrototypeOf$2(CubeCamera$$1).call(this,params,CubeCamera$$1.defaults));}createClass(CubeCamera$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({camera:new CubeCamera(params.near,params.far,params.cubeResolution)}).camera;}}]);inherits(CubeCamera$$1,_CameraComponent);return CubeCamera$$1;}(CameraComponent);defineProperty$3(CubeCamera$1,"defaults",objectSpread({},CameraComponent.defaults,{near:1,far:1000,cubeResolution:128}));/**
* @class OrthographicCamera
* @category components/cameras
* @description Camera with orthographic projection.
* @param {Object} [params] - The parameters object.
* @memberof module:components/cameras
* @extends module:core.CameraComponent
* @example <caption>Create an OrthographicCamera and set it as app's camera</caption>
* const camera = new OrthographicCamera({
* camera: {
* far: 10000
* },
*
* position: {
* y: 50
* }
* });
*
* app.camera = camera;
*/var OrthographicCamera$1=/*#__PURE__*/function(_CameraComponent){/**
* Default values for parameters
* @member {Object} module:components/cameras.OrthographicCamera#defaults
* @static
* @default <pre>
* {
* near: 1,
* far: 1000,
* left: system.window.innerWidth / -2,
* right: system.window.innerWidth / 2,
* top: system.window.innerHeight / 2,
* bottom: system.window.innerHeight / -2
* }</pre>
*/function OrthographicCamera$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,OrthographicCamera$$1);return possibleConstructorReturn(this,getPrototypeOf$2(OrthographicCamera$$1).call(this,params,OrthographicCamera$$1.defaults));}createClass(OrthographicCamera$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({camera:new OrthographicCamera(params.left,params.right,params.top,params.bottom,params.near,params.far)}).camera;}}]);inherits(OrthographicCamera$$1,_CameraComponent);return OrthographicCamera$$1;}(CameraComponent);defineProperty$3(OrthographicCamera$1,"defaults",objectSpread({},CameraComponent.defaults,{near:1,far:1000,left:system.window.innerWidth/-2,right:system.window.innerWidth/2,top:system.window.innerHeight/2,bottom:system.window.innerHeight/-2}));/**
* @class PerspectiveCamera
* @description Camera with perspective projection.
* @category components/cameras
* @param {Object} [params] - The parameters object.
* @memberof module:components/cameras
* @extends module:core.CameraComponent
* @example <caption>Create an PerspectiveCamera and set it as app's camera</caption>
* const camera = new PerspectiveCamera({
* fov: 75,
* aspect: window.innerWidth / window.innerHeight,
*
* position: {
* x: 0,
* y: 100,
* z: 0
* }
* });
*
* app.camera = camera;
*/var PerspectiveCamera$1=/*#__PURE__*/function(_CameraComponent){/**
* Default values for parameters
* @member {Object} module:components/cameras.PerspectiveCamera#defaults
* @static
* @default <pre>
* {
* near: 1,
* far: 1000,
* fov: 75,
* aspect: system.window.innerWidth / system.window.innerHeight
* }</pre>
*/function PerspectiveCamera$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,PerspectiveCamera$$1);return possibleConstructorReturn(this,getPrototypeOf$2(PerspectiveCamera$$1).call(this,params,PerspectiveCamera$$1.defaults));}createClass(PerspectiveCamera$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({camera:new PerspectiveCamera(params.fov,params.aspect,params.near,params.far)}).camera;}}]);inherits(PerspectiveCamera$$1,_CameraComponent);return PerspectiveCamera$$1;}(CameraComponent);defineProperty$3(PerspectiveCamera$1,"defaults",objectSpread({},CameraComponent.defaults,{near:1,far:1000,fov:75,aspect:system.window.innerWidth/system.window.innerHeight}));/** @module components/cameras */ /**
* @class Box
* @category components/meshes
* @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to
* pass specific parameters to build this mesh as a geometry object.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#BoxGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Box, and adding to app</caption>
* new Box({
* geometry: {
* width: 2,
* height: 2,
* depth: 2
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: [50, 60, 70]
* }).addTo(app);
*/var Box=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Box#defaults
* @static
* @default <pre>
* {
* geometry: {
* width: 1,
* height: 1,
* depth: 1,
* widthSegments: 1,
* heightSegments: 1,
* depthSegments: 1
* }
* }</pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Box#instructions
* @static
* @default geometry: ['width', 'height', 'depth', 'widthSegments', 'heightSegments', 'depthSegements']
*/function Box(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Box);return possibleConstructorReturn(this,getPrototypeOf$2(Box).call(this,params,Box.defaults,Box.instructions));}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Box
*/createClass(Box,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?BoxBufferGeometry:BoxGeometry)(params.geometry.width,params.geometry.height,params.geometry.depth,params.geometry.widthSegments,params.geometry.heightSegments,params.geometry.depthSegments);return geometry;}}]);inherits(Box,_MeshComponent);return Box;}(MeshComponent);defineProperty$3(defineProperty$3(Box,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{width:1,height:1,depth:1,widthSegments:1,heightSegments:1,depthSegments:1}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['width','height','depth','widthSegments','heightSegments','depthSegements']}));/**
* @class Circle
* @category components/meshes
* @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to
* pass specific parameters to build this mesh as a geometry object.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#CircleGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Circle, and adding to app</caption>
* new Circle({
* geometry: {
* radius: 4,
* segments: 16
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: [50, 60, 70]
* }).addTo(app);
*/var Circle=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Circle#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 50,
* segments: 8,
* thetaStart: 0,
* thetaLength: Math.PI * 2
* }
* }</pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Circle#instructions
* @static
* @default geometry: ['radius', 'segments', 'thetaStart', 'thetaLength']
*/function Circle(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Circle);return possibleConstructorReturn(this,getPrototypeOf$2(Circle).call(this,params,Circle.defaults,Circle.instructions));}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Circle
*/createClass(Circle,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?CircleBufferGeometry:CircleGeometry)(params.geometry.radius,params.geometry.segments,params.geometry.thetaStart,params.geometry.thetaLength);return geometry;}}]);inherits(Circle,_MeshComponent);return Circle;}(MeshComponent);defineProperty$3(defineProperty$3(Circle,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:50,segments:8,thetaStart:0,thetaLength:Math.PI*2}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','segments','thetaStart','thetaLength']}));/**
* @class Cone
* @category components/meshes
* @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder. <br/><br/>
* The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.<br/>
* The surface area and the volume of a cylinder have been known since deep antiquity.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#ConeGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Cone, and adding to app</caption>
* new Cone({
* geometry: {
* radiusTop: 2,
* radiusBottom: 4,
* height: 5
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* pos: [0, 100, 0]
* }).addTo(app);
*/var Cone=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Cone#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 20,
* height: 100,
* radiusSegments: 32,
* heightSegments: 1,
* openEnded: false,
* thetaStart: 0,
* thetaLength: Math.PI * 2
* }
* }</pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Cone#instructions
* @static
* @default <pre>
* geometry: [
* 'radius',
* 'height',
* 'radiusSegments',
* 'heightSegments',
* 'openEnded',
* 'thetaStart',
* 'thetaLength'
* ]
* </pre>
*/function Cone(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Cone);_this=possibleConstructorReturn(this,getPrototypeOf$2(Cone).call(this,params,Cone.defaults,Cone.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Cone.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Cone
*/createClass(Cone,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?ConeBufferGeometry:ConeGeometry)(params.geometry.radius,params.geometry.height,params.geometry.radiusSegments,params.geometry.heightSegments,params.geometry.openEnded,params.geometry.thetaStart,params.geometry.thetaLength);return geometry;}}]);inherits(Cone,_MeshComponent);return Cone;}(MeshComponent);defineProperty$3(defineProperty$3(Cone,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:20,height:100,radiusSegments:32,heightSegments:1,openEnded:false,thetaStart:0,thetaLength:Math.PI*2}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','height','radiusSegments','heightSegments','openEnded','thetaStart','thetaLength']}));/**
* @class Cylinder
* @category components/meshes
* @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder. <br/><br/>
* The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.<br/>
* The surface area and the volume of a cylinder have been known since deep antiquity.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#CylinderGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Cylinder, and adding to app</caption>
* new Cylinder({
* geometry: {
* radiusTop: 2,
* radiusBottom: 4,
* height: 5
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* pos: [0, 100, 0]
* }).addTo(app);
*/var Cylinder=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Cylinder#defaults
* @static
* @default <pre>
* {
* geometry: {
* radiusTop: 20,
* radiusBottom: 20,
* height: 100,
* radiusSegments: 32,
* heightSegments: 1,
* openEnded: false,
* thetaStart: 0,
* thetaLength: Math.PI * 2
* }
* }</pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Cylinder#instructions
* @static
* @default <pre>
* geometry: [
* 'radiusTop',
* 'radiusBottom',
* 'height',
* 'radiusSegments',
* 'heightSegments',
* 'openEnded',
* 'thetaStart',
* 'thetaLength'
* ]
* </pre>
*/function Cylinder(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Cylinder);_this=possibleConstructorReturn(this,getPrototypeOf$2(Cylinder).call(this,params,Cylinder.defaults,Cylinder.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Cylinder.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Cylinder
*/createClass(Cylinder,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?CylinderBufferGeometry:CylinderGeometry)(params.geometry.radiusTop,params.geometry.radiusBottom,params.geometry.height,params.geometry.radiusSegments,params.geometry.heightSegments,params.geometry.openEnded,params.geometry.thetaStart,params.geometry.thetaLength);return geometry;}}]);inherits(Cylinder,_MeshComponent);return Cylinder;}(MeshComponent);defineProperty$3(defineProperty$3(Cylinder,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radiusTop:0,radiusBottom:1,height:1,radiusSegments:32,heightSegments:1,openEnded:false,thetaStart:0,thetaLength:Math.PI*2}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radiusTop','radiusBottom','height','radiusSegments','heightSegments','openEnded','thetaStart','thetaLength']}));/**
* @class Dodecahedron
* @category components/meshes
* @description In geometry, a dodecahedron is any polyhedron with twelve flat faces. <br/><br/>
* The most familiar dodecahedron is the regular dodecahedron, which is a Platonic solid. <br/>
* There are also three regular star dodecahedra, which are constructed as stellations of the convex form. <br/>
* All of these have icosahedral symmetry, order 120.
* Dodecahedron creates Dodecahedron object by it's radius and detail.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#DodecahedronGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Dodecahedron, and adding to app</caption>
* new Dodecahedron({
* geometry: {
* radius: 2
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: {
* y: 10
* }
* }).addTo(app);
*/var Dodecahedron=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Dodecahedron#defaults
* @static
* @default <pre>
* geometry: {
* radius: 1,
* detail: 0
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Dodecahedron#instructions
* @static
* @default <pre>
* geometry: ['radius', 'detail']
* </pre>
*/function Dodecahedron(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Dodecahedron);_this=possibleConstructorReturn(this,getPrototypeOf$2(Dodecahedron).call(this,params,Dodecahedron.defaults,Dodecahedron.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Dodecahedron.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Dodecahedron
*/createClass(Dodecahedron,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?DodecahedronBufferGeometry:DodecahedronGeometry)(params.geometry.radius,params.geometry.detail);}}]);inherits(Dodecahedron,_MeshComponent);return Dodecahedron;}(MeshComponent);defineProperty$3(defineProperty$3(Dodecahedron,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:1,detail:0}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','detail']}));/**
* @class Extrude
* @category components/meshes
* @description Extrude geometry means that you can create a 3D mesh from any 2D shape using three.js geometry based on <a href='https://threejs.org/docs/#api/math/Vector2'>THREE.Vector2.</a> <br/>
* Such implementation will help you to make volumed shapes that have their own depth and can be seen from all angels.<br/><br/>
* You can also find some interesting examples made using <a href='threejs.org'>three.js</a> which is a core of whs.js, such as:
* - <a href='http://threejs.org/examples/webgl_geometry_extrude_shapes.html'>Webgl geometry extrude</a>
* - <a href='http://threejs.org/examples/webgl_geometry_extrude_shapes2.html'>Extrude shapes from geodata</a>
* - <a href='http://threejs.org/examples/webgl_geometry_extrude_splines.html'>Extrude splines</a>
*
* Such examples can be easily implemented using whitestorm.js or it's plugins. Use `Extrude` class with <a href='https://threejs.org/docs/#api/extras/core/Shape'>THREE.Shape</a> to get extrude effect of shape defined by 2D vectors.
* This class is similar to <a href='https://threejs.org/docs/#api/geometries/ExtrudeGeometry'>THREE.ExtrudeGeometry</a>,
* but it also contains all properties, applied by `Shape`, such as material, mass and vectors like position (pos) and rotation (rot).
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#ExtrudeGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a shape, then an Extrude from it</caption>
* const shape = new THREE.Shape([
* new THREE.Vector2(-4,-4),
* new THREE.Vector2(-2,0),
* new THREE.Vector2(-4,4),
* new THREE.Vector2(0,2),
* new THREE.Vector2(4,4),
* new THREE.Vector2(2,0),
* new THREE.Vector2(4,-4),
* new THREE.Vector2(0,-2)
* ]);
*
* const extrude = new Extrude({
* geometry: {
* shapes: shape,
* options: {
* bevelEnabled: false,
* bevelSize: 0,
* amount: 2
* }
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: [0, 100, 0]
* });
*
* extrude.addTo(app);
*/var Extrude=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Extrude#defaults
* @static
* @default <pre>
* {
* geometry: {
* shapes: [],
* options: {}
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Extrude#instructions
* @static
* @default <pre>
* {
* geometry: ['shapes', 'options']
* }
* </pre>
*/function Extrude(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Extrude);_this=possibleConstructorReturn(this,getPrototypeOf$2(Extrude).call(this,params,Extrude.defaults,Extrude.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Extrude.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Extrude
*/createClass(Extrude,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new ExtrudeGeometry(params.geometry.shapes,params.geometry.options);return params.buffer?new BufferGeometry().fromGeometry(geometry):geometry;}}]);inherits(Extrude,_MeshComponent);return Extrude;}(MeshComponent);defineProperty$3(defineProperty$3(Extrude,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{shapes:[],options:{}}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['shapes','options']}));/**
* @class Icosahedron
* @category components/meshes
* @description In geometry, an icosahedron is a polyhedron with 20 faces.<br/>
* There are many kinds of icosahedra, with some being more symmetrical than others. The most well known is the Platonic, convex regular icosahedron.<br/>
* `Icosahedron` creates an Icosahedron object by its radius and detail.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#IcosahedronGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Icosahedron, and adding to app</caption>
* new Icosahedron({
* geometry: {
* radius: 2,
* detail: 1
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: [0, 100, 0]
* }).addTo(app);
*/var Icosahedron=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Icosahedron#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 1,
* detail: 0
* }
* }</pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Icosahedron#instructions
* @static
* @default {geometry: ['radius', 'detail']}
*/function Icosahedron(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Icosahedron);_this=possibleConstructorReturn(this,getPrototypeOf$2(Icosahedron).call(this,params,Icosahedron.defaults,Icosahedron.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Icosahedron.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Icosahedron
*/createClass(Icosahedron,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?IcosahedronBufferGeometry:IcosahedronGeometry)(params.geometry.radius,params.geometry.detail);}}]);inherits(Icosahedron,_MeshComponent);return Icosahedron;}(MeshComponent);defineProperty$3(defineProperty$3(Icosahedron,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:1,detail:0}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','detail']}));/**
* @class Lathe
* @category components/meshes
* @description A `LatheGeometry` allows you to create shapes from a smooth curve.
* This curve is defined by a number of points (also called knots) and is most often called a spline. This spline is rotated around a fixed point and results in vase- and bell-like shapes.<br/><br/>
* In 3D computer graphics, a lathed object is a 3D model whose vertex geometry is produced by rotating the points of a spline or other point set around a fixed axis.
* The lathing may be partial; the amount of rotation is not necessarily a full 360 degrees.
* The point set providing the initial source data can be thought of as a cross section through the object along a plane containing its axis of radial symmetry. <br/><br/>
* The <a href='http://threejs.org/docs/scenes/geometry-browser.html#LatheGeometry'>following example</a> shows a geometry which can be generated using `Lathe` class.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#LatheGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Lath, and adding to app</caption>
* const points = [];
*
* for (let i = 0; i < 10; i++) {
* points.push(
* new THREE.Vector2(
* (Math.sin(i * 0.7) * 15 + 50) / 10,
* (i - 5) * 0.2
* )
* );
* }
*
* const lathe = new Lathe({
* geometry: {
* points: points
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: [0, 50, 10]
* }).addTo(app);
*/var Lathe=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Lathe#defaults
* @static
* @default <pre>
* {
* geometry: {
* points: []
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Lathe#instructions
* @static
* @default <pre>{
* geometry: ['points']
* }
* </pre>
*/function Lathe(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Lathe);_this=possibleConstructorReturn(this,getPrototypeOf$2(Lathe).call(this,params,Lathe.defaults,Lathe.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Lathe.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Lathe
*/createClass(Lathe,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?LatheBufferGeometry:LatheGeometry)(params.geometry.points);}}]);inherits(Lathe,_MeshComponent);return Lathe;}(MeshComponent);defineProperty$3(defineProperty$3(Lathe,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{points:[]}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['points']}));/**
* @class Line
* @category components/meshes
* @description Line component is generated from a curve/line and amount of vectors that should be used (points).
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Line, and adding to app</caption>
* new Line({
* geometry: {
* curve: new THREE.LineCurve3(new THREE.Vector3(10, 10, 0), new THREE.Vector3(10, 30, 0))
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* })
* }).addTo(app);
*/var Line$1=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Line#defaults
* @static
* @default <pre>
* {
* curve: new LineCurve3(new Vector3(0, 0, 0), new Vector3(10, 0, 0)),
* points: 50
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Line#instructions
* @static
* @default <pre>{
* geometry: ['curve', 'points']
* }
* </pre>
*/function Line$$1(params){classCallCheck(this,Line$$1);return possibleConstructorReturn(this,getPrototypeOf$2(Line$$1).call(this,params,Line$$1.defaults,Line$$1.instructions));}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Line
*/createClass(Line$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Line(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=params.buffer?new BufferGeometry():new Geometry();if(params.buffer){var pp=params.curve.getPoints(params.points);var verts=new Float32Array(pp.length*3);for(var i=0,max=pp.length;i<max;i++){var i3=i*3;verts[i3]=pp[i].x;verts[i3+1]=pp[i].y;verts[i3+2]=pp[i].z;}geometry.addAttribute('position',new BufferAttribute(verts,3));}else geometry.vertices=params.curve.getPoints(params.points);return geometry;}}]);inherits(Line$$1,_MeshComponent);return Line$$1;}(MeshComponent);defineProperty$3(defineProperty$3(Line$1,"defaults",objectSpread({},MeshComponent.defaults,{curve:null,points:50})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['curve','points']}));/**
* @class Importer
* @category components/meshes
* @description Importer is a loader for meshes and any other data to your scene
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Importer, and adding to app</caption>
* new Importer({
* loader: new THREE.OBJLoader(),
*
* parser(geometry, material) { // data from loader
* return new THREE.Mesh(geometry, material); // should return your .native (mesh in this case)
* },
*
* position: [0, 100, 0]
* }).addTo(app);
*/var Importer=/*#__PURE__*/function(_MeshComponent){createClass(Importer,null,[{key:"filter",/**
* Default values for parameters
* @member {Object} module:components/meshes.Importer#defaults
* @static
* @default <pre>
* {
* url: '',
* loader: new JSONLoader(),
*
* onLoad() {},
* onProgress() {},
* onError() {},
*
* texturePath: null,
* useCustomMaterial: false,
*
* parser(geometry, materials) {
* return new Mesh(geometry, materials);
* }
* }</pre>
*/ /**
* @method filter
* @description Default values for filter
* @static
* @param {THREE.Mesh} object Instance for iterating through it's children.
* @param {Function} filter Function with child as argument, should return a boolean whether include the child or not.
* @return {THREE.Mesh} object with children
* @memberof module:components/meshes.Importer
* @example <caption>Removing unnecessary lights from children</caption>
* new Importer({
* loader: new THREE.OBJLoader(),
*
* parse(group) { // data from loader
* return Importer.filter(group, child => !child.isLight); // remove lights
* },
*
* position: [0, 100, 0]
* }).addTo(app);
*/value:function filter(object,_filter){var processFilter=function processFilter(object){object.children.forEach(function(el,index){if(el.children)processFilter(el);if(!_filter(el))object.children.splice(index,1);});return object;};return processFilter(object);}}]);function Importer(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Importer);return possibleConstructorReturn(this,getPrototypeOf$2(Importer).call(this,params,Importer.defaults,Importer.instructions,false));}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Importer
*/createClass(Importer,[{key:"build",value:function build(){var _this=this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new Promise(function(resolve){if(params.texturePath)params.loader.setTexturePath(params.texturePath);params.loader.load(params.url,function(){for(var _len=arguments.length,data=new Array(_len),_key=0;_key<_len;_key++){data[_key]=arguments[_key];}// geometry, materials
params.onLoad.apply(params,data);var object=params.parser.apply(_this,data);if(params.material)object.material=_this.applyBridge({material:params.material}).material;resolve(object);},params.onProgress,params.onError);});}}]);inherits(Importer,_MeshComponent);return Importer;}(MeshComponent);defineProperty$3(defineProperty$3(Importer,"defaults",objectSpread({},MeshComponent.defaults,{url:'',loader:new JSONLoader(),onLoad:function onLoad(){},onProgress:function onProgress(){},// TODO add onComplete?
onError:function onError(){},texturePath:null,useCustomMaterial:false,parser:function parser(geometry,material){var _this$applyBridge=this.applyBridge({geometry:geometry,material:material}),geom=_this$applyBridge.geometry,mat=_this$applyBridge.material;return this.applyBridge({mesh:geom.bones?new SkinnedMesh(geom,mat):new Mesh(geom,mat)}).mesh;}})),"instructions",objectSpread({},MeshComponent.instructions));/**
* @class Octahedron
* @category components/meshes
* @description In geometry, an octahedron is a polyhedron with eight faces.
* A regular octahedron is a Platonic solid composed of eight equilateral triangles, four of which meet at each vertex.
* <br/><br/>
* `Octahedron` creates an Octahedron object by its `radius` and `detail`.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#OctahedronGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating an Octahedron, and adding to app</caption>
* new Octahedron({
* geometry: {
* radius: 2,
* detail: 1
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: [0, 100, 0]
* }).addTo(app);
*/var Octahedron=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Octahedron#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 1,
* detail: 0
* }
* }
* </pre>
*/function Octahedron(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Octahedron);_this=possibleConstructorReturn(this,getPrototypeOf$2(Octahedron).call(this,params,Octahedron.defaults,Octahedron.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Octahedron.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Octahedron
*/createClass(Octahedron,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?OctahedronBufferGeometry:OctahedronGeometry)(params.geometry.radius,params.geometry.detail);}}]);inherits(Octahedron,_MeshComponent);return Octahedron;}(MeshComponent);defineProperty$3(Octahedron,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:1,detail:0}}));/**
* @class Parametric
* @category components/meshes
* @description `Parametric` generates a geometry representing a <a href='https://en.wikipedia.org/wiki/Parametric_surface'>Parametric surface</a>
* <br/><br/>
* It is usually used to develop different kinds of highfields or visualize a <a href='https://stemkoski.github.io/Three.js/Graphulus-Function.html'>math function</a>.
* <br/>
* - <a href='http://math.hws.edu/graphicsbook/source/threejs/curves-and-surfaces.html'>Parametric surface</a>
* - <a href='https://stemkoski.github.io/Three.js/Graphulus-Surface.html'>"Graphulus"</a>
* <br/><br/>
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#ParametricGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Example creating an heightfield-like geometry. `u` and `v` are like `x` and `y` in shape, but their values are always from `0` to `1`.
* We use them in `THREE.Vector3` like `x` and `z` and `Math.random() * 5` for `y`.</caption>
* const createParametric = (u, v) => {
* return new THREE.Vector3(u * 30, Math.random() * 5, v * 30);
* }
*
* new Parametric({
* geometry: {
* func: createParametric
* },
*
* material: new THREE.MeshLambertMaterial({
* color: 0xffffff,
* side: THREE.DoubleSide
* }),
*
* position: [0, 100, -100]
* }).addTo(app);
*/var Parametric=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Parametric#defaults
* @static
* @default <pre>
* {
* geometry: {
* func: (u, v) => new Vector3(u, v, 0),
* slices: 10,
* tacks: 10
* }
* }
* </pre>
*/function Parametric(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Parametric);return possibleConstructorReturn(this,getPrototypeOf$2(Parametric).call(this,params,Parametric.defaults,Parametric.instructions));}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Parametric
*/createClass(Parametric,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?ParametricBufferGeometry:ParametricGeometry)(params.geometry.func,params.geometry.slices,params.geometry.stacks);}}]);inherits(Parametric,_MeshComponent);return Parametric;}(MeshComponent);defineProperty$3(Parametric,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{func:function func(u,v){return new Vector3(u,v,0);},slices:10,stacks:10}}));/**
* @class Plane
* @category components/meshes
* @description `Plane` is used for creating planes given some `width` and `height`.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#PlaneGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Plane, and adding to app</caption>
* new Plane({
* geometry: {
* width: 20,
* height: 30
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* })
* }).addTo(app);
*/var Plane$1=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Plane#defaults
* @static
* @default <pre>
* {
* geometry: {
* width: 10,
* height: 10,
* wSegments: 1,
* hSegments: 1
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Plane#instructions
* @static
* @default <pre>
* {
* geometry: ['width', 'height', 'wSegments', 'hSegments']
* }
* </pre>
*/function Plane$$1(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Plane$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(Plane$$1).call(this,params,Plane$$1.defaults,Plane$$1.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Plane$$1.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Plane
*/createClass(Plane$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?PlaneBufferGeometry:PlaneGeometry)(params.geometry.width,params.geometry.height,params.geometry.wSegments,params.geometry.hSegments);return geometry;}}]);inherits(Plane$$1,_MeshComponent);return Plane$$1;}(MeshComponent);defineProperty$3(defineProperty$3(Plane$1,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{width:10,height:10,wSegments:1,hSegments:1}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['width','height','wSegments','hSegments']}));var verticesOfCube=[-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1],indicesOfFaces=[2,1,0,0,3,2,0,4,7,7,3,0,0,1,5,5,4,0,1,2,6,6,5,1,2,3,7,7,6,2,4,5,6,6,7,4];/**
* @class Polyhedron
* @category components/meshes
* @description In elementary geometry, a polyhedron is a solid in three dimensions with flat polygonal faces, straight edges and sharp corners or vertices.
* <br/><br/>
* `Polyhedron` creates a Polyhedron by its `radius` and `detail`.
* <br/><br/>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating an Polyhedron, and adding to app</caption>
* new Polyhedron({
* geometry: {
* radius: 2,
* detail: 1
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: [0, 100, 0]
* }).addTo(app);
*/var Polyhedron=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Polyhedron#defaults
* @static
* @default <pre>
* {
* geometry: {
* verticesOfCube: [
* -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,
* -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1
* ],
*
* indicesOfFaces: [
* 2, 1, 0, 0, 3, 2,
* 0, 4, 7, 7, 3, 0,
* 0, 1, 5, 5, 4, 0,
* 1, 2, 6, 6, 5, 1,
* 2, 3, 7, 7, 6, 2,
* 4, 5, 6, 6, 7, 4
* ],
*
* radius: 6,
* detail: 2
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Polyhedron#instructions
* @static
* @default <pre>
* {
* geometry: ['verticesOfCube', 'indicesOfFaces', 'radius', 'detail']
* }
* </pre>
*/function Polyhedron(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Polyhedron);_this=possibleConstructorReturn(this,getPrototypeOf$2(Polyhedron).call(this,params,Polyhedron.defaults,Polyhedron.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Polyhedron.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Polyhedron
*/createClass(Polyhedron,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?PolyhedronBufferGeometry:PolyhedronGeometry)(params.geometry.verticesOfCube,params.geometry.indicesOfFaces,params.geometry.radius,params.geometry.detail);}}]);inherits(Polyhedron,_MeshComponent);return Polyhedron;}(MeshComponent);defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(Polyhedron,"verticesOfCube",verticesOfCube),"indicesOfFaces",indicesOfFaces),"defaults",objectSpread({},MeshComponent.defaults,{geometry:{verticesOfCube:verticesOfCube,indicesOfFaces:indicesOfFaces,radius:6,detail:2}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['verticesOfCube','indicesOfFaces','radius','detail']}));/**
* @class Ring
* @category components/meshes
* @description Ring class creates a circle or just 2D Torus. Does not support physics.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#RingGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Ring, and adding to app</caption>
* new Ring({
* geometry: {
* innerRadius: 5,
* outerRadius: 2
* },
*
* material: new THREE.MeshLambertMaterial({
* color: 0xffffff,
* side THREE.DoubleSide
* }),
*
* position: [0, 8, 0],
*
* rotation: {
* x: Math.PI/4
* }
* }).addTo(app);
*/var Ring=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Ring#defaults
* @static
* @default <pre>
* {
* geometry: {
* innerRadius: 0,
* outerRadius: 50,
* thetaSegments: 8,
* phiSegments: 8,
* thetaStart: 0,
* thetaLength: Math.PI * 2
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Ring#instructions
* @static
* @default <pre>
* {
* geometry: [
* 'innerRadius',
* 'outerRadius',
* 'thetaSegments',
* 'phiSegments',
* 'thetaStart',
* 'thetaLength'
* ]
* }
* </pre>
*/function Ring(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Ring);_this=possibleConstructorReturn(this,getPrototypeOf$2(Ring).call(this,params,Ring.defaults,Ring.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Ring.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Ring
*/createClass(Ring,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?RingBufferGeometry:RingGeometry)(params.geometry.innerRadius,params.geometry.outerRadius,params.geometry.thetaSegments,params.geometry.phiSegments,params.geometry.thetaStart,params.geometry.thetaLength);}}]);inherits(Ring,_MeshComponent);return Ring;}(MeshComponent);defineProperty$3(defineProperty$3(Ring,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{innerRadius:0,outerRadius:50,thetaSegments:8,phiSegments:8,thetaStart:0,thetaLength:Math.PI*2}})),"instructions",objectSpread({},MeshComponent.defaults,{geometry:['innerRadius','outerRadius','thetaSegments','phiSegments','thetaStart','thetaLength']}));/**
* @class Shape
* @category components/meshes
* @description Shape is a universal class. It allows you to create different 2D shapes in 3D scene.<br/>
* Unfortunately, not all of them support physics, an alternative is to make a similar 3D object and scale its width down to near zero.
* <br/><br/>
* `Shape` consists of shapes that are in its shapes parameter.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#ShapeGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a plane looking Shape from a THREE.Shape, and adding it to app</caption>
* const rectWidth = 10,
* rectLength = 5;
*
* const rectShape = new THREE.Shape();
* rectShape.moveTo(0,0);
* rectShape.lineTo(0, rectWidth);
* rectShape.lineTo(rectLength, rectWidth);
* rectShape.lineTo(rectLength, 0);
* rectShape.lineTo(0, 0);
*
* const plane = new Shape({
* geometry: {
* shape: rectShape
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* })
* }).addTo(app);
*/var Shape$1=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Shape#defaults
* @static
* @default <pre>
* {
* geometry: {
* shapes: []
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Shape#instructions
* @static
* @default <pre>
* {
* geometry: ['shapes']
* }
* </pre>
*/function Shape$$1(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Shape$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(Shape$$1).call(this,params,Shape$$1.defaults,Shape$$1.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Shape$$1.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Shape
*/createClass(Shape$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?ShapeBufferGeometry:ShapeGeometry)(params.geometry.shapes);}}]);inherits(Shape$$1,_MeshComponent);return Shape$$1;}(MeshComponent);defineProperty$3(defineProperty$3(Shape$1,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{shapes:[]}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['shapes']}));/**
* @class Sphere
* @category components/meshes
* @description Sphere class is used to create sphere objects by its radius property and other values that determines its detality.
* <br/><br/>
* It is similar to THREE.SphereGeometry, but it also contains all `Shape` properties, such as material, mass and vectors like position (pos) and rotation (rot).
* <br/><br/>
* Then it creates an `Three.js mesh` or a `Physijs mesh`, that is similar to `Three.js mesh`, but it also take into consideration collision calculations.
* This mesh is a combination of `Three.js geometry` and `Physijs material` (The same as in three.js, but with friction and restitution).
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#SphereGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Sphere, and adding it to app</caption>
* new Sphere({
* geometry: {
* radius: 2
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: {
* y: 100
* }
* }).addTo(app);
*/var Sphere$1=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Sphere#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 1,
* widthSegments: 8,
* heightSegments: 6
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Sphere#instructions
* @static
* @default <pre>
* {
* geometry: ['radius', 'widthSegments', 'heightSegments']
* }
* </pre>
*/function Sphere$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Sphere$$1);return possibleConstructorReturn(this,getPrototypeOf$2(Sphere$$1).call(this,params,Sphere$$1.defaults,Sphere$$1.instructions));}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Sphere
*/createClass(Sphere$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?SphereBufferGeometry:SphereGeometry)(params.geometry.radius,params.geometry.widthSegments,params.geometry.heightSegments);return geometry;}}]);inherits(Sphere$$1,_MeshComponent);return Sphere$$1;}(MeshComponent);defineProperty$3(defineProperty$3(Sphere$1,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:1,widthSegments:8,heightSegments:6}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','widthSegments','heightSegments']}));/**
* @class Tetrahedron
* @category components/meshes
* @description In geometry, a tetrahedron is a polyhedron composed of four triangular faces, six straight edges, and four vertex corners.
* The tetrahedron is the simplest of all the ordinary convex polyhedra and the only one that has fewer than 5 faces.
* <br/><br/>
* `Tetrahedron` creates a Tetrahedron object by its `radius` and `detail`
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#TetrahedronGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Tetrahedron, and adding it to app</caption>
* new Tetrahedron({
* geometry: {
* radius: 2,
* detail: 1
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: {
* x: 0,
* y: 100,
* z: 0
* }
* }).addTo(app);
*/var Tetrahedron=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Tetrahedron#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 1,
* detail: 0
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Tetrahedron#instructions
* @static
* @default <pre>
* {
* geometry: ['radius', 'detail']
* }
* </pre>
*/function Tetrahedron(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Tetrahedron);_this=possibleConstructorReturn(this,getPrototypeOf$2(Tetrahedron).call(this,params,Tetrahedron.defaults,Tetrahedron.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Tetrahedron.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Tetrahedron
*/createClass(Tetrahedron,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?TetrahedronBufferGeometry:TetrahedronGeometry)(params.geometry.radius,params.geometry.detail);}}]);inherits(Tetrahedron,_MeshComponent);return Tetrahedron;}(MeshComponent);defineProperty$3(defineProperty$3(Tetrahedron,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:1,detail:0}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','detail']}));/**
* @class Text
* @category components/meshes
* @description Text class is made for creating 3D text objects.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#TextGeometry"></iframe>
* <br/><br/>
* Physics text object can be convex or concave. By default it's convex but you can also switch to concave.
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Text, and adding it to app</caption>
* new Text({
* text: 'Some text',
* parameters: {
* font: 'path/to/font.typeface.js',
* size: 20,
* height: 5,
* curveSegments: 6
* }
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: {
* x: -40,
* y: 20,
* z: 0
* }
* }).addTo(app);
*/var Text=/*#__PURE__*/function(_MeshComponent){createClass(Text,null,[{key:"load",/**
* Default values for parameters
* @member {Object} module:components/meshes.Text#defaults
* @static
* @default <pre>
* {
* text: 'Hello World!',
* font: null,
*
* geometry: {
* size: 12,
* height: 50,
* curveSegments: 12,
* font: new Font(),
* bevelEnabled: false,
* bevelThickness: 10,
* bevelSize: 8
* }
* }
* </pre>
*/ /**
* Default FontLoader
* @member {Object} module:components/meshes.Text#loader
* @static
* @default new FontLoader()
*/ /**
* @method load
* @static
* @description load() preloads a Font object and returns a Promise with it.
* @param {String} path Path to the font
* @return {Promise} A promise resolved with a font
* @memberof module:components/meshes.Text
*/value:function load(path){var loader=arguments.length>1&&arguments[1]!==undefined?arguments[1]:Text.loader;return new Promise(function(resolve){loader.load(path,resolve);});}}]);function Text(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Text);return possibleConstructorReturn(this,getPrototypeOf$2(Text).call(this,params,Text.defaults,Text.instructions));}/**
* @method build
* @description Build is called as part of the lifecycle to create a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Text
*/createClass(Text,[{key:"build",value:function build(){var _this=this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var promise=new Promise(function(resolve){(params.font instanceof Promise?params.font:Promise.resolve(params.font)).then(function(font){var _this$applyBridge=_this.applyBridge({geometry:new TextGeometry(params.text,Object.assign(params.geometry,{font:font})),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;resolve(_this.applyBridge({mesh:new Mesh(geometry,material)}).mesh);});});get$3(getPrototypeOf$2(Text.prototype),"wait",this).call(this,promise);return promise;}}]);inherits(Text,_MeshComponent);return Text;}(MeshComponent);defineProperty$3(defineProperty$3(defineProperty$3(Text,"defaults",objectSpread({},MeshComponent.defaults,{text:'Hello World!',font:null,geometry:{size:12,height:50,curveSegments:12,font:new Font(),bevelEnabled:false,bevelThickness:10,bevelSize:8}})),"instructions",objectSpread({},MeshComponent.instructions)),"loader",new FontLoader());/**
* @class Torus
* @category components/meshes
* @description Torus class makes a torus figure. A donut is a torus.
* @classDesc
* <iframe src="https://threejs.org/docs/index.html#api/geometries/TorusGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Torus, and adding it to app</caption>
* new Torus({
* geometry: {
* radius: 5,
* tube: 2
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* position: {
* y: 35
* }
* }).addTo(app);
*/var Torus=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Torus#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 100,
* tube: 40,
* radialSegments: 8,
* tubularSegments: 6,
* arc: Math.PI * 2
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Torus#instructions
* @static
* @default <pre>
* {
* geometry: [
* 'radius',
* 'tube',
* 'radialSegments',
* 'tubularSegments',
* 'arc'
* ]
* }
* </pre>
*/function Torus(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Torus);_this=possibleConstructorReturn(this,getPrototypeOf$2(Torus).call(this,params,Torus.defaults,Torus.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Torus.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Torus
*/createClass(Torus,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new TorusGeometry(params.geometry.radius,params.geometry.tube,params.geometry.radialSegments,params.geometry.tubularSegments,params.geometry.arc);}}]);inherits(Torus,_MeshComponent);return Torus;}(MeshComponent);defineProperty$3(defineProperty$3(Torus,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:100,tube:40,radialSegments:8,tubularSegments:6,arc:Math.PI*2}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','tube','radialSegments','tubularSegments','arc']}));/**
* @class Torusknot
* @category components/meshes
* @description Torusknot class makes a torusknot figure. It's like a crooked donut, very crooked.
* @classDesc
* <iframe src="https://threejs.org/docs/scenes/geometry-browser.html#TorusKnotGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Torusknot, and adding it to app</caption>
* new Torusknot({
* geometry: {
* radius:5,
* tube: 2
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
*
* pos: {
* y: 100
* }
* }).addTo(app);
*/var Torusknot=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Torusknot#defaults
* @static
* @default <pre>
* {
* geometry: {
* radius: 100,
* tube: 40,
* radialSegments: 64,
* tubularSegments: 8,
* p: 2,
* q: 3
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Torusknot#instructions
* @static
* @default <pre>
* {
* geometry: [
* 'radius',
* 'tube',
* 'radialSegments',
* 'tubularSegments',
* 'p',
* 'q'
* ]
* }
* </pre>
*/function Torusknot(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Torusknot);_this=possibleConstructorReturn(this,getPrototypeOf$2(Torusknot).call(this,params,Torusknot.defaults,Torusknot.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Torusknot.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Torusknot
*/createClass(Torusknot,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var GConstruct=params.buffer?TorusKnotBufferGeometry:TorusKnotGeometry;return new GConstruct(params.geometry.radius,params.geometry.tube,params.geometry.radialSegments,params.geometry.tubularSegments,params.geometry.p,params.geometry.q);}}]);inherits(Torusknot,_MeshComponent);return Torusknot;}(MeshComponent);defineProperty$3(defineProperty$3(Torusknot,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:100,tube:40,radialSegments:64,tubularSegments:8,p:2,q:3}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','tube','radialSegments','tubularSegments','p','q']}));/**
* @class Tube
* @category components/meshes
* @description Tube class makes a tube that extrudes along a 3d curve.
* @classDesc
* <iframe src="https://threejs.org/docs/index.html#api/geometries/TubeGeometry"></iframe>
* @param {Object} [params] - The params.
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Creating a Tube from a three.js Curve, and adding it to app</caption>
* const CustomSinCurve = THREE.Curve.create(
* function (scale) { // custom curve constructor
* this.scale = (scale === undefined) ? 1 : scale;
* },
*
* function (t) { // getPoint: t is between 0-1
* const tx = t * 3 - 1.5,
* ty = Math.sin( 2 * Math.PI * t ),
* tz = 0;
*
* return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale);
* }
* );
*
* const path = new CustomSinCurve(10);
*
* new Tube({
* geometry: {
* path: path
* },
*
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* })
* }).addTo(app);
*/var Tube=/*#__PURE__*/function(_MeshComponent){/**
* Default values for parameters
* @member {Object} module:components/meshes.Tube#defaults
* @static
* @default <pre>
* {
* geometry: {
* path: new THREE.LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)),
* segments: 20,
* radius: 2,
* radiusSegments: 8,
* closed: false
* }
* }
* </pre>
*/ /**
* Instructions
* @member {Object} module:components/meshes.Tube#instructions
* @static
* @default <pre>
* {
* geometry: [
* 'path',
* 'segments',
* 'radius',
* 'radiusSegments',
* 'closed'
* ]
* }
* </pre>
*/function Tube(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Tube);_this=possibleConstructorReturn(this,getPrototypeOf$2(Tube).call(this,params,Tube.defaults,Tube.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Tube.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/**
* @method build
* @description Build lifecycle creates a mesh using input params.
* @param {Object} params Component parameters.
* @return {THREE.Mesh} Built mesh
* @memberof module:components/meshes.Tube
*/createClass(Tube,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?TubeBufferGeometry:TubeGeometry)(params.geometry.path,params.geometry.segments,params.geometry.radius,params.geometry.radiusSegments,params.geometry.closed);return geometry;}}]);inherits(Tube,_MeshComponent);return Tube;}(MeshComponent);defineProperty$3(defineProperty$3(Tube,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{path:new LineCurve3(new Vector3(0,0,0),new Vector3(0,0,1)),segments:20,radius:2,radiusSegments:8,closed:false}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['path','segments','radius','radiusSegments','closed']}));/**
* @class Group
* @category components/meshes
* @description Sometimes you need to make groups of objects (it's not conveniently to apply transforms to each object when can make just one to a group).<br/>
* In Three.js you make it using `THREE.Object3D` and it's children. <br/><br/>
* In whs.js we have `Group`
* @extends module:core.MeshComponent
* @memberof module:components/meshes
* @example <caption>Approach 2 - Adding objects to an empty group</caption>
* const sphere = new Sphere();
* const box = new Box();
* const group = new Group();
*
* sphere.addTo(group);
* box.addTo(group);
* @example <caption>Approach 2 - Making a group from objects</caption>
* const sphere = new Sphere();
* const box = new Box();
* const group = new Group(box, sphere);
* // OR: const group = new Group([box, sphere]);
*/var Group$1=/*#__PURE__*/function(_MeshComponent){function Group$$1(){var _this;classCallCheck(this,Group$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(Group$$1).call(this,{}));for(var i=0;i<arguments.length;i++){var obj=i<0||arguments.length<=i?undefined:arguments[i];if(obj instanceof Component)obj.addTo(assertThisInitialized(assertThisInitialized(_this)));else if(obj instanceof Object3D)_this.native.add(obj);}return _this;}createClass(Group$$1,[{key:"build",value:function build(){return new Object3D();}}]);inherits(Group$$1,_MeshComponent);return Group$$1;}(MeshComponent);/** @module components/meshes */ /**
* @class ElementModule
* @category modules/app
* @param {Object} [container=document.body] container is the DOM object to which application's canvas will be added to.
* @memberof module:modules/app
* @example <caption>Creating an element module, passing it to the App</caption>
* new App([
* new ElementModule(document.getElementById('app'))
* ]);
*/var ElementModule=/*#__PURE__*/function(){function ElementModule(){var container=arguments.length>0&&arguments[0]!==undefined?arguments[0]:document.body;classCallCheck(this,ElementModule);if(container.container){console.warn('ElementModule now accepts only argument which is a DOM object, not a params object.');this.container=container.container;}else this.container=container;this.createElement();}/**
* @method createElement
* @instance
* @description Creates a canvas element.
* @memberof module:modules/app.ElementModule
*/createClass(ElementModule,[{key:"createElement",value:function createElement(){this.element=window.document.createElement('div');this.element.className='whs-app';this.element.style.width='inherit';this.element.style.height='inherit';this.element.style.position='relative';}},{key:"manager",value:function manager(_manager){_manager.set('element',this.element);_manager.set('container',this.container);}},{key:"integrate",value:function integrate(self){self.container.appendChild(self.element);}}]);return ElementModule;}();/**
* @class RenderingModule
* @category modules/app
* @param {Object} [params]
* @memberof module:modules/app
* @example <caption> Creating a rendering module and passing it to App's modules</caption>
* new App([
* new ElementModule(),
* new SceneModule(),
* new DefineModule('camera', new PerspectiveCamera({
* position: new THREE.Vector3(0, 6, 18),
* far: 10000
* })),
* new RenderingModule({
* bgColor: 0x162129,
*
* renderer: {
* antialias: true
* }
* }, {shadow: true})
* ]);
*/var RenderingModule=/*#__PURE__*/function(){/**
* additional
* @description collection of additional scripts
* @static
* @member {Object} module:core.App#additional
* @public
*/ /**
* enabled
* @static
* @member {Boolean} module:core.App#enabled
* @public
*/function RenderingModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var additional=arguments.length>1?arguments[1]:undefined;classCallCheck(this,RenderingModule);defineProperty$3(this,"enabled",true);this.params=Object.assign({width:window.innerWidth,height:window.innerHeight,resolution:new Vector2(1,1),pixelRatio:window.devicePixelRatio,bgColor:0x000000,bgOpacity:1,renderer:{},fix:function fix(){}},params);var _this$params=this.params,bgColor=_this$params.bgColor,bgOpacity=_this$params.bgOpacity,_renderer=_this$params.renderer,pixelRatio=_this$params.pixelRatio,width=_this$params.width,height=_this$params.height,resolution=_this$params.resolution,fix=_this$params.fix;this.renderer=new WebGLRenderer(_renderer);this.effects=[];this.renderer.setClearColor(bgColor,bgOpacity);if(pixelRatio)this.renderer.setPixelRatio(pixelRatio);this.setSize(Number(width*resolution.x).toFixed(),Number(height*resolution.y).toFixed());for(var key in additional){if(additional[key])this.applyAdditional(key);}fix(this.renderer);}/**
* @method applyAdditional
* @description Apply additional script from RenderingModule.additional
* @param {Stirng} name Script name
* @return {this}
* @memberof module:modules/app.RenderingModule
*/createClass(RenderingModule,[{key:"applyAdditional",value:function applyAdditional(name){RenderingModule.additional[name].apply(this,[this.renderer]);}/**
* @method integrateRenderer
* @description Integrate renderer
* @param {NodeElement} element DOM object
* @param {THREE.Scene} scene used scene
* @param {THREE.Camera} camera used camera
* @return {Loop} renderLoop
* @memberof module:modules/app.RenderingModule
*/},{key:"integrateRenderer",value:function integrateRenderer(element,scene,camera){var _this=this;this.scene=scene;this.camera=camera;this.attachToCanvas(element);return new Loop(function(){return _this.renderer.render(_this.scene,_this.camera);});}/**
* @method effect
* @description Add three.js effect
* @param {Object} effect three.js effect
* @param {function} effectLoop update function for effect
* @return {this}
* @memberof module:modules/app.RenderingModule
*/},{key:"effect",value:function effect(_effect){var _this2=this;var effectLoop=arguments.length>1&&arguments[1]!==undefined?arguments[1]:function(){_effect.render(_this2.scene,_this2.camera);};this.renderLoop.stop();var size=this.renderer.getSize();_effect.setSize(size.width,size.height);var loop=new Loop(effectLoop);this.effects.push(loop);if(this.enabled)loop.start(this.app);return this;}/**
* @method setSize
* @description Update render target width and height.
* @param {Number} width
* @param {Number} height
* @memberof module:modules/app.RenderingModule
*/},{key:"setSize",value:function setSize(width,height){if(this.renderer)this.renderer.setSize(width,height);}/**
* @method attachToCanvas
* @description Attach renderer.domElement to element
* @param {NodeElement} element DOM object
* @memberof module:modules/app.RenderingModule
*/},{key:"attachToCanvas",value:function attachToCanvas(element){var canvas=this.renderer.domElement;// attach to new parent world dom
element.appendChild(canvas);canvas.style.width='100%';canvas.style.height='100%';}/**
* @method stop
* @description Stops renderLoop and effect loops
* @memberof module:modules/app.RenderingModule
*/},{key:"stop",value:function stop(){this.enabled=false;this.renderLoop.stop();this.effects.forEach(function(loop){return loop.stop();});}/**
* @method play
* @description Resumes renderLoop and effect loops
* @memberof module:modules/app.RenderingModule
*/},{key:"play",value:function play(){this.enabled=true;this.renderLoop.start();this.effects.forEach(function(loop){return loop.start();});}},{key:"manager",value:function manager(_manager){var _this3=this;_manager.define('rendering');_manager.set('renderer',this.renderer);this.app=_manager.handler;this.renderLoop=this.integrateRenderer(_manager.get('element'),_manager.get('scene'),_manager.get('camera').native);_manager.update({element:function element(_element){_this3.attachToCanvas(_element);},scene:function scene(_scene){_this3.scene=_scene;},camera:function camera(_camera){_this3.camera=_camera.native;}});}},{key:"integrate",value:function integrate(self){var _this4=this;self.renderLoop.start(this);self.effects.forEach(function(loop){return loop.start(_this4);});}/**
* @method dispose
* @description Dispose rendering context
* @memberof module:modules/app.RenderingModule
*/},{key:"dispose",value:function dispose(){this.stop();this.renderer.forceContextLoss();}}]);return RenderingModule;}();defineProperty$3(RenderingModule,"additional",{shadow:function shadow(renderer){renderer.shadowMap.enabled=true;}});var SYMBOL_CHILDREN_FOR_SCENE=Symbol('SYMBOL_CHILDREN_FOR_SCENE');/**
* @class SceneModule
* @category modules/app
* @param {Boolean} [willSceneBeReplaced=false] willSceneBeReplaced should be true only if you are going to overwrite scene dependency even without the use of default one.
* @memberof module:modules/app
*/var SceneModule=/*#__PURE__*/function(){function SceneModule(){var willSceneBeReplaced=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;classCallCheck(this,SceneModule);this.scene=willSceneBeReplaced?null:new Scene();}createClass(SceneModule,[{key:"manager",value:function manager(_manager){_manager.set('scene',this.scene);}},{key:"integrate",value:function integrate(self){Object.assign(this,{add:function add(object){var _this=this;return asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee(){return regenerator.wrap(function _callee$(_context){while(1){switch(_context.prev=_context.next){case 0:if(!object.parent){_context.next=3;break;}_context.next=3;return object.parent.remove(object);case 3:_context.next=5;return object.wait();case 5:if(object.native){_context.next=7;break;}throw new CompositionError('SceneModule','there is no object.native',_this);case 7:object.parent=_this;_context.next=10;return _this.applyBridge({onAdd:object}).onAdd;case 10:self.scene.add(object.native);_this.children.push(object);return _context.abrupt("return",object);case 13:case"end":return _context.stop();}}},_callee,this);}))();},remove:function remove(object){var _this2=this;return asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee2(){return regenerator.wrap(function _callee2$(_context2){while(1){switch(_context2.prev=_context2.next){case 0:if(!(object.parent!==_this2)){_context2.next=2;break;}return _context2.abrupt("return");case 2:_context2.next=4;return object.wait();case 4:object.parent=null;self.scene.remove(object.native);_this2.children.splice(_this2.children.indexOf(object),1);case 7:case"end":return _context2.stop();}}},_callee2,this);}))();},_setScene:function _setScene(scene){this.children=scene[SYMBOL_CHILDREN_FOR_SCENE]=scene[SYMBOL_CHILDREN_FOR_SCENE]||[];self.scene=scene;},setScene:function setScene(scene){this._setScene(scene);this.manager.set('scene',scene);},getScene:function getScene(){return self.scene;}});if(self.scene)this._setScene(self.scene);}}]);return SceneModule;}();// import {addResizeListener} from 'detect-element-resize';
/**
* @class ResizeModule
* @category modules/app
* @param {Object} [params={auto: true}] - If auto is set to true - resize will be triggered when container resizes
* @memberof module:modules/app
*/var ResizeModule=/*#__PURE__*/function(){function ResizeModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,ResizeModule);this.params=Object.assign({auto:true},params);this.callbacks=[this.setSize.bind(this)];}/**
* @function setSize
* @instance
* @description This function sets the provided width & height to the renderer object.
* @param {Number} [width=1] - The promise that should be added to a queue.
* @param {Number} [height=1] - that is resolved when all promises completed.
* @memberof module:modules/app.ResizeModule
*/createClass(ResizeModule,[{key:"setSize",value:function setSize(){var width=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1;var height=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1;this.camera.native.aspect=width/height;this.camera.native.updateProjectionMatrix();if(this.rendering)this.rendering.setSize(width,height);}/**
* @method trigger
* @instance
* @description Triggers resize when called. width & height are determined automatically
* This invokes each callbacks with the new width and height as params
* @memberof module:modules/app.ResizeModule
*/},{key:"trigger",value:function trigger(){var _this$container=this.container,offsetWidth=_this$container.offsetWidth,offsetHeight=_this$container.offsetHeight,resolution=this.resolution;var width=Number(offsetWidth*resolution.x).toFixed();var height=Number(offsetHeight*resolution.y).toFixed();this.callbacks.forEach(function(cb){cb(width,height);});}/**
* @method addAutoresize
* @instance
* @description Sets module to autoresize, this adds an event listene on window resize to trigger the resize
* @memberof module:modules/app.ResizeModule
*/},{key:"addAutoresize",value:function addAutoresize(){this.container=this.getContainer();this.resolution=this.getResolution();if(this.params.auto)window.addEventListener('resize',this.trigger.bind(this));}/**
* @method addCallback
* @instance
* @description Adds a call back function to the existing callbacks list.
* @param {Function} func - The callback function to add
* @memberof module:modules/app.ResizeModule
*/},{key:"addCallback",value:function addCallback(func){this.callbacks.push(func);}},{key:"manager",value:function manager(_manager){var _this=this;_manager.define('resize');this.rendering=_manager.get('renderer');this.camera=_manager.get('camera');this.getResolution=function(){return _manager.use('rendering').params.resolution;};this.getContainer=function(){return _manager.get('container');};_manager.update({container:function container(_container){_this.container=_container;}});this.addAutoresize();}}]);return ResizeModule;}();var fragment="uniform sampler2D tPreviousLum;\r\nuniform sampler2D tCurrentLum;\r\nuniform float minLuminance;\r\nuniform float delta;\r\nuniform float tau;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tfloat previousLum = texture2D(tPreviousLum, vUv, MIP_LEVEL_1X1).r;\r\n\tfloat currentLum = texture2D(tCurrentLum, vUv, MIP_LEVEL_1X1).r;\r\n\r\n\tpreviousLum = max(minLuminance, previousLum);\r\n\tcurrentLum = max(minLuminance, currentLum);\r\n\r\n\t// Adapt the luminance using Pattanaik's technique.\r\n\tfloat adaptedLum = previousLum + (currentLum - previousLum) * (1.0 - exp(-delta * tau));\r\n\r\n\tgl_FragColor.r = adaptedLum;\r\n\r\n}\r\n";var vertex="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* An adaptive luminosity shader material.
*/var AdaptiveLuminosityMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new adaptive luminosity material.
*/function AdaptiveLuminosityMaterial(){classCallCheck(this,AdaptiveLuminosityMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(AdaptiveLuminosityMaterial).call(this,{type:"AdaptiveLuminosityMaterial",defines:{MIP_LEVEL_1X1:"0.0"},uniforms:{tPreviousLum:new Uniform(null),tCurrentLum:new Uniform(null),minLuminance:new Uniform(0.01),delta:new Uniform(0.0),tau:new Uniform(1.0)},fragmentShader:fragment,vertexShader:vertex,depthWrite:false,depthTest:false}));}inherits(AdaptiveLuminosityMaterial,_ShaderMaterial);return AdaptiveLuminosityMaterial;}(ShaderMaterial);var fragment$1="uniform sampler2D tDiffuse;\r\nuniform sampler2D tDepth;\r\n\r\nuniform float focus;\r\nuniform float dof;\r\nuniform float aspect;\r\nuniform float aperture;\r\nuniform float maxBlur;\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifndef USE_LOGDEPTHBUF\r\n\r\n\t#include <packing>\r\n\r\n\tuniform float cameraNear;\r\n\tuniform float cameraFar;\r\n\r\n\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\r\n\r\n\t\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\nvoid main() {\r\n\r\n\tvec2 aspectCorrection = vec2(1.0, aspect);\r\n\r\n\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\tfloat depth = texture2D(tDepth, vUv).x;\r\n\r\n\t#else\r\n\r\n\t\tfloat depth = readDepth(tDepth, vUv);\r\n\r\n\t#endif\r\n\r\n\tfloat focusNear = clamp(focus - dof, 0.0, 1.0);\r\n\tfloat focusFar = clamp(focus + dof, 0.0, 1.0);\r\n\r\n\t// Calculate a DoF mask.\r\n\tfloat low = step(depth, focusNear);\r\n\tfloat high = step(focusFar, depth);\r\n\r\n\tfloat factor = (depth - focusNear) * low + (depth - focusFar) * high;\r\n\r\n\tvec2 dofBlur = vec2(clamp(factor * aperture, -maxBlur, maxBlur));\r\n\r\n\tvec2 dofblur9 = dofBlur * 0.9;\r\n\tvec2 dofblur7 = dofBlur * 0.7;\r\n\tvec2 dofblur4 = dofBlur * 0.4;\r\n\r\n\tvec4 color = vec4(0.0);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofBlur);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofblur9);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur7);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.4, 0.0 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur4);\r\n\r\n\tgl_FragColor = color / 41.0;\r\n\r\n}\r\n";var vertex$1="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* Depth of Field shader (Bokeh).
*
* Original shader code by Martins Upitis:
* http://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html
*/var BokehMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new bokeh material.
*
* @param {PerspectiveCamera} [camera] - A camera.
* @param {Object} [options] - The options.
* @param {Number} [options.focus=1.0] - The focus distance, corresponds directly with the scene depth.
* @param {Number} [options.dof=0.02] - Depth of field. An area in front of and behind the focus point that still appears sharp.
* @param {Number} [options.aperture=0.025] - Camera aperture scale. Bigger values for stronger blur and shallower depth of field.
* @param {Number} [options.maxBlur=1.0] - Maximum blur strength.
*/function BokehMaterial(camera){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,BokehMaterial);var settings=Object.assign({focus:1.0,dof:0.02,aperture:0.025,maxBlur:1.0},options);_this=possibleConstructorReturn(this,getPrototypeOf$2(BokehMaterial).call(this,{type:"BokehMaterial",uniforms:{cameraNear:new Uniform(0.1),cameraFar:new Uniform(2000),aspect:new Uniform(1.0),tDiffuse:new Uniform(null),tDepth:new Uniform(null),focus:new Uniform(settings.focus),dof:new Uniform(settings.dof),aperture:new Uniform(settings.aperture),maxBlur:new Uniform(settings.maxBlur)},fragmentShader:fragment$1,vertexShader:vertex$1,depthWrite:false,depthTest:false}));_this.adoptCameraSettings(camera);return _this;}/**
* Adopts the settings of the given camera.
*
* @param {PerspectiveCamera} [camera=null] - A camera.
*/createClass(BokehMaterial,[{key:"adoptCameraSettings",value:function adoptCameraSettings(){var camera=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;if(camera!==null){this.uniforms.cameraNear.value=camera.near;this.uniforms.cameraFar.value=camera.far;this.uniforms.aspect.value=camera.aspect;}}}]);inherits(BokehMaterial,_ShaderMaterial);return BokehMaterial;}(ShaderMaterial);var fragment$2="uniform sampler2D tDiffuse;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\n\r\nvoid main() {\r\n\r\n\tconst vec2 threshold = vec2(EDGE_THRESHOLD);\r\n\r\n\t// Calculate color deltas.\r\n\tvec4 delta;\r\n\tvec3 c = texture2D(tDiffuse, vUv).rgb;\r\n\r\n\tvec3 cLeft = texture2D(tDiffuse, vOffset[0].xy).rgb;\r\n\tvec3 t = abs(c - cLeft);\r\n\tdelta.x = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cTop = texture2D(tDiffuse, vOffset[0].zw).rgb;\r\n\tt = abs(c - cTop);\r\n\tdelta.y = max(max(t.r, t.g), t.b);\r\n\r\n\t// We do the usual threshold.\r\n\tvec2 edges = step(threshold, delta.xy);\r\n\r\n\t// Then discard if there is no edge.\r\n\tif(dot(edges, vec2(1.0)) == 0.0) {\r\n\r\n\t\tdiscard;\r\n\r\n\t}\r\n\r\n\t// Calculate right and bottom deltas.\r\n\tvec3 cRight = texture2D(tDiffuse, vOffset[1].xy).rgb;\r\n\tt = abs(c - cRight);\r\n\tdelta.z = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cBottom = texture2D(tDiffuse, vOffset[1].zw).rgb;\r\n\tt = abs(c - cBottom);\r\n\tdelta.w = max(max(t.r, t.g), t.b);\r\n\r\n\t// Calculate the maximum delta in the direct neighborhood.\r\n\tfloat maxDelta = max(max(max(delta.x, delta.y), delta.z), delta.w);\r\n\r\n\t// Calculate left-left and top-top deltas.\r\n\tvec3 cLeftLeft = texture2D(tDiffuse, vOffset[2].xy).rgb;\r\n\tt = abs(c - cLeftLeft);\r\n\tdelta.z = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cTopTop = texture2D(tDiffuse, vOffset[2].zw).rgb;\r\n\tt = abs(c - cTopTop);\r\n\tdelta.w = max(max(t.r, t.g), t.b);\r\n\r\n\t// Calculate the final maximum delta.\r\n\tmaxDelta = max(max(maxDelta, delta.z), delta.w);\r\n\r\n\t// Local contrast adaptation in action.\r\n\tedges.xy *= step(0.5 * maxDelta, delta.xy);\r\n\r\n\tgl_FragColor = vec4(edges, 0.0, 0.0);\r\n\r\n}\r\n";var vertex$2="uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-1.0, 0.0, 0.0, 1.0); // Changed sign in W component.\r\n\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\r\n\tvOffset[2] = uv.xyxy + texelSize.xyxy * vec4(-2.0, 0.0, 0.0, 2.0); // Changed sign in W component.\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* A material that detects edges in a color texture.
*
* Mainly used for Subpixel Morphological Antialiasing.
*/var ColorEdgesMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new color edges material.
*
* @param {Vector2} [texelSize] - The absolute screen texel size.
*/function ColorEdgesMaterial(){var texelSize=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Vector2();classCallCheck(this,ColorEdgesMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(ColorEdgesMaterial).call(this,{type:"ColorEdgesMaterial",defines:{EDGE_THRESHOLD:"0.1"},uniforms:{tDiffuse:new Uniform(null),texelSize:new Uniform(texelSize)},fragmentShader:fragment$2,vertexShader:vertex$2,depthWrite:false,depthTest:false}));}/**
* Sets the edge detection sensitivity.
*
* A lower value results in more edges being detected at the expense of
* performance.
*
* 0.1 is a reasonable value, and allows to catch most visible edges.
* 0.05 is a rather overkill value, that allows to catch 'em all.
*
* If temporal supersampling is used, 0.2 could be a reasonable value,
* as low contrast edges are properly filtered by just 2x.
*
* @param {Number} threshold - The edge detection sensitivity. Range: [0, 0.5].
*/createClass(ColorEdgesMaterial,[{key:"setEdgeDetectionThreshold",value:function setEdgeDetectionThreshold(threshold){this.defines.EDGE_THRESHOLD=threshold.toFixed("2");this.needsUpdate=true;}}]);inherits(ColorEdgesMaterial,_ShaderMaterial);return ColorEdgesMaterial;}(ShaderMaterial);var fragment$3="uniform sampler2D texture1;\r\nuniform sampler2D texture2;\r\n\r\nuniform float opacity1;\r\nuniform float opacity2;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel1 = opacity1 * texture2D(texture1, vUv);\r\n\tvec4 texel2 = opacity2 * texture2D(texture2, vUv);\r\n\r\n\t#ifdef SCREEN_MODE\r\n\r\n\t\tvec3 invTexel1 = vec3(1.0) - texel1.rgb;\r\n\t\tvec3 invTexel2 = vec3(1.0) - texel2.rgb;\r\n\r\n\t\tvec4 color = vec4(\r\n\t\t\tvec3(1.0) - invTexel1 * invTexel2,\r\n\t\t\ttexel1.a + texel2.a\r\n\t\t);\r\n\r\n\t#else\r\n\r\n\t\tvec4 color = texel1 + texel2;\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";var vertex$3="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* A material for combining two textures.
*
* This material supports the two blend modes Add and Screen.
*
* In Screen mode, the two textures are effectively projected on a white screen
* simultaneously. In Add mode, the textures are simply added together which
* often produces undesired, washed out results.
*/var CombineMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new combine material.
*
* @param {Boolean} [screenMode=false] - Whether the screen blend mode should be used.
*/function CombineMaterial(){var _this;var screenMode=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;classCallCheck(this,CombineMaterial);_this=possibleConstructorReturn(this,getPrototypeOf$2(CombineMaterial).call(this,{type:"CombineMaterial",uniforms:{texture1:new Uniform(null),texture2:new Uniform(null),opacity1:new Uniform(1.0),opacity2:new Uniform(1.0)},fragmentShader:fragment$3,vertexShader:vertex$3,depthWrite:false,depthTest:false}));_this.setScreenModeEnabled(screenMode);return _this;}/**
* Enables or disables the Screen blend mode.
*
* @param {Boolean} enabled - Whether the Screen blend mode should be enabled.
*/createClass(CombineMaterial,[{key:"setScreenModeEnabled",value:function setScreenModeEnabled(enabled){if(enabled){this.defines.SCREEN_MODE="1";}else{delete this.defines.SCREEN_MODE;}this.needsUpdate=true;}}]);inherits(CombineMaterial,_ShaderMaterial);return CombineMaterial;}(ShaderMaterial);var fragment$4="#include <common>\r\n#include <dithering_pars_fragment>\r\n\r\nuniform sampler2D tDiffuse;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\t// Sample top left texel.\r\n\tvec4 sum = texture2D(tDiffuse, vUv0);\r\n\r\n\t// Sample top right texel.\r\n\tsum += texture2D(tDiffuse, vUv1);\r\n\r\n\t// Sample bottom right texel.\r\n\tsum += texture2D(tDiffuse, vUv2);\r\n\r\n\t// Sample bottom left texel.\r\n\tsum += texture2D(tDiffuse, vUv3);\r\n\r\n\t// Compute the average.\r\n\tgl_FragColor = sum * 0.25;\r\n\r\n\t#include <dithering_fragment>\r\n\r\n}\r\n";var vertex$4="uniform vec2 texelSize;\r\nuniform vec2 halfTexelSize;\r\nuniform float kernel;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvec2 dUv = (texelSize * vec2(kernel)) + halfTexelSize;\r\n\r\n\tvUv0 = vec2(uv.x - dUv.x, uv.y + dUv.y);\r\n\tvUv1 = vec2(uv.x + dUv.x, uv.y + dUv.y);\r\n\tvUv2 = vec2(uv.x + dUv.x, uv.y - dUv.y);\r\n\tvUv3 = vec2(uv.x - dUv.x, uv.y - dUv.y);\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* An optimised convolution shader material.
*
* This material supports dithering.
*
* Based on the GDC2003 Presentation by Masaki Kawase, Bunkasha Games:
* Frame Buffer Postprocessing Effects in DOUBLE-S.T.E.A.L (Wreckless)
* and an article by Filip Strugar, Intel:
* An investigation of fast real-time GPU-based image blur algorithms
*
* Further modified according to Apple's
* [Best Practices for Shaders](https://goo.gl/lmRoM5).
*/var ConvolutionMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new convolution material.
*
* @param {Vector2} [texelSize] - The absolute screen texel size.
*/function ConvolutionMaterial(){var _this;var texelSize=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Vector2();classCallCheck(this,ConvolutionMaterial);_this=possibleConstructorReturn(this,getPrototypeOf$2(ConvolutionMaterial).call(this,{type:"ConvolutionMaterial",uniforms:{tDiffuse:new Uniform(null),texelSize:new Uniform(new Vector2()),halfTexelSize:new Uniform(new Vector2()),kernel:new Uniform(0.0)},fragmentShader:fragment$4,vertexShader:vertex$4,depthWrite:false,depthTest:false}));_this.setTexelSize(texelSize.x,texelSize.y);/**
* The current kernel size.
*
* @type {KernelSize}
* @default KernelSize.LARGE
*/_this.kernelSize=KernelSize.LARGE;return _this;}/**
* Returns the kernel.
*
* @return {Float32Array} The kernel.
*/createClass(ConvolutionMaterial,[{key:"getKernel",value:function getKernel(){return kernelPresets[this.kernelSize];}/**
* Sets the texel size.
*
* @param {Number} x - The texel width.
* @param {Number} y - The texel height.
*/},{key:"setTexelSize",value:function setTexelSize(x,y){this.uniforms.texelSize.value.set(x,y);this.uniforms.halfTexelSize.value.set(x,y).multiplyScalar(0.5);}}]);inherits(ConvolutionMaterial,_ShaderMaterial);return ConvolutionMaterial;}(ShaderMaterial);/**
* The Kawase blur kernel presets.
*
* @type {Float32Array[]}
* @private
*/var kernelPresets=[new Float32Array([0.0,0.0]),new Float32Array([0.0,1.0,1.0]),new Float32Array([0.0,1.0,1.0,2.0]),new Float32Array([0.0,1.0,2.0,2.0,3.0]),new Float32Array([0.0,1.0,2.0,3.0,4.0,4.0,5.0]),new Float32Array([0.0,1.0,2.0,3.0,4.0,5.0,7.0,8.0,9.0,10.0])];/**
* A kernel size enumeration.
*
* @type {Object}
* @property {Number} VERY_SMALL - A very small kernel that matches a 7x7 Gauss blur kernel.
* @property {Number} SMALL - A small kernel that matches a 15x15 Gauss blur kernel.
* @property {Number} MEDIUM - A medium sized kernel that matches a 23x23 Gauss blur kernel.
* @property {Number} LARGE - A large kernel that matches a 35x35 Gauss blur kernel.
* @property {Number} VERY_LARGE - A very large kernel that matches a 63x63 Gauss blur kernel.
* @property {Number} HUGE - A huge kernel that matches a 127x127 Gauss blur kernel.
*/var KernelSize={VERY_SMALL:0,SMALL:1,MEDIUM:2,LARGE:3,VERY_LARGE:4,HUGE:5};var fragment$5="uniform sampler2D tDiffuse;\r\nuniform float opacity;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tgl_FragColor = opacity * texel;\r\n\r\n}\r\n";var vertex$5="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* A simple copy shader material.
*/var CopyMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new copy material.
*/function CopyMaterial(){classCallCheck(this,CopyMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(CopyMaterial).call(this,{type:"CopyMaterial",uniforms:{tDiffuse:new Uniform(null),opacity:new Uniform(1.0)},fragmentShader:fragment$5,vertexShader:vertex$5,depthWrite:false,depthTest:false}));}inherits(CopyMaterial,_ShaderMaterial);return CopyMaterial;}(ShaderMaterial);var fragment$6="#include <packing>\r\n#include <clipping_planes_pars_fragment>\r\n\r\nuniform sampler2D tDepth;\r\nuniform float cameraNear;\r\nuniform float cameraFar;\r\n\r\nvarying float vViewZ;\r\nvarying vec4 vProjTexCoord;\r\n\r\nvoid main() {\r\n\r\n\t#include <clipping_planes_fragment>\r\n\r\n\t// Transform into Cartesian coordinate (not mirrored).\r\n\tvec2 projTexCoord = (vProjTexCoord.xy / vProjTexCoord.w) * 0.5 + 0.5;\r\n\tprojTexCoord = clamp(projTexCoord, 0.002, 0.998);\r\n\r\n\tfloat fragCoordZ = unpackRGBAToDepth(texture2D(tDepth, projTexCoord));\r\n\r\n\t#ifdef PERSPECTIVE_CAMERA\r\n\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t#else\r\n\r\n\t\tfloat viewZ = orthographicDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t#endif\r\n\r\n\tfloat depthTest = (-vViewZ > -viewZ) ? 1.0 : 0.0;\r\n\r\n\tgl_FragColor.rgb = vec3(0.0, depthTest, 1.0);\r\n\r\n}\r\n";var vertex$6="#include <common>\r\n#include <morphtarget_pars_vertex>\r\n#include <skinning_pars_vertex>\r\n#include <clipping_planes_pars_vertex>\r\n\r\nvarying float vViewZ;\r\nvarying vec4 vProjTexCoord;\r\n\r\nvoid main() {\r\n\r\n\t#include <skinbase_vertex>\r\n\r\n\t#include <begin_vertex>\r\n\t#include <morphtarget_vertex>\r\n\t#include <skinning_vertex>\r\n\t#include <project_vertex>\r\n\r\n\tvViewZ = mvPosition.z;\r\n\tvProjTexCoord = gl_Position;\r\n\r\n\t#include <clipping_planes_vertex>\r\n\r\n}\r\n";/**
* A depth comparison shader material.
*/var DepthComparisonMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new depth comparison material.
*
* @param {Texture} [depthTexture=null] - A depth texture.
* @param {PerspectiveCamera} [camera] - A camera.
*/function DepthComparisonMaterial(){var _this;var depthTexture=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;var camera=arguments.length>1?arguments[1]:undefined;classCallCheck(this,DepthComparisonMaterial);_this=possibleConstructorReturn(this,getPrototypeOf$2(DepthComparisonMaterial).call(this,{type:"DepthComparisonMaterial",uniforms:{tDepth:new Uniform(depthTexture),cameraNear:new Uniform(0.1),cameraFar:new Uniform(2000)},fragmentShader:fragment$6,vertexShader:vertex$6,depthWrite:false,depthTest:false,morphTargets:true,skinning:true}));_this.adoptCameraSettings(camera);return _this;}/**
* Adopts the settings of the given camera.
*
* @param {Camera} [camera=null] - A camera.
*/createClass(DepthComparisonMaterial,[{key:"adoptCameraSettings",value:function adoptCameraSettings(){var camera=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;if(camera!==null){this.uniforms.cameraNear.value=camera.near;this.uniforms.cameraFar.value=camera.far;if(camera instanceof PerspectiveCamera){this.defines.PERSPECTIVE_CAMERA="1";}else{delete this.defines.PERSPECTIVE_CAMERA;}}}}]);inherits(DepthComparisonMaterial,_ShaderMaterial);return DepthComparisonMaterial;}(ShaderMaterial);var fragment$7="uniform sampler2D tDiffuse;\r\n\r\nuniform float angle;\r\nuniform float scale;\r\nuniform float intensity;\r\n\r\nvarying vec2 vUv;\r\nvarying vec2 vUvPattern;\r\n\r\nfloat pattern() {\r\n\r\n\tfloat s = sin(angle);\r\n\tfloat c = cos(angle);\r\n\r\n\tvec2 point = vec2(c * vUvPattern.x - s * vUvPattern.y, s * vUvPattern.x + c * vUvPattern.y) * scale;\r\n\r\n\treturn (sin(point.x) * sin(point.y)) * 4.0;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tvec3 color = texel.rgb;\r\n\r\n\t#ifdef AVERAGE\r\n\r\n\t\tcolor = vec3((color.r + color.g + color.b) / 3.0);\r\n\r\n\t#endif\r\n\r\n\tcolor = vec3(color * 10.0 - 5.0 + pattern());\r\n\tcolor = texel.rgb + (color - texel.rgb) * intensity;\r\n\r\n\tgl_FragColor = vec4(color, texel.a);\r\n\r\n}\r\n";var vertex$7="uniform vec4 offsetRepeat;\r\n\r\nvarying vec2 vUv;\r\nvarying vec2 vUvPattern;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tvUvPattern = uv * offsetRepeat.zw + offsetRepeat.xy;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* A dot screen shader material.
*/var DotScreenMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new dot screen material.
*
* @param {Boolean} [options] - The options.
* @param {Boolean} [options.average=false] - Whether the shader should output the colour average (black and white).
* @param {Boolean} [options.angle=1.57] - The angle of the dot pattern.
* @param {Boolean} [options.scale=1.0] - The scale of the dot pattern.
* @param {Boolean} [options.intensity=1.0] - The intensity of the effect.
*/function DotScreenMaterial(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,DotScreenMaterial);var settings=Object.assign({average:false,angle:1.57,scale:1.0,intensity:1.0},options);_this=possibleConstructorReturn(this,getPrototypeOf$2(DotScreenMaterial).call(this,{type:"DotScreenMaterial",uniforms:{tDiffuse:new Uniform(null),angle:new Uniform(settings.angle),scale:new Uniform(settings.scale),intensity:new Uniform(settings.intensity),offsetRepeat:new Uniform(new Vector4(0.5,0.5,1.0,1.0))},fragmentShader:fragment$7,vertexShader:vertex$7,depthWrite:false,depthTest:false}));_this.setAverageEnabled(settings.average);return _this;}/**
* Enables or disables the Screen blend mode.
*
* @param {Boolean} enabled - Whether the Screen blend mode should be enabled.
*/createClass(DotScreenMaterial,[{key:"setAverageEnabled",value:function setAverageEnabled(enabled){if(enabled){this.defines.AVERAGE="1";}else{delete this.defines.AVERAGE;}this.needsUpdate=true;}}]);inherits(DotScreenMaterial,_ShaderMaterial);return DotScreenMaterial;}(ShaderMaterial);var fragment$8="uniform sampler2D tDiffuse;\r\nuniform float time;\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifdef NOISE\r\n\r\n\tuniform float noiseIntensity;\r\n\r\n#endif\r\n\r\n#ifdef SCANLINES\r\n\r\n\tuniform float scanlineIntensity;\r\n\tuniform float scanlineCount;\r\n\r\n#endif\r\n\r\n#ifdef GRID\r\n\r\n\tuniform float gridIntensity;\r\n\tuniform vec2 gridScale;\r\n\tuniform float gridLineWidth;\r\n\r\n#endif\r\n\r\n#ifdef GREYSCALE\r\n\r\n\t#include <common>\r\n\r\n\tuniform float greyscaleIntensity;\r\n\r\n#elif defined(SEPIA)\r\n\r\n\tuniform float sepiaIntensity;\r\n\r\n#endif\r\n\r\n#ifdef VIGNETTE\r\n\r\n\tuniform float vignetteOffset;\r\n\tuniform float vignetteDarkness;\r\n\r\n#endif\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tvec3 color = texel.rgb;\r\n\r\n\t#ifdef SCREEN_MODE\r\n\r\n\t\tvec3 invColor;\r\n\r\n\t#endif\r\n\r\n\t#ifdef NOISE\r\n\r\n\t\tfloat x = vUv.x * vUv.y * time * 1000.0;\r\n\t\tx = mod(x, 13.0) * mod(x, 123.0);\r\n\t\tx = mod(x, 0.01);\r\n\r\n\t\tvec3 noise = texel.rgb * clamp(0.1 + x * 100.0, 0.0, 1.0) * noiseIntensity;\r\n\r\n\t\t#ifdef SCREEN_MODE\r\n\r\n\t\t\tinvColor = vec3(1.0) - color;\r\n\t\t\tvec3 invNoise = vec3(1.0) - noise;\r\n\r\n\t\t\tcolor = vec3(1.0) - invColor * invNoise;\r\n\r\n\t\t#else\r\n\r\n\t\t\tcolor += noise;\r\n\r\n\t\t#endif\r\n\r\n\t#endif\r\n\r\n\t#ifdef SCANLINES\r\n\r\n\t\tvec2 sl = vec2(sin(vUv.y * scanlineCount), cos(vUv.y * scanlineCount));\r\n\t\tvec3 scanlines = texel.rgb * vec3(sl.x, sl.y, sl.x) * scanlineIntensity;\r\n\r\n\t\t#ifdef SCREEN_MODE\r\n\r\n\t\t\tinvColor = vec3(1.0) - color;\r\n\t\t\tvec3 invScanlines = vec3(1.0) - scanlines;\r\n\r\n\t\t\tcolor = vec3(1.0) - invColor * invScanlines;\r\n\r\n\t\t#else\r\n\r\n\t\t\tcolor += scanlines;\r\n\r\n\t\t#endif\r\n\r\n\t#endif\r\n\r\n\t#ifdef GRID\r\n\r\n\t\tfloat grid = 0.5 - max(abs(mod(vUv.x * gridScale.x, 1.0) - 0.5), abs(mod(vUv.y * gridScale.y, 1.0) - 0.5));\r\n\t\tcolor *= (1.0 - gridIntensity) + vec3(smoothstep(0.0, gridLineWidth, grid)) * gridIntensity;\r\n\r\n\t#endif\r\n\r\n\t#ifdef GREYSCALE\r\n\r\n\t\tcolor = mix(color, vec3(linearToRelativeLuminance(color)), greyscaleIntensity);\r\n\r\n\t#elif defined(SEPIA)\r\n\r\n\t\tvec3 c = color.rgb;\r\n\r\n\t\tcolor.r = dot(c, vec3(1.0 - 0.607 * sepiaIntensity, 0.769 * sepiaIntensity, 0.189 * sepiaIntensity));\r\n\t\tcolor.g = dot(c, vec3(0.349 * sepiaIntensity, 1.0 - 0.314 * sepiaIntensity, 0.168 * sepiaIntensity));\r\n\t\tcolor.b = dot(c, vec3(0.272 * sepiaIntensity, 0.534 * sepiaIntensity, 1.0 - 0.869 * sepiaIntensity));\r\n\r\n\t#endif\r\n\r\n\t#ifdef VIGNETTE\r\n\r\n\t\tconst vec2 center = vec2(0.5);\r\n\r\n\t\t#ifdef ESKIL\r\n\r\n\t\t\tvec2 uv = (vUv - center) * vec2(vignetteOffset);\r\n\t\t\tcolor = mix(color.rgb, vec3(1.0 - vignetteDarkness), dot(uv, uv));\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat dist = distance(vUv, center);\r\n\t\t\tcolor *= smoothstep(0.8, vignetteOffset * 0.799, dist * (vignetteDarkness + vignetteOffset));\r\n\r\n\t\t#endif\t\t\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = vec4(clamp(color, 0.0, 1.0), texel.a);\r\n\r\n}\r\n";var vertex$8="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* A cinematic shader that provides the following effects:
* - Film Grain
* - Scanlines
* - Vignette
* - Greyscale
* - Sepia
*
* Original scanlines algorithm by Pat "Hawthorne" Shearon.
* http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html
*
* Optimised scanlines and noise with intensity scaling by Georg "Leviathan"
* Steinrohder. This version was provided under a Creative Commons Attribution
* 3.0 License: http://creativecommons.org/licenses/by/3.0.
*
* The sepia effect is based on:
* https://github.com/evanw/glfx.js
*
* The vignette code is based on PaintEffect postprocess from ro.me:
* http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js
*/var FilmMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new film material.
*
* @param {Object} [options] - The options. Disabled effects will not be included in the final shader and have no negative impact on performance.
* @param {Boolean} [options.greyscale=false] - Enable greyscale effect. Greyscale and sepia are mutually exclusive.
* @param {Boolean} [options.sepia=false] - Enable sepia effect. Greyscale and sepia are mutually exclusive.
* @param {Boolean} [options.vignette=false] - Apply vignette effect.
* @param {Boolean} [options.eskil=false] - Use Eskil's vignette approach. The default looks dusty while Eskil looks burned out.
* @param {Boolean} [options.screenMode=true] - Whether the screen blend mode should be used for noise and scanlines. Both of these effects are computed independently.
* @param {Boolean} [options.noise=true] - Show noise-based film grain.
* @param {Boolean} [options.scanlines=true] - Show scanlines.
* @param {Boolean} [options.grid=true] - Show a grid.
* @param {Number} [options.noiseIntensity=0.5] - The noise intensity.
* @param {Number} [options.scanlineIntensity=0.05] - The scanline intensity.
* @param {Number} [options.gridIntensity=1.0] - The grid strength. 0.0 to 1.0.
* @param {Number} [options.greyscaleIntensity=1.0] - The intensity of the greyscale effect. 0.0 to 1.0.
* @param {Number} [options.sepiaIntensity=1.0] - The intensity of the sepia effect. 0.0 to 1.0.
* @param {Number} [options.vignetteOffset=1.0] - The offset of the vignette effect. 0.0 to 1.0.
* @param {Number} [options.vignetteDarkness=1.0] - The darkness of the vignette effect. 0.0 to 1.0.
*/function FilmMaterial(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,FilmMaterial);var settings=Object.assign({screenMode:true,noise:true,scanlines:true,grid:false,greyscale:false,sepia:false,vignette:false,eskil:false,noiseIntensity:0.5,scanlineIntensity:0.05,gridIntensity:1.0,greyscaleIntensity:1.0,sepiaIntensity:1.0,vignetteOffset:1.0,vignetteDarkness:1.0},options);_this=possibleConstructorReturn(this,getPrototypeOf$2(FilmMaterial).call(this,{type:"FilmMaterial",uniforms:{tDiffuse:new Uniform(null),time:new Uniform(0.0),noiseIntensity:new Uniform(settings.noiseIntensity),scanlineIntensity:new Uniform(settings.scanlineIntensity),gridIntensity:new Uniform(settings.gridIntensity),scanlineCount:new Uniform(0.0),gridScale:new Uniform(new Vector2()),gridLineWidth:new Uniform(0.0),greyscaleIntensity:new Uniform(settings.greyscaleIntensity),sepiaIntensity:new Uniform(settings.sepiaIntensity),vignetteOffset:new Uniform(settings.vignetteOffset),vignetteDarkness:new Uniform(settings.vignetteDarkness)},fragmentShader:fragment$8,vertexShader:vertex$8,depthWrite:false,depthTest:false}));_this.setScreenModeEnabled(settings.screenMode);_this.setNoiseEnabled(settings.noise);_this.setScanlinesEnabled(settings.scanlines);_this.setGridEnabled(settings.grid);_this.setGreyscaleEnabled(settings.greyscale);_this.setSepiaEnabled(settings.sepia);_this.setVignetteEnabled(settings.vignette);_this.setEskilEnabled(settings.eskil);return _this;}/**
* Enables or disables the Screen blend mode.
*
* @param {Boolean} enabled - Whether the Screen blend mode should be enabled.
*/createClass(FilmMaterial,[{key:"setScreenModeEnabled",value:function setScreenModeEnabled(enabled){if(enabled){this.defines.SCREEN_MODE="1";}else{delete this.defines.SCREEN_MODE;}this.needsUpdate=true;}/**
* Enables or disables the noise effect.
*
* @param {Boolean} enabled - Whether the noise effect should be enabled.
*/},{key:"setNoiseEnabled",value:function setNoiseEnabled(enabled){if(enabled){this.defines.NOISE="1";}else{delete this.defines.NOISE;}this.needsUpdate=true;}/**
* Enables or disables the scanlines effect.
*
* @param {Boolean} enabled - Whether the scanlines effect should be enabled.
*/},{key:"setScanlinesEnabled",value:function setScanlinesEnabled(enabled){if(enabled){this.defines.SCANLINES="1";}else{delete this.defines.SCANLINES;}this.needsUpdate=true;}/**
* Enables or disables the grid effect.
*
* @param {Boolean} enabled - Whether the grid effect should be enabled.
*/},{key:"setGridEnabled",value:function setGridEnabled(enabled){if(enabled){this.defines.GRID="1";}else{delete this.defines.GRID;}this.needsUpdate=true;}/**
* Enables or disables the greyscale effect.
*
* @param {Boolean} enabled - Whether the greyscale effect should be enabled.
*/},{key:"setGreyscaleEnabled",value:function setGreyscaleEnabled(enabled){if(enabled){this.defines.GREYSCALE="1";}else{delete this.defines.GREYSCALE;}this.needsUpdate=true;}/**
* Enables or disables the sepia effect.
*
* @param {Boolean} enabled - Whether the sepia effect should be enabled.
*/},{key:"setSepiaEnabled",value:function setSepiaEnabled(enabled){if(enabled){this.defines.SEPIA="1";}else{delete this.defines.SEPIA;}this.needsUpdate=true;}/**
* Enables or disables the Vignette effect.
*
* @param {Boolean} enabled - Whether the Vignette effect should be enabled.
*/},{key:"setVignetteEnabled",value:function setVignetteEnabled(enabled){if(enabled){this.defines.VIGNETTE="1";}else{delete this.defines.VIGNETTE;}this.needsUpdate=true;}/**
* Enables or disables the Eskil Vignette effect.
*
* Has no effect if Vignette is disabled.
*
* @param {Boolean} enabled - Whether the Eskil Vignette effect should be enabled.
*/},{key:"setEskilEnabled",value:function setEskilEnabled(enabled){if(enabled){this.defines.ESKIL="1";}else{delete this.defines.ESKIL;}this.needsUpdate=true;}}]);inherits(FilmMaterial,_ShaderMaterial);return FilmMaterial;}(ShaderMaterial);var fragment$9="uniform sampler2D tDiffuse;\r\nuniform sampler2D tPerturb;\r\n\r\nuniform bool active;\r\n\r\nuniform float amount;\r\nuniform float angle;\r\nuniform float seed;\r\nuniform float seedX;\r\nuniform float seedY;\r\nuniform float distortionX;\r\nuniform float distortionY;\r\nuniform float colS;\r\n\r\nvarying vec2 vUv;\r\n\r\nfloat rand(vec2 tc) {\r\n\r\n\tconst float a = 12.9898;\r\n\tconst float b = 78.233;\r\n\tconst float c = 43758.5453;\r\n\r\n\tfloat dt = dot(tc, vec2(a, b));\r\n\tfloat sn = mod(dt, 3.14);\r\n\r\n\treturn fract(sin(sn) * c);\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec2 coord = vUv;\r\n\r\n\tfloat xs, ys;\r\n\tvec4 normal;\r\n\r\n\tvec2 offset;\r\n\tvec4 cr, cga, cb;\r\n\tvec4 snow, color;\r\n\r\n\tfloat sx, sy;\r\n\r\n\tif(active) {\r\n\r\n\t\txs = floor(gl_FragCoord.x / 0.5);\r\n\t\tys = floor(gl_FragCoord.y / 0.5);\r\n\r\n\t\tnormal = texture2D(tPerturb, coord * seed * seed);\r\n\r\n\t\tif(coord.y < distortionX + colS && coord.y > distortionX - colS * seed) {\r\n\r\n\t\t\tsx = clamp(ceil(seedX), 0.0, 1.0);\r\n\t\t\tcoord.y = sx * (1.0 - (coord.y + distortionY)) + (1.0 - sx) * distortionY;\r\n\r\n\t\t}\r\n\r\n\t\tif(coord.x < distortionY + colS && coord.x > distortionY - colS * seed) {\r\n\r\n\t\t\tsy = clamp(ceil(seedY), 0.0, 1.0);\r\n\t\t\tcoord.x = sy * distortionX + (1.0 - sy) * (1.0 - (coord.x + distortionX));\r\n\r\n\t\t}\r\n\r\n\t\tcoord.x += normal.x * seedX * (seed / 5.0);\r\n\t\tcoord.y += normal.y * seedY * (seed / 5.0);\r\n\r\n\t\toffset = amount * vec2(cos(angle), sin(angle));\r\n\r\n\t\tcr = texture2D(tDiffuse, coord + offset);\r\n\t\tcga = texture2D(tDiffuse, coord);\r\n\t\tcb = texture2D(tDiffuse, coord - offset);\r\n\r\n\t\tcolor = vec4(cr.r, cga.g, cb.b, cga.a);\r\n\t\tsnow = 200.0 * amount * vec4(rand(vec2(xs * seed, ys * seed * 50.0)) * 0.2);\r\n\t\tcolor += snow;\r\n\r\n\t} else {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";var vertex$9="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* A glitch shader material.
*
* Reference:
* https://github.com/staffantan/unityglitch
*/var GlitchMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new glitch material.
*/function GlitchMaterial(){classCallCheck(this,GlitchMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(GlitchMaterial).call(this,{type:"GlitchMaterial",uniforms:{tDiffuse:new Uniform(null),tPerturb:new Uniform(null),active:new Uniform(1),amount:new Uniform(0.8),angle:new Uniform(0.02),seed:new Uniform(0.02),seedX:new Uniform(0.02),seedY:new Uniform(0.02),distortionX:new Uniform(0.5),distortionY:new Uniform(0.6),colS:new Uniform(0.05)},fragmentShader:fragment$9,vertexShader:vertex$9,depthWrite:false,depthTest:false}));}inherits(GlitchMaterial,_ShaderMaterial);return GlitchMaterial;}(ShaderMaterial);var fragment$10="#include <common>\r\n#include <dithering_pars_fragment>\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform vec3 lightPosition;\r\n\r\nuniform float exposure;\r\nuniform float decay;\r\nuniform float density;\r\nuniform float weight;\r\nuniform float clampMax;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec2 texCoord = vUv;\r\n\r\n\t// Calculate vector from pixel to light source in screen space.\r\n\tvec2 deltaTexCoord = texCoord - lightPosition.st;\r\n\tdeltaTexCoord *= 1.0 / NUM_SAMPLES_FLOAT * density;\r\n\r\n\t// A decreasing illumination factor.\r\n\tfloat illuminationDecay = 1.0;\r\n\r\n\tvec4 sample;\r\n\tvec4 color = vec4(0.0);\r\n\r\n\t// Estimate the probability of occlusion at each pixel by summing samples along a ray to the light source.\r\n\tfor(int i = 0; i < NUM_SAMPLES_INT; ++i) {\r\n\r\n\t\ttexCoord -= deltaTexCoord;\r\n\t\tsample = texture2D(tDiffuse, texCoord);\r\n\r\n\t\t// Apply sample attenuation scale/decay factors.\r\n\t\tsample *= illuminationDecay * weight;\r\n\r\n\t\tcolor += sample;\r\n\r\n\t\t// Update exponential decay factor.\r\n\t\tilluminationDecay *= decay;\r\n\r\n\t}\r\n\r\n\tgl_FragColor = clamp(color * exposure, 0.0, clampMax);\r\n\r\n\t#include <dithering_fragment>\r\n\r\n}\r\n";var vertex$10="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* A crepuscular rays shader material.
*
* This material supports dithering.
*
* References:
*
* Thibaut Despoulain, 2012:
* [(WebGL) Volumetric Light Approximation in Three.js](
* http://bkcore.com/blog/3d/webgl-three-js-volumetric-light-godrays.html)
*
* Nvidia, GPU Gems 3, 2008:
* [Chapter 13. Volumetric Light Scattering as a Post-Process](
* https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch13.html)
*/var GodRaysMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new god rays material.
*
* @param {Object} [options] - The options.
* @param {Number} [options.density=0.96] - The density of the light rays.
* @param {Number} [options.decay=0.93] - An illumination decay factor.
* @param {Number} [options.weight=0.4] - A light ray weight factor.
* @param {Number} [options.exposure=0.6] - A constant attenuation coefficient.
* @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect.
*/function GodRaysMaterial(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,GodRaysMaterial);var settings=Object.assign({exposure:0.6,density:0.93,decay:0.96,weight:0.4,clampMax:1.0},options);return possibleConstructorReturn(this,getPrototypeOf$2(GodRaysMaterial).call(this,{type:"GodRaysMaterial",defines:{NUM_SAMPLES_FLOAT:"60.0",NUM_SAMPLES_INT:"60"},uniforms:{tDiffuse:new Uniform(null),lightPosition:new Uniform(null),exposure:new Uniform(settings.exposure),decay:new Uniform(settings.decay),density:new Uniform(settings.density),weight:new Uniform(settings.weight),clampMax:new Uniform(settings.clampMax)},fragmentShader:fragment$10,vertexShader:vertex$10,depthWrite:false,depthTest:false}));}inherits(GodRaysMaterial,_ShaderMaterial);return GodRaysMaterial;}(ShaderMaterial);var fragment$11="#include <common>\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform float distinction;\r\nuniform vec2 range;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tfloat l = linearToRelativeLuminance(texel.rgb);\r\n\r\n\t#ifdef RANGE\r\n\r\n\t\tfloat low = step(range.x, l);\r\n\t\tfloat high = step(l, range.y);\r\n\r\n\t\t// Apply the mask.\r\n\t\tl *= low * high;\r\n\r\n\t#endif\r\n\r\n\tl = pow(abs(l), distinction);\r\n\r\n\t#ifdef COLOR\r\n\r\n\t\tgl_FragColor = vec4(texel.rgb * l, texel.a);\r\n\r\n\t#else\r\n\r\n\t\tgl_FragColor = vec4(l, l, l, texel.a);\r\n\r\n\t#endif\r\n\r\n}\r\n";var vertex$11="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* A luminosity shader material.
*
* This shader produces a greyscale luminance map that describes the absolute
* amount of light emitted by a scene. It can also be configured to output
* colours that are scaled with their respective luminance value. Additionally,
* a range may be provided to mask out undesired texels.
*
* The alpha channel will remain unaffected in all cases.
*
* On luminance coefficients:
* http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9
*
* Coefficients for different colour spaces:
* https://hsto.org/getpro/habr/post_images/2ab/69d/084/2ab69d084f9a597e032624bcd74d57a7.png
*
* Luminance range reference:
* https://cycling74.com/2007/05/23/your-first-shader/#.Vty9FfkrL4Z
*/var LuminosityMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new luminosity material.
*
* @param {Boolean} [colorOutput=false] - Defines whether the shader should output colours scaled with their luminance value.
* @param {Vector2} [luminanceRange] - If provided, the shader will mask out texels that aren't in the specified luminance range.
*/function LuminosityMaterial(){var _this;var colorOutput=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;var luminanceRange=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;classCallCheck(this,LuminosityMaterial);var maskLuminance=luminanceRange!==null;_this=possibleConstructorReturn(this,getPrototypeOf$2(LuminosityMaterial).call(this,{type:"LuminosityMaterial",uniforms:{tDiffuse:new Uniform(null),distinction:new Uniform(1.0),range:new Uniform(maskLuminance?luminanceRange:new Vector2())},fragmentShader:fragment$11,vertexShader:vertex$11}));_this.setColorOutputEnabled(colorOutput);_this.setLuminanceRangeEnabled(maskLuminance);return _this;}/**
* Enables or disables color output.
*
* @param {Boolean} enabled - Whether color output should be enabled.
*/createClass(LuminosityMaterial,[{key:"setColorOutputEnabled",value:function setColorOutputEnabled(enabled){if(enabled){this.defines.COLOR="1";}else{delete this.defines.COLOR;}this.needsUpdate=true;}/**
* Enables or disables the luminance mask.
*
* @param {Boolean} enabled - Whether the luminance mask should be enabled.
*/},{key:"setLuminanceRangeEnabled",value:function setLuminanceRangeEnabled(enabled){if(enabled){this.defines.RANGE="1";}else{delete this.defines.RANGE;}this.needsUpdate=true;}}]);inherits(LuminosityMaterial,_ShaderMaterial);return LuminosityMaterial;}(ShaderMaterial);var fragment$12="uniform sampler2D tDiffuse;\r\nuniform sampler2D tMask;\r\nuniform sampler2D tEdges;\r\n\r\nuniform vec3 visibleEdgeColor;\r\nuniform vec3 hiddenEdgeColor;\r\nuniform float pulse;\r\nuniform float edgeStrength;\r\n\r\n#ifdef USE_PATTERN\r\n\r\n\tuniform sampler2D tPattern;\r\n\tvarying vec2 vPatternCoord;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 color = texture2D(tDiffuse, vUv);\r\n\tvec2 edge = texture2D(tEdges, vUv).rg;\r\n\tvec2 mask = texture2D(tMask, vUv).rg;\r\n\r\n\t#ifndef X_RAY\r\n\r\n\t\tedge.y = 0.0;\r\n\r\n\t#endif\r\n\r\n\tedge *= (edgeStrength * mask.x * pulse);\r\n\tvec3 outlineColor = edge.x * visibleEdgeColor + edge.y * hiddenEdgeColor;\r\n\r\n\t#ifdef ALPHA_BLENDING\r\n\r\n\t\tcolor.rgb = mix(color.rgb, outlineColor, max(edge.x, edge.y));\r\n\r\n\t#else\r\n\r\n\t\tcolor.rgb += outlineColor;\r\n\r\n\t#endif\r\n\r\n\t#ifdef USE_PATTERN\r\n\r\n\t\tvec3 patternColor = texture2D(tPattern, vPatternCoord).rgb;\r\n\r\n\t\t#ifdef X_RAY\r\n\r\n\t\t\tfloat hiddenFactor = 0.5;\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat hiddenFactor = 0.0;\r\n\r\n\t\t#endif\r\n\r\n\t\tfloat visibilityFactor = (1.0 - mask.y > 0.0) ? 1.0 : hiddenFactor;\r\n\r\n\t\tcolor.rgb += visibilityFactor * (1.0 - mask.x) * (1.0 - patternColor);\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";var vertex$12="#ifdef USE_PATTERN\r\n\r\n\tuniform float aspect;\r\n\tuniform float patternScale;\r\n\tvarying vec2 vPatternCoord;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\t#ifdef USE_PATTERN\r\n\r\n\t\tvec2 aspectCorrection = vec2(aspect, 1.0);\r\n\t\tvPatternCoord = uv * aspectCorrection * patternScale;\r\n\r\n\t#endif\r\n\r\n\tvUv = uv;\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* An outline blend shader material.
*/var OutlineBlendMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new outline blend material.
*
* @param {Object} [options] - The options.
* @param {Number} [options.edgeStrength=1.0] - The edge strength.
* @param {Number} [options.patternScale=1.0] - The scale of the pattern texture.
* @param {Number} [options.visibleEdgeColor=0xffffff] - The color of visible edges.
* @param {Number} [options.hiddenEdgeColor=0x22090A] - The color of hidden edges.
* @param {Boolean} [alphaBlending=false] - Whether the outline should be blended using alpha.
* @param {Boolean} [xRay=true] - Whether hidden parts of selected objects should be visible.
*/function OutlineBlendMaterial(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,OutlineBlendMaterial);var settings=Object.assign({edgeStrength:1.0,patternScale:1.0,visibleEdgeColor:0xffffff,hiddenEdgeColor:0x22090A,alphaBlending:false,xRay:true},options);_this=possibleConstructorReturn(this,getPrototypeOf$2(OutlineBlendMaterial).call(this,{type:"OutlineBlendMaterial",uniforms:{pulse:new Uniform(1.0),aspect:new Uniform(1.0),tDiffuse:new Uniform(null),tMask:new Uniform(null),tEdges:new Uniform(null),tPattern:new Uniform(null),edgeStrength:new Uniform(settings.edgeStrength),patternScale:new Uniform(settings.patternScale),visibleEdgeColor:new Uniform(new Color(settings.visibleEdgeColor)),hiddenEdgeColor:new Uniform(new Color(settings.hiddenEdgeColor))},fragmentShader:fragment$12,vertexShader:vertex$12,depthWrite:false,depthTest:false}));_this.setAlphaBlendingEnabled(settings.alphaBlending);_this.setXRayEnabled(settings.xRay);return _this;}/**
* Enables or disables the alpha blending.
*
* @param {Boolean} enabled - Whether the alpha blending should be enabled.
*/createClass(OutlineBlendMaterial,[{key:"setAlphaBlendingEnabled",value:function setAlphaBlendingEnabled(enabled){if(enabled){this.defines.ALPHA_BLENDING="1";}else{delete this.defines.ALPHA_BLENDING;}this.needsUpdate=true;}/**
* Defines whether hidden parts of selected objects should be visible.
*
* @param {Boolean} enabled - Whether hidden parts of selected objects should be visible.
*/},{key:"setXRayEnabled",value:function setXRayEnabled(enabled){if(enabled){this.defines.X_RAY="1";}else{delete this.defines.X_RAY;}this.needsUpdate=true;}/**
* Sets a pattern texture to use as overlay.
*
* @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern.
*/},{key:"setPatternTexture",value:function setPatternTexture(){var texture=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;if(texture!==null){this.defines.USE_PATTERN="1";}else{delete this.defines.USE_PATTERN;}this.uniforms.tPattern.value=texture;this.needsUpdate=true;}}]);inherits(OutlineBlendMaterial,_ShaderMaterial);return OutlineBlendMaterial;}(ShaderMaterial);var fragment$13="uniform sampler2D tMask;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvec2 c0 = texture2D(tMask, vUv0).rg;\r\n\tvec2 c1 = texture2D(tMask, vUv1).rg;\r\n\tvec2 c2 = texture2D(tMask, vUv2).rg;\r\n\tvec2 c3 = texture2D(tMask, vUv3).rg;\r\n\r\n\tfloat d0 = (c0.x - c1.x) * 0.5;\r\n\tfloat d1 = (c2.x - c3.x) * 0.5;\r\n\tfloat d = length(vec2(d0, d1));\r\n\r\n\tfloat a0 = min(c0.y, c1.y);\r\n\tfloat a1 = min(c2.y, c3.y);\r\n\tfloat visibilityFactor = min(a0, a1);\r\n\r\n\tgl_FragColor.rg = (1.0 - visibilityFactor > 0.001) ? vec2(d, 0.0) : vec2(0.0, d);\r\n\r\n}\r\n";var vertex$13="uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvUv0 = vec2(uv.x + texelSize.x, uv.y);\r\n\tvUv1 = vec2(uv.x - texelSize.x, uv.y);\r\n\tvUv2 = vec2(uv.x, uv.y + texelSize.y);\r\n\tvUv3 = vec2(uv.x, uv.y - texelSize.y);\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* An outline edge detection shader material.
*/var OutlineEdgesMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new outline edge detection material.
*
* @param {Vector2} [texelSize] - The absolute screen texel size.
*/function OutlineEdgesMaterial(){var _this;var texelSize=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Vector2();classCallCheck(this,OutlineEdgesMaterial);_this=possibleConstructorReturn(this,getPrototypeOf$2(OutlineEdgesMaterial).call(this,{type:"OutlineEdgesMaterial",uniforms:{tMask:new Uniform(null),texelSize:new Uniform(new Vector2())},fragmentShader:fragment$13,vertexShader:vertex$13,depthWrite:false,depthTest:false}));_this.setTexelSize(texelSize.x,texelSize.y);return _this;}/**
* Sets the texel size.
*
* @param {Number} x - The texel width.
* @param {Number} y - The texel height.
*/createClass(OutlineEdgesMaterial,[{key:"setTexelSize",value:function setTexelSize(x,y){this.uniforms.texelSize.value.set(x,y);}}]);inherits(OutlineEdgesMaterial,_ShaderMaterial);return OutlineEdgesMaterial;}(ShaderMaterial);var fragment$14="uniform sampler2D tDiffuse;\r\nuniform float granularity;\r\nuniform float dx;\r\nuniform float dy;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel;\r\n\r\n\tif(granularity > 0.0) {\r\n\r\n\t\tvec2 coord = vec2(\r\n\t\t\tdx * (floor(vUv.x / dx) + 0.5),\r\n\t\t\tdy * (floor(vUv.y / dy) + 0.5)\r\n\t\t);\r\n\r\n\t\ttexel = texture2D(tDiffuse, coord);\r\n\r\n\t} else {\r\n\r\n\t\ttexel = texture2D(tDiffuse, vUv);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = texel;\r\n\r\n}\r\n";var vertex$14="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* A pixelation shader material.
*
* Original shader code by Robert Casanova:
* https://github.com/robertcasanova/pixelate-shader
*/var PixelationMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new pixelation material.
*/function PixelationMaterial(){classCallCheck(this,PixelationMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(PixelationMaterial).call(this,{type:"PixelationMaterial",uniforms:{tDiffuse:new Uniform(null),granularity:new Uniform(1.0),resolution:new Uniform(new Vector2(1.0,1.0)),dx:new Uniform(1.0),dy:new Uniform(1.0)},fragmentShader:fragment$14,vertexShader:vertex$14,depthWrite:false,depthTest:false}));}/**
* The pixel granularity.
*
* @type {Number}
*/createClass(PixelationMaterial,[{key:"setResolution",/**
* Sets the resolution.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/value:function setResolution(width,height){this.uniforms.resolution.value.set(width,height);this.granularity=this.granularity;}},{key:"granularity",get:function get(){return this.uniforms.granularity.value;}/**
* A higher value yields coarser visuals.
*
* @type {Number}
*/,set:function set(x){var uniforms=this.uniforms;var resolution=uniforms.resolution.value;uniforms.granularity.value=x;uniforms.dx.value=x/resolution.x;uniforms.dy.value=x/resolution.y;}}]);inherits(PixelationMaterial,_ShaderMaterial);return PixelationMaterial;}(ShaderMaterial);var fragment$15="#include <common>\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform sampler2D tDepth;\r\n\r\nuniform vec2 texelSize;\r\nuniform vec2 halfTexelSize;\r\n\r\nuniform float cameraNear;\r\nuniform float cameraFar;\r\n\r\nuniform float focalLength;\r\nuniform float focalStop;\r\n\r\nuniform float maxBlur;\r\nuniform float luminanceThreshold;\r\nuniform float luminanceGain;\r\nuniform float bias;\r\nuniform float fringe;\r\nuniform float ditherStrength;\r\n\r\n#ifdef SHADER_FOCUS\r\n\r\n\tuniform vec2 focusCoords;\r\n\r\n#else\r\n\r\n\tuniform float focalDepth;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifndef USE_LOGDEPTHBUF\r\n\r\n\t#include <packing>\r\n\r\n\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\r\n\r\n\t\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef PENTAGON\r\n\r\n\tfloat penta(vec2 coords) {\r\n\r\n\t\tconst vec4 HS0 = vec4( 1.0, 0.0, 0.0, 1.0);\r\n\t\tconst vec4 HS1 = vec4( 0.309016994, 0.951056516, 0.0, 1.0);\r\n\t\tconst vec4 HS2 = vec4(-0.809016994, 0.587785252, 0.0, 1.0);\r\n\t\tconst vec4 HS3 = vec4(-0.809016994, -0.587785252, 0.0, 1.0);\r\n\t\tconst vec4 HS4 = vec4( 0.309016994, -0.951056516, 0.0, 1.0);\r\n\t\tconst vec4 HS5 = vec4( 0.0, 0.0, 1.0, 1.0);\r\n\r\n\t\tconst vec4 ONE = vec4(1.0);\r\n\r\n\t\tconst float P_FEATHER = 0.4;\r\n\t\tconst float N_FEATHER = -P_FEATHER;\r\n\r\n\t\tfloat inOrOut = -4.0;\r\n\r\n\t\tvec4 P = vec4(coords, vec2(RINGS_FLOAT - 1.3));\r\n\r\n\t\tvec4 dist = vec4(\r\n\t\t\tdot(P, HS0),\r\n\t\t\tdot(P, HS1),\r\n\t\t\tdot(P, HS2),\r\n\t\t\tdot(P, HS3)\r\n\t\t);\r\n\r\n\t\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\r\n\r\n\t\tinOrOut += dot(dist, ONE);\r\n\r\n\t\tdist.x = dot(P, HS4);\r\n\t\tdist.y = HS5.w - abs(P.z);\r\n\r\n\t\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\r\n\t\tinOrOut += dist.x;\r\n\r\n\t\treturn clamp(inOrOut, 0.0, 1.0);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef SHOW_FOCUS\r\n\r\n\tvec3 debugFocus(vec3 c, float blur, float depth) {\r\n\r\n\t\tfloat edge = 0.002 * depth;\r\n\t\tfloat m = clamp(smoothstep(0.0, edge, blur), 0.0, 1.0);\r\n\t\tfloat e = clamp(smoothstep(1.0 - edge, 1.0, blur), 0.0, 1.0);\r\n\r\n\t\tc = mix(c, vec3(1.0, 0.5, 0.0), (1.0 - m) * 0.6);\r\n\t\tc = mix(c, vec3(0.0, 0.5, 1.0), ((1.0 - e) - (1.0 - m)) * 0.2);\r\n\r\n\t\treturn c;\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef VIGNETTE\r\n\r\n\tfloat vignette() {\r\n\r\n\t\tconst vec2 CENTER = vec2(0.5);\r\n\r\n\t\tconst float VIGNETTE_OUT = 1.3;\r\n\t\tconst float VIGNETTE_IN = 0.0;\r\n\t\tconst float VIGNETTE_FADE = 22.0; \r\n\r\n\t\tfloat d = distance(vUv, CENTER);\r\n\t\td = smoothstep(VIGNETTE_OUT + (focalStop / VIGNETTE_FADE), VIGNETTE_IN + (focalStop / VIGNETTE_FADE), d);\r\n\r\n\t\treturn clamp(d, 0.0, 1.0);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\nvec2 rand2(vec2 coord) {\r\n\r\n\tvec2 noise;\r\n\r\n\t#ifdef NOISE\r\n\r\n\t\tconst float a = 12.9898;\r\n\t\tconst float b = 78.233;\r\n\t\tconst float c = 43758.5453;\r\n\r\n\t\tnoise.x = clamp(fract(sin(mod(dot(coord, vec2(a, b)), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\r\n\t\tnoise.y = clamp(fract(sin(mod(dot(coord, vec2(a, b) * 2.0), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\r\n\r\n\t#else\r\n\r\n\t\tnoise.x = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.25) + (fract(coord.t * halfTexelSize.y) * 0.75)) * 2.0 - 1.0;\r\n\t\tnoise.y = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.75) + (fract(coord.t * halfTexelSize.y) * 0.25)) * 2.0 - 1.0;\r\n\r\n\t#endif\r\n\r\n\treturn noise;\r\n\r\n}\r\n\r\nvec3 processTexel(vec2 coords, float blur) {\r\n\r\n\tvec3 c;\r\n\tc.r = texture2D(tDiffuse, coords + vec2(0.0, 1.0) * texelSize * fringe * blur).r;\r\n\tc.g = texture2D(tDiffuse, coords + vec2(-0.866, -0.5) * texelSize * fringe * blur).g;\r\n\tc.b = texture2D(tDiffuse, coords + vec2(0.866, -0.5) * texelSize * fringe * blur).b;\r\n\r\n\t// Calculate the luminance of the constructed colour.\r\n\tfloat luminance = linearToRelativeLuminance(c);\r\n\tfloat threshold = max((luminance - luminanceThreshold) * luminanceGain, 0.0);\r\n\r\n\treturn c + mix(vec3(0.0), c, threshold * blur);\r\n\r\n}\r\n\r\nfloat linearize(float depth) {\r\n\r\n\treturn -cameraFar * cameraNear / (depth * (cameraFar - cameraNear) - cameraFar);\r\n\r\n}\r\n\r\nfloat gather(float i, float j, float ringSamples, inout vec3 color, float w, float h, float blur) {\r\n\r\n\tconst float TWO_PI = 6.28318531;\r\n\r\n\tfloat step = TWO_PI / ringSamples;\r\n\tfloat pw = cos(j * step) * i;\r\n\tfloat ph = sin(j * step) * i;\r\n\r\n\t#ifdef PENTAGON\r\n\r\n\t\tfloat p = penta(vec2(pw, ph));\r\n\r\n\t#else\r\n\r\n\t\tfloat p = 1.0;\r\n\r\n\t#endif\r\n\r\n\tcolor += processTexel(vUv + vec2(pw * w, ph * h), blur) * mix(1.0, i / RINGS_FLOAT, bias) * p;\r\n\r\n\treturn mix(1.0, i / RINGS_FLOAT, bias) * p;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\tfloat depth = linearize(texture2D(tDepth, vUv).x);\r\n\r\n\t#else\r\n\r\n\t\tfloat depth = linearize(readDepth(tDepth, vUv));\r\n\r\n\t#endif\r\n\r\n\t#ifdef SHADER_FOCUS\r\n\r\n\t\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\t\tfloat fDepth = linearize(texture2D(tDepth, focusCoords).x);\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat fDepth = linearize(readDepth(tDepth, focusCoords));\r\n\r\n\t\t#endif\r\n\r\n\t#else\r\n\r\n\t\tfloat fDepth = focalDepth;\r\n\r\n\t#endif\r\n\r\n\t#ifdef MANUAL_DOF\r\n\r\n\t\tconst float nDoFStart = 1.0; \r\n\t\tconst float nDoFDist = 2.0;\r\n\t\tconst float fDoFStart = 1.0;\r\n\t\tconst float fDoFDist = 3.0;\r\n\r\n\t\tfloat focalPlane = depth - fDepth;\r\n\t\tfloat farDoF = (focalPlane - fDoFStart) / fDoFDist;\r\n\t\tfloat nearDoF = (-focalPlane - nDoFStart) / nDoFDist;\r\n\r\n\t\tfloat blur = (focalPlane > 0.0) ? farDoF : nearDoF;\r\n\r\n\t#else\r\n\r\n\t\tconst float CIRCLE_OF_CONFUSION = 0.03; // 35mm film = 0.03mm CoC.\r\n\r\n\t\tfloat focalPlaneMM = fDepth * 1000.0;\r\n\t\tfloat depthMM = depth * 1000.0;\r\n\r\n\t\tfloat focalPlane = (depthMM * focalLength) / (depthMM - focalLength);\r\n\t\tfloat farDoF = (focalPlaneMM * focalLength) / (focalPlaneMM - focalLength);\r\n\t\tfloat nearDoF = (focalPlaneMM - focalLength) / (focalPlaneMM * focalStop * CIRCLE_OF_CONFUSION);\r\n\r\n\t\tfloat blur = abs(focalPlane - farDoF) * nearDoF;\r\n\r\n\t#endif\r\n\r\n\tblur = clamp(blur, 0.0, 1.0);\r\n\r\n\t// Dithering.\r\n\tvec2 noise = rand2(vUv) * ditherStrength * blur;\r\n\r\n\tfloat blurFactorX = texelSize.x * blur * maxBlur + noise.x;\r\n\tfloat blurFactorY = texelSize.y * blur * maxBlur + noise.y;\r\n\r\n\tconst int MAX_RING_SAMPLES = RINGS_INT * SAMPLES_INT;\r\n\r\n\t// Calculation of final color.\r\n\tvec4 color;\r\n\r\n\tif(blur < 0.05) {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t} else {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t\tfloat s = 1.0;\r\n\t\tint ringSamples;\r\n\r\n\t\tfor(int i = 1; i <= RINGS_INT; ++i) {\r\n\r\n\t\t\tringSamples = i * SAMPLES_INT;\r\n\r\n\t\t\t// Constant loop.\r\n\t\t\tfor(int j = 0; j < MAX_RING_SAMPLES; ++j) {\r\n\r\n\t\t\t\t// Break earlier.\r\n\t\t\t\tif(j >= ringSamples) { break; }\r\n\r\n\t\t\t\ts += gather(float(i), float(j), float(ringSamples), color.rgb, blurFactorX, blurFactorY, blur);\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tcolor.rgb /= s; // Divide by sample count.\r\n\r\n\t}\r\n\r\n\t#ifdef SHOW_FOCUS\r\n\r\n\t\tcolor.rgb = debugFocus(color.rgb, blur, depth);\r\n\r\n\t#endif\r\n\r\n\t#ifdef VIGNETTE\r\n\r\n\t\tcolor.rgb *= vignette();\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";var vertex$15="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* Depth of Field shader v2.4.
*
* Original shader code by Martins Upitis:
* http://blenderartists.org/forum/showthread.php?237488-GLSL-depth-of-field-with-bokeh-v2-4-(update)
*/var RealisticBokehMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new bokeh2 material.
*
* @param {PerspectiveCamera} [camera] - The main camera.
* @param {Object} [options] - Additional options.
* @param {Vector2} [options.texelSize] - The absolute screen texel size.
* @param {Boolean} [options.rings=3] - The number of blurring iterations.
* @param {Boolean} [options.samples=2] - The amount of samples taken per ring.
* @param {Boolean} [options.showFocus=false] - Whether the focus point should be highlighted.
* @param {Boolean} [options.manualDoF=false] - Enables manual depth of field blur.
* @param {Boolean} [options.vignette=false] - Enables a vignette effect.
* @param {Boolean} [options.pentagon=false] - Enable to use a pentagonal shape to scale gathered texels.
* @param {Boolean} [options.shaderFocus=true] - Disable if you compute your own focalDepth (in metres!).
* @param {Boolean} [options.noise=true] - Disable if you don't want noise patterns for dithering.
* @param {Number} [options.maxBlur=1.0] - The maximum blur strength.
* @param {Number} [options.luminanceThreshold=0.5] - A luminance threshold.
* @param {Number} [options.luminanceGain=2.0] - A luminance gain factor.
* @param {Number} [options.bias=0.5] - A blur bias.
* @param {Number} [options.fringe=0.7] - A blur offset.
* @param {Number} [options.ditherStrength=0.0001] - The dither strength.
*/function RealisticBokehMaterial(){var _this;var camera=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,RealisticBokehMaterial);var settings=Object.assign({texelSize:null,rings:3,samples:2,showFocus:false,manualDoF:false,vignette:false,pentagon:false,shaderFocus:true,noise:true,maxBlur:1.0,luminanceThreshold:0.5,luminanceGain:2.0,bias:0.5,fringe:0.7,ditherStrength:0.0001},options);_this=possibleConstructorReturn(this,getPrototypeOf$2(RealisticBokehMaterial).call(this,{type:"RealisticBokehMaterial",defines:{RINGS_INT:settings.rings.toFixed(0),RINGS_FLOAT:settings.rings.toFixed(1),SAMPLES_INT:settings.samples.toFixed(0),SAMPLES_FLOAT:settings.samples.toFixed(1)},uniforms:{tDiffuse:new Uniform(null),tDepth:new Uniform(null),texelSize:new Uniform(new Vector2()),halfTexelSize:new Uniform(new Vector2()),cameraNear:new Uniform(0.1),cameraFar:new Uniform(2000),focalLength:new Uniform(24.0),focalStop:new Uniform(0.9),maxBlur:new Uniform(settings.maxBlur),luminanceThreshold:new Uniform(settings.luminanceThreshold),luminanceGain:new Uniform(settings.luminanceGain),bias:new Uniform(settings.bias),fringe:new Uniform(settings.fringe),ditherStrength:new Uniform(settings.ditherStrength),focusCoords:new Uniform(new Vector2(0.5,0.5)),focalDepth:new Uniform(1.0)},fragmentShader:fragment$15,vertexShader:vertex$15,depthWrite:false,depthTest:false}));_this.setShowFocusEnabled(settings.showFocus);_this.setManualDepthOfFieldEnabled(settings.manualDoF);_this.setVignetteEnabled(settings.vignette);_this.setPentagonEnabled(settings.pentagon);_this.setShaderFocusEnabled(settings.shaderFocus);_this.setNoiseEnabled(settings.noise);if(settings.texelSize!==null){_this.setTexelSize(settings.texelSize.x,settings.texelSize.y);}_this.adoptCameraSettings(camera);return _this;}/**
* Defines whether the focus should be shown.
*
* @param {Boolean} enabled - True if the focus should be shown, false otherwise.
*/createClass(RealisticBokehMaterial,[{key:"setShowFocusEnabled",value:function setShowFocusEnabled(enabled){if(enabled){this.defines.SHOW_FOCUS="1";}else{delete this.defines.SHOW_FOCUS;}this.needsUpdate=true;}/**
* Defines whether manual Depth of Field should be enabled.
*
* @param {Boolean} enabled - Whether manual DoF should be enabled.
*/},{key:"setManualDepthOfFieldEnabled",value:function setManualDepthOfFieldEnabled(enabled){if(enabled){this.defines.MANUAL_DOF="1";}else{delete this.defines.MANUAL_DOF;}this.needsUpdate=true;}/**
* Defines whether the Vignette effect should be enabled.
*
* @param {Boolean} enabled - Whether the Vignette effect should be enabled.
*/},{key:"setVignetteEnabled",value:function setVignetteEnabled(enabled){if(enabled){this.defines.VIGNETTE="1";}else{delete this.defines.VIGNETTE;}this.needsUpdate=true;}/**
* Defines whether the pentagonal blur effect should be enabled.
*
* @param {Boolean} enabled - Whether the pentagonal blur effect should be enabled.
*/},{key:"setPentagonEnabled",value:function setPentagonEnabled(enabled){if(enabled){this.defines.PENTAGON="1";}else{delete this.defines.PENTAGON;}this.needsUpdate=true;}/**
* Enables or disables the automatic shader focus.
*
* @param {Boolean} enabled - Whether the shader focus should be enabled.
*/},{key:"setShaderFocusEnabled",value:function setShaderFocusEnabled(enabled){if(enabled){this.defines.SHADER_FOCUS="1";}else{delete this.defines.SHADER_FOCUS;}this.needsUpdate=true;}/**
* Defines whether the dithering should compute noise.
*
* @param {Boolean} enabled - Whether noise-based dithering should be enabled.
*/},{key:"setNoiseEnabled",value:function setNoiseEnabled(enabled){if(enabled){this.defines.NOISE="1";}else{delete this.defines.NOISE;}this.needsUpdate=true;}/**
* Sets the texel size.
*
* @param {Number} x - The texel width.
* @param {Number} y - The texel height.
*/},{key:"setTexelSize",value:function setTexelSize(x,y){this.uniforms.texelSize.value.set(x,y);this.uniforms.halfTexelSize.value.set(x,y).multiplyScalar(0.5);}/**
* Adopts the near and far plane and the focal length of the given camera.
*
* @param {PerspectiveCamera} camera - The main camera.
*/},{key:"adoptCameraSettings",value:function adoptCameraSettings(camera){if(camera!==null){this.uniforms.cameraNear.value=camera.near;this.uniforms.cameraFar.value=camera.far;this.uniforms.focalLength.value=camera.getFocalLength();// unit: mm.
}}}]);inherits(RealisticBokehMaterial,_ShaderMaterial);return RealisticBokehMaterial;}(ShaderMaterial);var fragment$16="#include <common>\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform vec2 center;\r\nuniform float aspect;\r\nuniform float waveSize;\r\nuniform float radius;\r\nuniform float maxRadius;\r\nuniform float amplitude;\r\n\r\nvarying vec2 vUv;\r\nvarying float vSize;\r\n\r\nvoid main() {\r\n\r\n\tvec2 aspectCorrection = vec2(aspect, 1.0);\r\n\r\n\tvec2 difference = vUv * aspectCorrection - center * aspectCorrection;\r\n\tfloat distance = sqrt(dot(difference, difference)) * vSize;\r\n\r\n\tvec2 displacement = vec2(0.0);\r\n\r\n\tif(distance > radius) {\r\n\r\n\t\tif(distance < radius + waveSize) {\r\n\r\n\t\t\tfloat angle = (distance - radius) * PI2 / waveSize;\r\n\t\t\tfloat cosSin = (1.0 - cos(angle)) * 0.5;\r\n\r\n\t\t\tfloat extent = maxRadius + waveSize;\r\n\t\t\tfloat decay = max(extent - distance * distance, 0.0) / extent;\r\n\r\n\t\t\tdisplacement = ((cosSin * amplitude * difference) / distance) * decay;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tgl_FragColor = texture2D(tDiffuse, vUv - displacement);\r\n\r\n}\r\n";var vertex$16="uniform float size;\r\nuniform float scale;\r\nuniform float cameraDistance;\r\n\r\nvarying vec2 vUv;\r\nvarying float vSize;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tvSize = (0.1 * cameraDistance) / size;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* A shock wave shader material.
*
* Based on a Gist by Jean-Philippe Sarda:
* https://gist.github.com/jpsarda/33cea67a9f2ecb0a0eda
*/var ShockWaveMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new shock wave material.
*
* @param {Object} [options] - The options.
* @param {Number} [options.waveSize=0.2] - The wave size.
* @param {Number} [options.amplitude=0.05] - The distortion amplitude.
*/function ShockWaveMaterial(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,ShockWaveMaterial);var settings=Object.assign({maxRadius:1.0,waveSize:0.2,amplitude:0.05},options);return possibleConstructorReturn(this,getPrototypeOf$2(ShockWaveMaterial).call(this,{type:"ShockWaveMaterial",uniforms:{tDiffuse:new Uniform(null),center:new Uniform(new Vector2(0.5,0.5)),aspect:new Uniform(1.0),cameraDistance:new Uniform(1.0),size:new Uniform(1.0),radius:new Uniform(-settings.waveSize),maxRadius:new Uniform(settings.maxRadius),waveSize:new Uniform(settings.waveSize),amplitude:new Uniform(settings.amplitude)},fragmentShader:fragment$16,vertexShader:vertex$16,depthWrite:false,depthTest:false}));}inherits(ShockWaveMaterial,_ShaderMaterial);return ShockWaveMaterial;}(ShaderMaterial);var fragment$17="uniform sampler2D tDiffuse;\r\nuniform sampler2D tWeights;\r\n\r\nuniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset;\r\n\r\nvoid main() {\r\n\r\n\t// Fetch the blending weights for current pixel.\r\n\tvec4 a;\r\n\ta.xz = texture2D(tWeights, vUv).xz;\r\n\ta.y = texture2D(tWeights, vOffset.zw).g;\r\n\ta.w = texture2D(tWeights, vOffset.xy).a;\r\n\r\n\tvec4 color;\r\n\r\n\t// Check if there is any blending weight with a value greater than 0.0.\r\n\tif(dot(a, vec4(1.0)) < 1e-5) {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv, 0.0);\r\n\r\n\t} else {\r\n\r\n\t\t/* Up to four lines can be crossing a pixel (one through each edge).\r\n\t\t * The line with the maximum weight for each direction is favoured.\r\n\t\t */\r\n\r\n\t\tvec2 offset;\r\n\t\toffset.x = a.a > a.b ? a.a : -a.b; // Left vs. right.\r\n\t\toffset.y = a.g > a.r ? -a.g : a.r; // Top vs. bottom (changed signs).\r\n\r\n\t\t// Go in the direction with the maximum weight (horizontal vs. vertical).\r\n\t\tif(abs(offset.x) > abs(offset.y)) {\r\n\r\n\t\t\toffset.y = 0.0;\r\n\r\n\t\t} else {\r\n\r\n\t\t\toffset.x = 0.0;\r\n\r\n\t\t}\r\n\r\n\t\t// Fetch the opposite color and lerp by hand.\r\n\t\tcolor = texture2D(tDiffuse, vUv, 0.0);\r\n\t\tvec2 coord = vUv + sign(offset) * texelSize;\r\n\t\tvec4 oppositeColor = texture2D(tDiffuse, coord, 0.0);\r\n\t\tfloat s = abs(offset.x) > abs(offset.y) ? abs(offset.x) : abs(offset.y);\r\n\r\n\t\t// Gamma correction.\r\n\t\tcolor.rgb = pow(abs(color.rgb), vec3(2.2));\r\n\t\toppositeColor.rgb = pow(abs(oppositeColor.rgb), vec3(2.2));\r\n\t\tcolor = mix(color, oppositeColor, s);\r\n\t\tcolor.rgb = pow(abs(color.rgb), vec3(1.0 / 2.2));\r\n\r\n\t}\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";var vertex$17="uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvOffset = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* Subpixel Morphological Antialiasing.
*
* This material is used to render the final antialiasing.
*/var SMAABlendMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new SMAA blend material.
*
* @param {Vector2} [texelSize] - The absolute screen texel size.
*/function SMAABlendMaterial(){var texelSize=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Vector2();classCallCheck(this,SMAABlendMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(SMAABlendMaterial).call(this,{type:"SMAABlendMaterial",uniforms:{tDiffuse:new Uniform(null),tWeights:new Uniform(null),texelSize:new Uniform(texelSize)},fragmentShader:fragment$17,vertexShader:vertex$17,depthWrite:false,depthTest:false}));}inherits(SMAABlendMaterial,_ShaderMaterial);return SMAABlendMaterial;}(ShaderMaterial);var fragment$18="#define sampleLevelZeroOffset(t, coord, offset) texture2D(t, coord + float(offset) * texelSize, 0.0)\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform sampler2D tArea;\r\nuniform sampler2D tSearch;\r\n\r\nuniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\nvarying vec2 vPixCoord;\r\n\r\nvec2 round(vec2 x) {\r\n\r\n\treturn sign(x) * floor(abs(x) + 0.5);\r\n\r\n}\r\n\r\nfloat searchLength(vec2 e, float bias, float scale) {\r\n\r\n\t// Not required if tSearch accesses are set to point.\r\n\t// const vec2 SEARCH_TEX_PIXEL_SIZE = 1.0 / vec2(66.0, 33.0);\r\n\t// e = vec2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE + e * vec2(scale, 1.0) * vec2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;\r\n\r\n\te.r = bias + e.r * scale;\r\n\r\n\treturn 255.0 * texture2D(tSearch, e, 0.0).r;\r\n\r\n}\r\n\r\nfloat searchXLeft(vec2 texCoord, float end) {\r\n\r\n\t/* @PSEUDO_GATHER4\r\n\t * This texCoord has been offset by (-0.25, -0.125) in the vertex shader to\r\n\t * sample between edge, thus fetching four edges in a row.\r\n\t * Sampling with different offsets in each direction allows to disambiguate\r\n\t * which edges are active from the four fetched ones.\r\n\t */\r\n\r\n\tvec2 e = vec2(0.0, 1.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord -= vec2(2.0, 0.0) * texelSize;\r\n\r\n\t\tif(!(texCoord.x > end && e.g > 0.8281 && e.r == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\t// Correct the previously applied offset (-0.25, -0.125).\r\n\ttexCoord.x += 0.25 * texelSize.x;\r\n\r\n\t// The searches are biased by 1, so adjust the coords accordingly.\r\n\ttexCoord.x += texelSize.x;\r\n\r\n\t// Disambiguate the length added by the last step.\r\n\ttexCoord.x += 2.0 * texelSize.x; // Undo last step.\r\n\ttexCoord.x -= texelSize.x * searchLength(e, 0.0, 0.5);\r\n\r\n\treturn texCoord.x;\r\n\r\n}\r\n\r\nfloat searchXRight(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(0.0, 1.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord += vec2(2.0, 0.0) * texelSize;\r\n\r\n\t\tif(!(texCoord.x < end && e.g > 0.8281 && e.r == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.x -= 0.25 * texelSize.x;\r\n\ttexCoord.x -= texelSize.x;\r\n\ttexCoord.x -= 2.0 * texelSize.x;\r\n\ttexCoord.x += texelSize.x * searchLength(e, 0.5, 0.5);\r\n\r\n\treturn texCoord.x;\r\n\r\n}\r\n\r\nfloat searchYUp(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(1.0, 0.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord += vec2(0.0, 2.0) * texelSize; // Changed sign.\r\n\r\n\t\tif(!(texCoord.y > end && e.r > 0.8281 && e.g == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.y -= 0.25 * texelSize.y; // Changed sign.\r\n\ttexCoord.y -= texelSize.y; // Changed sign.\r\n\ttexCoord.y -= 2.0 * texelSize.y; // Changed sign.\r\n\ttexCoord.y += texelSize.y * searchLength(e.gr, 0.0, 0.5); // Changed sign.\r\n\r\n\treturn texCoord.y;\r\n\r\n}\r\n\r\nfloat searchYDown(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(1.0, 0.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i ) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord -= vec2(0.0, 2.0) * texelSize; // Changed sign.\r\n\r\n\t\tif(!(texCoord.y < end && e.r > 0.8281 && e.g == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.y += 0.25 * texelSize.y; // Changed sign.\r\n\ttexCoord.y += texelSize.y; // Changed sign.\r\n\ttexCoord.y += 2.0 * texelSize.y; // Changed sign.\r\n\ttexCoord.y -= texelSize.y * searchLength(e.gr, 0.5, 0.5); // Changed sign.\r\n\r\n\treturn texCoord.y;\r\n\r\n}\r\n\r\nvec2 area(vec2 dist, float e1, float e2, float offset) {\r\n\r\n\t// Rounding prevents precision errors of bilinear filtering.\r\n\tvec2 texCoord = AREATEX_MAX_DISTANCE * round(4.0 * vec2(e1, e2)) + dist;\r\n\r\n\t// Scale and bias for texel space translation.\r\n\ttexCoord = AREATEX_PIXEL_SIZE * texCoord + (0.5 * AREATEX_PIXEL_SIZE);\r\n\r\n\t// Move to proper place, according to the subpixel offset.\r\n\ttexCoord.y += AREATEX_SUBTEX_SIZE * offset;\r\n\r\n\treturn texture2D(tArea, texCoord, 0.0).rg;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 weights = vec4(0.0);\r\n\tvec4 subsampleIndices = vec4(0.0);\r\n\tvec2 e = texture2D(tDiffuse, vUv).rg;\r\n\r\n\tif(e.g > 0.0) {\r\n\r\n\t\t// Edge at north.\r\n\t\tvec2 d;\r\n\r\n\t\t// Find the distance to the left.\r\n\t\tvec2 coords;\r\n\t\tcoords.x = searchXLeft(vOffset[0].xy, vOffset[2].x);\r\n\t\tcoords.y = vOffset[1].y; // vOffset[1].y = vUv.y - 0.25 * texelSize.y (@CROSSING_OFFSET)\r\n\t\td.x = coords.x;\r\n\r\n\t\t/* Now fetch the left crossing edges, two at a time using bilinear\r\n\t\tfiltering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to discern what\r\n\t\tvalue each edge has. */\r\n\t\tfloat e1 = texture2D(tDiffuse, coords, 0.0).r;\r\n\r\n\t\t// Find the distance to the right.\r\n\t\tcoords.x = searchXRight(vOffset[0].zw, vOffset[2].y);\r\n\t\td.y = coords.x;\r\n\r\n\t\t/* Translate distances to pixel units for better interleave arithmetic and\r\n\t\tmemory accesses. */\r\n\t\td = d / texelSize.x - vPixCoord.x;\r\n\r\n\t\t// The area texture is compressed quadratically.\r\n\t\tvec2 sqrtD = sqrt(abs(d));\r\n\r\n\t\t// Fetch the right crossing edges.\r\n\t\tcoords.y -= texelSize.y; // WebGL port note: Added.\r\n\t\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(1, 0)).r;\r\n\r\n\t\t// Pattern recognised, now get the actual area.\r\n\t\tweights.rg = area(sqrtD, e1, e2, subsampleIndices.y);\r\n\r\n\t}\r\n\r\n\tif(e.r > 0.0) {\r\n\r\n\t\t// Edge at west.\r\n\t\tvec2 d;\r\n\r\n\t\t// Find the distance to the top.\r\n\t\tvec2 coords;\r\n\t\tcoords.y = searchYUp(vOffset[1].xy, vOffset[2].z);\r\n\t\tcoords.x = vOffset[0].x; // vOffset[1].x = vUv.x - 0.25 * texelSize.x;\r\n\t\td.x = coords.y;\r\n\r\n\t\t// Fetch the top crossing edges.\r\n\t\tfloat e1 = texture2D(tDiffuse, coords, 0.0).g;\r\n\r\n\t\t// Find the distance to the bottom.\r\n\t\tcoords.y = searchYDown(vOffset[1].zw, vOffset[2].w);\r\n\t\td.y = coords.y;\r\n\r\n\t\t// Distances in pixel units.\r\n\t\td = d / texelSize.y - vPixCoord.y;\r\n\r\n\t\t// The area texture is compressed quadratically.\r\n\t\tvec2 sqrtD = sqrt(abs(d));\r\n\r\n\t\t// Fetch the bottom crossing edges.\r\n\t\tcoords.y -= texelSize.y; // WebGL port note: Added.\r\n\t\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(0, 1)).g;\r\n\r\n\t\t// Get the area for this direction.\r\n\t\tweights.ba = area(sqrtD, e1, e2, subsampleIndices.x);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = weights;\r\n\r\n}\r\n";var vertex$18="uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\nvarying vec2 vPixCoord;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvPixCoord = uv / texelSize;\r\n\r\n\t// Offsets for the searches (see @PSEUDO_GATHER4).\r\n\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-0.25, 0.125, 1.25, 0.125); // Changed sign in Y and W components.\r\n\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(-0.125, 0.25, -0.125, -1.25); //Changed sign in Y and W components.\r\n\r\n\t// This indicates the ends of the loops.\r\n\tvOffset[2] = vec4(vOffset[0].xz, vOffset[1].yw) + vec4(-2.0, 2.0, -2.0, 2.0) * texelSize.xxyy * MAX_SEARCH_STEPS_FLOAT;\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* Subpixel Morphological Antialiasing.
*
* This material computes weights for detected edges.
*/var SMAAWeightsMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new SMAA weights material.
*
* @param {Vector2} [texelSize] - The absolute screen texel size.
*/function SMAAWeightsMaterial(){var texelSize=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Vector2();classCallCheck(this,SMAAWeightsMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(SMAAWeightsMaterial).call(this,{type:"SMAAWeightsMaterial",defines:{// Configurable settings:
MAX_SEARCH_STEPS_INT:"8",MAX_SEARCH_STEPS_FLOAT:"8.0",// Non-configurable settings:
AREATEX_MAX_DISTANCE:"16.0",AREATEX_PIXEL_SIZE:"(1.0 / vec2(160.0, 560.0))",AREATEX_SUBTEX_SIZE:"(1.0 / 7.0)",SEARCHTEX_SIZE:"vec2(66.0, 33.0)",SEARCHTEX_PACKED_SIZE:"vec2(64.0, 16.0)"},uniforms:{tDiffuse:new Uniform(null),tArea:new Uniform(null),tSearch:new Uniform(null),texelSize:new Uniform(texelSize)},fragmentShader:fragment$18,vertexShader:vertex$18,depthWrite:false,depthTest:false}));}/**
* Sets the maximum amount of steps performed in the horizontal/vertical
* pattern searches, at each side of the pixel.
*
* In number of pixels, it's actually the double. So the maximum line length
* perfectly handled by, for example 16, is 64 (perfectly means that longer
* lines won't look as good, but are still antialiased).
*
* @param {Number} steps - The search steps. Range: [0, 112].
*/createClass(SMAAWeightsMaterial,[{key:"setOrthogonalSearchSteps",value:function setOrthogonalSearchSteps(steps){this.defines.MAX_SEARCH_STEPS_INT=steps.toFixed("0");this.defines.MAX_SEARCH_STEPS_FLOAT=steps.toFixed("1");this.needsUpdate=true;}}]);inherits(SMAAWeightsMaterial,_ShaderMaterial);return SMAAWeightsMaterial;}(ShaderMaterial);var fragment$19="#include <common>\r\n#include <dithering_pars_fragment>\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform float middleGrey;\r\nuniform float maxLuminance;\r\n\r\n#ifdef ADAPTED_LUMINANCE\r\n\r\n\tuniform sampler2D luminanceMap;\r\n\r\n#else\r\n\r\n\tuniform float averageLuminance;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvec3 toneMap(vec3 c) {\r\n\r\n\t#ifdef ADAPTED_LUMINANCE\r\n\r\n\t\t// Get the calculated average luminance by sampling the center.\r\n\t\tfloat lumAvg = texture2D(luminanceMap, vec2(0.5)).r;\r\n\r\n\t#else\r\n\r\n\t\tfloat lumAvg = averageLuminance;\r\n\r\n\t#endif\r\n\r\n\t// Calculate the luminance of the current pixel.\r\n\tfloat lumPixel = linearToRelativeLuminance(c);\r\n\r\n\t// Apply the modified operator (Reinhard Eq. 4).\r\n\tfloat lumScaled = (lumPixel * middleGrey) / lumAvg;\r\n\r\n\tfloat lumCompressed = (lumScaled * (1.0 + (lumScaled / (maxLuminance * maxLuminance)))) / (1.0 + lumScaled);\r\n\r\n\treturn lumCompressed * c;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tgl_FragColor = vec4(toneMap(texel.rgb), texel.a);\r\n\r\n\t#include <dithering_fragment>\r\n\r\n}\r\n";var vertex$19="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/**
* Full-screen tone-mapping shader material.
*
* This material supports dithering.
*
* Reference:
* http://www.cis.rit.edu/people/faculty/ferwerda/publications/sig02_paper.pdf
*/var ToneMappingMaterial=/*#__PURE__*/function(_ShaderMaterial){/**
* Constructs a new tone mapping material.
*/function ToneMappingMaterial(){classCallCheck(this,ToneMappingMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(ToneMappingMaterial).call(this,{type:"ToneMappingMaterial",uniforms:{tDiffuse:new Uniform(null),luminanceMap:new Uniform(null),averageLuminance:new Uniform(1.0),maxLuminance:new Uniform(16.0),middleGrey:new Uniform(0.6)},fragmentShader:fragment$19,vertexShader:vertex$19,depthWrite:false,depthTest:false}));}inherits(ToneMappingMaterial,_ShaderMaterial);return ToneMappingMaterial;}(ShaderMaterial);/**
* A collection of shader materials that are used in the post processing passes.
*
* @module postprocessing/materials
*/ /**
* An abstract pass.
*
* Passes that do not rely on the depth buffer should explicitly disable the
* depth test and depth write in their respective shader materials.
*
* @implements {Resizable}
* @implements {Disposable}
*/var Pass=/*#__PURE__*/function(){/**
* Constructs a new pass.
*
* @param {String} [name] - The name of this pass.
* @param {Scene} [scene] - The scene to render.
* @param {Camera} [camera] - The camera.
* @param {Mesh} [quad] - A quad that fills the screen to render 2D filter effects. Set this to null, if you don't need it (see {@link RenderPass}).
*/function Pass(){var name=arguments.length>0&&arguments[0]!==undefined?arguments[0]:"Pass";var scene=arguments.length>1&&arguments[1]!==undefined?arguments[1]:new Scene();var camera=arguments.length>2&&arguments[2]!==undefined?arguments[2]:new OrthographicCamera(-1,1,1,-1,0,1);var quad=arguments.length>3&&arguments[3]!==undefined?arguments[3]:new Mesh(new PlaneBufferGeometry(2,2),null);classCallCheck(this,Pass);/**
* The name of this pass.
*
* @type {String}
*/this.name=name;/**
* The scene to render.
*
* @type {Scene}
* @protected
*/this.scene=scene;/**
* The camera.
*
* @type {Camera}
* @protected
*/this.camera=camera;/**
* A quad mesh that fills the screen.
*
* @type {Mesh}
* @private
*/this.quad=quad;if(this.quad!==null){this.quad.frustumCulled=false;if(this.scene!==null){this.scene.add(this.quad);}}/**
* Indicates whether this pass should render to screen.
*
* @type {Boolean}
*/this.renderToScreen=false;/**
* Indicates whether this pass should be executed.
*
* @type {Boolean}
*/this.enabled=true;/**
* Indicates whether the {@link EffectComposer} should swap the frame
* buffers after this pass has finished rendering.
*
* Set this to `false` if this pass doesn't render to the output buffer or
* the screen. Otherwise, the contents of the input buffer will be lost.
*
* @type {Boolean}
*/this.needsSwap=true;}/**
* The fullscreen material.
*
* @type {Material}
*/createClass(Pass,[{key:"render",/**
* Renders the effect.
*
* This is an abstract method that must be overridden.
*
* @abstract
* @throws {Error} An error is thrown if the method is not overridden.
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){throw new Error("Render method not implemented!");}/**
* Updates this pass with the renderer's size.
*
* You may override this method in case you want to be informed about the main
* render size.
*
* The {@link EffectComposer} calls this method before this pass is
* initialized and every time its own size is updated.
*
* @param {Number} width - The renderer's width.
* @param {Number} height - The renderer's height.
* @example this.myRenderTarget.setSize(width, height);
*/},{key:"setSize",value:function setSize(width,height){}/**
* Performs initialization tasks.
*
* By overriding this method you gain access to the renderer. You'll also be
* able to configure your custom render targets to use the appropriate format
* (RGB or RGBA).
*
* The provided renderer can be used to warm up special off-screen render
* targets by performing a preliminary render operation.
*
* The {@link EffectComposer} calls this method when this pass is added to its
* queue, but not before its size has been set.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.
* @example if(!alpha) { this.myRenderTarget.texture.format = RGBFormat; }
*/},{key:"initialize",value:function initialize(renderer,alpha){}/**
* Performs a shallow search for properties that define a dispose method and
* deletes them. The pass will be inoperative after this method was called!
*
* Disposable objects:
* - render targets
* - materials
* - textures
*
* The {@link EffectComposer} calls this method when it is being destroyed.
* You may, however, use it independently to free memory when you are certain
* that you don't need this pass anymore.
*/},{key:"dispose",value:function dispose(){var key;var _arr=Object.keys(this);for(var _i=0;_i<_arr.length;_i++){key=_arr[_i];if(this[key]!==null&&typeof this[key].dispose==="function"){this[key].dispose();this[key]=null;}}if(this.material!==null){this.material.dispose();}}},{key:"material",get:function get(){return this.quad!==null?this.quad.material:null;}/**
* Sets the fullscreen material.
*
* The material will be assigned to the quad mesh that fills the screen.
*
* @type {Material}
*/,set:function set(value){if(this.quad!==null){this.quad.material=value;}}}]);return Pass;}();/**
* An efficient, incremental blur pass.
*
* Note: This pass allows the input and output buffer to be the same.
*/var BlurPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new blur pass.
*
* @param {Object} [options] - The options.
* @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size.
* @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size.
*/function BlurPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,BlurPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(BlurPass).call(this,"BlurPass"));/**
* A render target.
*
* @type {WebGLRenderTarget}
* @private
*/_this.renderTargetX=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter,stencilBuffer:false,depthBuffer:false});_this.renderTargetX.texture.name="Blur.TargetX";_this.renderTargetX.texture.generateMipmaps=false;/**
* A second render target.
*
* @type {WebGLRenderTarget}
* @private
*/_this.renderTargetY=_this.renderTargetX.clone();_this.renderTargetY.texture.name="Blur.TargetY";/**
* The resolution scale.
*
* You need to call {@link EffectComposer#setSize} after changing this
* value.
*
* @type {Number}
*/_this.resolutionScale=options.resolutionScale!==undefined?options.resolutionScale:0.5;/**
* A convolution shader material.
*
* @type {ConvolutionMaterial}
* @private
*/_this.convolutionMaterial=new ConvolutionMaterial();/**
* A convolution shader material that uses dithering.
*
* @type {ConvolutionMaterial}
* @private
*/_this.ditheredConvolutionMaterial=new ConvolutionMaterial();_this.ditheredConvolutionMaterial.dithering=true;/**
* Whether the blurred result should also be dithered using noise.
*
* @type {Boolean}
*/_this.dithering=false;_this.kernelSize=options.kernelSize;return _this;}/**
* The absolute width of the internal render targets.
*
* @type {Number}
*/createClass(BlurPass,[{key:"render",/**
* Blurs the input buffer and writes the result to the output buffer. The
* input buffer remains intact, unless its also the output buffer.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var scene=this.scene;var camera=this.camera;var renderTargetX=this.renderTargetX;var renderTargetY=this.renderTargetY;var material=this.convolutionMaterial;var uniforms=material.uniforms;var kernel=material.getKernel();var lastRT=inputBuffer;var destRT;var i,l;this.material=material;// Apply the multi-pass blur.
for(i=0,l=kernel.length-1;i<l;++i){// Alternate between targets.
destRT=i%2===0?renderTargetX:renderTargetY;uniforms.kernel.value=kernel[i];uniforms.tDiffuse.value=lastRT.texture;renderer.render(scene,camera,destRT);lastRT=destRT;}if(this.dithering){material=this.ditheredConvolutionMaterial;uniforms=material.uniforms;this.material=material;}uniforms.kernel.value=kernel[i];uniforms.tDiffuse.value=lastRT.texture;renderer.render(scene,camera,this.renderToScreen?null:outputBuffer);}/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/},{key:"setSize",value:function setSize(width,height){width=Math.max(1,Math.floor(width*this.resolutionScale));height=Math.max(1,Math.floor(height*this.resolutionScale));this.renderTargetX.setSize(width,height);this.renderTargetY.setSize(width,height);this.convolutionMaterial.setTexelSize(1.0/width,1.0/height);this.ditheredConvolutionMaterial.setTexelSize(1.0/width,1.0/height);}/**
* Performs initialization tasks.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.
*/},{key:"initialize",value:function initialize(renderer,alpha){if(!alpha){this.renderTargetX.texture.format=RGBFormat;this.renderTargetY.texture.format=RGBFormat;}}},{key:"width",get:function get(){return this.renderTargetX.width;}/**
* The absolute height of the internal render targets.
*
* @type {Number}
*/},{key:"height",get:function get(){return this.renderTargetX.height;}/**
* The kernel size.
*
* @type {KernelSize}
*/},{key:"kernelSize",get:function get(){return this.convolutionMaterial.kernelSize;}/**
* @type {KernelSize}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:KernelSize.LARGE;this.convolutionMaterial.kernelSize=value;this.ditheredConvolutionMaterial.kernelSize=value;}}]);inherits(BlurPass,_Pass);return BlurPass;}(Pass);/**
* A bloom pass.
*
* This pass renders a scene with superimposed blur by utilizing the fast Kawase
* convolution approach.
*/var BloomPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new bloom pass.
*
* @param {Object} [options] - The options.
* @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size.
* @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size.
* @param {Number} [options.intensity=1.0] - The strength of the bloom effect.
* @param {Number} [options.distinction=1.0] - The luminance distinction factor. Raise this value to bring out the brighter elements in the scene.
* @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the bloom texture with the scene colors.
*/function BloomPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,BloomPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(BloomPass).call(this,"BloomPass"));/**
* A render target.
*
* @type {WebGLRenderTarget}
* @private
*/_this.renderTarget=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter,stencilBuffer:false,depthBuffer:false});_this.renderTarget.texture.name="Bloom.Target";_this.renderTarget.texture.generateMipmaps=false;/**
* A blur pass.
*
* @type {BlurPass}
* @private
*/_this.blurPass=new BlurPass(options);/**
* A combine shader material.
*
* @type {CombineMaterial}
* @private
*/_this.combineMaterial=new CombineMaterial(options.screenMode!==undefined?options.screenMode:true);_this.intensity=options.intensity;/**
* A luminosity shader material.
*
* @type {LuminosityMaterial}
* @private
*/_this.luminosityMaterial=new LuminosityMaterial(true);_this.distinction=options.distinction;return _this;}/**
* The resolution scale.
*
* @type {Number}
*/createClass(BloomPass,[{key:"render",/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var scene=this.scene;var camera=this.camera;var blurPass=this.blurPass;var luminosityMaterial=this.luminosityMaterial;var combineMaterial=this.combineMaterial;var renderTarget=this.renderTarget;// Luminance filter.
this.material=luminosityMaterial;luminosityMaterial.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(scene,camera,renderTarget);// Convolution phase.
blurPass.render(renderer,renderTarget,renderTarget);if(this.blend){// Render the original scene with superimposed blur.
this.material=combineMaterial;combineMaterial.uniforms.texture1.value=inputBuffer.texture;combineMaterial.uniforms.texture2.value=renderTarget.texture;renderer.render(scene,camera,this.renderToScreen?null:outputBuffer);}}/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/},{key:"setSize",value:function setSize(width,height){this.blurPass.setSize(width,height);width=this.blurPass.width;height=this.blurPass.height;this.renderTarget.setSize(width,height);}/**
* Performs initialization tasks.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.
*/},{key:"initialize",value:function initialize(renderer,alpha){this.blurPass.initialize(renderer,alpha);if(!alpha){this.renderTarget.texture.format=RGBFormat;}}},{key:"resolutionScale",get:function get(){return this.blurPass.resolutionScale;}/**
* You need to call {@link EffectComposer#setSize} after changing this value.
*
* @type {Number}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0.5;this.blurPass.resolutionScale=value;}/**
* The blur kernel size.
*
* @type {KernelSize}
*/},{key:"kernelSize",get:function get(){return this.blurPass.kernelSize;}/**
* @type {KernelSize}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:KernelSize.LARGE;this.blurPass.kernelSize=value;}/**
* The overall intensity of the effect.
*
* @type {Number}
*/},{key:"intensity",get:function get(){return this.combineMaterial.uniforms.opacity2.value;}/**
* @type {Number}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1.0;this.combineMaterial.uniforms.opacity2.value=value;}/**
* The luminance distinction factor.
*
* @type {Number}
*/},{key:"distinction",get:function get(){return this.luminosityMaterial.uniforms.distinction.value;}/**
* @type {Number}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1.0;this.luminosityMaterial.uniforms.distinction.value=value;}/**
* Indicates whether dithering is enabled.
*
* @type {Boolean}
*/},{key:"dithering",get:function get(){return this.blurPass.dithering;}/**
* If enabled, the result will be dithered to remove banding artifacts.
*
* @type {Boolean}
*/,set:function set(value){this.blurPass.dithering=value;}/**
* Indicates whether the effect should be applied to the input buffer.
*
* @type {Boolean}
*/},{key:"blend",get:function get(){return this.needsSwap;}/**
* If disabled, the input buffer will remain unaffected.
*
* You may use the {@link BloomPass#overlay} texture to apply the effect to
* your scene.
*
* @type {Boolean}
*/,set:function set(value){this.needsSwap=value;}/**
* The effect overlay texture.
*
* @type {Texture}
*/},{key:"overlay",get:function get(){return this.renderTarget.texture;}}]);inherits(BloomPass,_Pass);return BloomPass;}(Pass);/**
* A Depth of Field (DoF) pass using a bokeh shader.
*
* This pass requires a {@link EffectComposer#depthTexture}.
*/var BokehPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new bokeh pass.
*
* @param {PerspectiveCamera} camera - The main camera. Used to obtain the aspect ratio and the near and far plane settings.
* @param {Object} [options] - Additional parameters. See {@link BokehMaterial} for details.
*/function BokehPass(camera){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,BokehPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(BokehPass).call(this,"BokehPass"));_this.material=new BokehMaterial(camera,options);return _this;}/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/createClass(BokehPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;this.material.uniforms.tDepth.value=inputBuffer.depthTexture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/},{key:"setSize",value:function setSize(width,height){this.material.uniforms.aspect.value=width/height;}}]);inherits(BokehPass,_Pass);return BokehPass;}(Pass);/**
* A pass that disables the stencil test.
*/var ClearMaskPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new clear mask pass.
*/function ClearMaskPass(){var _this;classCallCheck(this,ClearMaskPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(ClearMaskPass).call(this,"ClearMaskPass",null,null,null));_this.needsSwap=false;return _this;}/**
* Disables the global stencil test.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/createClass(ClearMaskPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){renderer.state.buffers.stencil.setTest(false);}}]);inherits(ClearMaskPass,_Pass);return ClearMaskPass;}(Pass);/**
* Used for saving the original clear color of the renderer.
*
* @type {Color}
* @private
*/var color=new Color();/**
* A pass that clears the input buffer or the screen.
*
* You can prevent specific bits from being cleared by setting either the
* autoClearColor, autoClearStencil or autoClearDepth properties of the renderer
* to false.
*/var ClearPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new clear pass.
*
* @param {Object} [options] - Additional options.
* @param {Color} [options.clearColor=null] - An override clear color.
* @param {Number} [options.clearAlpha=0.0] - An override clear alpha.
*/function ClearPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,ClearPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(ClearPass).call(this,"ClearPass",null,null,null));_this.needsSwap=false;/**
* The clear color.
*
* @type {Color}
*/_this.clearColor=options.clearColor!==undefined?options.clearColor:null;/**
* The clear alpha.
*
* @type {Number}
*/_this.clearAlpha=options.clearAlpha!==undefined?options.clearAlpha:0.0;return _this;}/**
* Clears the input buffer or the screen.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/createClass(ClearPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var clearColor=this.clearColor;var clearAlpha;if(clearColor!==null){color.copy(renderer.getClearColor());clearAlpha=renderer.getClearAlpha();renderer.setClearColor(clearColor,this.clearAlpha);}renderer.setRenderTarget(this.renderToScreen?null:inputBuffer);renderer.clear();if(clearColor!==null){renderer.setClearColor(color,clearAlpha);}}}]);inherits(ClearPass,_Pass);return ClearPass;}(Pass);/**
* A dot screen pass.
*/var DotScreenPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new dot screen pass.
*
* @param {Object} [options] - The options.
* @param {Boolean} [options.average=false] - Whether the shader should output a colour average (black and white).
* @param {Number} [options.angle=1.57] - The angle of the pattern.
* @param {Number} [options.scale=1.0] - The scale of the overall effect.
* @param {Number} [options.intensity=1.0] - The intensity of the effect.
*/function DotScreenPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,DotScreenPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(DotScreenPass).call(this,"DotScreenPass"));_this.material=new DotScreenMaterial(options);return _this;}/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/createClass(DotScreenPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/},{key:"setSize",value:function setSize(width,height){width=Math.max(1,width);height=Math.max(1,height);this.material.uniforms.offsetRepeat.value.z=width;this.material.uniforms.offsetRepeat.value.w=height;}}]);inherits(DotScreenPass,_Pass);return DotScreenPass;}(Pass);/**
* A film pass.
*
* Provides various cinematic effects.
*/var FilmPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new film pass.
*
* @param {Object} [options] - The options. See {@link FilmMaterial} for more options.
* @param {Number} [options.scanlineDensity=1.25] - The scanline density, relative to the screen height.
* @param {Number} [options.gridScale=1.0] - The grid scale, relative to the screen height.
* @param {Number} [options.gridLineWidth=0.0] - The grid line width. This value will be added to the base line width.
*/function FilmPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,FilmPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(FilmPass).call(this,"FilmPass"));_this.material=new FilmMaterial(options);/**
* The amount of scanlines, relative to the screen height.
*
* You need to call {@link EffectComposer#setSize} after changing this
* value.
*
* @type {Number}
*/_this.scanlineDensity=options.scanlineDensity===undefined?1.25:options.scanlineDensity;/**
* The grid scale, relative to the screen height.
*
* You need to call {@link EffectComposer#setSize} after changing this
* value.
*
* @type {Number}
*/_this.gridScale=options.gridScale===undefined?1.0:Math.max(options.gridScale,1e-6);/**
* The grid line width.
*
* You need to call {@link EffectComposer#setSize} after changing this
* value.
*
* @type {Number}
*/_this.gridLineWidth=options.gridLineWidth===undefined?0.0:Math.max(options.gridLineWidth,0.0);return _this;}/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/createClass(FilmPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;this.material.uniforms.time.value+=delta;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/},{key:"setSize",value:function setSize(width,height){var aspect=width/height;var gridScale=this.gridScale*(height*0.125);this.material.uniforms.scanlineCount.value=Math.round(height*this.scanlineDensity);this.material.uniforms.gridScale.value.set(aspect*gridScale,gridScale);this.material.uniforms.gridLineWidth.value=gridScale/height+this.gridLineWidth;}}]);inherits(FilmPass,_Pass);return FilmPass;}(Pass);/**
* Returns a random integer in the specified range.
*
* @private
* @param {Number} low - The lowest possible value.
* @param {Number} high - The highest possible value.
* @return {Number} The random value.
*/function randomInt(low,high){return low+Math.floor(Math.random()*(high-low+1));}/**
* Returns a random float in the specified range.
*
* @private
* @param {Number} low - The lowest possible value.
* @param {Number} high - The highest possible value.
* @return {Number} The random value.
*/function randomFloat(low,high){return low+Math.random()*(high-low);}/**
* A glitch pass.
*/var GlitchPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new glitch pass.
*
* @param {Object} [options] - The options.
* @param {Texture} [options.perturbMap] - A perturbation map. If none is provided, a noise texture will be created.
* @param {Number} [options.dtSize=64] - The size of the generated noise map. Will be ignored if a perturbation map is provided.
*/function GlitchPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,GlitchPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(GlitchPass).call(this,"GlitchPass"));_this.material=new GlitchMaterial();/**
* A perturbation map.
*
* @type {Texture}
* @private
*/_this.texture=null;_this.perturbMap=options.perturbMap!==undefined?options.perturbMap:_this.generatePerturbMap(options.dtSize);_this.perturbMap.name="Glitch.Perturbation";_this.perturbMap.generateMipmaps=false;/**
* The effect mode.
*
* @type {GlitchMode}
*/_this.mode=GlitchMode.SPORADIC;/**
* A counter for the glitch activation and deactivation.
*
* @type {Number}
* @private
*/_this.counter=0;/**
* A random break point for the sporadic glitch activation.
*
* @type {Number}
* @private
*/_this.breakPoint=randomInt(120,240);return _this;}/**
* The current perturbation map.
*
* @type {Texture}
*/createClass(GlitchPass,[{key:"generatePerturbMap",/**
* Destroys the current perturbation map and replaces it with a new one.
*
* @param {Number} [size=64] - The texture size.
* @return {DataTexture} The perturbation texture.
*/value:function generatePerturbMap(){var size=arguments.length>0&&arguments[0]!==undefined?arguments[0]:64;var pixels=size*size;var data=new Float32Array(pixels*3);var dt=this.perturbMap;var i,x;for(i=0;i<pixels;++i){x=Math.random();data[i*3]=x;data[i*3+1]=x;data[i*3+2]=x;}if(dt!==null){dt.dispose();}dt=new DataTexture(data,size,size,RGBFormat,FloatType);dt.needsUpdate=true;this.perturbMap=dt;return dt;}/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/},{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var mode=this.mode;var counter=this.counter;var breakPoint=this.breakPoint;var uniforms=this.material.uniforms;uniforms.tDiffuse.value=inputBuffer.texture;uniforms.seed.value=Math.random();uniforms.active.value=true;if(counter%breakPoint===0||mode===GlitchMode.CONSTANT_WILD){uniforms.amount.value=Math.random()/30.0;uniforms.angle.value=randomFloat(-Math.PI,Math.PI);uniforms.seedX.value=randomFloat(-1.0,1.0);uniforms.seedY.value=randomFloat(-1.0,1.0);uniforms.distortionX.value=randomFloat(0.0,1.0);uniforms.distortionY.value=randomFloat(0.0,1.0);this.breakPoint=randomInt(120,240);this.counter=0;}else{if(counter%breakPoint<breakPoint/5||mode===GlitchMode.CONSTANT_MILD){uniforms.amount.value=Math.random()/90.0;uniforms.angle.value=randomFloat(-Math.PI,Math.PI);uniforms.distortionX.value=randomFloat(0.0,1.0);uniforms.distortionY.value=randomFloat(0.0,1.0);uniforms.seedX.value=randomFloat(-0.3,0.3);uniforms.seedY.value=randomFloat(-0.3,0.3);}else{// Sporadic.
uniforms.active.value=false;}}++this.counter;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}},{key:"perturbMap",get:function get(){return this.texture;}/**
* Assigning a new perturbation map does not destroy the current one!
*
* @type {Texture}
*/,set:function set(value){this.texture=value;this.material.uniforms.tPerturb.value=value;}}]);inherits(GlitchPass,_Pass);return GlitchPass;}(Pass);/**
* A glitch mode enumeration.
*
* @type {Object}
* @property {Number} SPORADIC - Sporadic glitches.
* @property {Number} CONSTANT_MILD - Constant mild glitches.
* @property {Number} CONSTANT_WILD - Constant wild glitches.
*/var GlitchMode={SPORADIC:0,CONSTANT_MILD:1,CONSTANT_WILD:2};/**
* A pass that renders a given scene directly on screen or into the read buffer
* for further processing.
*/var RenderPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new render pass.
*
* @param {Scene} scene - The scene to render.
* @param {Camera} camera - The camera to use to render the scene.
* @param {Object} [options] - Additional options.
* @param {Material} [options.overrideMaterial=null] - An override material for the scene.
* @param {Color} [options.clearColor=null] - An override clear color.
* @param {Number} [options.clearAlpha=1.0] - An override clear alpha.
* @param {Boolean} [options.clearDepth=false] - Whether depth should be cleared explicitly.
* @param {Boolean} [options.clear=true] - Whether all buffers should be cleared.
*/function RenderPass(scene,camera){var _this;var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};classCallCheck(this,RenderPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(RenderPass).call(this,"RenderPass",scene,camera,null));_this.needsSwap=false;/**
* A clear pass.
*
* @type {ClearPass}
*/_this.clearPass=new ClearPass(options);/**
* An override material.
*
* @type {Material}
*/_this.overrideMaterial=options.overrideMaterial!==undefined?options.overrideMaterial:null;/**
* Indicates whether the depth buffer should be cleared explicitly.
*
* @type {Boolean}
*/_this.clearDepth=options.clearDepth!==undefined?options.clearDepth:false;/**
* Indicates whether the color, depth and stencil buffers should be cleared.
*
* Even with clear set to true you can prevent specific buffers from being
* cleared by setting either the autoClearColor, autoClearStencil or
* autoClearDepth properties of the renderer to false.
*
* @type {Boolean}
*/_this.clear=options.clear!==undefined?options.clear:true;return _this;}/**
* Renders the scene.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/createClass(RenderPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var scene=this.scene;var renderTarget=this.renderToScreen?null:inputBuffer;var overrideMaterial=scene.overrideMaterial;if(this.clear){this.clearPass.renderToScreen=this.renderToScreen;this.clearPass.render(renderer,inputBuffer);}else if(this.clearDepth){renderer.setRenderTarget(renderTarget);renderer.clearDepth();}scene.overrideMaterial=this.overrideMaterial;renderer.render(scene,this.camera,renderTarget);scene.overrideMaterial=overrideMaterial;}}]);inherits(RenderPass,_Pass);return RenderPass;}(Pass);/**
* Clamps a given value.
*
* @private
* @param {Number} value - The value to clamp.
* @param {Number} min - The lowest possible value.
* @param {Number} max - The highest possible value.
* @return {Number} The clamped value.
*/function clamp(value,min,max){return Math.max(min,Math.min(max,value));}/**
* A crepuscular rays pass.
*/var GodRaysPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new god rays pass.
*
* @param {Scene} scene - The main scene.
* @param {Camera} camera - The main camera.
* @param {Object3D} lightSource - The main light source.
* @param {Object} [options] - The options.
* @param {Number} [options.density=0.96] - The density of the light rays.
* @param {Number} [options.decay=0.93] - An illumination decay factor.
* @param {Number} [options.weight=0.4] - A light ray weight factor.
* @param {Number} [options.exposure=0.6] - A constant attenuation coefficient.
* @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect.
* @param {Number} [options.intensity=1.0] - A constant factor for additive blending.
* @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size.
* @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size.
* @param {Number} [options.samples=60] - The number of samples per pixel.
* @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the god rays texture with the scene colors.
*/function GodRaysPass(scene,camera,lightSource){var _this;var options=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{};classCallCheck(this,GodRaysPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(GodRaysPass).call(this,"GodRaysPass"));/**
* A scene that only contains the light source.
*
* @type {Scene}
* @private
*/_this.lightScene=new Scene();/**
* The main scene.
*
* @type {Scene}
* @private
*/_this.mainScene=scene;/**
* The main camera.
*
* @type {Camera}
* @private
*/_this.mainCamera=camera;/**
* A render target.
*
* @type {WebGLRenderTarget}
* @private
*/_this.renderTargetX=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter,stencilBuffer:false,depthBuffer:false});_this.renderTargetX.texture.name="GodRays.TargetX";_this.renderTargetX.texture.generateMipmaps=false;/**
* A second render target.
*
* @type {WebGLRenderTarget}
* @private
*/_this.renderTargetY=_this.renderTargetX.clone();_this.renderTargetY.texture.name="GodRays.TargetY";/**
* A render target for the masked light scene.
*
* @type {WebGLRenderTarget}
* @private
*/_this.renderTargetMask=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter});_this.renderTargetMask.texture.name="GodRays.Mask";_this.renderTargetMask.texture.generateMipmaps=false;/**
* A pass that only renders the light source.
*
* @type {RenderPass}
* @private
*/_this.renderPassLight=new RenderPass(_this.lightScene,_this.mainCamera,{clearColor:new Color(0x000000)});/**
* A pass that renders the masked scene over the light.
*
* @type {RenderPass}
* @private
*/_this.renderPassMask=new RenderPass(_this.mainScene,_this.mainCamera,{overrideMaterial:new MeshBasicMaterial({color:0x000000})});_this.renderPassMask.clear=false;/**
* A blur pass.
*
* @type {BlurPass}
* @private
*/_this.blurPass=new BlurPass(options);/**
* The light source.
*
* @type {Object3D}
*/_this.lightSource=lightSource;/**
* The light position in screen space.
*
* @type {Vector3}
* @private
*/_this.screenPosition=new Vector3();/**
* A god rays shader material.
*
* @type {GodRaysMaterial}
* @private
*/_this.godRaysMaterial=new GodRaysMaterial(options);_this.godRaysMaterial.uniforms.lightPosition.value=_this.screenPosition;_this.samples=options.samples;/**
* A combine shader material.
*
* @type {CombineMaterial}
* @private
*/_this.combineMaterial=new CombineMaterial(options.screenMode!==undefined?options.screenMode:true);_this.intensity=options.intensity;return _this;}/**
* The resolution scale.
*
* @type {Number}
*/createClass(GodRaysPass,[{key:"render",/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var scene=this.scene;var camera=this.camera;var mainScene=this.mainScene;var lightSource=this.lightSource;var screenPosition=this.screenPosition;var godRaysMaterial=this.godRaysMaterial;var combineMaterial=this.combineMaterial;var renderTargetMask=this.renderTargetMask;var renderTargetX=this.renderTargetX;var renderTargetY=this.renderTargetY;var background,parent;// Compute the screen light position and translate it to [0.0, 1.0].
screenPosition.copy(lightSource.position).project(this.mainCamera);screenPosition.x=clamp((screenPosition.x+1.0)*0.5,0.0,1.0);screenPosition.y=clamp((screenPosition.y+1.0)*0.5,0.0,1.0);parent=lightSource.parent;background=mainScene.background;mainScene.background=null;this.lightScene.add(lightSource);/* First, render the light source. Then render the scene into the same
buffer using a mask override material with depth test enabled. */this.renderPassLight.render(renderer,renderTargetMask);this.renderPassMask.render(renderer,renderTargetMask);if(parent!==null){parent.add(lightSource);}mainScene.background=background;// Blur the masked scene to reduce artifacts.
this.blurPass.render(renderer,this.renderTargetMask,renderTargetX);// Blur the masked scene along radial lines towards the light source.
this.material=godRaysMaterial;godRaysMaterial.uniforms.tDiffuse.value=renderTargetX.texture;renderer.render(scene,camera,renderTargetY);if(this.blend){// Combine the god rays with the scene colors.
this.material=combineMaterial;combineMaterial.uniforms.texture1.value=inputBuffer.texture;combineMaterial.uniforms.texture2.value=renderTargetY.texture;renderer.render(scene,camera,this.renderToScreen?null:outputBuffer);}}/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/},{key:"setSize",value:function setSize(width,height){this.renderPassLight.setSize(width,height);this.renderPassMask.setSize(width,height);this.blurPass.setSize(width,height);width=this.blurPass.width;height=this.blurPass.height;this.renderTargetMask.setSize(width,height);this.renderTargetX.setSize(width,height);this.renderTargetY.setSize(width,height);}/**
* Performs initialization tasks.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.
*/},{key:"initialize",value:function initialize(renderer,alpha){this.renderPassLight.initialize(renderer,alpha);this.renderPassMask.initialize(renderer,alpha);this.blurPass.initialize(renderer,alpha);if(!alpha){this.renderTargetMask.texture.format=RGBFormat;this.renderTargetX.texture.format=RGBFormat;this.renderTargetY.texture.format=RGBFormat;}}},{key:"resolutionScale",get:function get(){return this.blurPass.resolutionScale;}/**
* You need to call {@link EffectComposer#setSize} after changing this value.
*
* @type {Number}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0.5;this.blurPass.resolutionScale=value;}/**
* The blur kernel size.
*
* @type {KernelSize}
*/},{key:"kernelSize",get:function get(){return this.blurPass.kernelSize;}/**
* @type {KernelSize}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:KernelSize.LARGE;this.blurPass.kernelSize=value;}/**
* The overall intensity of the effect.
*
* @type {Number}
*/},{key:"intensity",get:function get(){return this.combineMaterial.uniforms.opacity2.value;}/**
* @type {Number}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1.0;this.combineMaterial.uniforms.opacity2.value=value;}/**
* The number of samples per pixel.
*
* @type {Number}
*/},{key:"samples",get:function get(){return Number.parseInt(this.godRaysMaterial.defines.NUM_SAMPLES_INT);}/**
* This value must be carefully chosen. A higher value directly increases the
* GPU load.
*
* @type {Number}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:60;value=Math.floor(value);this.godRaysMaterial.defines.NUM_SAMPLES_FLOAT=value.toFixed(1);this.godRaysMaterial.defines.NUM_SAMPLES_INT=value.toFixed(0);this.godRaysMaterial.needsUpdate=true;}/**
* Indicates whether dithering is enabled.
*
* @type {Boolean}
*/},{key:"dithering",get:function get(){return this.godRaysMaterial.dithering;}/**
* If enabled, the result will be dithered to remove banding artifacts.
*
* @type {Boolean}
*/,set:function set(value){if(this.dithering!==value){this.godRaysMaterial.dithering=value;this.godRaysMaterial.needsUpdate=true;}}/**
* Indicates whether the effect should be applied to the input buffer.
*
* @type {Boolean}
*/},{key:"blend",get:function get(){return this.needsSwap;}/**
* If disabled, the input buffer will remain unaffected.
*
* You may use the {@link BloomPass#overlay} texture to apply the effect to
* your scene.
*
* @type {Boolean}
*/,set:function set(value){this.needsSwap=value;}/**
* The effect overlay texture.
*
* @type {Texture}
*/},{key:"overlay",get:function get(){return this.renderTargetY.texture;}}]);inherits(GodRaysPass,_Pass);return GodRaysPass;}(Pass);/**
* A mask pass.
*/var MaskPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new mask pass.
*
* @param {Scene} scene - The scene to render.
* @param {Camera} camera - The camera to use.
*/function MaskPass(scene,camera){var _this;classCallCheck(this,MaskPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(MaskPass).call(this,"MaskPass",scene,camera,null));_this.needsSwap=false;/**
* Inverse flag.
*
* @type {Boolean}
*/_this.inverse=false;/**
* Stencil buffer clear flag.
*
* @type {Boolean}
*/_this.clearStencil=true;return _this;}/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/createClass(MaskPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var context=renderer.context;var state=renderer.state;var scene=this.scene;var camera=this.camera;var writeValue=this.inverse?0:1;var clearValue=1-writeValue;// Don't update color or depth.
state.buffers.color.setMask(false);state.buffers.depth.setMask(false);// Lock the buffers.
state.buffers.color.setLocked(true);state.buffers.depth.setLocked(true);// Configure the stencil.
state.buffers.stencil.setTest(true);state.buffers.stencil.setOp(context.REPLACE,context.REPLACE,context.REPLACE);state.buffers.stencil.setFunc(context.ALWAYS,writeValue,0xffffffff);state.buffers.stencil.setClear(clearValue);// Clear the stencil.
if(this.clearStencil){if(this.renderToScreen){renderer.setRenderTarget(null);renderer.clearStencil();}else{renderer.setRenderTarget(inputBuffer);renderer.clearStencil();renderer.setRenderTarget(outputBuffer);renderer.clearStencil();}}// Draw the mask.
if(this.renderToScreen){renderer.render(scene,camera,null);}else{renderer.render(scene,camera,inputBuffer);renderer.render(scene,camera,outputBuffer);}// Unlock the buffers.
state.buffers.color.setLocked(false);state.buffers.depth.setLocked(false);// Only render where the stencil is set to 1.
state.buffers.stencil.setFunc(context.EQUAL,1,0xffffffff);state.buffers.stencil.setOp(context.KEEP,context.KEEP,context.KEEP);}}]);inherits(MaskPass,_Pass);return MaskPass;}(Pass);/**
* A shader pass.
*
* Used to render any shader material as a 2D filter.
*/var ShaderPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new shader pass.
*
* @param {ShaderMaterial} material - The shader material to use.
* @param {String} [textureID="tDiffuse"] - The texture uniform identifier.
*/function ShaderPass(material){var _this;var textureID=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"tDiffuse";classCallCheck(this,ShaderPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(ShaderPass).call(this,"ShaderPass"));_this.material=material;/**
* The name of the color sampler uniform of the given material.
*
* @type {String}
*/_this.textureID=textureID;return _this;}/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/createClass(ShaderPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){if(this.material.uniforms[this.textureID]!==undefined){this.material.uniforms[this.textureID].value=inputBuffer.texture;}renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}}]);inherits(ShaderPass,_Pass);return ShaderPass;}(Pass);/**
* An outline pass.
*/var OutlinePass=/*#__PURE__*/function(_Pass){/**
* Constructs a new outline pass.
*
* @param {Scene} scene - The main scene.
* @param {Camera} camera - The main camera.
* @param {Object} [options] - Additional parameters. See {@link BlurPass}, {@link OutlineBlendMaterial} and {@link OutlineEdgesMaterial} for details.
* @param {Number} [options.pulseSpeed=0.0] - The pulse speed. A value of zero disables the pulse effect.
* @param {Boolean} [options.blur=true] - Whether the outline should be blurred.
*/function OutlinePass(scene,camera){var _this;var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};classCallCheck(this,OutlinePass);_this=possibleConstructorReturn(this,getPrototypeOf$2(OutlinePass).call(this,"OutlinePass"));/**
* The main scene.
*
* @type {Scene}
* @private
*/_this.mainScene=scene;/**
* The main camera.
*
* @type {Camera}
* @private
*/_this.mainCamera=camera;/**
* A render target for depth information.
*
* @type {WebGLRenderTarget}
* @private
*/_this.renderTargetDepth=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter});_this.renderTargetDepth.texture.name="Outline.Depth";_this.renderTargetDepth.texture.generateMipmaps=false;/**
* A render target for the outline mask.
*
* @type {WebGLRenderTarget}
* @private
*/_this.renderTargetMask=_this.renderTargetDepth.clone();_this.renderTargetMask.texture.format=RGBFormat;_this.renderTargetMask.texture.name="Outline.Mask";/**
* A render target for the edge detection.
*
* @type {WebGLRenderTarget}
* @private
*/_this.renderTargetEdges=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter,stencilBuffer:false,depthBuffer:false,format:RGBFormat});_this.renderTargetEdges.texture.name="Outline.Edges";_this.renderTargetEdges.texture.generateMipmaps=false;/**
* A render target for the blurred outline overlay.
*
* @type {WebGLRenderTarget}
* @private
*/_this.renderTargetBlurredEdges=_this.renderTargetEdges.clone();_this.renderTargetBlurredEdges.texture.name="Outline.BlurredEdges";/**
* A depth pass.
*
* @type {RenderPass}
* @private
*/_this.renderPassDepth=new RenderPass(_this.mainScene,_this.mainCamera,{overrideMaterial:new MeshDepthMaterial({depthPacking:RGBADepthPacking,morphTargets:true,skinning:true}),clearColor:new Color(0xffffff),clearAlpha:1.0});/**
* A depth comparison mask pass.
*
* @type {RenderPass}
* @private
*/_this.renderPassMask=new RenderPass(_this.mainScene,_this.mainCamera,{overrideMaterial:new DepthComparisonMaterial(_this.renderTargetDepth.texture,_this.mainCamera),clearColor:new Color(0xffffff),clearAlpha:1.0});/**
* A blur pass.
*
* @type {BlurPass}
* @private
*/_this.blurPass=new BlurPass(options);_this.kernelSize=options.kernelSize;/**
* A copy pass that renders the read buffer to screen if needed.
*
* @type {ShaderPass}
* @private
*/_this.copyPass=new ShaderPass(new CopyMaterial());_this.copyPass.renderToScreen=true;/**
* An outline edge detection material.
*
* @type {OutlineEdgesMaterial}
* @private
*/_this.outlineEdgesMaterial=new OutlineEdgesMaterial(options);_this.outlineEdgesMaterial.uniforms.tMask.value=_this.renderTargetMask.texture;/**
* An outline blend material.
*
* @type {OutlineBlendMaterial}
* @private
*/_this.outlineBlendMaterial=new OutlineBlendMaterial(options);_this.outlineBlendMaterial.uniforms.tMask.value=_this.renderTargetMask.texture;_this.blur=options.blur!==undefined?options.blur:true;/**
* A list of objects to outline.
*
* @type {Object3D[]}
* @private
*/_this.selection=[];/**
* The current animation time.
*
* @type {Number}
* @private
*/_this.time=0.0;/**
* The pulse speed. A value of zero disables the pulse effect.
*
* @type {Number}
*/_this.pulseSpeed=options.pulseSpeed!==undefined?options.pulseSpeed:0.0;/**
* A dedicated render layer for selected objects.
*
* This layer is set to 10 by default. If this collides with your own custom
* layers, please change it to a free layer before rendering!
*
* @type {Number}
*/_this.selectionLayer=10;return _this;}/**
* The resolution scale.
*
* @type {Number}
*/createClass(OutlinePass,[{key:"setPatternTexture",/**
* Sets a pattern texture to use as an overlay for selected objects.
*
* @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern.
*/value:function setPatternTexture(){var texture=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;this.outlineBlendMaterial.setPatternTexture(texture);}/**
* Clears the current selection and selects a list of objects.
*
* @param {Object3D[]} objects - The objects that should be outlined. This array will be copied.
* @return {OutlinePass} This pass.
*/},{key:"setSelection",value:function setSelection(objects){var selection=objects.slice(0);var selectionLayer=this.selectionLayer;var i,l;this.clearSelection();for(i=0,l=selection.length;i<l;++i){selection[i].layers.enable(selectionLayer);}this.selection=selection;return this;}/**
* Clears the list of selected objects.
*
* @return {OutlinePass} This pass.
*/},{key:"clearSelection",value:function clearSelection(){var selection=this.selection;var selectionLayer=this.selectionLayer;var i,l;for(i=0,l=selection.length;i<l;++i){selection[i].layers.disable(selectionLayer);}this.selection=[];this.time=0.0;return this;}/**
* Selects an object.
*
* @param {Object3D} object - The object that should be outlined.
* @return {OutlinePass} This pass.
*/},{key:"selectObject",value:function selectObject(object){object.layers.enable(this.selectionLayer);this.selection.push(object);return this;}/**
* Deselects an object.
*
* @param {Object3D} object - The object that should no longer be outlined.
* @return {OutlinePass} This pass.
*/},{key:"deselectObject",value:function deselectObject(object){var selection=this.selection;var index=selection.indexOf(object);if(index>=0){selection[index].layers.disable(this.selectionLayer);selection.splice(index,1);if(selection.length===0){this.time=0.0;}}return this;}/**
* Sets the visibility of all selected objects.
*
* @private
* @param {Boolean} visible - Whether the selected objects should be visible.
*/},{key:"setSelectionVisible",value:function setSelectionVisible(visible){var selection=this.selection;var i,l;for(i=0,l=selection.length;i<l;++i){if(visible){selection[i].layers.enable(0);}else{selection[i].layers.disable(0);}}}/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/},{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var mainScene=this.mainScene;var mainCamera=this.mainCamera;var pulse=this.outlineBlendMaterial.uniforms.pulse;var background,mask;if(this.selection.length>0){background=mainScene.background;mask=mainCamera.layers.mask;mainScene.background=null;pulse.value=1.0;if(this.pulseSpeed>0.0){pulse.value=0.625+Math.cos(this.time*this.pulseSpeed*10.0)*0.375;this.time+=delta;}// Render a custom depth texture and ignore selected objects.
this.setSelectionVisible(false);this.renderPassDepth.render(renderer,this.renderTargetDepth);this.setSelectionVisible(true);// Create a mask for the selected objects using the depth information.
mainCamera.layers.mask=1<<this.selectionLayer;this.renderPassMask.render(renderer,this.renderTargetMask);// Restore the camera layer mask and the scene background.
mainCamera.layers.mask=mask;mainScene.background=background;// Detect the outline.
this.material=this.outlineEdgesMaterial;renderer.render(this.scene,this.camera,this.renderTargetEdges);if(this.blurPass.enabled){// Blur the edges.
this.blurPass.render(renderer,this.renderTargetEdges,this.renderTargetBlurredEdges);}if(this.blend){// Draw the final overlay onto the scene colours.
this.material=this.outlineBlendMaterial;this.outlineBlendMaterial.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:this.outputBuffer);}}else if(this.renderToScreen){// Draw the read buffer to screen.
this.copyPass.render(renderer,inputBuffer);}}/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/},{key:"setSize",value:function setSize(width,height){this.renderTargetDepth.setSize(width,height);this.renderTargetMask.setSize(width,height);this.renderPassDepth.setSize(width,height);this.renderPassMask.setSize(width,height);this.blurPass.setSize(width,height);width=this.blurPass.width;height=this.blurPass.height;this.renderTargetEdges.setSize(width,height);this.renderTargetBlurredEdges.setSize(width,height);this.outlineBlendMaterial.uniforms.aspect.value=width/height;this.outlineEdgesMaterial.setTexelSize(1.0/width,1.0/height);}/**
* Performs initialization tasks.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.
*/},{key:"initialize",value:function initialize(renderer,alpha){this.renderPassDepth.initialize(renderer,alpha);this.renderPassMask.initialize(renderer,alpha);this.blurPass.initialize(renderer,alpha);}},{key:"resolutionScale",get:function get(){return this.blurPass.resolutionScale;}/**
* You need to call {@link EffectComposer#setSize} after changing this value.
*
* @type {Number}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0.5;this.blurPass.resolutionScale=value;}/**
* The blur kernel size.
*
* @type {KernelSize}
*/},{key:"kernelSize",get:function get(){return this.blurPass.kernelSize;}/**
* @type {KernelSize}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:KernelSize.VERY_SMALL;this.blurPass.kernelSize=value;}/**
* Indicates whether the outline overlay should be blurred.
*
* @type {Boolean}
*/},{key:"blur",get:function get(){return this.blurPass.enabled;}/**
* @type {Boolean}
*/,set:function set(value){this.blurPass.enabled=value;this.outlineBlendMaterial.uniforms.tEdges.value=value?this.renderTargetBlurredEdges.texture:this.renderTargetEdges.texture;}/**
* Indicates whether dithering is enabled.
*
* @type {Boolean}
*/},{key:"dithering",get:function get(){return this.blurPass.dithering;}/**
* If enabled, the result will be dithered to remove banding artifacts.
*
* @type {Boolean}
*/,set:function set(value){this.blurPass.dithering=value;}/**
* Indicates whether the effect should be applied to the input buffer.
*
* @type {Boolean}
*/},{key:"blend",get:function get(){return this.needsSwap;}/**
* If disabled, the input buffer will remain unaffected.
*
* You may use the {@link BloomPass#overlay} texture to apply the effect to
* your scene.
*
* @type {Boolean}
*/,set:function set(value){this.needsSwap=value;}/**
* The effect overlay texture.
*
* @type {Texture}
*/},{key:"overlay",get:function get(){return this.outlineBlendMaterial.uniforms.tEdges.value;}}]);inherits(OutlinePass,_Pass);return OutlinePass;}(Pass);/**
* A pixelation pass.
*/var PixelationPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new pixelation pass.
*
* @param {Number} [granularity=30.0] - The intensity of the effect.
*/function PixelationPass(){var _this;var granularity=arguments.length>0&&arguments[0]!==undefined?arguments[0]:30.0;classCallCheck(this,PixelationPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(PixelationPass).call(this,"PixelationPass"));_this.material=new PixelationMaterial();_this.granularity=granularity;return _this;}/**
* The pixel granularity.
*
* @type {Number}
*/createClass(PixelationPass,[{key:"render",/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/},{key:"setSize",value:function setSize(width,height){this.material.setResolution(width,height);}},{key:"granularity",get:function get(){return this.material.granularity;}/**
* A higher value yields coarser visuals.
*
* @type {Number}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:30;value=Math.floor(value);if(value%2>0){value+=1;}this.material.granularity=value;}}]);inherits(PixelationPass,_Pass);return PixelationPass;}(Pass);/**
* An advanced Depth of Field (DoF) pass.
*
* Yields more realistic results but is also more demanding.
*
* This pass requires a {@link EffectComposer#depthTexture}.
*/var RealisticBokehPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new bokeh pass.
*
* @param {PerspectiveCamera} camera - The main camera. Used to obtain the focal length and the near and far plane settings.
* @param {Object} [options] - Additional parameters. See {@link RealisticBokehMaterial} for details.
*/function RealisticBokehPass(camera){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,RealisticBokehPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(RealisticBokehPass).call(this,"RealisticBokehPass"));_this.material=new RealisticBokehMaterial(camera,options);return _this;}/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/createClass(RealisticBokehPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;this.material.uniforms.tDepth.value=inputBuffer.depthTexture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/},{key:"setSize",value:function setSize(width,height){this.material.setTexelSize(1.0/width,1.0/height);}}]);inherits(RealisticBokehPass,_Pass);return RealisticBokehPass;}(Pass);/**
* A pass that renders the result from a previous pass to another render target.
*/var SavePass=/*#__PURE__*/function(_Pass){/**
* Constructs a new save pass.
*
* @param {WebGLRenderTarget} [renderTarget] - The render target to use for saving the input buffer.
* @param {Boolean} [resize=true] - Whether the render target should adjust to the size of the input buffer.
*/function SavePass(renderTarget){var _this;var resize=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;classCallCheck(this,SavePass);_this=possibleConstructorReturn(this,getPrototypeOf$2(SavePass).call(this,"SavePass"));_this.material=new CopyMaterial();_this.needsSwap=false;/**
* The render target.
*
* @type {WebGLRenderTarget}
*/_this.renderTarget=renderTarget!==undefined?renderTarget:new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter,stencilBuffer:false,depthBuffer:false});_this.renderTarget.texture.name="Save.Target";_this.renderTarget.texture.generateMipmaps=false;/**
* Indicates whether the render target should be resized when the size of
* the composer's frame buffer changes.
*
* @type {Boolean}
*/_this.resize=resize;return _this;}/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/createClass(SavePass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderTarget);}/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/},{key:"setSize",value:function setSize(width,height){if(this.resize){width=Math.max(1,width);height=Math.max(1,height);this.renderTarget.setSize(width,height);}}/**
* Performs initialization tasks.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.
*/},{key:"initialize",value:function initialize(renderer,alpha){if(!alpha){this.renderTarget.texture.format=RGBFormat;}}}]);inherits(SavePass,_Pass);return SavePass;}(Pass);/**
* Half PI.
*
* @type {Number}
* @private
*/var HALF_PI=Math.PI*0.5;/**
* A vector.
*
* @type {Vector3}
* @private
*/var v=new Vector3();/**
* A vector.
*
* @type {Vector3}
* @private
*/var ab=new Vector3();/**
* A shock wave pass.
*/var ShockWavePass=/*#__PURE__*/function(_Pass){/**
* Constructs a new shock wave pass.
*
* @param {Camera} camera - The main camera.
* @param {Vector3} [epicenter] - The world position of the shock wave epicenter.
* @param {Object} [options] - The options.
* @param {Number} [options.speed=1.0] - The animation speed.
* @param {Number} [options.maxRadius=1.0] - The extent of the shock wave.
* @param {Number} [options.waveSize=0.2] - The wave size.
* @param {Number} [options.amplitude=0.05] - The distortion amplitude.
*/function ShockWavePass(camera){var _this;var epicenter=arguments.length>1&&arguments[1]!==undefined?arguments[1]:new Vector3();var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};classCallCheck(this,ShockWavePass);_this=possibleConstructorReturn(this,getPrototypeOf$2(ShockWavePass).call(this,"ShockWavePass"));/**
* The main camera.
*
* @type {Object3D}
*/_this.mainCamera=camera;/**
* The epicenter.
*
* @type {Vector3}
* @example shockWavePass.epicenter = myMesh.position;
*/_this.epicenter=epicenter;/**
* The object position in screen space.
*
* @type {Vector3}
* @private
*/_this.screenPosition=new Vector3();/**
* The speed of the shock wave animation.
*
* @type {Number}
*/_this.speed=options.speed!==undefined?options.speed:2.0;/**
* A time accumulator.
*
* @type {Number}
* @private
*/_this.time=0.0;/**
* Indicates whether the shock wave animation is active.
*
* @type {Boolean}
* @private
*/_this.active=false;/**
* A shock wave shader material.
*
* @type {ShockWaveMaterial}
* @private
*/_this.shockWaveMaterial=new ShockWaveMaterial(options);_this.shockWaveMaterial.uniforms.center.value=_this.screenPosition;/**
* A copy shader material.
*
* @type {CopyMaterial}
* @private
*/_this.copyMaterial=new CopyMaterial();return _this;}/**
* Emits the shock wave.
*/createClass(ShockWavePass,[{key:"explode",value:function explode(){this.time=0.0;this.active=true;}/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/},{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var epicenter=this.epicenter;var mainCamera=this.mainCamera;var screenPosition=this.screenPosition;var shockWaveMaterial=this.shockWaveMaterial;var uniforms=shockWaveMaterial.uniforms;var center=uniforms.center;var radius=uniforms.radius;var maxRadius=uniforms.maxRadius;var waveSize=uniforms.waveSize;this.copyMaterial.uniforms.tDiffuse.value=inputBuffer.texture;this.material=this.copyMaterial;if(this.active){// Calculate direction vectors.
mainCamera.getWorldDirection(v);ab.copy(mainCamera.position).sub(epicenter);// Don't render the effect if the object is behind the camera.
if(v.angleTo(ab)>HALF_PI){// Scale the effect based on distance to the object.
uniforms.cameraDistance.value=mainCamera.position.distanceTo(epicenter);// Calculate the screen position of the epicenter.
screenPosition.copy(epicenter).project(mainCamera);center.value.x=(screenPosition.x+1.0)*0.5;center.value.y=(screenPosition.y+1.0)*0.5;uniforms.tDiffuse.value=inputBuffer.texture;this.material=shockWaveMaterial;}// Update the shock wave radius based on time.
this.time+=delta*this.speed;radius.value=this.time-waveSize.value;if(radius.value>=(maxRadius.value+waveSize.value)*2){this.active=false;}}renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/},{key:"setSize",value:function setSize(width,height){this.shockWaveMaterial.uniforms.aspect.value=width/height;}}]);inherits(ShockWavePass,_Pass);return ShockWavePass;}(Pass);// Generated with SMAASearchImageData.generate().toCanvas().toDataURL(), not cropped, low dynamic range.
var searchImageDataURL="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAAAAABIXyLAAAAAOElEQVRIx2NgGAWjYBSMglEwEICREYRgFBZBqDCSLA2MGPUIVQETE9iNUAqLR5gIeoQKRgwXjwAAGn4AtaFeYLEAAAAASUVORK5CYII";// Generated with SMAAAreaImageData.generate().toCanvas().toDataURL().
var areaImageDataURL="data:image/png;base64,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";/**
* Subpixel Morphological Antialiasing (SMAA) v2.8.
*
* Preset: SMAA 1x Medium (with color edge detection).
* https://github.com/iryoku/smaa/releases/tag/v2.8
*/var SMAAPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new SMAA pass.
*
* @param {Image} searchImage - The SMAA search image. Preload this image using the {@link searchImageDataURL}.
* @param {Image} areaImage - The SMAA area image. Preload this image using the {@link areaImageDataURL}.
*/function SMAAPass(searchImage,areaImage){var _this;classCallCheck(this,SMAAPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(SMAAPass).call(this,"SMAAPass"));/**
* A clear pass for the color edges buffer.
*
* @type {ClearPass}
* @private
*/_this.clearPass=new ClearPass({clearColor:new Color(0x000000),clearAlpha:1.0});/**
* A render target for the color edge detection.
*
* @type {WebGLRenderTarget}
* @private
*/_this.renderTargetColorEdges=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,format:RGBFormat,stencilBuffer:false,depthBuffer:false});_this.renderTargetColorEdges.texture.name="SMAA.ColorEdges";_this.renderTargetColorEdges.texture.generateMipmaps=false;/**
* A render target for the SMAA weights.
*
* @type {WebGLRenderTarget}
* @private
*/_this.renderTargetWeights=_this.renderTargetColorEdges.clone();_this.renderTargetWeights.texture.name="SMAA.Weights";_this.renderTargetWeights.texture.format=RGBAFormat;/**
* Color edge detection shader material.
*
* @type {ColorEdgesMaterial}
* @private
*/_this.colorEdgesMaterial=new ColorEdgesMaterial();/**
* SMAA weights shader material.
*
* @type {SMAAWeightsMaterial}
* @private
*/_this.weightsMaterial=new SMAAWeightsMaterial();_this.weightsMaterial.uniforms.tDiffuse.value=_this.renderTargetColorEdges.texture;/**
* The SMAA search texture.
*
* @type {Texture}
* @private
*/_this.searchTexture=new Texture(searchImage);_this.searchTexture.name="SMAA.Search";_this.searchTexture.magFilter=NearestFilter;_this.searchTexture.minFilter=NearestFilter;_this.searchTexture.format=RGBAFormat;_this.searchTexture.generateMipmaps=false;_this.searchTexture.needsUpdate=true;_this.searchTexture.flipY=false;_this.weightsMaterial.uniforms.tSearch.value=_this.searchTexture;/**
* The SMAA area texture.
*
* @type {Texture}
* @private
*/_this.areaTexture=new Texture(areaImage);_this.areaTexture.name="SMAA.Area";_this.areaTexture.minFilter=LinearFilter;_this.areaTexture.format=RGBAFormat;_this.areaTexture.generateMipmaps=false;_this.areaTexture.needsUpdate=true;_this.areaTexture.flipY=false;_this.weightsMaterial.uniforms.tArea.value=_this.areaTexture;/**
* SMAA blend shader material.
*
* @type {SMAABlendMaterial}
* @private
*/_this.blendMaterial=new SMAABlendMaterial();_this.blendMaterial.uniforms.tWeights.value=_this.renderTargetWeights.texture;return _this;}/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/createClass(SMAAPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){// Detect color edges.
this.material=this.colorEdgesMaterial;this.colorEdgesMaterial.uniforms.tDiffuse.value=inputBuffer.texture;this.clearPass.render(renderer,this.renderTargetColorEdges);renderer.render(this.scene,this.camera,this.renderTargetColorEdges);// Compute edge weights.
this.material=this.weightsMaterial;renderer.render(this.scene,this.camera,this.renderTargetWeights);// Apply the antialiasing filter to the colors.
this.material=this.blendMaterial;this.blendMaterial.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/**
* Updates the size of this pass.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/},{key:"setSize",value:function setSize(width,height){this.renderTargetColorEdges.setSize(width,height);this.renderTargetWeights.setSize(width,height);this.colorEdgesMaterial.uniforms.texelSize.value.copy(this.weightsMaterial.uniforms.texelSize.value.copy(this.blendMaterial.uniforms.texelSize.value.set(1.0/width,1.0/height)));}/**
* The SMAA search image, encoded as a base64 data URL.
*
* Use this image data to create an Image instance and use it together with
* the area image to create an SMAAPass.
*
* @type {String}
* @example
* const searchImage = new Image();
* searchImage.addEventListener("load", progress);
* searchImage.src = SMAAPass.searchImageDataURL;
*/}],[{key:"searchImageDataURL",get:function get(){return searchImageDataURL;}/**
* The SMAA area image, encoded as a base64 data URL.
*
* Use this image data to create an Image instance and use it together with
* the search image to create an SMAAPass.
*
* @type {String}
* @example
* const areaImage = new Image();
* areaImage.addEventListener("load", progress);
* areaImage.src = SMAAPass.areaImageDataURL;
*/},{key:"areaImageDataURL",get:function get(){return areaImageDataURL;}}]);inherits(SMAAPass,_Pass);return SMAAPass;}(Pass);/**
* A pass that renders a given texture.
*/var TexturePass=/*#__PURE__*/function(_Pass){/**
* Constructs a new texture pass.
*
* @param {Texture} texture - The texture.
* @param {Number} [opacity=1.0] - The texture opacity.
* @param {Boolean} [screenMode=true] - Whether the screen blend mode should be used for combining the texture with the scene colors.
*/function TexturePass(texture){var _this;var opacity=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1.0;var screenMode=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;classCallCheck(this,TexturePass);_this=possibleConstructorReturn(this,getPrototypeOf$2(TexturePass).call(this,"TexturePass"));_this.material=new CombineMaterial(screenMode);_this.texture=texture;_this.opacitySource=opacity;return _this;}/**
* The texture.
*
* @type {Texture}
*/createClass(TexturePass,[{key:"render",/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.texture1.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}},{key:"texture",get:function get(){return this.material.uniforms.texture2.value;}/**
* @type {Texture}
*/,set:function set(value){this.material.uniforms.texture2.value=value;}/**
* The opacity of the input buffer.
*
* The destination color is the color from the image in the input buffer.
*
* @type {Number}
*/},{key:"opacityDestination",get:function get(){return this.material.uniforms.opacity1.value;}/**
* @type {Number}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1.0;this.material.uniforms.opacity1.value=value;}/**
* The opacity of the texture.
*
* The source color is the color from the texture.
*
* @type {Number}
*/},{key:"opacitySource",get:function get(){return this.material.uniforms.opacity2.value;}/**
* @type {Number}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1.0;this.material.uniforms.opacity2.value=value;}}]);inherits(TexturePass,_Pass);return TexturePass;}(Pass);/**
* A tone mapping pass that supports adaptive luminosity.
*
* If adaptivity is enabled, this pass generates a texture that represents the
* luminosity of the current scene and adjusts it over time to simulate the
* optic nerve responding to the amount of light it is receiving.
*
* Reference:
* GDC2007 - Wolfgang Engel, Post-Processing Pipeline
* http://perso.univ-lyon1.fr/jean-claude.iehl/Public/educ/GAMA/2007/gdc07/Post-Processing_Pipeline.pdf
*/var ToneMappingPass=/*#__PURE__*/function(_Pass){/**
* Constructs a new tone mapping pass.
*
* @param {Object} [options] - The options.
* @param {Boolean} [options.adaptive=true] - Whether the tone mapping should use an adaptive luminance map.
* @param {Number} [options.resolution=256] - The render texture resolution.
* @param {Number} [options.distinction=1.0] - A luminance distinction factor.
*/function ToneMappingPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,ToneMappingPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(ToneMappingPass).call(this,"ToneMappingPass"));/**
* The render target for the current luminosity.
*
* @type {WebGLRenderTarget}
* @private
* @todo Use RED format in WebGL 2.0.
*/_this.renderTargetLuminosity=new WebGLRenderTarget(1,1,{minFilter:LinearMipMapLinearFilter,magFilter:LinearFilter,format:RGBFormat,stencilBuffer:false,depthBuffer:false});_this.renderTargetLuminosity.texture.name="ToneMapping.Luminosity";/**
* The render target for adapted luminosity.
*
* @type {WebGLRenderTarget}
* @private
*/_this.renderTargetAdapted=_this.renderTargetLuminosity.clone();_this.renderTargetAdapted.texture.name="ToneMapping.AdaptedLuminosity";_this.renderTargetAdapted.texture.generateMipmaps=false;_this.renderTargetAdapted.texture.minFilter=LinearFilter;/**
* A render target that holds a copy of the adapted limonosity.
*
* @type {WebGLRenderTarget}
* @private
*/_this.renderTargetPrevious=_this.renderTargetAdapted.clone();_this.renderTargetPrevious.texture.name="ToneMapping.PreviousLuminosity";/**
* Copy shader material used for saving the luminance map.
*
* @type {CopyMaterial}
* @private
*/_this.copyMaterial=new CopyMaterial();/**
* A luminosity shader material.
*
* @type {LuminosityMaterial}
* @private
*/_this.luminosityMaterial=new LuminosityMaterial();_this.luminosityMaterial.uniforms.distinction.value=options.distinction!==undefined?options.distinction:1.0;/**
* An adaptive luminance shader material.
*
* @type {AdaptiveLuminosityMaterial}
* @private
*/_this.adaptiveLuminosityMaterial=new AdaptiveLuminosityMaterial();_this.resolution=options.resolution;/**
* A tone mapping shader material.
*
* @type {ToneMappingMaterial}
* @private
*/_this.toneMappingMaterial=new ToneMappingMaterial();_this.adaptive=options.adaptive;return _this;}/**
* The resolution of the render targets.
*
* @type {Number}
*/createClass(ToneMappingPass,[{key:"render",/**
* Renders the effect.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass.
* @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen.
* @param {Number} [delta] - The time between the last frame and the current one in seconds.
* @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active.
*/value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var scene=this.scene;var camera=this.camera;var adaptiveLuminosityMaterial=this.adaptiveLuminosityMaterial;var luminosityMaterial=this.luminosityMaterial;var toneMappingMaterial=this.toneMappingMaterial;var copyMaterial=this.copyMaterial;var renderTargetPrevious=this.renderTargetPrevious;var renderTargetLuminosity=this.renderTargetLuminosity;var renderTargetAdapted=this.renderTargetAdapted;if(this.adaptive){// Render the luminance of the current scene into a render target with mipmapping enabled.
this.material=luminosityMaterial;luminosityMaterial.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(scene,camera,renderTargetLuminosity);// Use the new luminance values, the previous luminance and the frame delta to adapt the luminance over time.
this.material=adaptiveLuminosityMaterial;adaptiveLuminosityMaterial.uniforms.delta.value=delta;adaptiveLuminosityMaterial.uniforms.tPreviousLum.value=renderTargetPrevious.texture;adaptiveLuminosityMaterial.uniforms.tCurrentLum.value=renderTargetLuminosity.texture;renderer.render(scene,camera,renderTargetAdapted);// Copy the new adapted luminance value so that it can be used by the next frame.
this.material=copyMaterial;copyMaterial.uniforms.tDiffuse.value=renderTargetAdapted.texture;renderer.render(scene,camera,renderTargetPrevious);}// Apply the tone mapping to the colours.
this.material=toneMappingMaterial;toneMappingMaterial.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/**
* Performs initialization tasks.
*
* @param {WebGLRenderer} renderer - The renderer.
* @param {Boolean} alpha - Whether the renderer uses the alpha channel or not.
*/},{key:"initialize",value:function initialize(renderer,alpha){this.material=new MeshBasicMaterial({color:0x7fffff});renderer.render(this.scene,this.camera,this.renderTargetPrevious);this.material.dispose();}},{key:"resolution",get:function get(){return this.renderTargetLuminosity.width;}/**
* The resolution of the render targets. Must be a power of two for mipmaps.
*
* @type {Number}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:256;// Round the given value to the next power of two.
var exponent=Math.max(0,Math.ceil(Math.log2(value)));value=Math.pow(2,exponent);this.renderTargetLuminosity.setSize(value,value);this.renderTargetPrevious.setSize(value,value);this.renderTargetAdapted.setSize(value,value);this.adaptiveLuminosityMaterial.defines.MIP_LEVEL_1X1=exponent.toFixed(1);this.adaptiveLuminosityMaterial.needsUpdate=true;}/**
* Whether this pass uses adaptive luminosity.
*
* @type {Boolean}
* @default true
*/},{key:"adaptive",get:function get(){return this.toneMappingMaterial.defines.ADAPTED_LUMINANCE!==undefined;}/**
* Whether this pass should use adaptive luminosity.
*
* @type {Boolean}
*/,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;if(value){this.toneMappingMaterial.defines.ADAPTED_LUMINANCE="1";this.toneMappingMaterial.uniforms.luminanceMap.value=this.renderTargetAdapted.texture;}else{delete this.toneMappingMaterial.defines.ADAPTED_LUMINANCE;this.toneMappingMaterial.uniforms.luminanceMap.value=null;}this.toneMappingMaterial.needsUpdate=true;}/**
* Indicates whether dithering is enabled.
*
* @type {Boolean}
*/},{key:"dithering",get:function get(){return this.toneMappingMaterial.dithering;}/**
* If enabled, the result will be dithered to remove banding artifacts.
*
* @type {Boolean}
*/,set:function set(value){if(this.dithering!==value){this.toneMappingMaterial.dithering=value;this.toneMappingMaterial.needsUpdate=true;}}}]);inherits(ToneMappingPass,_Pass);return ToneMappingPass;}(Pass);/**
* A compilation of the post processing passes.
*
* @module postprocessing/passes
*/ /**
* The EffectComposer may be used in place of a normal WebGLRenderer.
*
* The auto clear behaviour of the provided renderer will be disabled to prevent
* unnecessary clear operations.
*
* It is common practice to use a {@link RenderPass} as the first pass to
* automatically clear the screen and render the scene to a texture for further
* processing.
*
* @implements {Resizable}
* @implements {Disposable}
*/var EffectComposer=/*#__PURE__*/function(){/**
* Constructs a new effect composer.
*
* @param {WebGLRenderer} [renderer] - The renderer that should be used.
* @param {Object} [options] - The options.
* @param {Boolean} [options.depthBuffer=true] - Whether the main render targets should have a depth buffer.
* @param {Boolean} [options.stencilBuffer=false] - Whether the main render targets should have a stencil buffer.
* @param {Boolean} [options.depthTexture=false] - Set to true if one of your passes relies on a depth texture.
*/function EffectComposer(){var renderer=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,EffectComposer);/**
* The renderer.
*
* You may replace the renderer at any time by using
* {@link EffectComposer#replaceRenderer}.
*
* @type {WebGLRenderer}
*/this.renderer=renderer;/**
* The input buffer.
*
* Reading from and writing to the same render target should be avoided.
* Therefore, two seperate yet identical buffers are used.
*
* @type {WebGLRenderTarget}
* @private
*/this.inputBuffer=null;/**
* The output buffer.
*
* @type {WebGLRenderTarget}
* @private
*/this.outputBuffer=null;if(this.renderer!==null){this.renderer.autoClear=false;this.inputBuffer=this.createBuffer(options.depthBuffer!==undefined?options.depthBuffer:true,options.stencilBuffer!==undefined?options.stencilBuffer:false,options.depthTexture!==undefined?options.depthTexture:false);this.outputBuffer=this.inputBuffer.clone();}/**
* A copy pass used for copying masked scenes.
*
* @type {ShaderPass}
* @private
*/this.copyPass=new ShaderPass(new CopyMaterial());/**
* The passes.
*
* @type {Pass[]}
* @private
*/this.passes=[];}/**
* The depth texture of the input and output buffers.
*
* @type {DepthTexture}
*/createClass(EffectComposer,[{key:"replaceRenderer",/**
* Replaces the current renderer with the given one. The DOM element of the
* current renderer will automatically be removed from its parent node and the
* DOM element of the new renderer will take its place.
*
* The auto clear mechanism of the provided renderer will be disabled.
*
* Switching between renderers allows you to dynamically enable or disable
* antialiasing.
*
* @param {WebGLRenderer} renderer - The new renderer.
* @return {WebGLRenderer} The old renderer.
*/value:function replaceRenderer(renderer){var oldRenderer=this.renderer;var parent,oldSize,newSize;if(oldRenderer!==null&&oldRenderer!==renderer){this.renderer=renderer;this.renderer.autoClear=false;parent=oldRenderer.domElement.parentNode;oldSize=oldRenderer.getSize();newSize=renderer.getSize();if(parent!==null){parent.removeChild(oldRenderer.domElement);parent.appendChild(renderer.domElement);}if(oldSize.width!==newSize.width||oldSize.height!==newSize.height){this.setSize();}}return oldRenderer;}/**
* Creates a new render target by replicating the renderer's canvas.
*
* The created render target uses a linear filter for texel minification and
* magnification. Its render texture format depends on whether the renderer
* uses the alpha channel. Mipmaps are disabled.
*
* @param {Boolean} depthBuffer - Whether the render target should have a depth buffer.
* @param {Boolean} stencilBuffer - Whether the render target should have a stencil buffer.
* @param {Boolean} depthTexture - Whether the render target should have a depth texture.
* @return {WebGLRenderTarget} A new render target that equals the renderer's canvas.
*/},{key:"createBuffer",value:function createBuffer(depthBuffer,stencilBuffer,depthTexture){var drawingBufferSize=this.renderer.getDrawingBufferSize();var alpha=this.renderer.context.getContextAttributes().alpha;var renderTarget=new WebGLRenderTarget(drawingBufferSize.width,drawingBufferSize.height,{minFilter:LinearFilter,magFilter:LinearFilter,format:alpha?RGBAFormat:RGBFormat,depthBuffer:depthBuffer,stencilBuffer:stencilBuffer,depthTexture:depthTexture?new DepthTexture():null});if(depthTexture&&stencilBuffer){renderTarget.depthTexture.format=DepthStencilFormat;renderTarget.depthTexture.type=UnsignedInt248Type;}renderTarget.texture.name="EffectComposer.Buffer";renderTarget.texture.generateMipmaps=false;return renderTarget;}/**
* Adds a pass, optionally at a specific index.
*
* @param {Pass} pass - A new pass.
* @param {Number} [index] - An index at which the pass should be inserted.
*/},{key:"addPass",value:function addPass(pass,index){var renderer=this.renderer;var drawingBufferSize=renderer.getDrawingBufferSize();pass.setSize(drawingBufferSize.width,drawingBufferSize.height);pass.initialize(renderer,renderer.context.getContextAttributes().alpha);if(index!==undefined){this.passes.splice(index,0,pass);}else{this.passes.push(pass);}}/**
* Removes a pass.
*
* @param {Pass} pass - The pass.
*/},{key:"removePass",value:function removePass(pass){this.passes.splice(this.passes.indexOf(pass),1);}/**
* Renders all enabled passes in the order in which they were added.
*
* @param {Number} delta - The time between the last frame and the current one in seconds.
*/},{key:"render",value:function render(delta){var passes=this.passes;var copyPass=this.copyPass;var renderer=this.renderer;var inputBuffer=this.inputBuffer;var outputBuffer=this.outputBuffer;var stencilTest=false;var pass,context,state,buffer;var i,l;for(i=0,l=passes.length;i<l;++i){pass=passes[i];if(pass.enabled){pass.render(renderer,inputBuffer,outputBuffer,delta,stencilTest);if(pass.needsSwap){if(stencilTest){copyPass.renderToScreen=pass.renderToScreen;context=renderer.context;state=renderer.state;// Preserve the unaffected pixels.
state.buffers.stencil.setFunc(context.NOTEQUAL,1,0xffffffff);copyPass.render(renderer,inputBuffer,outputBuffer,delta,stencilTest);state.buffers.stencil.setFunc(context.EQUAL,1,0xffffffff);}buffer=inputBuffer;inputBuffer=outputBuffer;outputBuffer=buffer;}if(pass instanceof MaskPass){stencilTest=true;}else if(pass instanceof ClearMaskPass){stencilTest=false;}}}}/**
* Sets the size of the buffers and the renderer's output canvas.
*
* Every pass will be informed of the new size. It's up to each pass how that
* information is used.
*
* If no width or height is specified, the render targets and passes will be
* updated with the current size of the renderer.
*
* @param {Number} [width] - The width.
* @param {Number} [height] - The height.
*/},{key:"setSize",value:function setSize(width,height){var passes=this.passes;var renderer=this.renderer;var size,drawingBufferSize;var i,l;if(width===undefined||height===undefined){size=renderer.getSize();width=size.width;height=size.height;}// Update the logical render size.
renderer.setSize(width,height);// The drawing buffer size takes the device pixel ratio into account.
drawingBufferSize=renderer.getDrawingBufferSize();this.inputBuffer.setSize(drawingBufferSize.width,drawingBufferSize.height);this.outputBuffer.setSize(drawingBufferSize.width,drawingBufferSize.height);for(i=0,l=passes.length;i<l;++i){passes[i].setSize(drawingBufferSize.width,drawingBufferSize.height);}}/**
* Resets this composer by deleting all passes and creating new buffers.
*/},{key:"reset",value:function reset(){var renderTarget=this.createBuffer(this.inputBuffer.depthBuffer,this.inputBuffer.stencilBuffer,this.inputBuffer.depthTexture!==null);this.dispose();// Reanimate.
this.inputBuffer=renderTarget;this.outputBuffer=renderTarget.clone();this.copyPass=new ShaderPass(new CopyMaterial());}/**
* Destroys this composer and all passes.
*
* This method deallocates all disposable objects created by the passes. It
* also deletes the main frame buffers of this composer.
*/},{key:"dispose",value:function dispose(){var passes=this.passes;var i,l;for(i=0,l=passes.length;i<l;++i){passes[i].dispose();}this.passes=[];if(this.inputBuffer!==null){this.inputBuffer.dispose();this.inputBuffer=null;}if(this.outputBuffer!==null){this.outputBuffer.dispose();this.outputBuffer=null;}this.copyPass.dispose();}},{key:"depthTexture",get:function get(){return this.inputBuffer.depthTexture;}/**
* The input and output buffers share a single depth texture. Depth will be
* written to this texture when something is rendered into one of the buffers
* and the involved materials have depth write enabled.
*
* You may enable this mechanism during the instantiation of the composer or
* by assigning a DepthTexture instance later on. You may also disable it by
* assigning null.
*
* @type {DepthTexture}
*/,set:function set(x){this.inputBuffer.depthTexture=x;this.outputBuffer.depthTexture=x;}}]);return EffectComposer;}();var polyfill=function polyfill(object,method){var showWarn=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;if(object[method])return;if(showWarn)console.warn("@PostProcessorModule: pass.".concat(method,"() was not found."),object);object[method]=function(){};};/**
* @class PostProcessorModule
* @category modules/app
* @param {Object} [params]
* @memberof module:modules/app
* @example <caption> Creating a rendering module and passing it to App's modules</caption>
* new App([
* new ElementModule(),
* new SceneModule(),
* new DefineModule('camera', new WHS.PerspectiveCamera({
* position: new THREE.Vector3(0, 6, 18),
* far: 10000
* })),
* new RenderingModule(),
* new PostProcessorModule()
* ]);
*
* const processor = app.use('postprocessor');
*
* processor
* .render()
* .pass(new GlitchPass())
* .renderToScreen()
*/var PostProcessorModule=/*#__PURE__*/function(){function PostProcessorModule(){var _this=this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:PostProcessorModule.defaults;classCallCheck(this,PostProcessorModule);defineProperty$3(defineProperty$3(this,"currentPass",null),"defer",new Promise(function(resolve){_this.resolve=resolve;}));this.debug=params.debug;this.params=params;}createClass(PostProcessorModule,[{key:"manager",value:function manager(_manager){var _this2=this;_manager.define('postprocessor');this.effects=_manager.use('rendering').effects;this.renderer=_manager.get('renderer');this.scene=_manager.get('scene');this.camera=_manager.get('camera');this.composer=new EffectComposer(this.renderer,this.params);_manager.use('rendering').stop();var composer=this.composer;this.renderLoop=new Loop(function(clock){return composer.render(clock.getDelta());}).start(_manager.handler);_manager.update({renderer:function renderer(_renderer){_this2.composer.replaceRenderer(_renderer);},scene:function scene(_scene){_this2.scene=_scene;},camera:function camera(_camera){_this2.camera=_camera;}});this.resolve();}/**
* @method render
* @description Adds RenderPass
* @return {this}
* @memberof module:modules/app.PostProcessorModule
*/},{key:"render",value:function render(){var _this3=this;this.defer.then(function(){var pass=new RenderPass(_this3.scene,_this3.camera.native);// TODO: Support for effects.
_this3.composer.addPass(pass);_this3.currentPass=pass;});return this;}/**
* @method pass
* @description Adds your custom pass
* @param {Pass} pass A custom pass
* @return {this}
* @memberof module:modules/app.PostProcessorModule
*/},{key:"pass",value:function pass(_pass){var _this4=this;this.defer.then(function(){polyfill(_pass,'setSize',_this4.debug);polyfill(_pass,'initialise',_this4.debug);_this4.composer.addPass(_pass);_this4.currentPass=_pass;});return this;}/**
* @method shader
* @description Adds a pass made from shader material
* @param {Material} material A ShaderMaterial
* @param {String} textureID Name of the readBuffer uniform
* @return {this}
* @memberof module:modules/app.PostProcessorModule
*/},{key:"shader",value:function shader(material){var _this5=this;var textureID=arguments.length>1&&arguments[1]!==undefined?arguments[1]:'readBuffer';this.defer.then(function(){if(!material.uniforms[textureID])material.uniforms[textureID]={value:null};var pass=new ShaderPass(material,textureID);_this5.composer.addPass(pass);_this5.currentPass=pass;});return this;}/**
* @method get
* @description Returns a pass by the given name
* @param {String} name The name of the pass
* @return {this}
* @memberof module:modules/app.PostProcessorModule
*/},{key:"get",value:function get(name){return name?this.composer.passes.filter(function(pass){return pass.name===name;})[0]:this.currentPass;}/**
* @method renderToScreen
* @description Sets the renderToScreen property of currentPass
* @param {String} [name=true] The name of the pass
* @return {this}
* @memberof module:modules/app.PostProcessorModule
*/},{key:"renderToScreen",value:function renderToScreen(){var _this6=this;var bool=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;this.defer.then(function(){_this6.currentPass.renderToScreen=bool;});return this;}}]);return PostProcessorModule;}();defineProperty$3(PostProcessorModule,"defaults",{debug:true});/**
* @class EventsPatchModule
* @description This one is used in the core to handle events used by modules. If you want to make custom events - please make a similar one.
* @category modules/app
* @memberof module:modules/app
*/var EventsPatchModule=/*#__PURE__*/function(){function EventsPatchModule(){classCallCheck(this,EventsPatchModule);}createClass(EventsPatchModule,[{key:"manager",value:function manager(_manager){_manager.define('events');this.element=_manager.get('renderer').domElement;}/**
* @function patchEvents
* @description This methods patches the list of events on specific object.
* @param {Number} originObject - The object that gives events.
* @param {Number} [destObject=this] - The object that takes events.
* @param {Array[Strings]} [events=[]] - The list of events by names.
* @memberof module:modules/app.EventsPatchModule
*/},{key:"patchEvents",value:function patchEvents(originObject){var destObject=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this;var events=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[];events.forEach(function(event){return originObject.addEventListener(event,function(e){return destObject.emit(event,e);});});}},{key:"integrate",value:function integrate(self){var element=self.element,patchEvents=self.patchEvents;patchEvents(element,this,['mousemove','mouseup','contextmenu','mousedown','click','wheel','touchstart','touchend','touchmove','keydown','keyup','keypress']);}}]);return EventsPatchModule;}();/**
* @class VirtualMouseModule
* @category modules/app
* @param {Boolean} [globalMovement=false]
* @memberof module:modules/app
* @extends Events
*/var VirtualMouseModule=/*#__PURE__*/function(_Events){function VirtualMouseModule(){var _this;var globalMovement=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;classCallCheck(this,VirtualMouseModule);_this=possibleConstructorReturn(this,getPrototypeOf$2(VirtualMouseModule).call(this));defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)),"mouse",new Vector2()),"raycaster",new Raycaster()),"world",null),"canvas",null),"projectionPlane",new Plane(new Vector3(0,0,1),0));_this.globalMovement=globalMovement;return _this;}createClass(VirtualMouseModule,[{key:"update",value:function update(e,customX,customY){var rect=this.canvas.getBoundingClientRect();var x=customX||e.clientX;var y=customY||e.clientY;this.mouse.x=(x-rect.left)/(rect.right-rect.left)*2-1;this.mouse.y=-((y-rect.top)/(rect.bottom-rect.top))*2+1;this.projectionPlane.normal.copy(this.camera.getWorldDirection());this.raycaster.setFromCamera(this.mouse,this.camera);this.emit('move');}},{key:"manager",value:function manager(_manager){_manager.define('mouse');_manager.require('events',function(){return new EventsPatchModule();});this.canvas=_manager.get('renderer').domElement;this.camera=_manager.get('camera').native;}},{key:"integrate",value:function integrate(self){var _this2=this;['click','mousedown','mouseup','mousemove'].forEach(function(ev){return _this2.on(ev,function(e){return self.emit(ev,e);});});self.globalX=0;self.globalY=0;this.on('mousemove',function(e){if(document.pointerLockElement!==null){self.globalX+=e.movementX;self.globalY+=e.movementY;self.update(e,self.globalX,self.globalY);}else self.update(e);});}/**
* @method track
* @description Starts tracking events on a component
* @param {Component} component A component, that should be tracked by the mouse
* @param {Boolean} nested Whether component's children should be tracked or not
* @memberof module:modules/app.VirtualMouseModule
*/},{key:"track",value:function track(component){var _this3=this;var nested=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;var isHovered=false;this.on('move',function(){if(_this3.hovers(component,nested)){if(isHovered)component.emit('mousemove');else{component.emit('mouseover');isHovered=true;}}else if(isHovered){component.emit('mouseout');isHovered=false;}});this.on('click',function(){if(isHovered)component.emit('click');else component.emit('offClick');});this.on('mousedown',function(){if(isHovered)component.emit('mousedown');});this.on('mouseup',function(){if(isHovered)component.emit('mouseup');});}/**
* @method intersection
* @description Returns an intersection data
* @param {Component} component A component that intersects with mouse ray (or doesn't)
* @param {Boolean} nested Whether component's children should be tracked or not
* @return {Array} intersection data.
* @memberof module:modules/app.VirtualMouseModule
*/},{key:"intersection",value:function intersection(_ref){var native=_ref.native;var nested=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;if(native.children.length>0&&nested){var objects=[];native.traverse(function(child){return objects.push(child);});return this.raycaster.intersectObjects(objects);}return this.raycaster.intersectObject(native);}/**
* @method project
* @description Returns a vector based on mouse ray intersection with plane
* @param {THREE.Plane} [plane=this.projectionPlane] Math plane that is used
* @param {Vector3} [target] Optional target
* @return {Vector3} An intersection point.
* @memberof module:modules/app.VirtualMouseModule
*/},{key:"project",value:function project(){var plane=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.projectionPlane;var target=arguments.length>1?arguments[1]:undefined;return this.raycaster.ray.intersectPlane(plane,target);}/**
* @method hovers
* @description Returns a boolean based on intersection data (Whether mouse hovers the component)
* @param {Component} component A component that intersects with mouse ray (or doesn't)
* @param {Boolean} nested Whether component's children should be tracked or not
* @return {Boolean} Whether the component is hovered.
* @memberof module:modules/app.VirtualMouseModule
*/},{key:"hovers",value:function hovers(component){var nested=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;return this.intersection(component,nested).length>0;}/**
* Mouse ray
* @member {THREE.Ray} module:modules/app.VirtualMouseModule#ray
* @public
*/},{key:"ray",get:function get(){return this.raycaster.ray;}/**
* Mouse x [-1; 1]
* @member {Number} module:modules/app.VirtualMouseModule#x
* @public
*/},{key:"x",get:function get(){return this.mouse.x;}/**
* Mouse y [-1; 1]
* @member {Number} module:modules/app.VirtualMouseModule#y
* @public
*/},{key:"y",get:function get(){return this.mouse.y;}}]);inherits(VirtualMouseModule,_Events);return VirtualMouseModule;}(minivents_commonjs);/**
* @class ControlsModule
* @category modules/app
* @param {Object} [params]
* @memberof module:modules/app
* @example <caption> Creating a rendering module and passing it to App's modules</caption>
* new App([
* new ElementModule(),
* new SceneModule(),
* new DefineModule('camera', new WHS.PerspectiveCamera({
* position: new THREE.Vector3(0, 6, 18),
* far: 10000
* })),
* new RenderingModule(),
* new ControlsModule.from(new THREE.TrackballControls())
* ]);
*/var ControlsModule=/*#__PURE__*/function(){createClass(ControlsModule,null,[{key:"from",value:function from(controls){return new ControlsModule({controls:controls});}}]);function ControlsModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,ControlsModule);this.params=Object.assign({controls:false,fix:function fix(controls){return controls;},update:function update(c){this.controls.update(c.getDelta());}},params);this.controls=this.params.controls;this.update=this.params.update;}createClass(ControlsModule,[{key:"manager",value:function manager(_manager){_manager.define('controls');_manager.require('events',function(){return new EventsPatchModule();});}/**
* @method setControls
* @description Set working controls
* @param {Object} controls Working three.js controls object.
* @return {this}
* @memberof module:modules/app.ControlsModule
*/},{key:"setControls",value:function setControls(controls){this.controls=controls;return this;}/**
* @method setUpdate
* @description Set controls update function
* @param {Function} update Update function
* @return {this}
* @memberof module:modules/app.ControlsModule
*/},{key:"setUpdate",value:function setUpdate(update){this.update=update;return this;}},{key:"integrate",value:function integrate(self){self.updateLoop=new Loop(self.update.bind(self));self.updateLoop.start(this);}}]);return ControlsModule;}();/**
* @class FogModule
* @category modules/app
* @param {Object} [params={color: 0xefd1b5, density: 0.020, near: 10, far: 1000}] - The parameters object.
* @param {String} [type=exp2] - The type of fog - exp2 or linear
* @memberof module:modules/app
* @example <caption>How to create and apply a FogModule</caption>
* const fogModule = new FogModule({
* color: 0xffffff,
* density: 0.03,
* near: 20,
* far: 200
* }, 'exp2');
*
* new App([
* ...,
* fogModule
* ]);
*/var FogModule=/*#__PURE__*/function(){function FogModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var type=arguments.length>1?arguments[1]:undefined;classCallCheck(this,FogModule);this.params=Object.assign({color:0xefd1b5,density:0.020,near:10,far:1000},params);if(!type||type==='exp2')this.fog=new FogExp2(this.params.color,this.params.density);else if(type==='linear')this.fog=new Fog(this.params.color,this.params.near,this.params.far);}createClass(FogModule,[{key:"manager",value:function manager(_manager){_manager.set('fog',this.fog);_manager.get('scene').fog=this.fog;}}]);return FogModule;}();var isEqualDefault=function isEqualDefault(a,b){if(a===b)return true;else if(a&&a.equals&&a.equals(b))return true;return false;};/**
* @class StateModule
* @description `StateModule` is useful for apps, where you need state manipulation.
* This can be: _transitions between screens, games, development moments_.
* You can check [basic/state](https://whs-dev.surge.sh/examples/?basic/state) example.
* @category modules/app
* @param {Object} [params]
* @memberof module:modules/app
* @example <caption> Creating a state module</caption>
* new App([
* // ...
* new StateModule().default({
* sphereColor: 0xff0000
* })
* ]);
*/var StateModule=/*#__PURE__*/function(){createClass(StateModule,null,[{key:"actionGenerate",value:function actionGenerate(isEqual){return function(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[{},''];var _ref=arguments.length>1?arguments[1]:undefined,key=_ref.key,data=_ref.data;if(isEqual(state[0][key],data))return state;state[0][key]=data;state[1]=key;return state;};}}]);function StateModule(){var equalCheck=arguments.length>0&&arguments[0]!==undefined?arguments[0]:isEqualDefault;classCallCheck(this,StateModule);this.store=createStore(StateModule.actionGenerate(equalCheck));this.configuration={};this.currentConfig='default';this.prevConfig='default';}/**
* @method default
* @description Add default configuration.
* @param {Object} data Configuration setup
* @memberof module:modules/app.StateModule
* @example
* new WHS.StateModule().default({
* sphereColor: UTILS.$colors.mesh,
* planeColor: 0x447F8B
* })
*/createClass(StateModule,[{key:"default",value:function _default(data){this.config({default:data});return this;}/**
* @method setEqualCheck
* @description Sets an equalCheck function
* @param {Function} func function to generate equal check
* @memberof module:modules/app.StateModule
*/},{key:"setEqualCheck",value:function setEqualCheck(func){this.store.replaceReducer(StateModule.actionGenerate(func));}},{key:"manager",value:function manager(_manager){_manager.define('state');}/**
* @method config
* @description Load configurations from object.
* @param {Object} configs Configuration data
* @memberof module:modules/app.StateModule
* @example <caption> Adding `green` configuration</caption>
* state.config({
* green: {
* sphereColor: 0x00ff00,
* planeColor: 0x00ff00
* }
* });
*/},{key:"config",value:function config(configs){for(var key in configs){if(key){this.configuration[key]=key==='default'?configs[key]:Object.assign({},this.configuration.default,configs[key]);}}}/**
* @method update
* @description Load updates from object.
* @param {Object} updates Updates data
* @memberof module:modules/app.StateModule
* @example <caption> Update callback for `sphereColor`</caption>
* state.update({
* sphereColor: color => sphere.material.color.setHex(color)
* });
*/},{key:"update",value:function update(){var _this=this;var updates=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};this.store.subscribe(function(){var _this$store$getState=_this.store.getState(),_this$store$getState2=slicedToArray(_this$store$getState,2),data=_this$store$getState2[0],changedKey=_this$store$getState2[1];var callback=updates[changedKey];if(callback)callback(data[changedKey]);});}/**
* @method to
* @description Switch to configuration.
* @param {String} configName Configuration name.
* @memberof module:modules/app.StateModule
* @example <caption> Changes configuration to `green`</caption>
* state.to('green');
*/},{key:"to",value:function to(configName){this.prevConfig=this.currentConfig;this.currentConfig=configName;var config=this.configuration[configName]?this.configuration[configName]:this.configuration.default;this.set(config);}/**
* @method set
* @description Set current parameters.
* @param {Object} data Configuration parameters.
* @memberof module:modules/app.StateModule
* @example
* state.set({
* sphereColor: 0x00ff00
* });
*/},{key:"set",value:function set(data){for(var key in data){if(key)this.store.dispatch({type:'ADD',key:key,data:data[key]});}}/**
* @method get
* @description Return data of parameter.
* @param {String} key Parameter name.
* @memberof module:modules/app.StateModule
* @example
* state.get('sphereColor'); // 0x00ff00
*/},{key:"get",value:function get(key){return this.store.getState()[0][key];}/**
* @method prev
* @description Return `trueVal` if `config` match previous configuration, in other case - return `falseVal`.
* @param {String} config Configuration name.
* @param {Any} trueVal Value returned if condition is truthy.
* @param {Any} falseVal Value returned if condition is falsy.
* @memberof module:modules/app.StateModule
*/},{key:"prev",value:function prev(config,trueVal,falseVal){return this.prevConfig===config?trueVal:falseVal;}/**
* @method current
* @description Return `trueVal` if `config` match current configuration, in other case - return `falseVal`.
* @param {String} config Configuration name.
* @param {Any} trueVal Value returned if condition is truthy.
* @param {Any} falseVal Value returned if condition is falsy.
* @memberof module:modules/app.StateModule
*/},{key:"current",value:function current(config,trueVal,falseVal){return this.currentConfig===config?trueVal:falseVal;}}]);return StateModule;}();// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default).
//
// Orbit - left mouse / touch: one finger move
// Zoom - middle mouse, or mousewheel / touch: two finger spread or squish
// Pan - right mouse, or arrow keys / touch: three finter swipe
var ThreeOrbitControls=/*#__PURE__*/function(_EventDispatcher){function ThreeOrbitControls(object,domElement,eventHandler){var _this;classCallCheck(this,ThreeOrbitControls);_this=possibleConstructorReturn(this,getPrototypeOf$2(ThreeOrbitControls).call(this));_this.object=object;_this.domElement=domElement===undefined?document:domElement;_this.eventHandler=eventHandler;// Set to false to disable this control
_this.enabled=true;// "target" sets the location of focus, where the object orbits around
_this.target=new Vector3();// How far you can dolly in and out ( PerspectiveCamera only )
_this.minDistance=0;_this.maxDistance=Infinity;// How far you can zoom in and out ( OrthographicCamera only )
_this.minZoom=0;_this.maxZoom=Infinity;// How far you can orbit vertically, upper and lower limits.
// Range is 0 to Math.PI radians.
_this.minPolarAngle=0;// radians
_this.maxPolarAngle=Math.PI;// radians
// How far you can orbit horizontally, upper and lower limits.
// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].
_this.minAzimuthAngle=-Infinity;// radians
_this.maxAzimuthAngle=Infinity;// radians
// Set to true to enable damping (inertia)
// If damping is enabled, you must call controls.update() in your animation loop
_this.enableDamping=false;_this.dampingFactor=0.25;// This option actually enables dollying in and out; left as "zoom" for backwards compatibility.
// Set to false to disable zooming
_this.enableZoom=true;_this.zoomSpeed=1.0;// Set to false to disable rotating
_this.enableRotate=true;_this.rotateSpeed=1.0;// Set to false to disable panning
_this.enablePan=true;_this.keyPanSpeed=7.0;// pixels moved per arrow key push
// Set to true to automatically rotate around the target
// If auto-rotate is enabled, you must call controls.update() in your animation loop
_this.autoRotate=false;_this.autoRotateSpeed=2.0;// 30 seconds per round when fps is 60
// Set to false to disable use of the keys
_this.enableKeys=true;// The four arrow keys
_this.keys={LEFT:37,UP:38,RIGHT:39,BOTTOM:40};// Mouse buttons
_this.mouseButtons={ORBIT:MOUSE.LEFT,ZOOM:MOUSE.MIDDLE,PAN:MOUSE.RIGHT};// for reset
_this.target0=_this.target.clone();_this.position0=_this.object.position.clone();_this.zoom0=_this.object.zoom;//
// public methods
//
_this.getPolarAngle=function(){return spherical.phi;};_this.getAzimuthalAngle=function(){return spherical.theta;};_this.reset=function(){_this.target.copy(_this.target0);_this.object.position.copy(_this.position0);_this.object.zoom=_this.zoom0;_this.object.updateProjectionMatrix();_this.dispatchEvent(changeEvent);_this.update();state=STATE.NONE;};// this method is exposed, but perhaps it would be better if we can make it private...
_this.update=function(){var offset=new Vector3();// so camera.up is the orbit axis
var quat=new Quaternion().setFromUnitVectors(object.up,new Vector3(0,1,0));var quatInverse=quat.clone().inverse();var lastPosition=new Vector3();var lastQuaternion=new Quaternion();return function(){var position=_this.object.position;offset.copy(position).sub(_this.target);// rotate offset to "y-axis-is-up" space
offset.applyQuaternion(quat);// angle from z-axis around y-axis
spherical.setFromVector3(offset);if(_this.autoRotate&&state===STATE.NONE)rotateLeft(getAutoRotationAngle());spherical.theta+=sphericalDelta.theta;spherical.phi+=sphericalDelta.phi;// restrict theta to be between desired limits
spherical.theta=Math.max(_this.minAzimuthAngle,Math.min(_this.maxAzimuthAngle,spherical.theta));// restrict phi to be between desired limits
spherical.phi=Math.max(_this.minPolarAngle,Math.min(_this.maxPolarAngle,spherical.phi));spherical.makeSafe();spherical.radius*=scale;// restrict radius to be between desired limits
spherical.radius=Math.max(_this.minDistance,Math.min(_this.maxDistance,spherical.radius));// move target to panned location
_this.target.add(panOffset);offset.setFromSpherical(spherical);// rotate offset back to "camera-up-vector-is-up" space
offset.applyQuaternion(quatInverse);position.copy(_this.target).add(offset);_this.object.lookAt(_this.target);if(_this.enableDamping===true){sphericalDelta.theta*=1-_this.dampingFactor;sphericalDelta.phi*=1-_this.dampingFactor;}else sphericalDelta.set(0,0,0);scale=1;panOffset.set(0,0,0);// update condition is:
// min(camera displacement, camera rotation in radians)^2 > EPS
// using small-angle approximation cos(x/2) = 1 - x^2 / 8
if(zoomChanged||lastPosition.distanceToSquared(_this.object.position)>EPS||8*(1-lastQuaternion.dot(_this.object.quaternion))>EPS){_this.dispatchEvent(changeEvent);lastPosition.copy(_this.object.position);lastQuaternion.copy(_this.object.quaternion);zoomChanged=false;return true;}return false;}();};_this.dispose=function(){_this.domElement.removeEventListener('contextmenu',onContextMenu,false);_this.domElement.removeEventListener('mousedown',onMouseDown,false);_this.domElement.removeEventListener('wheel',onMouseWheel,false);_this.domElement.removeEventListener('touchstart',onTouchStart,false);_this.domElement.removeEventListener('touchend',onTouchEnd,false);_this.domElement.removeEventListener('touchmove',onTouchMove,false);document.removeEventListener('mousemove',onMouseMove,false);document.removeEventListener('mouseup',onMouseUp,false);window.removeEventListener('keydown',onKeyDown,false);// this.dispatchEvent( { type: 'dispose' } ); // should this be added here?
};//
// internals
//
var changeEvent={type:'change'};var startEvent={type:'start'};var endEvent={type:'end'};var STATE={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_DOLLY:4,TOUCH_PAN:5};var state=STATE.NONE;var EPS=0.000001;// current position in spherical coordinates
var spherical=new Spherical();var sphericalDelta=new Spherical();var scale=1;var panOffset=new Vector3();var zoomChanged=false;var rotateStart=new Vector2();var rotateEnd=new Vector2();var rotateDelta=new Vector2();var panStart=new Vector2();var panEnd=new Vector2();var panDelta=new Vector2();var dollyStart=new Vector2();var dollyEnd=new Vector2();var dollyDelta=new Vector2();var getAutoRotationAngle=function getAutoRotationAngle(){return 2*Math.PI/60/60*_this.autoRotateSpeed;};var getZoomScale=function getZoomScale(){return Math.pow(0.95,_this.zoomSpeed);};var rotateLeft=function rotateLeft(angle){sphericalDelta.theta-=angle;};var rotateUp=function rotateUp(angle){sphericalDelta.phi-=angle;};var panLeft=function(){var v=new Vector3();return function(distance,objectMatrix){v.setFromMatrixColumn(objectMatrix,0);// get X column of objectMatrix
v.multiplyScalar(-distance);panOffset.add(v);};}();var panUp=function(){var v=new Vector3();return function(distance,objectMatrix){v.setFromMatrixColumn(objectMatrix,1);// get Y column of objectMatrix
v.multiplyScalar(distance);panOffset.add(v);};}();// deltaX and deltaY are in pixels; right and down are positive
var pan=function(){var offset=new Vector3();return function(deltaX,deltaY){var element=_this.domElement===document?_this.domElement.body:_this.domElement;if(_this.object instanceof PerspectiveCamera){// perspective
var position=_this.object.position;offset.copy(position).sub(_this.target);var targetDistance=offset.length();// half of the fov is center to top of screen
targetDistance*=Math.tan(_this.object.fov/2*Math.PI/180.0);// we actually don't use screenWidth, since perspective camera is fixed to screen height
panLeft(2*deltaX*targetDistance/element.clientHeight,_this.object.matrix);panUp(2*deltaY*targetDistance/element.clientHeight,_this.object.matrix);}else if(_this.object instanceof OrthographicCamera){// orthographic
panLeft(deltaX*(_this.object.right-_this.object.left)/_this.object.zoom/element.clientWidth,_this.object.matrix);panUp(deltaY*(_this.object.top-_this.object.bottom)/_this.object.zoom/element.clientHeight,_this.object.matrix);}else{// camera neither orthographic nor perspective
console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - pan disabled.');_this.enablePan=false;}};}();var dollyIn=function dollyIn(dollyScale){if(_this.object instanceof PerspectiveCamera)scale/=dollyScale;else if(_this.object instanceof OrthographicCamera){_this.object.zoom=Math.max(_this.minZoom,Math.min(_this.maxZoom,_this.object.zoom*dollyScale));_this.object.updateProjectionMatrix();zoomChanged=true;}else{console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.');_this.enableZoom=false;}};var dollyOut=function dollyOut(dollyScale){if(_this.object instanceof PerspectiveCamera)scale*=dollyScale;else if(_this.object instanceof OrthographicCamera){_this.object.zoom=Math.max(_this.minZoom,Math.min(_this.maxZoom,_this.object.zoom/dollyScale));_this.object.updateProjectionMatrix();zoomChanged=true;}else{console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.');_this.enableZoom=false;}};//
// event callbacks - update the object state
//
var handleMouseDownRotate=function handleMouseDownRotate(event){// console.log( 'handleMouseDownRotate' );
rotateStart.set(event.clientX,event.clientY);};var handleMouseDownDolly=function handleMouseDownDolly(event){// console.log( 'handleMouseDownDolly' );
dollyStart.set(event.clientX,event.clientY);};var handleMouseDownPan=function handleMouseDownPan(event){// console.log( 'handleMouseDownPan' );
panStart.set(event.clientX,event.clientY);};var handleMouseMoveRotate=function handleMouseMoveRotate(event){// console.log( 'handleMouseMoveRotate' );
rotateEnd.set(event.clientX,event.clientY);rotateDelta.subVectors(rotateEnd,rotateStart);var element=_this.domElement===document?_this.domElement.body:_this.domElement;// rotating across whole screen goes 360 degrees around
rotateLeft(2*Math.PI*rotateDelta.x/element.clientWidth*_this.rotateSpeed);// rotating up and down along whole screen attempts to go 360, but limited to 180
rotateUp(2*Math.PI*rotateDelta.y/element.clientHeight*_this.rotateSpeed);rotateStart.copy(rotateEnd);_this.update();};var handleMouseMoveDolly=function handleMouseMoveDolly(event){// console.log( 'handleMouseMoveDolly' );
dollyEnd.set(event.clientX,event.clientY);dollyDelta.subVectors(dollyEnd,dollyStart);if(dollyDelta.y>0)dollyIn(getZoomScale());else if(dollyDelta.y<0)dollyOut(getZoomScale());dollyStart.copy(dollyEnd);_this.update();};var handleMouseMovePan=function handleMouseMovePan(event){// console.log( 'handleMouseMovePan' );
panEnd.set(event.clientX,event.clientY);panDelta.subVectors(panEnd,panStart);pan(panDelta.x,panDelta.y);panStart.copy(panEnd);_this.update();};var handleMouseWheel=function handleMouseWheel(event){// console.log( 'handleMouseWheel' );
if(event.deltaY<0)dollyOut(getZoomScale());else if(event.deltaY>0)dollyIn(getZoomScale());_this.update();};var handleKeyDown=function handleKeyDown(event){// console.log( 'handleKeyDown' );
switch(event.keyCode){case _this.keys.UP:pan(0,_this.keyPanSpeed);_this.update();break;case _this.keys.BOTTOM:pan(0,-_this.keyPanSpeed);_this.update();break;case _this.keys.LEFT:pan(_this.keyPanSpeed,0);_this.update();break;case _this.keys.RIGHT:pan(-_this.keyPanSpeed,0);_this.update();break;}};var handleTouchStartRotate=function handleTouchStartRotate(event){// console.log( 'handleTouchStartRotate' );
rotateStart.set(event.touches[0].pageX,event.touches[0].pageY);};var handleTouchStartDolly=function handleTouchStartDolly(event){// console.log( 'handleTouchStartDolly' );
var dx=event.touches[0].pageX-event.touches[1].pageX;var dy=event.touches[0].pageY-event.touches[1].pageY;var distance=Math.sqrt(dx*dx+dy*dy);dollyStart.set(0,distance);};var handleTouchStartPan=function handleTouchStartPan(event){// console.log( 'handleTouchStartPan' );
panStart.set(event.touches[0].pageX,event.touches[0].pageY);};var handleTouchMoveRotate=function handleTouchMoveRotate(event){// console.log( 'handleTouchMoveRotate' );
rotateEnd.set(event.touches[0].pageX,event.touches[0].pageY);rotateDelta.subVectors(rotateEnd,rotateStart);var element=_this.domElement===document?_this.domElement.body:_this.domElement;// rotating across whole screen goes 360 degrees around
rotateLeft(2*Math.PI*rotateDelta.x/element.clientWidth*_this.rotateSpeed);// rotating up and down along whole screen attempts to go 360, but limited to 180
rotateUp(2*Math.PI*rotateDelta.y/element.clientHeight*_this.rotateSpeed);rotateStart.copy(rotateEnd);_this.update();};var handleTouchMoveDolly=function handleTouchMoveDolly(event){// console.log( 'handleTouchMoveDolly' );
var dx=event.touches[0].pageX-event.touches[1].pageX;var dy=event.touches[0].pageY-event.touches[1].pageY;var distance=Math.sqrt(dx*dx+dy*dy);dollyEnd.set(0,distance);dollyDelta.subVectors(dollyEnd,dollyStart);if(dollyDelta.y>0)dollyOut(getZoomScale());else if(dollyDelta.y<0)dollyIn(getZoomScale());dollyStart.copy(dollyEnd);_this.update();};var handleTouchMovePan=function handleTouchMovePan(event){// console.log( 'handleTouchMovePan' );
panEnd.set(event.touches[0].pageX,event.touches[0].pageY);panDelta.subVectors(panEnd,panStart);pan(panDelta.x,panDelta.y);panStart.copy(panEnd);_this.update();};// event handlers - FSM: listen for events and reset state
//
var onMouseDown=function onMouseDown(event){if(_this.enabled===false)return;event.preventDefault();if(event.button===_this.mouseButtons.ORBIT){if(_this.enableRotate===false)return;handleMouseDownRotate(event);state=STATE.ROTATE;}else if(event.button===_this.mouseButtons.ZOOM){if(_this.enableZoom===false)return;handleMouseDownDolly(event);state=STATE.DOLLY;}else if(event.button===_this.mouseButtons.PAN){if(_this.enablePan===false)return;handleMouseDownPan(event);state=STATE.PAN;}if(state!==STATE.NONE){_this.eventHandler.on('mousemove',onMouseMove,false);_this.eventHandler.on('mouseup',onMouseUp,false);_this.dispatchEvent(startEvent);}};var onMouseMove=function onMouseMove(event){if(_this.enabled===false)return;event.preventDefault();if(state===STATE.ROTATE){if(_this.enableRotate===false)return;handleMouseMoveRotate(event);}else if(state===STATE.DOLLY){if(_this.enableZoom===false)return;handleMouseMoveDolly(event);}else if(state===STATE.PAN){if(_this.enablePan===false)return;handleMouseMovePan(event);}};var onMouseUp=function onMouseUp(event){if(_this.enabled===false)return;document.removeEventListener('mousemove',onMouseMove,false);document.removeEventListener('mouseup',onMouseUp,false);_this.dispatchEvent(endEvent);state=STATE.NONE;};var onMouseWheel=function onMouseWheel(event){if(_this.enabled===false||_this.enableZoom===false||state!==STATE.NONE&&state!==STATE.ROTATE)return;event.preventDefault();event.stopPropagation();handleMouseWheel(event);_this.dispatchEvent(startEvent);// not sure why these are here...
_this.dispatchEvent(endEvent);};var onKeyDown=function onKeyDown(event){if(_this.enabled===false||_this.enableKeys===false||_this.enablePan===false)return;handleKeyDown(event);};var onTouchStart=function onTouchStart(event){if(_this.enabled===false)return;switch(event.touches.length){case 1:// one-fingered touch: rotate
if(_this.enableRotate===false)return;handleTouchStartRotate(event);state=STATE.TOUCH_ROTATE;break;case 2:// two-fingered touch: dolly
if(_this.enableZoom===false)return;handleTouchStartDolly(event);state=STATE.TOUCH_DOLLY;break;case 3:// three-fingered touch: pan
if(_this.enablePan===false)return;handleTouchStartPan(event);state=STATE.TOUCH_PAN;break;default:state=STATE.NONE;}if(state!==STATE.NONE)_this.dispatchEvent(startEvent);};var onTouchMove=function onTouchMove(event){if(_this.enabled===false)return;event.preventDefault();event.stopPropagation();switch(event.touches.length){case 1:// one-fingered touch: rotate
if(_this.enableRotate===false)return;if(state!==STATE.TOUCH_ROTATE)return;// is this needed?...
handleTouchMoveRotate(event);break;case 2:// two-fingered touch: dolly
if(_this.enableZoom===false)return;if(state!==STATE.TOUCH_DOLLY)return;// is this needed?...
handleTouchMoveDolly(event);break;case 3:// three-fingered touch: pan
if(_this.enablePan===false)return;if(state!==STATE.TOUCH_PAN)return;// is this needed?...
handleTouchMovePan(event);break;default:state=STATE.NONE;}};var onTouchEnd=function onTouchEnd(event){if(_this.enabled===false)return;_this.dispatchEvent(endEvent);state=STATE.NONE;};var onContextMenu=function onContextMenu(event){event.preventDefault();};//
_this.eventHandler.on('contextmenu',onContextMenu,false);_this.eventHandler.on('mousedown',onMouseDown,false);_this.eventHandler.on('wheel',onMouseWheel,false);_this.eventHandler.on('touchstart',onTouchStart,false);_this.eventHandler.on('touchend',onTouchEnd,false);_this.eventHandler.on('touchmove',onTouchMove,false);_this.eventHandler.on('keydown',onKeyDown,false);// force an update at start
_this.update();return _this;}createClass(ThreeOrbitControls,[{key:"center",get:function get(){console.warn('OrbitControls: .center has been renamed to .target');return this.target;}},{key:"noZoom",get:function get(){console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');return !this.enableZoom;},set:function set(value){console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');this.enableZoom=!value;}},{key:"noRotate",get:function get(){console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');return !this.enableRotate;},set:function set(value){console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');this.enableRotate=!value;}},{key:"noPan",get:function get(){console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');return !this.enablePan;},set:function set(value){console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');this.enablePan=!value;}},{key:"noKeys",get:function get(){console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');return !this.enableKeys;},set:function set(value){console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');this.enableKeys=!value;}},{key:"staticMoving",get:function get(){console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');return !this.enableDamping;},set:function set(value){console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');this.enableDamping=!value;}},{key:"dynamicDampingFactor",get:function get(){console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');return this.dampingFactor;},set:function set(value){console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');this.dampingFactor=value;}}]);inherits(ThreeOrbitControls,_EventDispatcher);return ThreeOrbitControls;}(EventDispatcher);/**
* @class OrbitControlsModule
* @category modules/app
* @param {Object} [params]
* @param {Object} [params.object=camera] Object to which controls are applied.
* @param {THREE.Vector3} [params.target=new Vector3()] Controls center vector.
* @param {Boolean} [params.follow=false] Follow the target
* @memberof module:modules/app
* @example <caption> Creating a rendering module and passing it to App's modules</caption>
* new App([
* new ElementModule(),
* new SceneModule(),
* new DefineModule('camera', new WHS.PerspectiveCamera({
* position: new THREE.Vector3(0, 6, 18),
* far: 10000
* })),
* new RenderingModule(),
* new OrbitControlsModule()
* ]);
*/var OrbitControlsModule=/*#__PURE__*/function(_ControlsModule){function OrbitControlsModule(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,OrbitControlsModule);_this=possibleConstructorReturn(this,getPrototypeOf$2(OrbitControlsModule).call(this,params));_this.params=Object.assign({follow:false,object:null,target:new Vector3()},params);return _this;}createClass(OrbitControlsModule,[{key:"manager",value:function manager(_manager){get$3(getPrototypeOf$2(OrbitControlsModule.prototype),"manager",this).call(this,_manager);var _this$params=this.params,obj=_this$params.object,follow=_this$params.follow,target=_this$params.target;var object=obj?obj.native:_manager.get('camera').native;var controls=new ThreeOrbitControls(object,_manager.get('element'),_manager.handler);var updateProcessor=follow?function(c){controls.update(c.getDelta());controls.target.copy(target);}:function(c){controls.update(c.getDelta());};this.setControls(controls);this.setUpdate(updateProcessor);_manager.update({camera:function camera(_camera){if(obj)return;controls.object=_camera.native;},element:function element(_element){controls.domElement=_element;}});controls.target.copy(target);}}]);inherits(OrbitControlsModule,_ControlsModule);return OrbitControlsModule;}(ControlsModule);/** @module modules/app/controls */ /** @module modules/app */ /**
* @class DynamicGeometryModule
* @category modules/mesh
* @param {Object} [params={attributes: false}] - params
* @param {Boolean} [patchEvents=true]
* @memberof module:modules/mesh
*/var DynamicGeometryModule=/*#__PURE__*/function(){function DynamicGeometryModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,DynamicGeometryModule);this.params=Object.assign({attributes:false},params);}createClass(DynamicGeometryModule,[{key:"integrate",value:function integrate(self){var _this=this;var params=self.params;this.g_=function(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};if(this.buildGeometry){this.native.geometry=this.buildGeometry(this.updateParams({geometry:params}));}};if(params.attributes){var _loop=function _loop(key){if(key){Object.defineProperty(_this,"g_".concat(key),{get:function get(){return this.native.geometry.parameters[key];},set:function set(value){this.native.geometry=this.buildGeometry(this.updateParams({geometry:defineProperty$3({},key,value)}));},configurable:true,enumerable:true});}};for(var key in this.params.geometry){_loop(key);}}}}]);return DynamicGeometryModule;}();var loader=new TextureLoader();/**
* @class TextureModule
* @category modules/mesh
* @description A TextureModule can be applied to any Mesh or Model.
* @param {Array} [textures] - array of texture objects
* @memberof module:modules/mesh
* @example <caption>Creating an instance. url takes a path, or a data object.</caption>
* var woodTexture = new TextureModule({
* url: `${process.assetsPath}/textures/wood.jpg`
* });
* @example <caption>More comprehensive example, wood texture applied to a Box.</caption>
* new Box({
* geometry: {
* width: 2,
* height: 2,
* depth: 2
* },
* modules: [
* new TextureModule({
* url: `path/to/texture.jpg`,
* repeat: new THREE.Vector2(1, 1) // optional
* })
* ],
* material: new THREE.MeshBasicMaterial({
* color: 0xffffff
* }),
* position: [50, 60, 70]
* }).addTo(app);
*/var TextureModule=/*#__PURE__*/function(){createClass(TextureModule,null,[{key:"load",value:function load(url){return new TextureModule({url:url}).textures[0][1];}}]);function TextureModule(){var _this=this;classCallCheck(this,TextureModule);defineProperty$3(defineProperty$3(this,"textures",[]),"bridge",{material:function material(_material,self){self.textures.forEach(function(texture){_material[texture[0]]=texture[1];});_material.needsUpdate=true;return _material;}});for(var _len=arguments.length,textures=new Array(_len),_key=0;_key<_len;_key++){textures[_key]=arguments[_key];}textures.forEach(function(_ref){var url=_ref.url,_ref$type=_ref.type,type=_ref$type===void 0?'map':_ref$type,_ref$offset=_ref.offset,offset=_ref$offset===void 0?new Vector2(0,0):_ref$offset,_ref$repeat=_ref.repeat,repeat=_ref$repeat===void 0?new Vector2(1,1):_ref$repeat,_ref$wrap=_ref.wrap,wrap=_ref$wrap===void 0?RepeatWrapping:_ref$wrap,_ref$mapping=_ref.mapping,mapping=_ref$mapping===void 0?UVMapping:_ref$mapping,_ref$fix=_ref.fix,fix=_ref$fix===void 0?function(tex){return tex;}:_ref$fix;var texture=loader.load(url);if(wrap.length>0){texture.wrapS=wrap[0];texture.wrapT=wrap[1];}else texture.wrapS=texture.wrapT=wrap;texture.mapping=mapping;texture.offset.copy(offset);texture.repeat.copy(repeat);texture.magFilter=NearestFilter;texture.minFilter=LinearMipMapLinearFilter;_this.textures.push([type,fix(texture)]);});}return TextureModule;}();/**
* @class AnimationModule
* @category modules/mesh
* @description Convenience module that wraps the <a href='https://threejs.org/docs/#manual/introduction/Animation-system'>three.js animation system</a>
* @param {App} app - the app
* @param {Boolean} [isDeferred=false] - set to true if animation should not start automatically
* @param {Object} [params={speed: 1}] - the params
* @memberof module:modules/mesh
* @example <caption>Create animation module and play a given clip of an imported model</caption>
* const animationModule = new AnimationModule(app, false, {
* speed: 1.2 // speed up animation by 20%
* });
*
* new Importer({
* parser(geometry, materials) {
* // Override parse to generate a skinnedMesh, needed for skinned models
* return new THREE.SkinnedMesh(geometry, materials);
* },
*
* url: `path/to/model.json`,
* useCustomMaterial: true,
*
* material: new THREE.MeshStandardMaterial({
* skinning: true
* }),
*
* modules: [animationModule]
* }).addTo(app).then(() => {
* // adding model to app returns a promise, so pipe the function to kick off the animation clip
* animationModule.play('clipName');
* });
*/var AnimationModule=/*#__PURE__*/function(){function AnimationModule(app,isDeferred){var params=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};classCallCheck(this,AnimationModule);defineProperty$3(this,"bridge",{mesh:function mesh(_mesh,self){_mesh.geometry.skeleton=_mesh.skeleton;self.mixer=new AnimationMixer(_mesh.geometry);self.clips=_mesh.geometry.animations;return _mesh;}});this.params=Object.assign({speed:1},params);this.clock=new Clock();this.app=app;this.isDeferred=isDeferred;}/**
* @method play
* @instance
* @description Plays the given clip name
* @param {String} clipName - the clip to play
* @return {THREE.AnimationAction} Playing action
* @memberof module:modules/mesh.AnimationModule
*/createClass(AnimationModule,[{key:"play",value:function play(clipName){var clip=AnimationClip.findByName(this.clips,clipName);return this.mixer.clipAction(clip).play();}/**
* @method update
* @instance
* @description Update the mixer (being called on frame animation loop)
* @memberof module:modules/mesh.AnimationModule
*/},{key:"update",value:function update(){if(this.mixer)this.mixer.update(this.clock.getDelta()*this.params.speed);}},{key:"integrate",value:function integrate(self){self.loop=new Loop(function(){self.update();});if(!self.isDeferred)self.loop.start(self.app);}},{key:"manager",value:function manager(_manager){_manager.define('animation');}}]);return AnimationModule;}();/** @module modules/mesh */ /**
* @class DefineModule
* @category modules
* @param {String} name
* @param {Object} data
* @memberof module:modules
* @example <caption> Creating a DefineModule with PerspectiveCamera as camera module and passing it to App's modules</caption>
* new App([
* // ...
* new DefineModule('camera', new PerspectiveCamera())
* ]);
*/var DefineModule=/*#__PURE__*/function(){function DefineModule(name,data){classCallCheck(this,DefineModule);this.name=name;this.data=data;}createClass(DefineModule,[{key:"manager",value:function manager(_manager){_manager.set(this.name,this.data);}}]);return DefineModule;}();/** @module modules */var Model=/*#__PURE__*/function(_Importer){function Model(params){var _getPrototypeOf2;classCallCheck(this,Model);console.warn('Model is deprecated. Use Importer instead.');if(params.geometry){params.url=params.geometry.path;params.loader=params.geometry.loader;}for(var _len=arguments.length,additional=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++){additional[_key-1]=arguments[_key];}return possibleConstructorReturn(this,(_getPrototypeOf2=getPrototypeOf$2(Model)).call.apply(_getPrototypeOf2,[this,params].concat(additional)));}inherits(Model,_Importer);return Model;}(Importer);var CameraModule=/*#__PURE__*/function(){function CameraModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,CameraModule);console.warn('CameraModule is deprecated. Use DefineModule instead.');this.camera=new PerspectiveCamera$1(params);}createClass(CameraModule,[{key:"integrate",value:function integrate(self){this.add(self.camera);}},{key:"manager",value:function manager(_manager){_manager.set('camera',this.camera);}}]);return CameraModule;}();
var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
function createCommonjsModule$1(fn, module) {
return module = { exports: {} }, fn(module, module.exports), module.exports;
}
var stats_min = createCommonjsModule$1(function (module, exports) {
// stats.js - http://github.com/mrdoob/stats.js
(function(f,e){module.exports=e();})(commonjsGlobal,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;d<c.children.length;d++)c.children[d].style.display=d===a?"block":"none";l=a;}var l=0,c=document.createElement("div");c.style.cssText="position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000";c.addEventListener("click",function(a){a.preventDefault();
u(++l%c.children.length);},!1);var k=(performance||Date).now(),g=k,a=0,r=e(new f.Panel("FPS","#0ff","#002")),h=e(new f.Panel("MS","#0f0","#020"));if(self.performance&&self.performance.memory)var t=e(new f.Panel("MB","#f08","#201"));u(0);return {REVISION:16,dom:c,addPanel:e,showPanel:u,begin:function(){k=(performance||Date).now();},end:function(){a++;var c=(performance||Date).now();h.update(c-k,200);if(c>g+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/
1048576,d.jsHeapSizeLimit/1048576);}return c},update:function(){k=this.end();},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement("canvas");q.width=r;q.height=h;q.style.cssText="width:80px;height:48px";var b=q.getContext("2d");b.font="bold "+9*a+"px Helvetica,Arial,sans-serif";b.textBaseline="top";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v);
b.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return {dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+" "+e+" ("+g(c)+"-"+g(k)+")",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p));}}};return f});
});
var StatsModule =
/*#__PURE__*/
function () {
function StatsModule() {
var code = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
_classCallCheck(this, StatsModule);
this.stats = new stats_min();
this.stats.showPanel(code);
}
_createClass(StatsModule, [{
key: "manager",
value: function manager(_manager) {
_manager.get('container').appendChild(this.stats.dom);
_manager.add('stats', this.stats, {
alias: '$stats'
});
}
}, {
key: "integrate",
value: function integrate(self) {
var stats = self.stats;
var preProcess = new Loop(function () {
return stats.begin();
});
var postProcess = new Loop(function () {
return stats.end();
});
this.loops.unshift(preProcess);
this.loops.push(postProcess); // Patch method
self.addLoop = function (loop) {
var _this = this;
return new Promise(function (resolve) {
if (_this.loops[_this.loops.length - 1] === postProcess) _this.loops.pop();
_this.loops.push(loop);
_this.loops.push(postProcess);
resolve(loop);
});
};
preProcess.start();
postProcess.start();
}
}]);
return StatsModule;
}();
_defineProperty(StatsModule, "codes", {
fps: 0,
ms: 1,
mb: 2,
custom: 3
});
export default StatsModule;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhdHNNb2R1bGUubW9kdWxlLmpzIiwic291cmNlcyI6WyIuLi9zcmMvbW9kdWxlcy9leHRyYS9yb2xsdXBQbHVnaW5CYWJlbEhlbHBlcnMiLCIuLi8uLi9ub2RlX21vZHVsZXMvd2hzL2J1aWxkL3docy5tb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9leHRyYS9ub2RlX21vZHVsZXMvc3RhdHMuanMvYnVpbGQvc3RhdHMubWluLmpzIiwiLi4vc3JjL21vZHVsZXMvZXh0cmEvU3RhdHNNb2R1bGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgX3R5cGVvZiBhcyB0eXBlb2YsIF9qc3ggYXMganN4LCBfYXN5bmNJdGVyYXRvciBhcyBhc3luY0l0ZXJhdG9yLCBfQXdhaXRWYWx1ZSBhcyBBd2FpdFZhbHVlLCBfQXN5bmNHZW5lcmF0b3IgYXMgQXN5bmNHZW5lcmF0b3IsIF93cmFwQXN5bmNHZW5lcmF0b3IgYXMgd3JhcEFzeW5jR2VuZXJhdG9yLCBfYXdhaXRBc3luY0dlbmVyYXRvciBhcyBhd2FpdEFzeW5jR2VuZXJhdG9yLCBfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZSBhcyBhc3luY0dlbmVyYXRvckRlbGVnYXRlLCBfYXN5bmNUb0dlbmVyYXRvciBhcyBhc3luY1RvR2VuZXJhdG9yLCBfY2xhc3NDYWxsQ2hlY2sgYXMgY2xhc3NDYWxsQ2hlY2ssIF9jcmVhdGVDbGFzcyBhcyBjcmVhdGVDbGFzcywgX2RlZmluZUVudW1lcmFibGVQcm9wZXJ0aWVzIGFzIGRlZmluZUVudW1lcmFibGVQcm9wZXJ0aWVzLCBfZGVmYXVsdHMgYXMgZGVmYXVsdHMsIF9kZWZpbmVQcm9wZXJ0eSBhcyBkZWZpbmVQcm9wZXJ0eSwgX2V4dGVuZHMgYXMgZXh0ZW5kcywgX29iamVjdFNwcmVhZCBhcyBvYmplY3RTcHJlYWQsIF9pbmhlcml0cyBhcyBpbmhlcml0cywgX2luaGVyaXRzTG9vc2UgYXMgaW5oZXJpdHNMb29zZSwgX2dldFByb3RvdHlwZU9mIGFzIGdldFByb3RvdHlwZU9mLCBfc2V0UHJvdG90eXBlT2YgYXMgc2V0UHJvdG90eXBlT2YsIF9jb25zdHJ1Y3QgYXMgY29uc3RydWN0LCBfd3JhcE5hdGl2ZVN1cGVyIGFzIHdyYXBOYXRpdmVTdXBlciwgX2luc3RhbmNlb2YgYXMgaW5zdGFuY2VvZiwgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCBhcyBpbnRlcm9wUmVxdWlyZURlZmF1bHQsIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIGFzIGludGVyb3BSZXF1aXJlV2lsZGNhcmQsIF9uZXdBcnJvd0NoZWNrIGFzIG5ld0Fycm93Q2hlY2ssIF9vYmplY3REZXN0cnVjdHVyaW5nRW1wdHkgYXMgb2JqZWN0RGVzdHJ1Y3R1cmluZ0VtcHR5LCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgYXMgb2JqZWN0V2l0aG91dFByb3BlcnRpZXMsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgYXMgYXNzZXJ0VGhpc0luaXRpYWxpemVkLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiBhcyBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLCBfc3VwZXJQcm9wQmFzZSBhcyBzdXBlclByb3BCYXNlLCBfZ2V0IGFzIGdldCwgX3NldCBhcyBzZXQsIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwgYXMgdGFnZ2VkVGVtcGxhdGVMaXRlcmFsLCBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UgYXMgdGFnZ2VkVGVtcGxhdGVMaXRlcmFsTG9vc2UsIF90ZW1wb3JhbFJlZiBhcyB0ZW1wb3JhbFJlZiwgX3JlYWRPbmx5RXJyb3IgYXMgcmVhZE9ubHlFcnJvciwgX2NsYXNzTmFtZVREWkVycm9yIGFzIGNsYXNzTmFtZVREWkVycm9yLCBfdGVtcG9yYWxVbmRlZmluZWQgYXMgdGVtcG9yYWxVbmRlZmluZWQsIF9zbGljZWRUb0FycmF5IGFzIHNsaWNlZFRvQXJyYXksIF9zbGljZWRUb0FycmF5TG9vc2UgYXMgc2xpY2VkVG9BcnJheUxvb3NlLCBfdG9BcnJheSBhcyB0b0FycmF5LCBfdG9Db25zdW1hYmxlQXJyYXkgYXMgdG9Db25zdW1hYmxlQXJyYXksIF9hcnJheVdpdGhvdXRIb2xlcyBhcyBhcnJheVdpdGhvdXRIb2xlcywgX2FycmF5V2l0aEhvbGVzIGFzIGFycmF5V2l0aEhvbGVzLCBfaXRlcmFibGVUb0FycmF5IGFzIGl0ZXJhYmxlVG9BcnJheSwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0IGFzIGl0ZXJhYmxlVG9BcnJheUxpbWl0LCBfaXRlcmFibGVUb0FycmF5TGltaXRMb29zZSBhcyBpdGVyYWJsZVRvQXJyYXlMaW1pdExvb3NlLCBfbm9uSXRlcmFibGVTcHJlYWQgYXMgbm9uSXRlcmFibGVTcHJlYWQsIF9ub25JdGVyYWJsZVJlc3QgYXMgbm9uSXRlcmFibGVSZXN0LCBfc2tpcEZpcnN0R2VuZXJhdG9yTmV4dCBhcyBza2lwRmlyc3RHZW5lcmF0b3JOZXh0LCBfdG9Qcm9wZXJ0eUtleSBhcyB0b1Byb3BlcnR5S2V5LCBfaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyIGFzIGluaXRpYWxpemVyV2FybmluZ0hlbHBlciwgX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkgYXMgaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSwgX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvciBhcyBhcHBseURlY29yYXRlZERlc2NyaXB0b3IsIF9jbGFzc1ByaXZhdGVGaWVsZExvb3NlS2V5IGFzIGNsYXNzUHJpdmF0ZUZpZWxkTG9vc2VLZXksIF9jbGFzc1ByaXZhdGVGaWVsZExvb3NlQmFzZSBhcyBjbGFzc1ByaXZhdGVGaWVsZExvb3NlQmFzZSwgX2NsYXNzUHJpdmF0ZUZpZWxkR2V0IGFzIGNsYXNzUHJpdmF0ZUZpZWxkR2V0LCBfY2xhc3NQcml2YXRlRmllbGRTZXQgYXMgY2xhc3NQcml2YXRlRmllbGRTZXQgfTtcblxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiKSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgX3R5cGVvZiA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFO1xuXG5mdW5jdGlvbiBfanN4KHR5cGUsIHByb3BzLCBrZXksIGNoaWxkcmVuKSB7XG4gIGlmICghUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgUkVBQ1RfRUxFTUVOVF9UWVBFID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5mb3IgJiYgU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIikgfHwgMHhlYWM3O1xuICB9XG5cbiAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHM7XG4gIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAzO1xuXG4gIGlmICghcHJvcHMgJiYgY2hpbGRyZW5MZW5ndGggIT09IDApIHtcbiAgICBwcm9wcyA9IHtcbiAgICAgIGNoaWxkcmVuOiB2b2lkIDBcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb3BzICYmIGRlZmF1bHRQcm9wcykge1xuICAgIGZvciAodmFyIHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKCFwcm9wcykge1xuICAgIHByb3BzID0gZGVmYXVsdFByb3BzIHx8IHt9O1xuICB9XG5cbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IG5ldyBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDNdO1xuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5ID09PSB1bmRlZmluZWQgPyBudWxsIDogJycgKyBrZXksXG4gICAgcmVmOiBudWxsLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICBfb3duZXI6IG51bGxcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2FzeW5jSXRlcmF0b3IoaXRlcmFibGUpIHtcbiAgdmFyIG1ldGhvZDtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaWYgKFN5bWJvbC5hc3luY0l0ZXJhdG9yKSB7XG4gICAgICBtZXRob2QgPSBpdGVyYWJsZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl07XG4gICAgICBpZiAobWV0aG9kICE9IG51bGwpIHJldHVybiBtZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgfVxuXG4gICAgaWYgKFN5bWJvbC5pdGVyYXRvcikge1xuICAgICAgbWV0aG9kID0gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXTtcbiAgICAgIGlmIChtZXRob2QgIT0gbnVsbCkgcmV0dXJuIG1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGlzIG5vdCBhc3luYyBpdGVyYWJsZVwiKTtcbn1cblxuZnVuY3Rpb24gX0F3YWl0VmFsdWUodmFsdWUpIHtcbiAgdGhpcy53cmFwcGVkID0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIF9Bc3luY0dlbmVyYXRvcihnZW4pIHtcbiAgdmFyIGZyb250LCBiYWNrO1xuXG4gIGZ1bmN0aW9uIHNlbmQoa2V5LCBhcmcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlcXVlc3QgPSB7XG4gICAgICAgIGtleToga2V5LFxuICAgICAgICBhcmc6IGFyZyxcbiAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgcmVqZWN0OiByZWplY3QsXG4gICAgICAgIG5leHQ6IG51bGxcbiAgICAgIH07XG5cbiAgICAgIGlmIChiYWNrKSB7XG4gICAgICAgIGJhY2sgPSBiYWNrLm5leHQgPSByZXF1ZXN0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnJvbnQgPSBiYWNrID0gcmVxdWVzdDtcbiAgICAgICAgcmVzdW1lKGtleSwgYXJnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc3VtZShrZXksIGFyZykge1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzdWx0ID0gZ2VuW2tleV0oYXJnKTtcbiAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgIHZhciB3cmFwcGVkQXdhaXQgPSB2YWx1ZSBpbnN0YW5jZW9mIF9Bd2FpdFZhbHVlO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKHdyYXBwZWRBd2FpdCA/IHZhbHVlLndyYXBwZWQgOiB2YWx1ZSkudGhlbihmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgIGlmICh3cmFwcGVkQXdhaXQpIHtcbiAgICAgICAgICByZXN1bWUoXCJuZXh0XCIsIGFyZyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0dGxlKHJlc3VsdC5kb25lID8gXCJyZXR1cm5cIiA6IFwibm9ybWFsXCIsIGFyZyk7XG4gICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIHJlc3VtZShcInRocm93XCIsIGVycik7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNldHRsZShcInRocm93XCIsIGVycik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2V0dGxlKHR5cGUsIHZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFwicmV0dXJuXCI6XG4gICAgICAgIGZyb250LnJlc29sdmUoe1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcInRocm93XCI6XG4gICAgICAgIGZyb250LnJlamVjdCh2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBmcm9udC5yZXNvbHZlKHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGZyb250ID0gZnJvbnQubmV4dDtcblxuICAgIGlmIChmcm9udCkge1xuICAgICAgcmVzdW1lKGZyb250LmtleSwgZnJvbnQuYXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFjayA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgdGhpcy5faW52b2tlID0gc2VuZDtcblxuICBpZiAodHlwZW9mIGdlbi5yZXR1cm4gIT09IFwiZnVuY3Rpb25cIikge1xuICAgIHRoaXMucmV0dXJuID0gdW5kZWZpbmVkO1xuICB9XG59XG5cbmlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHtcbiAgX0FzeW5jR2VuZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbl9Bc3luY0dlbmVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgcmV0dXJuIHRoaXMuX2ludm9rZShcIm5leHRcIiwgYXJnKTtcbn07XG5cbl9Bc3luY0dlbmVyYXRvci5wcm90b3R5cGUudGhyb3cgPSBmdW5jdGlvbiAoYXJnKSB7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJ0aHJvd1wiLCBhcmcpO1xufTtcblxuX0FzeW5jR2VuZXJhdG9yLnByb3RvdHlwZS5yZXR1cm4gPSBmdW5jdGlvbiAoYXJnKSB7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJyZXR1cm5cIiwgYXJnKTtcbn07XG5cbmZ1bmN0aW9uIF93cmFwQXN5bmNHZW5lcmF0b3IoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IF9Bc3luY0dlbmVyYXRvcihmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2F3YWl0QXN5bmNHZW5lcmF0b3IodmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBfQXdhaXRWYWx1ZSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIF9hc3luY0dlbmVyYXRvckRlbGVnYXRlKGlubmVyLCBhd2FpdFdyYXApIHtcbiAgdmFyIGl0ZXIgPSB7fSxcbiAgICAgIHdhaXRpbmcgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBwdW1wKGtleSwgdmFsdWUpIHtcbiAgICB3YWl0aW5nID0gdHJ1ZTtcbiAgICB2YWx1ZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKGlubmVyW2tleV0odmFsdWUpKTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB2YWx1ZTogYXdhaXRXcmFwKHZhbHVlKVxuICAgIH07XG4gIH1cblxuICA7XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IpIHtcbiAgICBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9XG5cbiAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKHdhaXRpbmcpIHtcbiAgICAgIHdhaXRpbmcgPSBmYWxzZTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHVtcChcIm5leHRcIiwgdmFsdWUpO1xuICB9O1xuXG4gIGlmICh0eXBlb2YgaW5uZXIudGhyb3cgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGl0ZXIudGhyb3cgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh3YWl0aW5nKSB7XG4gICAgICAgIHdhaXRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhyb3cgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwdW1wKFwidGhyb3dcIiwgdmFsdWUpO1xuICAgIH07XG4gIH1cblxuICBpZiAodHlwZW9mIGlubmVyLnJldHVybiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgaXRlci5yZXR1cm4gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBwdW1wKFwicmV0dXJuXCIsIHZhbHVlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGl0ZXI7XG59XG5cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cbiAgICAgIGZ1bmN0aW9uIHN0ZXAoa2V5LCBhcmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgICAgICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgc3RlcChcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIHN0ZXAoXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCgpO1xuICAgIH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVFbnVtZXJhYmxlUHJvcGVydGllcyhvYmosIGRlc2NzKSB7XG4gIGZvciAodmFyIGtleSBpbiBkZXNjcykge1xuICAgIHZhciBkZXNjID0gZGVzY3Nba2V5XTtcbiAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IGRlc2MuZW51bWVyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjKSBkZXNjLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIGRlc2MpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgb2JqZWN0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZGVzY3MpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmplY3RTeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3ltID0gb2JqZWN0U3ltYm9sc1tpXTtcbiAgICAgIHZhciBkZXNjID0gZGVzY3Nbc3ltXTtcbiAgICAgIGRlc2MuY29uZmlndXJhYmxlID0gZGVzYy5lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzYykgZGVzYy53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBzeW0sIGRlc2MpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIF9kZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7XG4gIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdHMpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIHZhciB2YWx1ZSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZGVmYXVsdHMsIGtleSk7XG5cbiAgICBpZiAodmFsdWUgJiYgdmFsdWUuY29uZmlndXJhYmxlICYmIG9ialtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuXG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuICAgIHZhciBvd25LZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICAgIGlmICh0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb3duS2V5cyA9IG93bktleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufVxuXG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7XG4gIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59XG5cbmZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gIF9nZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKTtcbiAgfTtcbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbmZ1bmN0aW9uIGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcInVuZGVmaW5lZFwiIHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoUmVmbGVjdC5jb25zdHJ1Y3Quc2hhbSkgcmV0dXJuIGZhbHNlO1xuICBpZiAodHlwZW9mIFByb3h5ID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiB0cnVlO1xuXG4gIHRyeSB7XG4gICAgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkge30pKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgaWYgKGlzTmF0aXZlUmVmbGVjdENvbnN0cnVjdCgpKSB7XG4gICAgX2NvbnN0cnVjdCA9IFJlZmxlY3QuY29uc3RydWN0O1xuICB9IGVsc2Uge1xuICAgIF9jb25zdHJ1Y3QgPSBmdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgICAgIHZhciBhID0gW251bGxdO1xuICAgICAgYS5wdXNoLmFwcGx5KGEsIGFyZ3MpO1xuICAgICAgdmFyIENvbnN0cnVjdG9yID0gRnVuY3Rpb24uYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICBpZiAoQ2xhc3MpIF9zZXRQcm90b3R5cGVPZihpbnN0YW5jZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICB2YXIgX2NhY2hlID0gdHlwZW9mIE1hcCA9PT0gXCJmdW5jdGlvblwiID8gbmV3IE1hcCgpIDogdW5kZWZpbmVkO1xuXG4gIF93cmFwTmF0aXZlU3VwZXIgPSBmdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gICAgaWYgKENsYXNzID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIGlmICh0eXBlb2YgQ2xhc3MgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgX2NhY2hlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoX2NhY2hlLmhhcyhDbGFzcykpIHJldHVybiBfY2FjaGUuZ2V0KENsYXNzKTtcblxuICAgICAgX2NhY2hlLnNldChDbGFzcywgV3JhcHBlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gV3JhcHBlcigpIHtcbiAgICAgIHJldHVybiBfY29uc3RydWN0KENsYXNzLCBhcmd1bWVudHMsIF9nZXRQcm90b3R5cGVPZih0aGlzKS5jb25zdHJ1Y3Rvcik7XG4gICAgfVxuXG4gICAgV3JhcHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKENsYXNzLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IFdyYXBwZXIsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihXcmFwcGVyLCBDbGFzcyk7XG4gIH07XG5cbiAgcmV0dXJuIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpO1xufVxuXG5mdW5jdGlvbiBfaW5zdGFuY2VvZihsZWZ0LCByaWdodCkge1xuICBpZiAocmlnaHQgIT0gbnVsbCAmJiB0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIHJpZ2h0W1N5bWJvbC5oYXNJbnN0YW5jZV0pIHtcbiAgICByZXR1cm4gcmlnaHRbU3ltYm9sLmhhc0luc3RhbmNlXShsZWZ0KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGVmdCBpbnN0YW5jZW9mIHJpZ2h0O1xuICB9XG59XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7XG4gIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7XG4gICAgZGVmYXVsdDogb2JqXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikge1xuICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbmV3T2JqID0ge307XG5cbiAgICBpZiAob2JqICE9IG51bGwpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICB2YXIgZGVzYyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiB7fTtcblxuICAgICAgICAgIGlmIChkZXNjLmdldCB8fCBkZXNjLnNldCkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld09iaiwga2V5LCBkZXNjKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3T2JqW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBuZXdPYmouZGVmYXVsdCA9IG9iajtcbiAgICByZXR1cm4gbmV3T2JqO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9uZXdBcnJvd0NoZWNrKGlubmVyVGhpcywgYm91bmRUaGlzKSB7XG4gIGlmIChpbm5lclRoaXMgIT09IGJvdW5kVGhpcykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgaW5zdGFudGlhdGUgYW4gYXJyb3cgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX29iamVjdERlc3RydWN0dXJpbmdFbXB0eShvYmopIHtcbiAgaWYgKG9iaiA9PSBudWxsKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGRlc3RydWN0dXJlIHVuZGVmaW5lZFwiKTtcbn1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuXG4gIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gIH1cblxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07XG4gICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gc2VsZjtcbn1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkge1xuICBpZiAoY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICByZXR1cm4gY2FsbDtcbiAgfVxuXG4gIHJldHVybiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpO1xufVxuXG5mdW5jdGlvbiBfc3VwZXJQcm9wQmFzZShvYmplY3QsIHByb3BlcnR5KSB7XG4gIHdoaWxlICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpKSB7XG4gICAgb2JqZWN0ID0gX2dldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufVxuXG5mdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBSZWZsZWN0LmdldCkge1xuICAgIF9nZXQgPSBSZWZsZWN0LmdldDtcbiAgfSBlbHNlIHtcbiAgICBfZ2V0ID0gZnVuY3Rpb24gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikge1xuICAgICAgdmFyIGJhc2UgPSBfc3VwZXJQcm9wQmFzZSh0YXJnZXQsIHByb3BlcnR5KTtcblxuICAgICAgaWYgKCFiYXNlKSByZXR1cm47XG4gICAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZSwgcHJvcGVydHkpO1xuXG4gICAgICBpZiAoZGVzYy5nZXQpIHtcbiAgICAgICAgcmV0dXJuIGRlc2MuZ2V0LmNhbGwocmVjZWl2ZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVzYy52YWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIgfHwgdGFyZ2V0KTtcbn1cblxuZnVuY3Rpb24gc2V0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlcikge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIgJiYgUmVmbGVjdC5zZXQpIHtcbiAgICBzZXQgPSBSZWZsZWN0LnNldDtcbiAgfSBlbHNlIHtcbiAgICBzZXQgPSBmdW5jdGlvbiBzZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIHJlY2VpdmVyKSB7XG4gICAgICB2YXIgYmFzZSA9IF9zdXBlclByb3BCYXNlKHRhcmdldCwgcHJvcGVydHkpO1xuXG4gICAgICB2YXIgZGVzYztcblxuICAgICAgaWYgKGJhc2UpIHtcbiAgICAgICAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYmFzZSwgcHJvcGVydHkpO1xuXG4gICAgICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgICAgIGRlc2Muc2V0LmNhbGwocmVjZWl2ZXIsIHZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICghZGVzYy53cml0YWJsZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyZWNlaXZlciwgcHJvcGVydHkpO1xuXG4gICAgICBpZiAoZGVzYykge1xuICAgICAgICBpZiAoIWRlc2Mud3JpdGFibGUpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBkZXNjLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWNlaXZlciwgcHJvcGVydHksIGRlc2MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHJlY2VpdmVyLCBwcm9wZXJ0eSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHNldCh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgcmVjZWl2ZXIpO1xufVxuXG5mdW5jdGlvbiBfc2V0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlciwgaXNTdHJpY3QpIHtcbiAgdmFyIHMgPSBzZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIHJlY2VpdmVyIHx8IHRhcmdldCk7XG5cbiAgaWYgKCFzICYmIGlzU3RyaWN0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gc2V0IHByb3BlcnR5Jyk7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWwoc3RyaW5ncywgcmF3KSB7XG4gIGlmICghcmF3KSB7XG4gICAgcmF3ID0gc3RyaW5ncy5zbGljZSgwKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHN0cmluZ3MsIHtcbiAgICByYXc6IHtcbiAgICAgIHZhbHVlOiBPYmplY3QuZnJlZXplKHJhdylcbiAgICB9XG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlKHN0cmluZ3MsIHJhdykge1xuICBpZiAoIXJhdykge1xuICAgIHJhdyA9IHN0cmluZ3Muc2xpY2UoMCk7XG4gIH1cblxuICBzdHJpbmdzLnJhdyA9IHJhdztcbiAgcmV0dXJuIHN0cmluZ3M7XG59XG5cbmZ1bmN0aW9uIF90ZW1wb3JhbFJlZih2YWwsIG5hbWUpIHtcbiAgaWYgKHZhbCA9PT0gX3RlbXBvcmFsVW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKG5hbWUgKyBcIiBpcyBub3QgZGVmaW5lZCAtIHRlbXBvcmFsIGRlYWQgem9uZVwiKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9yZWFkT25seUVycm9yKG5hbWUpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwiXFxcIlwiICsgbmFtZSArIFwiXFxcIiBpcyByZWFkLW9ubHlcIik7XG59XG5cbmZ1bmN0aW9uIF9jbGFzc05hbWVURFpFcnJvcihuYW1lKSB7XG4gIHRocm93IG5ldyBFcnJvcihcIkNsYXNzIFxcXCJcIiArIG5hbWUgKyBcIlxcXCIgY2Fubm90IGJlIHJlZmVyZW5jZWQgaW4gY29tcHV0ZWQgcHJvcGVydHkga2V5cy5cIik7XG59XG5cbnZhciBfdGVtcG9yYWxVbmRlZmluZWQgPSB7fTtcblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7XG59XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5TG9vc2UoYXJyLCBpKSB7XG4gIHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5TGltaXRMb29zZShhcnIsIGkpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cblxuZnVuY3Rpb24gX3RvQXJyYXkoYXJyKSB7XG4gIHJldHVybiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhvdXRIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBhcnIyW2ldID0gYXJyW2ldO1xuXG4gICAgcmV0dXJuIGFycjI7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5KGl0ZXIpIHtcbiAgaWYgKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoaXRlcikgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXIpID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdExvb3NlKGFyciwgaSkge1xuICB2YXIgX2FyciA9IFtdO1xuXG4gIGZvciAodmFyIF9pdGVyYXRvciA9IGFycltTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwOyAhKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZTspIHtcbiAgICBfYXJyLnB1c2goX3N0ZXAudmFsdWUpO1xuXG4gICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVNwcmVhZCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xufVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTtcbn1cblxuZnVuY3Rpb24gX3NraXBGaXJzdEdlbmVyYXRvck5leHQoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaXQgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGl0Lm5leHQoKTtcbiAgICByZXR1cm4gaXQ7XG4gIH07XG59XG5cbmZ1bmN0aW9uIF90b1Byb3BlcnR5S2V5KGtleSkge1xuICBpZiAodHlwZW9mIGtleSA9PT0gXCJzeW1ib2xcIikge1xuICAgIHJldHVybiBrZXk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFN0cmluZyhrZXkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9pbml0aWFsaXplcldhcm5pbmdIZWxwZXIoZGVzY3JpcHRvciwgY29udGV4dCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0RlY29yYXRpbmcgY2xhc3MgcHJvcGVydHkgZmFpbGVkLiBQbGVhc2UgZW5zdXJlIHRoYXQgJyArICdwcm9wb3NhbC1jbGFzcy1wcm9wZXJ0aWVzIGlzIGVuYWJsZWQgYW5kIHNldCB0byB1c2UgbG9vc2UgbW9kZS4gJyArICdUbyB1c2UgcHJvcG9zYWwtY2xhc3MtcHJvcGVydGllcyBpbiBzcGVjIG1vZGUgd2l0aCBkZWNvcmF0b3JzLCB3YWl0IGZvciAnICsgJ3RoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgZGVjb3JhdG9ycyBpbiBzdGFnZSAyLicpO1xufVxuXG5mdW5jdGlvbiBfaW5pdGlhbGl6ZXJEZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCBkZXNjcmlwdG9yLCBjb250ZXh0KSB7XG4gIGlmICghZGVzY3JpcHRvcikgcmV0dXJuO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwge1xuICAgIGVudW1lcmFibGU6IGRlc2NyaXB0b3IuZW51bWVyYWJsZSxcbiAgICBjb25maWd1cmFibGU6IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlLFxuICAgIHdyaXRhYmxlOiBkZXNjcmlwdG9yLndyaXRhYmxlLFxuICAgIHZhbHVlOiBkZXNjcmlwdG9yLmluaXRpYWxpemVyID8gZGVzY3JpcHRvci5pbml0aWFsaXplci5jYWxsKGNvbnRleHQpIDogdm9pZCAwXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHksIGRlY29yYXRvcnMsIGRlc2NyaXB0b3IsIGNvbnRleHQpIHtcbiAgdmFyIGRlc2MgPSB7fTtcbiAgT2JqZWN0WydrZScgKyAneXMnXShkZXNjcmlwdG9yKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBkZXNjW2tleV0gPSBkZXNjcmlwdG9yW2tleV07XG4gIH0pO1xuICBkZXNjLmVudW1lcmFibGUgPSAhIWRlc2MuZW51bWVyYWJsZTtcbiAgZGVzYy5jb25maWd1cmFibGUgPSAhIWRlc2MuY29uZmlndXJhYmxlO1xuXG4gIGlmICgndmFsdWUnIGluIGRlc2MgfHwgZGVzYy5pbml0aWFsaXplcikge1xuICAgIGRlc2Mud3JpdGFibGUgPSB0cnVlO1xuICB9XG5cbiAgZGVzYyA9IGRlY29yYXRvcnMuc2xpY2UoKS5yZXZlcnNlKCkucmVkdWNlKGZ1bmN0aW9uIChkZXNjLCBkZWNvcmF0b3IpIHtcbiAgICByZXR1cm4gZGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHksIGRlc2MpIHx8IGRlc2M7XG4gIH0sIGRlc2MpO1xuXG4gIGlmIChjb250ZXh0ICYmIGRlc2MuaW5pdGlhbGl6ZXIgIT09IHZvaWQgMCkge1xuICAgIGRlc2MudmFsdWUgPSBkZXNjLmluaXRpYWxpemVyID8gZGVzYy5pbml0aWFsaXplci5jYWxsKGNvbnRleHQpIDogdm9pZCAwO1xuICAgIGRlc2MuaW5pdGlhbGl6ZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoZGVzYy5pbml0aWFsaXplciA9PT0gdm9pZCAwKSB7XG4gICAgT2JqZWN0WydkZWZpbmUnICsgJ1Byb3BlcnR5J10odGFyZ2V0LCBwcm9wZXJ0eSwgZGVzYyk7XG4gICAgZGVzYyA9IG51bGw7XG4gIH1cblxuICByZXR1cm4gZGVzYztcbn1cblxudmFyIGlkID0gMDtcblxuZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkTG9vc2VLZXkobmFtZSkge1xuICByZXR1cm4gXCJfX3ByaXZhdGVfXCIgKyBpZCsrICsgXCJfXCIgKyBuYW1lO1xufVxuXG5mdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRMb29zZUJhc2UocmVjZWl2ZXIsIHByaXZhdGVLZXkpIHtcbiAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVjZWl2ZXIsIHByaXZhdGVLZXkpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byB1c2UgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XG4gIH1cblxuICByZXR1cm4gcmVjZWl2ZXI7XG59XG5cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xuICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gZ2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xuICB9XG5cbiAgcmV0dXJuIHByaXZhdGVNYXAuZ2V0KHJlY2VpdmVyKTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xuICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xuICB9XG5cbiAgcHJpdmF0ZU1hcC5zZXQocmVjZWl2ZXIsIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufSIsIi8qIFdoaXRlc3Rvcm1KUyBGcmFtZXdvcmsgdjIuMi4wLWFscGhhLjAgKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuLCBtb2R1bGUpIHtcblx0cmV0dXJuIG1vZHVsZSA9IHsgZXhwb3J0czoge30gfSwgZm4obW9kdWxlLCBtb2R1bGUuZXhwb3J0cyksIG1vZHVsZS5leHBvcnRzO1xufVxuXG52YXIgcnVudGltZSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuIShmdW5jdGlvbihnbG9iYWwpIHtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIHZhciBpbk1vZHVsZSA9ICdvYmplY3QnID09PSBcIm9iamVjdFwiO1xuICB2YXIgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIGlmIChydW50aW1lKSB7XG4gICAgaWYgKGluTW9kdWxlKSB7XG4gICAgICAvLyBJZiByZWdlbmVyYXRvclJ1bnRpbWUgaXMgZGVmaW5lZCBnbG9iYWxseSBhbmQgd2UncmUgaW4gYSBtb2R1bGUsXG4gICAgICAvLyBtYWtlIHRoZSBleHBvcnRzIG9iamVjdCBpZGVudGljYWwgdG8gcmVnZW5lcmF0b3JSdW50aW1lLlxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgZXZhbHVhdGluZyB0aGUgcmVzdCBvZiB0aGlzIGZpbGUgaWYgdGhlIHJ1bnRpbWUgd2FzXG4gICAgLy8gYWxyZWFkeSBkZWZpbmVkIGdsb2JhbGx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmluZSB0aGUgcnVudGltZSBnbG9iYWxseSAoYXMgZXhwZWN0ZWQgYnkgZ2VuZXJhdGVkIGNvZGUpIGFzIGVpdGhlclxuICAvLyBtb2R1bGUuZXhwb3J0cyAoaWYgd2UncmUgaW4gYSBtb2R1bGUpIG9yIGEgbmV3LCBlbXB0eSBvYmplY3QuXG4gIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lID0gaW5Nb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA6IHt9O1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIHJ1bnRpbWUud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9XG4gICAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgcnVudGltZS5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBpZiAoISh0b1N0cmluZ1RhZ1N5bWJvbCBpbiBnZW5GdW4pKSB7XG4gICAgICAgIGdlbkZ1blt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIHJ1bnRpbWUuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLiBJZiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZCwgaG93ZXZlciwgdGhlXG4gICAgICAgICAgLy8gcmVzdWx0IGZvciB0aGlzIGl0ZXJhdGlvbiB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWVcbiAgICAgICAgICAvLyByZWFzb24uIE5vdGUgdGhhdCByZWplY3Rpb25zIG9mIHlpZWxkZWQgUHJvbWlzZXMgYXJlIG5vdFxuICAgICAgICAgIC8vIHRocm93biBiYWNrIGludG8gdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgYXMgaXMgdGhlIGNhc2VcbiAgICAgICAgICAvLyB3aGVuIGFuIGF3YWl0ZWQgUHJvbWlzZSBpcyByZWplY3RlZC4gVGhpcyBkaWZmZXJlbmNlIGluXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYmV0d2VlbiB5aWVsZCBhbmQgYXdhaXQgaXMgaW1wb3J0YW50LCBiZWNhdXNlIGl0XG4gICAgICAgICAgLy8gYWxsb3dzIHRoZSBjb25zdW1lciB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHRoZSB5aWVsZGVkXG4gICAgICAgICAgLy8gcmVqZWN0aW9uIChzd2FsbG93IGl0IGFuZCBjb250aW51ZSwgbWFudWFsbHkgLnRocm93IGl0IGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBnZW5lcmF0b3IsIGFiYW5kb24gaXRlcmF0aW9uLCB3aGF0ZXZlcikuIFdpdGhcbiAgICAgICAgICAvLyBhd2FpdCwgYnkgY29udHJhc3QsIHRoZXJlIGlzIG5vIG9wcG9ydHVuaXR5IHRvIGV4YW1pbmUgdGhlXG4gICAgICAgICAgLy8gcmVqZWN0aW9uIHJlYXNvbiBvdXRzaWRlIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIHNvIHRoZVxuICAgICAgICAgIC8vIG9ubHkgb3B0aW9uIGlzIHRvIHRocm93IGl0IGZyb20gdGhlIGF3YWl0IGV4cHJlc3Npb24sIGFuZFxuICAgICAgICAgIC8vIGxldCB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhbmRsZSB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgcnVudGltZS5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgcnVudGltZS5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpXG4gICAgKTtcblxuICAgIHJldHVybiBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAgIC8vIFwicmV0dXJuXCIgdG8gXCJ0aHJvd1wiLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgR3BbdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JcIjtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBydW50aW1lLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgcnVudGltZS52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcbn0pKFxuICAvLyBJbiBzbG9wcHkgbW9kZSwgdW5ib3VuZCBgdGhpc2AgcmVmZXJzIHRvIHRoZSBnbG9iYWwgb2JqZWN0LCBmYWxsYmFjayB0b1xuICAvLyBGdW5jdGlvbiBjb25zdHJ1Y3RvciBpZiB3ZSdyZSBpbiBnbG9iYWwgc3RyaWN0IG1vZGUuIFRoYXQgaXMgc2FkbHkgYSBmb3JtXG4gIC8vIG9mIGluZGlyZWN0IGV2YWwgd2hpY2ggdmlvbGF0ZXMgQ29udGVudCBTZWN1cml0eSBQb2xpY3kuXG4gIChmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMgfSkoKSB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKClcbik7XG59KTtcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4vLyBUaGlzIG1ldGhvZCBvZiBvYnRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QgbmVlZHMgdG8gYmVcbi8vIGtlcHQgaWRlbnRpY2FsIHRvIHRoZSB3YXkgaXQgaXMgb2J0YWluZWQgaW4gcnVudGltZS5qc1xudmFyIGcgPSAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzIH0pKCkgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xuXG4vLyBVc2UgYGdldE93blByb3BlcnR5TmFtZXNgIGJlY2F1c2Ugbm90IGFsbCBicm93c2VycyBzdXBwb3J0IGNhbGxpbmdcbi8vIGBoYXNPd25Qcm9wZXJ0eWAgb24gdGhlIGdsb2JhbCBgc2VsZmAgb2JqZWN0IGluIGEgd29ya2VyLiBTZWUgIzE4My5cbnZhciBoYWRSdW50aW1lID0gZy5yZWdlbmVyYXRvclJ1bnRpbWUgJiZcbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZykuaW5kZXhPZihcInJlZ2VuZXJhdG9yUnVudGltZVwiKSA+PSAwO1xuXG4vLyBTYXZlIHRoZSBvbGQgcmVnZW5lcmF0b3JSdW50aW1lIGluIGNhc2UgaXQgbmVlZHMgdG8gYmUgcmVzdG9yZWQgbGF0ZXIuXG52YXIgb2xkUnVudGltZSA9IGhhZFJ1bnRpbWUgJiYgZy5yZWdlbmVyYXRvclJ1bnRpbWU7XG5cbi8vIEZvcmNlIHJlZXZhbHV0YXRpb24gb2YgcnVudGltZS5qcy5cbmcucmVnZW5lcmF0b3JSdW50aW1lID0gdW5kZWZpbmVkO1xuXG52YXIgcnVudGltZU1vZHVsZSA9IHJ1bnRpbWU7XG5cbmlmIChoYWRSdW50aW1lKSB7XG4gIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHJ1bnRpbWUuXG4gIGcucmVnZW5lcmF0b3JSdW50aW1lID0gb2xkUnVudGltZTtcbn0gZWxzZSB7XG4gIC8vIFJlbW92ZSB0aGUgZ2xvYmFsIHByb3BlcnR5IGFkZGVkIGJ5IHJ1bnRpbWUuanMuXG4gIHRyeSB7XG4gICAgZGVsZXRlIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuICB9IGNhdGNoKGUpIHtcbiAgICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG52YXIgcmVnZW5lcmF0b3IgPSBydW50aW1lTW9kdWxlO1xuXG4vLyA3LjEuNCBUb0ludGVnZXJcbnZhciBjZWlsID0gTWF0aC5jZWlsO1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBfdG9JbnRlZ2VyID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpc05hTihpdCA9ICtpdCkgPyAwIDogKGl0ID4gMCA/IGZsb29yIDogY2VpbCkoaXQpO1xufTtcblxuLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbnZhciBfZGVmaW5lZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07XG5cbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG52YXIgX3N0cmluZ0F0ID0gZnVuY3Rpb24gKFRPX1NUUklORykge1xuICByZXR1cm4gZnVuY3Rpb24gKHRoYXQsIHBvcykge1xuICAgIHZhciBzID0gU3RyaW5nKF9kZWZpbmVkKHRoYXQpKTtcbiAgICB2YXIgaSA9IF90b0ludGVnZXIocG9zKTtcbiAgICB2YXIgbCA9IHMubGVuZ3RoO1xuICAgIHZhciBhLCBiO1xuICAgIGlmIChpIDwgMCB8fCBpID49IGwpIHJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuXG52YXIgX2xpYnJhcnkgPSB0cnVlO1xuXG52YXIgX2dsb2JhbCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmICh0eXBlb2YgX19nID09ICdudW1iZXInKSBfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbn0pO1xuXG52YXIgX2NvcmUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG52YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0geyB2ZXJzaW9uOiAnMi41LjYnIH07XG5pZiAodHlwZW9mIF9fZSA9PSAnbnVtYmVyJykgX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxufSk7XG52YXIgX2NvcmVfMSA9IF9jb3JlLnZlcnNpb247XG5cbnZhciBfYUZ1bmN0aW9uID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTtcblxuLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG5cbnZhciBfY3R4ID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgX2FGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG5cbnZhciBfaXNPYmplY3QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbnZhciBfYW5PYmplY3QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFfaXNPYmplY3QoaXQpKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07XG5cbnZhciBfZmFpbHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG52YXIgX2Rlc2NyaXB0b3JzID0gIV9mYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG5cbnZhciBkb2N1bWVudCQxID0gX2dsb2JhbC5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gX2lzT2JqZWN0KGRvY3VtZW50JDEpICYmIF9pc09iamVjdChkb2N1bWVudCQxLmNyZWF0ZUVsZW1lbnQpO1xudmFyIF9kb21DcmVhdGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcblxudmFyIF9pZThEb21EZWZpbmUgPSAhX2Rlc2NyaXB0b3JzICYmICFfZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KF9kb21DcmVhdGUoJ2RpdicpLCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuXG4vLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcblxuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG52YXIgX3RvUHJpbWl0aXZlID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghX2lzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFfaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIV9pc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIV9pc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG5cbnZhciBkUCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxudmFyIGYgPSBfZGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIF9hbk9iamVjdChPKTtcbiAgUCA9IF90b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgX2FuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoX2llOERvbURlZmluZSkgdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKSB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZiAoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKSBPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59O1xuXG52YXIgX29iamVjdERwID0ge1xuXHRmOiBmXG59O1xuXG52YXIgX3Byb3BlcnR5RGVzYyA9IGZ1bmN0aW9uIChiaXRtYXAsIHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZTogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGU6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59O1xuXG52YXIgX2hpZGUgPSBfZGVzY3JpcHRvcnMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBfb2JqZWN0RHAuZihvYmplY3QsIGtleSwgX3Byb3BlcnR5RGVzYygxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xudmFyIF9oYXMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG5cbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbiAodHlwZSwgbmFtZSwgc291cmNlKSB7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GO1xuICB2YXIgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuRztcbiAgdmFyIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlM7XG4gIHZhciBJU19QUk9UTyA9IHR5cGUgJiAkZXhwb3J0LlA7XG4gIHZhciBJU19CSU5EID0gdHlwZSAmICRleHBvcnQuQjtcbiAgdmFyIElTX1dSQVAgPSB0eXBlICYgJGV4cG9ydC5XO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IF9jb3JlIDogX2NvcmVbbmFtZV0gfHwgKF9jb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV07XG4gIHZhciB0YXJnZXQgPSBJU19HTE9CQUwgPyBfZ2xvYmFsIDogSVNfU1RBVElDID8gX2dsb2JhbFtuYW1lXSA6IChfZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIga2V5LCBvd24sIG91dDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICBpZiAob3duICYmIF9oYXMoZXhwb3J0cywga2V5KSkgY29udGludWU7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSBvd24gPyB0YXJnZXRba2V5XSA6IHNvdXJjZVtrZXldO1xuICAgIC8vIHByZXZlbnQgZ2xvYmFsIHBvbGx1dGlvbiBmb3IgbmFtZXNwYWNlc1xuICAgIGV4cG9ydHNba2V5XSA9IElTX0dMT0JBTCAmJiB0eXBlb2YgdGFyZ2V0W2tleV0gIT0gJ2Z1bmN0aW9uJyA/IHNvdXJjZVtrZXldXG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICA6IElTX0JJTkQgJiYgb3duID8gX2N0eChvdXQsIF9nbG9iYWwpXG4gICAgLy8gd3JhcCBnbG9iYWwgY29uc3RydWN0b3JzIGZvciBwcmV2ZW50IGNoYW5nZSB0aGVtIGluIGxpYnJhcnlcbiAgICA6IElTX1dSQVAgJiYgdGFyZ2V0W2tleV0gPT0gb3V0ID8gKGZ1bmN0aW9uIChDKSB7XG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgQykge1xuICAgICAgICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEMoKTtcbiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBDKGEpO1xuICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEMoYSwgYik7XG4gICAgICAgICAgfSByZXR1cm4gbmV3IEMoYSwgYiwgYyk7XG4gICAgICAgIH0gcmV0dXJuIEMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgICBGW1BST1RPVFlQRV0gPSBDW1BST1RPVFlQRV07XG4gICAgICByZXR1cm4gRjtcbiAgICAvLyBtYWtlIHN0YXRpYyB2ZXJzaW9ucyBmb3IgcHJvdG90eXBlIG1ldGhvZHNcbiAgICB9KShvdXQpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gX2N0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5tZXRob2RzLiVOQU1FJVxuICAgIGlmIChJU19QUk9UTykge1xuICAgICAgKGV4cG9ydHMudmlydHVhbCB8fCAoZXhwb3J0cy52aXJ0dWFsID0ge30pKVtrZXldID0gb3V0O1xuICAgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLnByb3RvdHlwZS4lTkFNRSVcbiAgICAgIGlmICh0eXBlICYgJGV4cG9ydC5SICYmIGV4cFByb3RvICYmICFleHBQcm90b1trZXldKSBfaGlkZShleHBQcm90bywga2V5LCBvdXQpO1xuICAgIH1cbiAgfVxufTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWBcbnZhciBfZXhwb3J0ID0gJGV4cG9ydDtcblxudmFyIF9yZWRlZmluZSA9IF9oaWRlO1xuXG52YXIgX2l0ZXJhdG9ycyA9IHt9O1xuXG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIF9jb2YgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG5cbi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbnZhciBfaW9iamVjdCA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBfY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuXG4vLyB0byBpbmRleGVkIG9iamVjdCwgdG9PYmplY3Qgd2l0aCBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIHN0cmluZ3NcblxuXG52YXIgX3RvSW9iamVjdCA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gX2lvYmplY3QoX2RlZmluZWQoaXQpKTtcbn07XG5cbi8vIDcuMS4xNSBUb0xlbmd0aFxuXG52YXIgbWluID0gTWF0aC5taW47XG52YXIgX3RvTGVuZ3RoID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4oX3RvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiQxID0gTWF0aC5taW47XG52YXIgX3RvQWJzb2x1dGVJbmRleCA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIGluZGV4ID0gX3RvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluJDEoaW5kZXgsIGxlbmd0aCk7XG59O1xuXG4vLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xuXG5cblxudmFyIF9hcnJheUluY2x1ZGVzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IF90b0lvYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSBfdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IF90b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuXG52YXIgX3NoYXJlZCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IF9nbG9iYWxbU0hBUkVEXSB8fCAoX2dsb2JhbFtTSEFSRURdID0ge30pO1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHt9KTtcbn0pKCd2ZXJzaW9ucycsIFtdKS5wdXNoKHtcbiAgdmVyc2lvbjogX2NvcmUudmVyc2lvbixcbiAgbW9kZTogX2xpYnJhcnkgPyAncHVyZScgOiAnZ2xvYmFsJyxcbiAgY29weXJpZ2h0OiAnwqkgMjAxOCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSdcbn0pO1xufSk7XG5cbnZhciBpZCA9IDA7XG52YXIgcHggPSBNYXRoLnJhbmRvbSgpO1xudmFyIF91aWQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59O1xuXG52YXIgc2hhcmVkID0gX3NoYXJlZCgna2V5cycpO1xuXG52YXIgX3NoYXJlZEtleSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IF91aWQoa2V5KSk7XG59O1xuXG52YXIgYXJyYXlJbmRleE9mID0gX2FycmF5SW5jbHVkZXMoZmFsc2UpO1xudmFyIElFX1BST1RPID0gX3NoYXJlZEtleSgnSUVfUFJPVE8nKTtcblxudmFyIF9vYmplY3RLZXlzSW50ZXJuYWwgPSBmdW5jdGlvbiAob2JqZWN0LCBuYW1lcykge1xuICB2YXIgTyA9IF90b0lvYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIF9oYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoX2hhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcbnZhciBfZW51bUJ1Z0tleXMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7XG5cbi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxuXG5cblxudmFyIF9vYmplY3RLZXlzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiBfb2JqZWN0S2V5c0ludGVybmFsKE8sIF9lbnVtQnVnS2V5cyk7XG59O1xuXG52YXIgX29iamVjdERwcyA9IF9kZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKSB7XG4gIF9hbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBfb2JqZWN0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBQO1xuICB3aGlsZSAobGVuZ3RoID4gaSkgX29iamVjdERwLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XG4gIHJldHVybiBPO1xufTtcblxudmFyIGRvY3VtZW50JDIgPSBfZ2xvYmFsLmRvY3VtZW50O1xudmFyIF9odG1sID0gZG9jdW1lbnQkMiAmJiBkb2N1bWVudCQyLmRvY3VtZW50RWxlbWVudDtcblxuLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG5cblxuXG52YXIgSUVfUFJPVE8kMSA9IF9zaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgUFJPVE9UWVBFJDEgPSAncHJvdG90eXBlJztcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBfZG9tQ3JlYXRlKCdpZnJhbWUnKTtcbiAgdmFyIGkgPSBfZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBndCA9ICc+JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgX2h0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUgKGktLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFJDFdW19lbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG52YXIgX29iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eVtQUk9UT1RZUEUkMV0gPSBfYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgRW1wdHlbUFJPVE9UWVBFJDFdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPJDFdID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IF9vYmplY3REcHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG5cbnZhciBfd2tzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xudmFyIHN0b3JlID0gX3NoYXJlZCgnd2tzJyk7XG5cbnZhciBTeW1ib2wgPSBfZ2xvYmFsLlN5bWJvbDtcbnZhciBVU0VfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xuXG52YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuICAgIFVTRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdIHx8IChVU0VfU1lNQk9MID8gU3ltYm9sIDogX3VpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbn0pO1xuXG52YXIgZGVmID0gX29iamVjdERwLmY7XG5cbnZhciBUQUcgPSBfd2tzKCd0b1N0cmluZ1RhZycpO1xuXG52YXIgX3NldFRvU3RyaW5nVGFnID0gZnVuY3Rpb24gKGl0LCB0YWcsIHN0YXQpIHtcbiAgaWYgKGl0ICYmICFfaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuXG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbl9oaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBfd2tzKCdpdGVyYXRvcicpLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxudmFyIF9pdGVyQ3JlYXRlID0gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KSB7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IF9vYmplY3RDcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogX3Byb3BlcnR5RGVzYygxLCBuZXh0KSB9KTtcbiAgX3NldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcblxuLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxuXG52YXIgX3RvT2JqZWN0ID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoX2RlZmluZWQoaXQpKTtcbn07XG5cbi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG5cblxudmFyIElFX1BST1RPJDIgPSBfc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxudmFyIF9vYmplY3RHcG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKE8pIHtcbiAgTyA9IF90b09iamVjdChPKTtcbiAgaWYgKF9oYXMoTywgSUVfUFJPVE8kMikpIHJldHVybiBPW0lFX1BST1RPJDJdO1xuICBpZiAodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbn07XG5cbnZhciBJVEVSQVRPUiA9IF93a3MoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbnZhciBfaXRlckRlZmluZSA9IGZ1bmN0aW9uIChCYXNlLCBOQU1FLCBDb25zdHJ1Y3RvciwgbmV4dCwgREVGQVVMVCwgSVNfU0VULCBGT1JDRUQpIHtcbiAgX2l0ZXJDcmVhdGUoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24gKGtpbmQpIHtcbiAgICBpZiAoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pIHJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICB9IHJldHVybiBmdW5jdGlvbiBlbnRyaWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICB9O1xuICB2YXIgVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgREVGX1ZBTFVFUyA9IERFRkFVTFQgPT0gVkFMVUVTO1xuICB2YXIgVkFMVUVTX0JVRyA9IGZhbHNlO1xuICB2YXIgcHJvdG8gPSBCYXNlLnByb3RvdHlwZTtcbiAgdmFyICRuYXRpdmUgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF07XG4gIHZhciAkZGVmYXVsdCA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpO1xuICB2YXIgJGVudHJpZXMgPSBERUZBVUxUID8gIURFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZCgnZW50cmllcycpIDogdW5kZWZpbmVkO1xuICB2YXIgJGFueU5hdGl2ZSA9IE5BTUUgPT0gJ0FycmF5JyA/IHByb3RvLmVudHJpZXMgfHwgJG5hdGl2ZSA6ICRuYXRpdmU7XG4gIHZhciBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmICgkYW55TmF0aXZlKSB7XG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBfb2JqZWN0R3BvKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIF9zZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcbiAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuICAgICAgaWYgKCFfbGlicmFyeSAmJiB0eXBlb2YgSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIF9oaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFfbGlicmFyeSB8fCBGT1JDRUQpICYmIChCVUdHWSB8fCBWQUxVRVNfQlVHIHx8ICFwcm90b1tJVEVSQVRPUl0pKSB7XG4gICAgX2hpZGUocHJvdG8sIElURVJBVE9SLCAkZGVmYXVsdCk7XG4gIH1cbiAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuICBfaXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIF9pdGVyYXRvcnNbVEFHXSA9IHJldHVyblRoaXM7XG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSBmb3IgKGtleSBpbiBtZXRob2RzKSB7XG4gICAgICBpZiAoIShrZXkgaW4gcHJvdG8pKSBfcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcbiAgICB9IGVsc2UgX2V4cG9ydChfZXhwb3J0LlAgKyBfZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpO1xuICB9XG4gIHJldHVybiBtZXRob2RzO1xufTtcblxudmFyICRhdCA9IF9zdHJpbmdBdCh0cnVlKTtcblxuLy8gMjEuMS4zLjI3IFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxuX2l0ZXJEZWZpbmUoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIgaW5kZXggPSB0aGlzLl9pO1xuICB2YXIgcG9pbnQ7XG4gIGlmIChpbmRleCA+PSBPLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcblxudmFyIF9pdGVyU3RlcCA9IGZ1bmN0aW9uIChkb25lLCB2YWx1ZSkge1xuICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZSB9O1xufTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxudmFyIGVzNl9hcnJheV9pdGVyYXRvciA9IF9pdGVyRGVmaW5lKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IF90b0lvYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbiAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgIC8vIGtpbmRcbi8vIDIyLjEuNS4yLjEgJUFycmF5SXRlcmF0b3JQcm90b3R5cGUlLm5leHQoKVxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgTyA9IHRoaXMuX3Q7XG4gIHZhciBraW5kID0gdGhpcy5faztcbiAgdmFyIGluZGV4ID0gdGhpcy5faSsrO1xuICBpZiAoIU8gfHwgaW5kZXggPj0gTy5sZW5ndGgpIHtcbiAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBfaXRlclN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gX2l0ZXJTdGVwKDAsIGluZGV4KTtcbiAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBfaXRlclN0ZXAoMCwgT1tpbmRleF0pO1xuICByZXR1cm4gX2l0ZXJTdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuX2l0ZXJhdG9ycy5Bcmd1bWVudHMgPSBfaXRlcmF0b3JzLkFycmF5O1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IF93a3MoJ3RvU3RyaW5nVGFnJyk7XG5cbnZhciBET01JdGVyYWJsZXMgPSAoJ0NTU1J1bGVMaXN0LENTU1N0eWxlRGVjbGFyYXRpb24sQ1NTVmFsdWVMaXN0LENsaWVudFJlY3RMaXN0LERPTVJlY3RMaXN0LERPTVN0cmluZ0xpc3QsJyArXG4gICdET01Ub2tlbkxpc3QsRGF0YVRyYW5zZmVySXRlbUxpc3QsRmlsZUxpc3QsSFRNTEFsbENvbGxlY3Rpb24sSFRNTENvbGxlY3Rpb24sSFRNTEZvcm1FbGVtZW50LEhUTUxTZWxlY3RFbGVtZW50LCcgK1xuICAnTWVkaWFMaXN0LE1pbWVUeXBlQXJyYXksTmFtZWROb2RlTWFwLE5vZGVMaXN0LFBhaW50UmVxdWVzdExpc3QsUGx1Z2luLFBsdWdpbkFycmF5LFNWR0xlbmd0aExpc3QsU1ZHTnVtYmVyTGlzdCwnICtcbiAgJ1NWR1BhdGhTZWdMaXN0LFNWR1BvaW50TGlzdCxTVkdTdHJpbmdMaXN0LFNWR1RyYW5zZm9ybUxpc3QsU291cmNlQnVmZmVyTGlzdCxTdHlsZVNoZWV0TGlzdCxUZXh0VHJhY2tDdWVMaXN0LCcgK1xuICAnVGV4dFRyYWNrTGlzdCxUb3VjaExpc3QnKS5zcGxpdCgnLCcpO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IERPTUl0ZXJhYmxlcy5sZW5ndGg7IGkrKykge1xuICB2YXIgTkFNRSA9IERPTUl0ZXJhYmxlc1tpXTtcbiAgdmFyIENvbGxlY3Rpb24gPSBfZ2xvYmFsW05BTUVdO1xuICB2YXIgcHJvdG8gPSBDb2xsZWN0aW9uICYmIENvbGxlY3Rpb24ucHJvdG90eXBlO1xuICBpZiAocHJvdG8gJiYgIXByb3RvW1RPX1NUUklOR19UQUddKSBfaGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gIF9pdGVyYXRvcnNbTkFNRV0gPSBfaXRlcmF0b3JzLkFycmF5O1xufVxuXG4vLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxuXG52YXIgVEFHJDEgPSBfd2tzKCd0b1N0cmluZ1RhZycpO1xuLy8gRVMzIHdyb25nIGhlcmVcbnZhciBBUkcgPSBfY29mKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbnZhciBfY2xhc3NvZiA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRyQxKSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBfY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBfY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07XG5cbnZhciBfYW5JbnN0YW5jZSA9IGZ1bmN0aW9uIChpdCwgQ29uc3RydWN0b3IsIG5hbWUsIGZvcmJpZGRlbkZpZWxkKSB7XG4gIGlmICghKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSkge1xuICAgIHRocm93IFR5cGVFcnJvcihuYW1lICsgJzogaW5jb3JyZWN0IGludm9jYXRpb24hJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcblxuLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxuXG52YXIgX2l0ZXJDYWxsID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIGVudHJpZXMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZW50cmllcyA/IGZuKF9hbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSBfYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59O1xuXG4vLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG5cbnZhciBJVEVSQVRPUiQxID0gX3drcygnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG52YXIgX2lzQXJyYXlJdGVyID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChfaXRlcmF0b3JzLkFycmF5ID09PSBpdCB8fCBBcnJheVByb3RvW0lURVJBVE9SJDFdID09PSBpdCk7XG59O1xuXG52YXIgSVRFUkFUT1IkMiA9IF93a3MoJ2l0ZXJhdG9yJyk7XG5cbnZhciBjb3JlX2dldEl0ZXJhdG9yTWV0aG9kID0gX2NvcmUuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ICE9IHVuZGVmaW5lZCkgcmV0dXJuIGl0W0lURVJBVE9SJDJdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IF9pdGVyYXRvcnNbX2NsYXNzb2YoaXQpXTtcbn07XG5cbnZhciBfZm9yT2YgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG52YXIgQlJFQUsgPSB7fTtcbnZhciBSRVRVUk4gPSB7fTtcbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUikge1xuICB2YXIgaXRlckZuID0gSVRFUkFUT1IgPyBmdW5jdGlvbiAoKSB7IHJldHVybiBpdGVyYWJsZTsgfSA6IGNvcmVfZ2V0SXRlcmF0b3JNZXRob2QoaXRlcmFibGUpO1xuICB2YXIgZiA9IF9jdHgoZm4sIHRoYXQsIGVudHJpZXMgPyAyIDogMSk7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsZW5ndGgsIHN0ZXAsIGl0ZXJhdG9yLCByZXN1bHQ7XG4gIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdGVyYWJsZSArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICAvLyBmYXN0IGNhc2UgZm9yIGFycmF5cyB3aXRoIGRlZmF1bHQgaXRlcmF0b3JcbiAgaWYgKF9pc0FycmF5SXRlcihpdGVyRm4pKSBmb3IgKGxlbmd0aCA9IF90b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgIHJlc3VsdCA9IGVudHJpZXMgPyBmKF9hbk9iamVjdChzdGVwID0gaXRlcmFibGVbaW5kZXhdKVswXSwgc3RlcFsxXSkgOiBmKGl0ZXJhYmxlW2luZGV4XSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7KSB7XG4gICAgcmVzdWx0ID0gX2l0ZXJDYWxsKGl0ZXJhdG9yLCBmLCBzdGVwLnZhbHVlLCBlbnRyaWVzKTtcbiAgICBpZiAocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTikgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcbmV4cG9ydHMuQlJFQUsgPSBCUkVBSztcbmV4cG9ydHMuUkVUVVJOID0gUkVUVVJOO1xufSk7XG5cbi8vIDcuMy4yMCBTcGVjaWVzQ29uc3RydWN0b3IoTywgZGVmYXVsdENvbnN0cnVjdG9yKVxuXG5cbnZhciBTUEVDSUVTID0gX3drcygnc3BlY2llcycpO1xudmFyIF9zcGVjaWVzQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAoTywgRCkge1xuICB2YXIgQyA9IF9hbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBfYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBfYUZ1bmN0aW9uKFMpO1xufTtcblxuLy8gZmFzdCBhcHBseSwgaHR0cDovL2pzcGVyZi5sbmtpdC5jb20vZmFzdC1hcHBseS81XG52YXIgX2ludm9rZSA9IGZ1bmN0aW9uIChmbiwgYXJncywgdGhhdCkge1xuICB2YXIgdW4gPSB0aGF0ID09PSB1bmRlZmluZWQ7XG4gIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHJldHVybiB1biA/IGZuKClcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCk7XG4gICAgY2FzZSAxOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdKTtcbiAgICBjYXNlIDI6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgIGNhc2UgMzogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgY2FzZSA0OiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgfSByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJncyk7XG59O1xuXG52YXIgcHJvY2VzcyA9IF9nbG9iYWwucHJvY2VzcztcbnZhciBzZXRUYXNrID0gX2dsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXJUYXNrID0gX2dsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBNZXNzYWdlQ2hhbm5lbCA9IF9nbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgRGlzcGF0Y2ggPSBfZ2xvYmFsLkRpc3BhdGNoO1xudmFyIGNvdW50ZXIgPSAwO1xudmFyIHF1ZXVlID0ge307XG52YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7XG52YXIgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG52YXIgcnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaWQgPSArdGhpcztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICBpZiAocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldFRhc2sgfHwgIWNsZWFyVGFzaykge1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgaSA9IDE7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgIF9pbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpIHtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICB9O1xuICAvLyBOb2RlLmpzIDAuOC1cbiAgaWYgKF9jb2YocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soX2N0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gU3BoZXJlIChKUyBnYW1lIGVuZ2luZSkgRGlzcGF0Y2ggQVBJXG4gIH0gZWxzZSBpZiAoRGlzcGF0Y2ggJiYgRGlzcGF0Y2gubm93KSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIERpc3BhdGNoLm5vdyhfY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIH0gZWxzZSBpZiAoTWVzc2FnZUNoYW5uZWwpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IF9jdHgocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKF9nbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhX2dsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIF9nbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIF9nbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyLCBmYWxzZSk7XG4gIC8vIElFOC1cbiAgfSBlbHNlIGlmIChPTlJFQURZU1RBVEVDSEFOR0UgaW4gX2RvbUNyZWF0ZSgnc2NyaXB0JykpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgX2h0bWwuYXBwZW5kQ2hpbGQoX2RvbUNyZWF0ZSgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9odG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4uY2FsbChpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHNldFRpbWVvdXQoX2N0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxudmFyIF90YXNrID0ge1xuICBzZXQ6IHNldFRhc2ssXG4gIGNsZWFyOiBjbGVhclRhc2tcbn07XG5cbnZhciBtYWNyb3Rhc2sgPSBfdGFzay5zZXQ7XG52YXIgT2JzZXJ2ZXIgPSBfZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgX2dsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xudmFyIHByb2Nlc3MkMSA9IF9nbG9iYWwucHJvY2VzcztcbnZhciBQcm9taXNlJDEgPSBfZ2xvYmFsLlByb21pc2U7XG52YXIgaXNOb2RlID0gX2NvZihwcm9jZXNzJDEpID09ICdwcm9jZXNzJztcblxudmFyIF9taWNyb3Rhc2sgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBoZWFkLCBsYXN0LCBub3RpZnk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MkMS5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGhlYWQpIG5vdGlmeSgpO1xuICAgICAgICBlbHNlIGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5lbnRlcigpO1xuICB9O1xuXG4gIC8vIE5vZGUuanNcbiAgaWYgKGlzTm9kZSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MkMS5uZXh0VGljayhmbHVzaCk7XG4gICAgfTtcbiAgLy8gYnJvd3NlcnMgd2l0aCBNdXRhdGlvbk9ic2VydmVyLCBleGNlcHQgaU9TIFNhZmFyaSAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgfSBlbHNlIGlmIChPYnNlcnZlciAmJiAhKF9nbG9iYWwubmF2aWdhdG9yICYmIF9nbG9iYWwubmF2aWdhdG9yLnN0YW5kYWxvbmUpKSB7XG4gICAgdmFyIHRvZ2dsZSA9IHRydWU7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoUHJvbWlzZSQxICYmIFByb21pc2UkMS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UkMS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoX2dsb2JhbCwgZmx1c2gpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGZuKSB7XG4gICAgdmFyIHRhc2sgPSB7IGZuOiBmbiwgbmV4dDogdW5kZWZpbmVkIH07XG4gICAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gICAgaWYgKCFoZWFkKSB7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59O1xuXG4vLyAyNS40LjEuNSBOZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxuXG5cbmZ1bmN0aW9uIFByb21pc2VDYXBhYmlsaXR5KEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IF9hRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gX2FGdW5jdGlvbihyZWplY3QpO1xufVxuXG52YXIgZiQxID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG5cbnZhciBfbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSB7XG5cdGY6IGYkMVxufTtcblxudmFyIF9wZXJmb3JtID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlOiBmYWxzZSwgdjogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBlOiB0cnVlLCB2OiBlIH07XG4gIH1cbn07XG5cbnZhciBuYXZpZ2F0b3IgPSBfZ2xvYmFsLm5hdmlnYXRvcjtcblxudmFyIF91c2VyQWdlbnQgPSBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCB8fCAnJztcblxudmFyIF9wcm9taXNlUmVzb2x2ZSA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIF9hbk9iamVjdChDKTtcbiAgaWYgKF9pc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gX25ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuXG52YXIgX3JlZGVmaW5lQWxsID0gZnVuY3Rpb24gKHRhcmdldCwgc3JjLCBzYWZlKSB7XG4gIGZvciAodmFyIGtleSBpbiBzcmMpIHtcbiAgICBpZiAoc2FmZSAmJiB0YXJnZXRba2V5XSkgdGFyZ2V0W2tleV0gPSBzcmNba2V5XTtcbiAgICBlbHNlIF9oaWRlKHRhcmdldCwga2V5LCBzcmNba2V5XSk7XG4gIH0gcmV0dXJuIHRhcmdldDtcbn07XG5cbnZhciBTUEVDSUVTJDEgPSBfd2tzKCdzcGVjaWVzJyk7XG5cbnZhciBfc2V0U3BlY2llcyA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgdmFyIEMgPSB0eXBlb2YgX2NvcmVbS0VZXSA9PSAnZnVuY3Rpb24nID8gX2NvcmVbS0VZXSA6IF9nbG9iYWxbS0VZXTtcbiAgaWYgKF9kZXNjcmlwdG9ycyAmJiBDICYmICFDW1NQRUNJRVMkMV0pIF9vYmplY3REcC5mKEMsIFNQRUNJRVMkMSwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59O1xuXG52YXIgSVRFUkFUT1IkMyA9IF93a3MoJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciByaXRlciA9IFs3XVtJVEVSQVRPUiQzXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbiAoKSB7IFNBRkVfQ0xPU0lORyA9IHRydWU7IH07XG59IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cblxudmFyIF9pdGVyRGV0ZWN0ID0gZnVuY3Rpb24gKGV4ZWMsIHNraXBDbG9zaW5nKSB7XG4gIGlmICghc2tpcENsb3NpbmcgJiYgIVNBRkVfQ0xPU0lORykgcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBbN107XG4gICAgdmFyIGl0ZXIgPSBhcnJbSVRFUkFUT1IkM10oKTtcbiAgICBpdGVyLm5leHQgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB7IGRvbmU6IHNhZmUgPSB0cnVlIH07IH07XG4gICAgYXJyW0lURVJBVE9SJDNdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gc2FmZTtcbn07XG5cbnZhciB0YXNrID0gX3Rhc2suc2V0O1xudmFyIG1pY3JvdGFzayA9IF9taWNyb3Rhc2soKTtcblxuXG5cblxudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgVHlwZUVycm9yJDEgPSBfZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBwcm9jZXNzJDIgPSBfZ2xvYmFsLnByb2Nlc3M7XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzJDIgJiYgcHJvY2VzcyQyLnZlcnNpb25zO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjggfHwgJyc7XG52YXIgJFByb21pc2UgPSBfZ2xvYmFsW1BST01JU0VdO1xudmFyIGlzTm9kZSQxID0gX2NsYXNzb2YocHJvY2VzcyQyKSA9PSAncHJvY2Vzcyc7XG52YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgSW50ZXJuYWwsIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBfbmV3UHJvbWlzZUNhcGFiaWxpdHkuZjtcblxudmFyIFVTRV9OQVRJVkUgPSAhIWZ1bmN0aW9uICgpIHtcbiAgdHJ5IHtcbiAgICAvLyBjb3JyZWN0IHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgICB2YXIgcHJvbWlzZSA9ICRQcm9taXNlLnJlc29sdmUoMSk7XG4gICAgdmFyIEZha2VQcm9taXNlID0gKHByb21pc2UuY29uc3RydWN0b3IgPSB7fSlbX3drcygnc3BlY2llcycpXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gICAgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUkMSB8fCB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbicpXG4gICAgICAmJiBwcm9taXNlLnRoZW4oZW1wdHkpIGluc3RhbmNlb2YgRmFrZVByb21pc2VcbiAgICAgIC8vIHY4IDYuNiAoTm9kZSAxMCBhbmQgQ2hyb21lIDY2KSBoYXZlIGEgYnVnIHdpdGggcmVzb2x2aW5nIGN1c3RvbSB0aGVuYWJsZXNcbiAgICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAgICAgLy8gd2UgY2FuJ3QgZGV0ZWN0IGl0IHN5bmNocm9ub3VzbHksIHNvIGp1c3QgY2hlY2sgdmVyc2lvbnNcbiAgICAgICYmIHY4LmluZGV4T2YoJzYuNicpICE9PSAwXG4gICAgICAmJiBfdXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZS82NicpID09PSAtMTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gX2lzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbiAocHJvbWlzZSwgaXNSZWplY3QpIHtcbiAgaWYgKHByb21pc2UuX24pIHJldHVybjtcbiAgcHJvbWlzZS5fbiA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHByb21pc2UuX2M7XG4gIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdjtcbiAgICB2YXIgb2sgPSBwcm9taXNlLl9zID09IDE7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBydW4gPSBmdW5jdGlvbiAocmVhY3Rpb24pIHtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWw7XG4gICAgICB2YXIgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmU7XG4gICAgICB2YXIgcmVqZWN0ID0gcmVhY3Rpb24ucmVqZWN0O1xuICAgICAgdmFyIGRvbWFpbiA9IHJlYWN0aW9uLmRvbWFpbjtcbiAgICAgIHZhciByZXN1bHQsIHRoZW4sIGV4aXRlZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgaWYgKCFvaykge1xuICAgICAgICAgICAgaWYgKHByb21pc2UuX2ggPT0gMikgb25IYW5kbGVVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgICAgICAgICBwcm9taXNlLl9oID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRsZXIgPT09IHRydWUpIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRvbWFpbikgZG9tYWluLmVudGVyKCk7XG4gICAgICAgICAgICByZXN1bHQgPSBoYW5kbGVyKHZhbHVlKTsgLy8gbWF5IHRocm93XG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XG4gICAgICAgICAgICAgIGRvbWFpbi5leGl0KCk7XG4gICAgICAgICAgICAgIGV4aXRlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHJlYWN0aW9uLnByb21pc2UpIHtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IkMSgnUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhcHJvbWlzZS5faCkgb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChfZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdjtcbiAgICB2YXIgdW5oYW5kbGVkID0gaXNVbmhhbmRsZWQocHJvbWlzZSk7XG4gICAgdmFyIHJlc3VsdCwgaGFuZGxlciwgY29uc29sZTtcbiAgICBpZiAodW5oYW5kbGVkKSB7XG4gICAgICByZXN1bHQgPSBfcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc05vZGUkMSkge1xuICAgICAgICAgIHByb2Nlc3MkMi5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IF9nbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pIHtcbiAgICAgICAgICBoYW5kbGVyKHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiB2YWx1ZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICgoY29uc29sZSA9IF9nbG9iYWwuY29uc29sZSkgJiYgY29uc29sZS5lcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgcHJvbWlzZS5faCA9IGlzTm9kZSQxIHx8IGlzVW5oYW5kbGVkKHByb21pc2UpID8gMiA6IDE7XG4gICAgfSBwcm9taXNlLl9hID0gdW5kZWZpbmVkO1xuICAgIGlmICh1bmhhbmRsZWQgJiYgcmVzdWx0LmUpIHRocm93IHJlc3VsdC52O1xuICB9KTtcbn07XG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICByZXR1cm4gcHJvbWlzZS5faCAhPT0gMSAmJiAocHJvbWlzZS5fYSB8fCBwcm9taXNlLl9jKS5sZW5ndGggPT09IDA7XG59O1xudmFyIG9uSGFuZGxlVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgdGFzay5jYWxsKF9nbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaGFuZGxlcjtcbiAgICBpZiAoaXNOb2RlJDEpIHtcbiAgICAgIHByb2Nlc3MkMi5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID0gX2dsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpIHtcbiAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHByb21pc2UuX3YgfSk7XG4gICAgfVxuICB9KTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIGlmIChwcm9taXNlLl9kKSByZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICBwcm9taXNlLl9zID0gMjtcbiAgaWYgKCFwcm9taXNlLl9hKSBwcm9taXNlLl9hID0gcHJvbWlzZS5fYy5zbGljZSgpO1xuICBub3RpZnkocHJvbWlzZSwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgdmFyIHRoZW47XG4gIGlmIChwcm9taXNlLl9kKSByZXR1cm47XG4gIHByb21pc2UuX2QgPSB0cnVlO1xuICBwcm9taXNlID0gcHJvbWlzZS5fdyB8fCBwcm9taXNlOyAvLyB1bndyYXBcbiAgdHJ5IHtcbiAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvciQxKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgX2N0eCgkcmVzb2x2ZSwgd3JhcHBlciwgMSksIF9jdHgoJHJlamVjdCwgd3JhcHBlciwgMSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgJHJlamVjdC5jYWxsKHdyYXBwZXIsIGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fcyA9IDE7XG4gICAgICBub3RpZnkocHJvbWlzZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgICRyZWplY3QuY2FsbCh7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfSwgZSk7IC8vIHdyYXBcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmICghVVNFX05BVElWRSkge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICAkUHJvbWlzZSA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBfYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgX2FGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IoX2N0eCgkcmVzb2x2ZSwgdGhpcywgMSksIF9jdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gX3JlZGVmaW5lQWxsKCRQcm9taXNlLnByb3RvdHlwZSwge1xuICAgIC8vIDI1LjQuNS4zIFByb21pc2UucHJvdG90eXBlLnRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpXG4gICAgdGhlbjogZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoX3NwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCAkUHJvbWlzZSkpO1xuICAgICAgcmVhY3Rpb24ub2sgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7XG4gICAgICByZWFjdGlvbi5kb21haW4gPSBpc05vZGUkMSA/IHByb2Nlc3MkMi5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX2EpIHRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fcykgbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBfY3R4KCRyZXNvbHZlLCBwcm9taXNlLCAxKTtcbiAgICB0aGlzLnJlamVjdCA9IF9jdHgoJHJlamVjdCwgcHJvbWlzZSwgMSk7XG4gIH07XG4gIF9uZXdQcm9taXNlQ2FwYWJpbGl0eS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSAkUHJvbWlzZSB8fCBDID09PSBXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG59XG5cbl9leHBvcnQoX2V4cG9ydC5HICsgX2V4cG9ydC5XICsgX2V4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgUHJvbWlzZTogJFByb21pc2UgfSk7XG5fc2V0VG9TdHJpbmdUYWcoJFByb21pc2UsIFBST01JU0UpO1xuX3NldFNwZWNpZXMoUFJPTUlTRSk7XG5XcmFwcGVyID0gX2NvcmVbUFJPTUlTRV07XG5cbi8vIHN0YXRpY3Ncbl9leHBvcnQoX2V4cG9ydC5TICsgX2V4cG9ydC5GICogIVVTRV9OQVRJVkUsIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjUgUHJvbWlzZS5yZWplY3QocilcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocikge1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcyk7XG4gICAgdmFyICQkcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgJCRyZWplY3Qocik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5fZXhwb3J0KF9leHBvcnQuUyArIF9leHBvcnQuRiAqIChfbGlicmFyeSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBfcHJvbWlzZVJlc29sdmUoX2xpYnJhcnkgJiYgdGhpcyA9PT0gV3JhcHBlciA/ICRQcm9taXNlIDogdGhpcywgeCk7XG4gIH1cbn0pO1xuX2V4cG9ydChfZXhwb3J0LlMgKyBfZXhwb3J0LkYgKiAhKFVTRV9OQVRJVkUgJiYgX2l0ZXJEZXRlY3QoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IF9wZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIF9mb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciAkaW5kZXggPSBpbmRleCsrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbJGluZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZSkgcmVqZWN0KHJlc3VsdC52KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyAyNS40LjQuNCBQcm9taXNlLnJhY2UoaXRlcmFibGUpXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IF9wZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIF9mb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGNhcGFiaWxpdHkucmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZSkgcmVqZWN0KHJlc3VsdC52KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcblxuX2V4cG9ydChfZXhwb3J0LlAgKyBfZXhwb3J0LlIsICdQcm9taXNlJywgeyAnZmluYWxseSc6IGZ1bmN0aW9uIChvbkZpbmFsbHkpIHtcbiAgdmFyIEMgPSBfc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIF9jb3JlLlByb21pc2UgfHwgX2dsb2JhbC5Qcm9taXNlKTtcbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2Ygb25GaW5hbGx5ID09ICdmdW5jdGlvbic7XG4gIHJldHVybiB0aGlzLnRoZW4oXG4gICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uICh4KSB7XG4gICAgICByZXR1cm4gX3Byb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgIH0gOiBvbkZpbmFsbHksXG4gICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gX3Byb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSk7XG4gICAgfSA6IG9uRmluYWxseVxuICApO1xufSB9KTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS10cnlcblxuXG5cblxuX2V4cG9ydChfZXhwb3J0LlMsICdQcm9taXNlJywgeyAndHJ5JzogZnVuY3Rpb24gKGNhbGxiYWNrZm4pIHtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gX25ld1Byb21pc2VDYXBhYmlsaXR5LmYodGhpcyk7XG4gIHZhciByZXN1bHQgPSBfcGVyZm9ybShjYWxsYmFja2ZuKTtcbiAgKHJlc3VsdC5lID8gcHJvbWlzZUNhcGFiaWxpdHkucmVqZWN0IDogcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZSkocmVzdWx0LnYpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn0gfSk7XG5cbnZhciBwcm9taXNlID0gX2NvcmUuUHJvbWlzZTtcblxudmFyIHByb21pc2UkMSA9IHByb21pc2U7XG5cbmZ1bmN0aW9uIF9hc3luY1RvR2VuZXJhdG9yKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgIHJldHVybiBuZXcgcHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgZnVuY3Rpb24gc3RlcChrZXksIGFyZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb21pc2UkMS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgIHN0ZXAoXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICBzdGVwKFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH1cblxuICAgICAgX25leHQoKTtcbiAgICB9KTtcbiAgfTtcbn1cblxudmFyIGFzeW5jVG9HZW5lcmF0b3IgPSBfYXN5bmNUb0dlbmVyYXRvcjtcblxudmFyIGYkMiA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG52YXIgX29iamVjdFBpZSA9IHtcblx0ZjogZiQyXG59O1xuXG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbnZhciBmJDMgPSBfZGVzY3JpcHRvcnMgPyBnT1BEIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IF90b0lvYmplY3QoTyk7XG4gIFAgPSBfdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChfaWU4RG9tRGVmaW5lKSB0cnkge1xuICAgIHJldHVybiBnT1BEKE8sIFApO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKF9oYXMoTywgUCkpIHJldHVybiBfcHJvcGVydHlEZXNjKCFfb2JqZWN0UGllLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuXG52YXIgX29iamVjdEdvcGQgPSB7XG5cdGY6IGYkM1xufTtcblxuLy8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG5cblxuXG52YXIgX29iamVjdFNhcCA9IGZ1bmN0aW9uIChLRVksIGV4ZWMpIHtcbiAgdmFyIGZuID0gKF9jb3JlLk9iamVjdCB8fCB7fSlbS0VZXSB8fCBPYmplY3RbS0VZXTtcbiAgdmFyIGV4cCA9IHt9O1xuICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuICBfZXhwb3J0KF9leHBvcnQuUyArIF9leHBvcnQuRiAqIF9mYWlscyhmdW5jdGlvbiAoKSB7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG59O1xuXG4vLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG5cbnZhciAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gX29iamVjdEdvcGQuZjtcblxuX29iamVjdFNhcCgnZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcihfdG9Jb2JqZWN0KGl0KSwga2V5KTtcbiAgfTtcbn0pO1xuXG52YXIgJE9iamVjdCA9IF9jb3JlLk9iamVjdDtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICByZXR1cm4gJE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSk7XG59O1xuXG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDEgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbnZhciBfbWV0YSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbnZhciBNRVRBID0gX3VpZCgnbWV0YScpO1xuXG5cbnZhciBzZXREZXNjID0gX29iamVjdERwLmY7XG52YXIgaWQgPSAwO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgRlJFRVpFID0gIV9mYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBpc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7XG59KTtcbnZhciBzZXRNZXRhID0gZnVuY3Rpb24gKGl0KSB7XG4gIHNldERlc2MoaXQsIE1FVEEsIHsgdmFsdWU6IHtcbiAgICBpOiAnTycgKyArK2lkLCAvLyBvYmplY3QgSURcbiAgICB3OiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IH0pO1xufTtcbnZhciBmYXN0S2V5ID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgLy8gcmV0dXJuIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZiAoIV9pc09iamVjdChpdCkpIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG4gIGlmICghX2hhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuICdGJztcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmICghY3JlYXRlKSByZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQV0uaTtcbn07XG52YXIgZ2V0V2VhayA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIGlmICghX2hhcyhpdCwgTUVUQSkpIHtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmICghaXNFeHRlbnNpYmxlKGl0KSkgcmV0dXJuIHRydWU7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBoYXNoIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gcmV0dXJuIGl0W01FVEFdLnc7XG59O1xuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKEZSRUVaRSAmJiBtZXRhLk5FRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhX2hhcyhpdCwgTUVUQSkpIHNldE1ldGEoaXQpO1xuICByZXR1cm4gaXQ7XG59O1xudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgS0VZOiBNRVRBLFxuICBORUVEOiBmYWxzZSxcbiAgZmFzdEtleTogZmFzdEtleSxcbiAgZ2V0V2VhazogZ2V0V2VhayxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xufSk7XG52YXIgX21ldGFfMSA9IF9tZXRhLktFWTtcbnZhciBfbWV0YV8yID0gX21ldGEuTkVFRDtcbnZhciBfbWV0YV8zID0gX21ldGEuZmFzdEtleTtcbnZhciBfbWV0YV80ID0gX21ldGEuZ2V0V2VhaztcbnZhciBfbWV0YV81ID0gX21ldGEub25GcmVlemU7XG5cbnZhciBmJDQgPSBfd2tzO1xuXG52YXIgX3drc0V4dCA9IHtcblx0ZjogZiQ0XG59O1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBfb2JqZWN0RHAuZjtcbnZhciBfd2tzRGVmaW5lID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyICRTeW1ib2wgPSBfY29yZS5TeW1ib2wgfHwgKF9jb3JlLlN5bWJvbCA9IF9saWJyYXJ5ID8ge30gOiBfZ2xvYmFsLlN5bWJvbCB8fCB7fSk7XG4gIGlmIChuYW1lLmNoYXJBdCgwKSAhPSAnXycgJiYgIShuYW1lIGluICRTeW1ib2wpKSBkZWZpbmVQcm9wZXJ0eSgkU3ltYm9sLCBuYW1lLCB7IHZhbHVlOiBfd2tzRXh0LmYobmFtZSkgfSk7XG59O1xuXG52YXIgZiQ1ID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxudmFyIF9vYmplY3RHb3BzID0ge1xuXHRmOiBmJDVcbn07XG5cbi8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG5cblxuXG52YXIgX2VudW1LZXlzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciByZXN1bHQgPSBfb2JqZWN0S2V5cyhpdCk7XG4gIHZhciBnZXRTeW1ib2xzID0gX29iamVjdEdvcHMuZjtcbiAgaWYgKGdldFN5bWJvbHMpIHtcbiAgICB2YXIgc3ltYm9scyA9IGdldFN5bWJvbHMoaXQpO1xuICAgIHZhciBpc0VudW0gPSBfb2JqZWN0UGllLmY7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBrZXk7XG4gICAgd2hpbGUgKHN5bWJvbHMubGVuZ3RoID4gaSkgaWYgKGlzRW51bS5jYWxsKGl0LCBrZXkgPSBzeW1ib2xzW2krK10pKSByZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxuXG52YXIgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIHJldHVybiBfY29mKGFyZykgPT0gJ0FycmF5Jztcbn07XG5cbi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcblxudmFyIGhpZGRlbktleXMgPSBfZW51bUJ1Z0tleXMuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7XG5cbnZhciBmJDYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuIF9vYmplY3RLZXlzSW50ZXJuYWwoTywgaGlkZGVuS2V5cyk7XG59O1xuXG52YXIgX29iamVjdEdvcG4gPSB7XG5cdGY6IGYkNlxufTtcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgYnVnZ3kgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgd2l0aCBpZnJhbWUgYW5kIHdpbmRvd1xuXG52YXIgZ09QTiA9IF9vYmplY3RHb3BuLmY7XG52YXIgdG9TdHJpbmckMSA9IHt9LnRvU3RyaW5nO1xuXG52YXIgd2luZG93TmFtZXMgPSB0eXBlb2Ygd2luZG93ID09ICdvYmplY3QnICYmIHdpbmRvdyAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc1xuICA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHdpbmRvdykgOiBbXTtcblxudmFyIGdldFdpbmRvd05hbWVzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdPUE4oaXQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7XG4gIH1cbn07XG5cbnZhciBmJDcgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHJldHVybiB3aW5kb3dOYW1lcyAmJiB0b1N0cmluZyQxLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogZ09QTihfdG9Jb2JqZWN0KGl0KSk7XG59O1xuXG52YXIgX29iamVjdEdvcG5FeHQgPSB7XG5cdGY6IGYkN1xufTtcblxuLy8gRUNNQVNjcmlwdCA2IHN5bWJvbHMgc2hpbVxuXG5cblxuXG5cbnZhciBNRVRBID0gX21ldGEuS0VZO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgZ09QRCQxID0gX29iamVjdEdvcGQuZjtcbnZhciBkUCQxID0gX29iamVjdERwLmY7XG52YXIgZ09QTiQxID0gX29iamVjdEdvcG5FeHQuZjtcbnZhciAkU3ltYm9sID0gX2dsb2JhbC5TeW1ib2w7XG52YXIgJEpTT04gPSBfZ2xvYmFsLkpTT047XG52YXIgX3N0cmluZ2lmeSA9ICRKU09OICYmICRKU09OLnN0cmluZ2lmeTtcbnZhciBQUk9UT1RZUEUkMiA9ICdwcm90b3R5cGUnO1xudmFyIEhJRERFTiA9IF93a3MoJ19oaWRkZW4nKTtcbnZhciBUT19QUklNSVRJVkUgPSBfd2tzKCd0b1ByaW1pdGl2ZScpO1xudmFyIGlzRW51bSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIFN5bWJvbFJlZ2lzdHJ5ID0gX3NoYXJlZCgnc3ltYm9sLXJlZ2lzdHJ5Jyk7XG52YXIgQWxsU3ltYm9scyA9IF9zaGFyZWQoJ3N5bWJvbHMnKTtcbnZhciBPUFN5bWJvbHMgPSBfc2hhcmVkKCdvcC1zeW1ib2xzJyk7XG52YXIgT2JqZWN0UHJvdG8kMSA9IE9iamVjdFtQUk9UT1RZUEUkMl07XG52YXIgVVNFX05BVElWRSQxID0gdHlwZW9mICRTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcbnZhciBRT2JqZWN0ID0gX2dsb2JhbC5RT2JqZWN0O1xuLy8gRG9uJ3QgdXNlIHNldHRlcnMgaW4gUXQgU2NyaXB0LCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTczXG52YXIgc2V0dGVyID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFJDJdIHx8ICFRT2JqZWN0W1BST1RPVFlQRSQyXS5maW5kQ2hpbGQ7XG5cbi8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xudmFyIHNldFN5bWJvbERlc2MgPSBfZGVzY3JpcHRvcnMgJiYgX2ZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIF9vYmplY3RDcmVhdGUoZFAkMSh7fSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkUCQxKHRoaXMsICdhJywgeyB2YWx1ZTogNyB9KS5hOyB9XG4gIH0pKS5hICE9IDc7XG59KSA/IGZ1bmN0aW9uIChpdCwga2V5LCBEKSB7XG4gIHZhciBwcm90b0Rlc2MgPSBnT1BEJDEoT2JqZWN0UHJvdG8kMSwga2V5KTtcbiAgaWYgKHByb3RvRGVzYykgZGVsZXRlIE9iamVjdFByb3RvJDFba2V5XTtcbiAgZFAkMShpdCwga2V5LCBEKTtcbiAgaWYgKHByb3RvRGVzYyAmJiBpdCAhPT0gT2JqZWN0UHJvdG8kMSkgZFAkMShPYmplY3RQcm90byQxLCBrZXksIHByb3RvRGVzYyk7XG59IDogZFAkMTtcblxudmFyIHdyYXAgPSBmdW5jdGlvbiAodGFnKSB7XG4gIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfb2JqZWN0Q3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFJDJdKTtcbiAgc3ltLl9rID0gdGFnO1xuICByZXR1cm4gc3ltO1xufTtcblxudmFyIGlzU3ltYm9sID0gVVNFX05BVElWRSQxICYmIHR5cGVvZiAkU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG59IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCBpbnN0YW5jZW9mICRTeW1ib2w7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCkge1xuICBpZiAoaXQgPT09IE9iamVjdFByb3RvJDEpICRkZWZpbmVQcm9wZXJ0eShPUFN5bWJvbHMsIGtleSwgRCk7XG4gIF9hbk9iamVjdChpdCk7XG4gIGtleSA9IF90b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBfYW5PYmplY3QoRCk7XG4gIGlmIChfaGFzKEFsbFN5bWJvbHMsIGtleSkpIHtcbiAgICBpZiAoIUQuZW51bWVyYWJsZSkge1xuICAgICAgaWYgKCFfaGFzKGl0LCBISURERU4pKSBkUCQxKGl0LCBISURERU4sIF9wcm9wZXJ0eURlc2MoMSwge30pKTtcbiAgICAgIGl0W0hJRERFTl1ba2V5XSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChfaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkgaXRbSElEREVOXVtrZXldID0gZmFsc2U7XG4gICAgICBEID0gX29iamVjdENyZWF0ZShELCB7IGVudW1lcmFibGU6IF9wcm9wZXJ0eURlc2MoMCwgZmFsc2UpIH0pO1xuICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCk7XG4gIH0gcmV0dXJuIGRQJDEoaXQsIGtleSwgRCk7XG59O1xudmFyICRkZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhpdCwgUCkge1xuICBfYW5PYmplY3QoaXQpO1xuICB2YXIga2V5cyA9IF9lbnVtS2V5cyhQID0gX3RvSW9iamVjdChQKSk7XG4gIHZhciBpID0gMDtcbiAgdmFyIGwgPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKGwgPiBpKSAkZGVmaW5lUHJvcGVydHkoaXQsIGtleSA9IGtleXNbaSsrXSwgUFtrZXldKTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciAkY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGl0LCBQKSB7XG4gIHJldHVybiBQID09PSB1bmRlZmluZWQgPyBfb2JqZWN0Q3JlYXRlKGl0KSA6ICRkZWZpbmVQcm9wZXJ0aWVzKF9vYmplY3RDcmVhdGUoaXQpLCBQKTtcbn07XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoa2V5KSB7XG4gIHZhciBFID0gaXNFbnVtLmNhbGwodGhpcywga2V5ID0gX3RvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpO1xuICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG8kMSAmJiBfaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIV9oYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBFIHx8ICFfaGFzKHRoaXMsIGtleSkgfHwgIV9oYXMoQWxsU3ltYm9scywga2V5KSB8fCBfaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW2tleV0gPyBFIDogdHJ1ZTtcbn07XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciQxID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgaXQgPSBfdG9Jb2JqZWN0KGl0KTtcbiAga2V5ID0gX3RvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG8kMSAmJiBfaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIV9oYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm47XG4gIHZhciBEID0gZ09QRCQxKGl0LCBrZXkpO1xuICBpZiAoRCAmJiBfaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIShfaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpIEQuZW51bWVyYWJsZSA9IHRydWU7XG4gIHJldHVybiBEO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgdmFyIG5hbWVzID0gZ09QTiQxKF90b0lvYmplY3QoaXQpKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSB7XG4gICAgaWYgKCFfaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIGtleSAhPSBISURERU4gJiYga2V5ICE9IE1FVEEpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCkge1xuICB2YXIgSVNfT1AgPSBpdCA9PT0gT2JqZWN0UHJvdG8kMTtcbiAgdmFyIG5hbWVzID0gZ09QTiQxKElTX09QID8gT1BTeW1ib2xzIDogX3RvSW9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoX2hhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiAoSVNfT1AgPyBfaGFzKE9iamVjdFByb3RvJDEsIGtleSkgOiB0cnVlKSkgcmVzdWx0LnB1c2goQWxsU3ltYm9sc1trZXldKTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gMTkuNC4xLjEgU3ltYm9sKFtkZXNjcmlwdGlvbl0pXG5pZiAoIVVTRV9OQVRJVkUkMSkge1xuICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCkge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgJFN5bWJvbCkgdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG4gICAgdmFyIHRhZyA9IF91aWQoYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICAgIHZhciAkc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG8kMSkgJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuICAgICAgaWYgKF9oYXModGhpcywgSElEREVOKSAmJiBfaGFzKHRoaXNbSElEREVOXSwgdGFnKSkgdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcbiAgICAgIHNldFN5bWJvbERlc2ModGhpcywgdGFnLCBfcHJvcGVydHlEZXNjKDEsIHZhbHVlKSk7XG4gICAgfTtcbiAgICBpZiAoX2Rlc2NyaXB0b3JzICYmIHNldHRlcikgc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90byQxLCB0YWcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6ICRzZXQgfSk7XG4gICAgcmV0dXJuIHdyYXAodGFnKTtcbiAgfTtcbiAgX3JlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFJDJdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5faztcbiAgfSk7XG5cbiAgX29iamVjdEdvcGQuZiA9ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkMTtcbiAgX29iamVjdERwLmYgPSAkZGVmaW5lUHJvcGVydHk7XG4gIF9vYmplY3RHb3BuLmYgPSBfb2JqZWN0R29wbkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIF9vYmplY3RQaWUuZiA9ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiAgX29iamVjdEdvcHMuZiA9ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbiAgaWYgKF9kZXNjcmlwdG9ycyAmJiAhX2xpYnJhcnkpIHtcbiAgICBfcmVkZWZpbmUoT2JqZWN0UHJvdG8kMSwgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB0cnVlKTtcbiAgfVxuXG4gIF93a3NFeHQuZiA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHdyYXAoX3drcyhuYW1lKSk7XG4gIH07XG59XG5cbl9leHBvcnQoX2V4cG9ydC5HICsgX2V4cG9ydC5XICsgX2V4cG9ydC5GICogIVVTRV9OQVRJVkUkMSwgeyBTeW1ib2w6ICRTeW1ib2wgfSk7XG5cbmZvciAodmFyIGVzNlN5bWJvbHMgPSAoXG4gIC8vIDE5LjQuMi4yLCAxOS40LjIuMywgMTkuNC4yLjQsIDE5LjQuMi42LCAxOS40LjIuOCwgMTkuNC4yLjksIDE5LjQuMi4xMCwgMTkuNC4yLjExLCAxOS40LjIuMTIsIDE5LjQuMi4xMywgMTkuNC4yLjE0XG4gICdoYXNJbnN0YW5jZSxpc0NvbmNhdFNwcmVhZGFibGUsaXRlcmF0b3IsbWF0Y2gscmVwbGFjZSxzZWFyY2gsc3BlY2llcyxzcGxpdCx0b1ByaW1pdGl2ZSx0b1N0cmluZ1RhZyx1bnNjb3BhYmxlcydcbikuc3BsaXQoJywnKSwgaiA9IDA7IGVzNlN5bWJvbHMubGVuZ3RoID4gajspX3drcyhlczZTeW1ib2xzW2orK10pO1xuXG5mb3IgKHZhciB3ZWxsS25vd25TeW1ib2xzID0gX29iamVjdEtleXMoX3drcy5zdG9yZSksIGsgPSAwOyB3ZWxsS25vd25TeW1ib2xzLmxlbmd0aCA+IGs7KSBfd2tzRGVmaW5lKHdlbGxLbm93blN5bWJvbHNbaysrXSk7XG5cbl9leHBvcnQoX2V4cG9ydC5TICsgX2V4cG9ydC5GICogIVVTRV9OQVRJVkUkMSwgJ1N5bWJvbCcsIHtcbiAgLy8gMTkuNC4yLjEgU3ltYm9sLmZvcihrZXkpXG4gICdmb3InOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIF9oYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcbiAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuICAgICAgOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpO1xuICB9LFxuICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioc3ltKSB7XG4gICAgaWYgKCFpc1N5bWJvbChzeW0pKSB0aHJvdyBUeXBlRXJyb3Ioc3ltICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG4gICAgZm9yICh2YXIga2V5IGluIFN5bWJvbFJlZ2lzdHJ5KSBpZiAoU3ltYm9sUmVnaXN0cnlba2V5XSA9PT0gc3ltKSByZXR1cm4ga2V5O1xuICB9LFxuICB1c2VTZXR0ZXI6IGZ1bmN0aW9uICgpIHsgc2V0dGVyID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IGZhbHNlOyB9XG59KTtcblxuX2V4cG9ydChfZXhwb3J0LlMgKyBfZXhwb3J0LkYgKiAhVVNFX05BVElWRSQxLCAnT2JqZWN0Jywge1xuICAvLyAxOS4xLjIuMiBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4gIGNyZWF0ZTogJGNyZWF0ZSxcbiAgLy8gMTkuMS4yLjQgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG4gIGRlZmluZVByb3BlcnR5OiAkZGVmaW5lUHJvcGVydHksXG4gIC8vIDE5LjEuMi4zIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpXG4gIGRlZmluZVByb3BlcnRpZXM6ICRkZWZpbmVQcm9wZXJ0aWVzLFxuICAvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogJGdldE93blByb3BlcnR5RGVzY3JpcHRvciQxLFxuICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyAyNC4zLjIgSlNPTi5zdHJpbmdpZnkodmFsdWUgWywgcmVwbGFjZXIgWywgc3BhY2VdXSlcbiRKU09OICYmIF9leHBvcnQoX2V4cG9ydC5TICsgX2V4cG9ydC5GICogKCFVU0VfTkFUSVZFJDEgfHwgX2ZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoeyBhOiBTIH0pICE9ICd7fScgfHwgX3N0cmluZ2lmeShPYmplY3QoUykpICE9ICd7fSc7XG59KSksICdKU09OJywge1xuICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCkge1xuICAgIHZhciBhcmdzID0gW2l0XTtcbiAgICB2YXIgaSA9IDE7XG4gICAgdmFyIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgICRyZXBsYWNlciA9IHJlcGxhY2VyID0gYXJnc1sxXTtcbiAgICBpZiAoIV9pc09iamVjdChyZXBsYWNlcikgJiYgaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpIHJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICAgIGlmICghX2lzQXJyYXkocmVwbGFjZXIpKSByZXBsYWNlciA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBpZiAodHlwZW9mICRyZXBsYWNlciA9PSAnZnVuY3Rpb24nKSB2YWx1ZSA9ICRyZXBsYWNlci5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgICAgaWYgKCFpc1N5bWJvbCh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcbiAgICByZXR1cm4gX3N0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJncyk7XG4gIH1cbn0pO1xuXG4vLyAxOS40LjMuNCBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdKGhpbnQpXG4kU3ltYm9sW1BST1RPVFlQRSQyXVtUT19QUklNSVRJVkVdIHx8IF9oaWRlKCRTeW1ib2xbUFJPVE9UWVBFJDJdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFJDJdLnZhbHVlT2YpO1xuLy8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXVxuX3NldFRvU3RyaW5nVGFnKCRTeW1ib2wsICdTeW1ib2wnKTtcbi8vIDIwLjIuMS45IE1hdGhbQEB0b1N0cmluZ1RhZ11cbl9zZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuLy8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cbl9zZXRUb1N0cmluZ1RhZyhfZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7XG5cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBfY29yZS5PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzJDEgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbi8vIDE5LjEuMi4xNCBPYmplY3Qua2V5cyhPKVxuXG5cblxuX29iamVjdFNhcCgna2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGtleXMoaXQpIHtcbiAgICByZXR1cm4gX29iamVjdEtleXMoX3RvT2JqZWN0KGl0KSk7XG4gIH07XG59KTtcblxudmFyIGtleXMgPSBfY29yZS5PYmplY3Qua2V5cztcblxudmFyIGtleXMkMSA9IGtleXM7XG5cbi8vIDE5LjEuMi40IC8gMTUuMi4zLjYgT2JqZWN0LmRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpXG5fZXhwb3J0KF9leHBvcnQuUyArIF9leHBvcnQuRiAqICFfZGVzY3JpcHRvcnMsICdPYmplY3QnLCB7IGRlZmluZVByb3BlcnR5OiBfb2JqZWN0RHAuZiB9KTtcblxudmFyICRPYmplY3QkMSA9IF9jb3JlLk9iamVjdDtcbnZhciBkZWZpbmVQcm9wZXJ0eSQxID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYykge1xuICByZXR1cm4gJE9iamVjdCQxLmRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpO1xufTtcblxudmFyIGRlZmluZVByb3BlcnR5JDIgPSBkZWZpbmVQcm9wZXJ0eSQxO1xuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgZGVmaW5lUHJvcGVydHkkMihvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSQzID0gX2RlZmluZVByb3BlcnR5O1xuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV0gIT0gbnVsbCA/IGFyZ3VtZW50c1tpXSA6IHt9O1xuXG4gICAgdmFyIG93bktleXMgPSBrZXlzJDEoc291cmNlKTtcblxuICAgIGlmICh0eXBlb2YgZ2V0T3duUHJvcGVydHlTeW1ib2xzJDEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG93bktleXMgPSBvd25LZXlzLmNvbmNhdChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMkMShzb3VyY2UpLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7XG4gICAgICAgIHJldHVybiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkMShzb3VyY2UsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBvd25LZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgZGVmaW5lUHJvcGVydHkkMyh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxudmFyIG9iamVjdFNwcmVhZCA9IF9vYmplY3RTcHJlYWQ7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbnZhciBjbGFzc0NhbGxDaGVjayA9IF9jbGFzc0NhbGxDaGVjaztcblxuLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG5cbnZhciBjaGVjayA9IGZ1bmN0aW9uIChPLCBwcm90bykge1xuICBfYW5PYmplY3QoTyk7XG4gIGlmICghX2lzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCkgdGhyb3cgVHlwZUVycm9yKHByb3RvICsgXCI6IGNhbid0IHNldCBhcyBwcm90b3R5cGUhXCIpO1xufTtcbnZhciBfc2V0UHJvdG8gPSB7XG4gIHNldDogT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBmdW5jdGlvbiAodGVzdCwgYnVnZ3ksIHNldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0ID0gX2N0eChGdW5jdGlvbi5jYWxsLCBfb2JqZWN0R29wZC5mKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQsIDIpO1xuICAgICAgICBzZXQodGVzdCwgW10pO1xuICAgICAgICBidWdneSA9ICEodGVzdCBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgYnVnZ3kgPSB0cnVlOyB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pIHtcbiAgICAgICAgY2hlY2soTywgcHJvdG8pO1xuICAgICAgICBpZiAoYnVnZ3kpIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgICAgIGVsc2Ugc2V0KE8sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIE87XG4gICAgICB9O1xuICAgIH0oe30sIGZhbHNlKSA6IHVuZGVmaW5lZCksXG4gIGNoZWNrOiBjaGVja1xufTtcblxuLy8gMTkuMS4zLjE5IE9iamVjdC5zZXRQcm90b3R5cGVPZihPLCBwcm90bylcblxuX2V4cG9ydChfZXhwb3J0LlMsICdPYmplY3QnLCB7IHNldFByb3RvdHlwZU9mOiBfc2V0UHJvdG8uc2V0IH0pO1xuXG52YXIgc2V0UHJvdG90eXBlT2YgPSBfY29yZS5PYmplY3Quc2V0UHJvdG90eXBlT2Y7XG5cbnZhciBzZXRQcm90b3R5cGVPZiQxID0gc2V0UHJvdG90eXBlT2Y7XG5cbnZhciBzZXRQcm90b3R5cGVPZiQyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfc2V0UHJvdG90eXBlT2YgPSBzZXRQcm90b3R5cGVPZiQxIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gICAgby5fX3Byb3RvX18gPSBwO1xuICAgIHJldHVybiBvO1xuICB9O1xuXG4gIHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3NldFByb3RvdHlwZU9mO1xufSk7XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uXCIpO1xuICB9XG5cbiAgc2V0UHJvdG90eXBlT2YkMihzdWJDbGFzcy5wcm90b3R5cGUsIHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUpO1xuICBpZiAoc3VwZXJDbGFzcykgc2V0UHJvdG90eXBlT2YkMihzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG59XG5cbnZhciBpbmhlcml0cyA9IF9pbmhlcml0cztcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG5cbiAgICBkZWZpbmVQcm9wZXJ0eSQyKHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG52YXIgY3JlYXRlQ2xhc3MgPSBfY3JlYXRlQ2xhc3M7XG5cbnZhciBpdGVyYXRvciA9IF93a3NFeHQuZignaXRlcmF0b3InKTtcblxudmFyIGl0ZXJhdG9yJDEgPSBpdGVyYXRvcjtcblxuX3drc0RlZmluZSgnYXN5bmNJdGVyYXRvcicpO1xuXG5fd2tzRGVmaW5lKCdvYnNlcnZhYmxlJyk7XG5cbnZhciBzeW1ib2wgPSBfY29yZS5TeW1ib2w7XG5cbnZhciBzeW1ib2wkMSA9IHN5bWJvbDtcblxudmFyIF90eXBlb2ZfMSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbmZ1bmN0aW9uIF90eXBlb2YyKG9iaikgeyBpZiAodHlwZW9mIHN5bWJvbCQxID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIGl0ZXJhdG9yJDEgPT09IFwic3ltYm9sXCIpIHsgX3R5cGVvZjIgPSBmdW5jdGlvbiBfdHlwZW9mMihvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH07IH0gZWxzZSB7IF90eXBlb2YyID0gZnVuY3Rpb24gX3R5cGVvZjIob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIHN5bWJvbCQxID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBzeW1ib2wkMSAmJiBvYmogIT09IHN5bWJvbCQxLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9OyB9IHJldHVybiBfdHlwZW9mMihvYmopOyB9XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIGlmICh0eXBlb2Ygc3ltYm9sJDEgPT09IFwiZnVuY3Rpb25cIiAmJiBfdHlwZW9mMihpdGVyYXRvciQxKSA9PT0gXCJzeW1ib2xcIikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICByZXR1cm4gX3R5cGVvZjIob2JqKTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX3R5cGVvZiA9IGZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBzeW1ib2wkMSA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gc3ltYm9sJDEgJiYgb2JqICE9PSBzeW1ib2wkMS5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogX3R5cGVvZjIob2JqKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mO1xufSk7XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59XG5cbnZhciBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemVkO1xuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7XG4gIGlmIChjYWxsICYmIChfdHlwZW9mXzEoY2FsbCkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikpIHtcbiAgICByZXR1cm4gY2FsbDtcbiAgfVxuXG4gIHJldHVybiBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZik7XG59XG5cbnZhciBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm47XG5cbi8vIDE5LjEuMi45IE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxuXG5cblxuX29iamVjdFNhcCgnZ2V0UHJvdG90eXBlT2YnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCkge1xuICAgIHJldHVybiBfb2JqZWN0R3BvKF90b09iamVjdChpdCkpO1xuICB9O1xufSk7XG5cbnZhciBnZXRQcm90b3R5cGVPZiA9IF9jb3JlLk9iamVjdC5nZXRQcm90b3R5cGVPZjtcblxudmFyIGdldFByb3RvdHlwZU9mJDEgPSBnZXRQcm90b3R5cGVPZjtcblxudmFyIGdldFByb3RvdHlwZU9mJDIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBtb2R1bGUuZXhwb3J0cyA9IF9nZXRQcm90b3R5cGVPZiA9IGdldFByb3RvdHlwZU9mJDEgfHwgZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgICByZXR1cm4gby5fX3Byb3RvX187XG4gIH07XG5cbiAgcmV0dXJuIF9nZXRQcm90b3R5cGVPZihvKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZ2V0UHJvdG90eXBlT2Y7XG59KTtcblxudmFyIGV4dGVuZCA9IGZ1bmN0aW9uIGV4dGVuZChvYmplY3QpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGV4dGVuc2lvbnMgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGV4dGVuc2lvbnNbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgLy8gJC5leHRlbmQgYWx0ZXJuYXRpdmUsIC4uLiBpcyB0aGUgc3ByZWFkIG9wZXJhdG9yLlxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IF9pKyspIHtcbiAgICB2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tfaV07XG4gICAgLy8gY29uc29sZS5sb2coZXh0ZW5zaW9uKTtcbiAgICAvLyBjb25zb2xlLmxvZyh0eXBlb2YgZXh0ZW5zaW9uKTtcbiAgICBpZiAoIWV4dGVuc2lvbikgY29udGludWU7IC8vIElnbm9yZSBudWxsIGFuZCB1bmRlZmluZWQgb2JqZWN0cyBhbmQgcGFyYW1ldGVycy5cblxuICAgIHZhciBfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICB2YXIgX2RpZEl0ZXJhdG9yRXJyb3IgPSBmYWxzZTtcbiAgICB2YXIgX2l0ZXJhdG9yRXJyb3IgPSB1bmRlZmluZWQ7XG5cbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZXh0ZW5zaW9uKVtTeW1ib2wuaXRlcmF0b3JdKCksIF9zdGVwOyAhKF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSAoX3N0ZXAgPSBfaXRlcmF0b3IubmV4dCgpKS5kb25lKTsgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWUpIHtcbiAgICAgICAgdmFyIHByb3AgPSBfc3RlcC52YWx1ZTtcblxuICAgICAgICAvLyBEbyBub3QgdHJhdmVyc2UgdGhlIHByb3RvdHlwZSBjaGFpbi5cbiAgICAgICAgaWYgKG9iamVjdFtwcm9wXSAhPT0gdW5kZWZpbmVkICYmIGV4dGVuc2lvbltwcm9wXSAmJiBvYmplY3RbcHJvcF0udG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScgJiYgZXh0ZW5zaW9uW3Byb3BdLnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICAgICAgLy8gR29lcyBkZWVwIG9ubHkgaWYgb2JqZWN0W3Byb3BdIGFuZCBleHRlbnNpb25bcHJvcF0gYXJlIGJvdGggb2JqZWN0cyAhXG4gICAgICAgICAgaWYgKG9iamVjdFtwcm9wXS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSBleHRlbmQob2JqZWN0W3Byb3BdLCBleHRlbnNpb25bcHJvcF0pO1xuICAgICAgICB9IGVsc2Ugb2JqZWN0W3Byb3BdID0gdHlwZW9mIG9iamVjdFtwcm9wXSA9PT0gJ3VuZGVmaW5lZCcgPyBleHRlbnNpb25bcHJvcF0gOiBvYmplY3RbcHJvcF07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvYmplY3RbcHJvcF0gPT09ICd1bmRlZmluZWQnICYmIEFycmF5LmlzQXJyYXkoZXh0ZW5zaW9uW3Byb3BdKSkgb2JqZWN0W3Byb3BdID0gZXh0ZW5zaW9uW3Byb3BdLnNsaWNlKCk7IC8vIEFkZCB2YWx1ZXMgdGhhdCBkbyBub3QgYWxyZWFkeSBleGlzdC5cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9iamVjdFtwcm9wXSA9PT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheShleHRlbnNpb25bcHJvcF0pKSBvYmplY3RbcHJvcF0gPSBleHRlbnNpb25bcHJvcF07XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBfZGlkSXRlcmF0b3JFcnJvciA9IHRydWU7XG4gICAgICBfaXRlcmF0b3JFcnJvciA9IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uICYmIF9pdGVyYXRvci5yZXR1cm4gIT0gbnVsbCkge1xuICAgICAgICAgIF9pdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKF9kaWRJdGVyYXRvckVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgX2l0ZXJhdG9yRXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufTtcblxudmFyIGluc3RydWN0ID0gZnVuY3Rpb24gaW5zdHJ1Y3QoYXJyYXksIGluc3RBcnJheSkge1xuICB2YXIgdGVtcE9iamVjdCA9IHt9O1xuXG4gIGZvciAodmFyIGkgPSAwLCBtYXggPSBpbnN0QXJyYXkubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHtcbiAgICB2YXIgZ3VpZGUgPSBpbnN0QXJyYXlbaV07XG4gICAgdGVtcE9iamVjdFtndWlkZV0gPSBhcnJheVtpXTtcbiAgfVxuXG4gIHJldHVybiB0ZW1wT2JqZWN0O1xufTtcbnZhciB0cmFuc2Zvcm1EYXRhID0gZnVuY3Rpb24gdHJhbnNmb3JtRGF0YShvYmplY3QsIGluc3RydWN0aW9ucykge1xuICBmb3IgKHZhciBrZXkgaW4gaW5zdHJ1Y3Rpb25zKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0W2tleV0pKSBvYmplY3Rba2V5XSA9IGluc3RydWN0KG9iamVjdFtrZXldLCBpbnN0cnVjdGlvbnNba2V5XSk7ZWxzZSBpZiAob2JqZWN0W2tleV0gaW5zdGFuY2VvZiBPYmplY3QgJiYgIUFycmF5LmlzQXJyYXkoaW5zdHJ1Y3Rpb25zW2tleV0pKSBvYmplY3Rba2V5XSA9IHRyYW5zZm9ybURhdGEob2JqZWN0W2tleV0sIGluc3RydWN0aW9uc1trZXldKTtcbiAgfVxuXG4gIHJldHVybiBvYmplY3Q7XG59O1xudmFyIHRvQXJyYXkgPSBmdW5jdGlvbiB0b0FycmF5KG9iamVjdCwgaW5zdHJ1Y3Rpb24pIHtcbiAgdmFyIHRlbXBBcnJheSA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwLCBtYXggPSBpbnN0cnVjdGlvbi5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgIHZhciBndWlkZSA9IGluc3RydWN0aW9uW2ldO1xuICAgIHRlbXBBcnJheVtpXSA9IG9iamVjdFtndWlkZV07XG4gIH1cblxuICByZXR1cm4gdGVtcEFycmF5O1xufTtcblxuLy8gUG9seWZpbGxzXG5cbmlmICggTnVtYmVyLkVQU0lMT04gPT09IHVuZGVmaW5lZCApIHtcblxuXHROdW1iZXIuRVBTSUxPTiA9IE1hdGgucG93KCAyLCAtIDUyICk7XG5cbn1cblxuaWYgKCBOdW1iZXIuaXNJbnRlZ2VyID09PSB1bmRlZmluZWQgKSB7XG5cblx0Ly8gTWlzc2luZyBpbiBJRVxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9OdW1iZXIvaXNJbnRlZ2VyXG5cblx0TnVtYmVyLmlzSW50ZWdlciA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSggdmFsdWUgKSAmJiBNYXRoLmZsb29yKCB2YWx1ZSApID09PSB2YWx1ZTtcblxuXHR9O1xuXG59XG5cbi8vXG5cbmlmICggTWF0aC5zaWduID09PSB1bmRlZmluZWQgKSB7XG5cblx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9zaWduXG5cblx0TWF0aC5zaWduID0gZnVuY3Rpb24gKCB4ICkge1xuXG5cdFx0cmV0dXJuICggeCA8IDAgKSA/IC0gMSA6ICggeCA+IDAgKSA/IDEgOiArIHg7XG5cblx0fTtcblxufVxuXG5pZiAoICduYW1lJyBpbiBGdW5jdGlvbi5wcm90b3R5cGUgPT09IGZhbHNlICkge1xuXG5cdC8vIE1pc3NpbmcgaW4gSUVcblx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vbmFtZVxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggRnVuY3Rpb24ucHJvdG90eXBlLCAnbmFtZScsIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy50b1N0cmluZygpLm1hdGNoKCAvXlxccypmdW5jdGlvblxccyooW15cXChcXHNdKikvIClbIDEgXTtcblxuXHRcdH1cblxuXHR9ICk7XG5cbn1cblxuaWYgKCBPYmplY3QuYXNzaWduID09PSB1bmRlZmluZWQgKSB7XG5cblx0Ly8gTWlzc2luZyBpbiBJRVxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXG5cblx0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoICdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG91dHB1dCA9IE9iamVjdCggdGFyZ2V0ICk7XG5cblx0XHRcdGZvciAoIHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXggKysgKSB7XG5cblx0XHRcdFx0dmFyIHNvdXJjZSA9IGFyZ3VtZW50c1sgaW5kZXggXTtcblxuXHRcdFx0XHRpZiAoIHNvdXJjZSAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBuZXh0S2V5IGluIHNvdXJjZSApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoIHNvdXJjZSwgbmV4dEtleSApICkge1xuXG5cdFx0XHRcdFx0XHRcdG91dHB1dFsgbmV4dEtleSBdID0gc291cmNlWyBuZXh0S2V5IF07XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG91dHB1dDtcblxuXHRcdH07XG5cblx0fSApKCk7XG5cbn1cblxuLyoqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL2V2ZW50ZGlzcGF0Y2hlci5qcy9cbiAqL1xuXG5mdW5jdGlvbiBFdmVudERpc3BhdGNoZXIoKSB7fVxuXG5PYmplY3QuYXNzaWduKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLCB7XG5cblx0YWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSB0aGlzLl9saXN0ZW5lcnMgPSB7fTtcblxuXHRcdHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG5cblx0XHRpZiAoIGxpc3RlbmVyc1sgdHlwZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGxpc3RlbmVyc1sgdHlwZSBdID0gW107XG5cblx0XHR9XG5cblx0XHRpZiAoIGxpc3RlbmVyc1sgdHlwZSBdLmluZGV4T2YoIGxpc3RlbmVyICkgPT09IC0gMSApIHtcblxuXHRcdFx0bGlzdGVuZXJzWyB0eXBlIF0ucHVzaCggbGlzdGVuZXIgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGhhc0V2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICggdHlwZSwgbGlzdGVuZXIgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblxuXHRcdHJldHVybiBsaXN0ZW5lcnNbIHR5cGUgXSAhPT0gdW5kZWZpbmVkICYmIGxpc3RlbmVyc1sgdHlwZSBdLmluZGV4T2YoIGxpc3RlbmVyICkgIT09IC0gMTtcblxuXHR9LFxuXG5cdHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICggdHlwZSwgbGlzdGVuZXIgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblx0XHR2YXIgbGlzdGVuZXJBcnJheSA9IGxpc3RlbmVyc1sgdHlwZSBdO1xuXG5cdFx0aWYgKCBsaXN0ZW5lckFycmF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBpbmRleCA9IGxpc3RlbmVyQXJyYXkuaW5kZXhPZiggbGlzdGVuZXIgKTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gLSAxICkge1xuXG5cdFx0XHRcdGxpc3RlbmVyQXJyYXkuc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG5cdFx0dmFyIGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbIGV2ZW50LnR5cGUgXTtcblxuXHRcdGlmICggbGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRldmVudC50YXJnZXQgPSB0aGlzO1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBsaXN0ZW5lckFycmF5LnNsaWNlKCAwICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0YXJyYXlbIGkgXS5jYWxsKCB0aGlzLCBldmVudCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbnZhciBSRVZJU0lPTiA9ICc5Mic7XG52YXIgTU9VU0UgPSB7IExFRlQ6IDAsIE1JRERMRTogMSwgUklHSFQ6IDIgfTtcbnZhciBDdWxsRmFjZU5vbmUgPSAwO1xudmFyIEN1bGxGYWNlQmFjayA9IDE7XG52YXIgQ3VsbEZhY2VGcm9udCA9IDI7XG52YXIgUENGU2hhZG93TWFwID0gMTtcbnZhciBQQ0ZTb2Z0U2hhZG93TWFwID0gMjtcbnZhciBGcm9udFNpZGUgPSAwO1xudmFyIEJhY2tTaWRlID0gMTtcbnZhciBEb3VibGVTaWRlID0gMjtcbnZhciBGbGF0U2hhZGluZyA9IDE7XG52YXIgTm9Db2xvcnMgPSAwO1xudmFyIEZhY2VDb2xvcnMgPSAxO1xudmFyIFZlcnRleENvbG9ycyA9IDI7XG52YXIgTm9CbGVuZGluZyA9IDA7XG52YXIgTm9ybWFsQmxlbmRpbmcgPSAxO1xudmFyIEFkZGl0aXZlQmxlbmRpbmcgPSAyO1xudmFyIFN1YnRyYWN0aXZlQmxlbmRpbmcgPSAzO1xudmFyIE11bHRpcGx5QmxlbmRpbmcgPSA0O1xudmFyIEN1c3RvbUJsZW5kaW5nID0gNTtcbnZhciBBZGRFcXVhdGlvbiA9IDEwMDtcbnZhciBTdWJ0cmFjdEVxdWF0aW9uID0gMTAxO1xudmFyIFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uID0gMTAyO1xudmFyIE1pbkVxdWF0aW9uID0gMTAzO1xudmFyIE1heEVxdWF0aW9uID0gMTA0O1xudmFyIFplcm9GYWN0b3IgPSAyMDA7XG52YXIgT25lRmFjdG9yID0gMjAxO1xudmFyIFNyY0NvbG9yRmFjdG9yID0gMjAyO1xudmFyIE9uZU1pbnVzU3JjQ29sb3JGYWN0b3IgPSAyMDM7XG52YXIgU3JjQWxwaGFGYWN0b3IgPSAyMDQ7XG52YXIgT25lTWludXNTcmNBbHBoYUZhY3RvciA9IDIwNTtcbnZhciBEc3RBbHBoYUZhY3RvciA9IDIwNjtcbnZhciBPbmVNaW51c0RzdEFscGhhRmFjdG9yID0gMjA3O1xudmFyIERzdENvbG9yRmFjdG9yID0gMjA4O1xudmFyIE9uZU1pbnVzRHN0Q29sb3JGYWN0b3IgPSAyMDk7XG52YXIgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciA9IDIxMDtcbnZhciBOZXZlckRlcHRoID0gMDtcbnZhciBBbHdheXNEZXB0aCA9IDE7XG52YXIgTGVzc0RlcHRoID0gMjtcbnZhciBMZXNzRXF1YWxEZXB0aCA9IDM7XG52YXIgRXF1YWxEZXB0aCA9IDQ7XG52YXIgR3JlYXRlckVxdWFsRGVwdGggPSA1O1xudmFyIEdyZWF0ZXJEZXB0aCA9IDY7XG52YXIgTm90RXF1YWxEZXB0aCA9IDc7XG52YXIgTXVsdGlwbHlPcGVyYXRpb24gPSAwO1xudmFyIE1peE9wZXJhdGlvbiA9IDE7XG52YXIgQWRkT3BlcmF0aW9uID0gMjtcbnZhciBOb1RvbmVNYXBwaW5nID0gMDtcbnZhciBMaW5lYXJUb25lTWFwcGluZyA9IDE7XG52YXIgUmVpbmhhcmRUb25lTWFwcGluZyA9IDI7XG52YXIgVW5jaGFydGVkMlRvbmVNYXBwaW5nID0gMztcbnZhciBDaW5lb25Ub25lTWFwcGluZyA9IDQ7XG52YXIgVVZNYXBwaW5nID0gMzAwO1xudmFyIEN1YmVSZWZsZWN0aW9uTWFwcGluZyA9IDMwMTtcbnZhciBDdWJlUmVmcmFjdGlvbk1hcHBpbmcgPSAzMDI7XG52YXIgRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDM7XG52YXIgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcgPSAzMDQ7XG52YXIgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDU7XG52YXIgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDY7XG52YXIgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcgPSAzMDc7XG52YXIgUmVwZWF0V3JhcHBpbmcgPSAxMDAwO1xudmFyIENsYW1wVG9FZGdlV3JhcHBpbmcgPSAxMDAxO1xudmFyIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgPSAxMDAyO1xudmFyIE5lYXJlc3RGaWx0ZXIgPSAxMDAzO1xudmFyIE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNDtcbnZhciBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyID0gMTAwNTtcbnZhciBMaW5lYXJGaWx0ZXIgPSAxMDA2O1xudmFyIExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIgPSAxMDA3O1xudmFyIExpbmVhck1pcE1hcExpbmVhckZpbHRlciA9IDEwMDg7XG52YXIgVW5zaWduZWRCeXRlVHlwZSA9IDEwMDk7XG52YXIgQnl0ZVR5cGUgPSAxMDEwO1xudmFyIFNob3J0VHlwZSA9IDEwMTE7XG52YXIgVW5zaWduZWRTaG9ydFR5cGUgPSAxMDEyO1xudmFyIEludFR5cGUgPSAxMDEzO1xudmFyIFVuc2lnbmVkSW50VHlwZSA9IDEwMTQ7XG52YXIgRmxvYXRUeXBlID0gMTAxNTtcbnZhciBIYWxmRmxvYXRUeXBlID0gMTAxNjtcbnZhciBVbnNpZ25lZFNob3J0NDQ0NFR5cGUgPSAxMDE3O1xudmFyIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSA9IDEwMTg7XG52YXIgVW5zaWduZWRTaG9ydDU2NVR5cGUgPSAxMDE5O1xudmFyIFVuc2lnbmVkSW50MjQ4VHlwZSA9IDEwMjA7XG52YXIgQWxwaGFGb3JtYXQgPSAxMDIxO1xudmFyIFJHQkZvcm1hdCA9IDEwMjI7XG52YXIgUkdCQUZvcm1hdCA9IDEwMjM7XG52YXIgTHVtaW5hbmNlRm9ybWF0ID0gMTAyNDtcbnZhciBMdW1pbmFuY2VBbHBoYUZvcm1hdCA9IDEwMjU7XG52YXIgRGVwdGhGb3JtYXQgPSAxMDI2O1xudmFyIERlcHRoU3RlbmNpbEZvcm1hdCA9IDEwMjc7XG52YXIgUkdCX1MzVENfRFhUMV9Gb3JtYXQgPSAzMzc3NjtcbnZhciBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgPSAzMzc3NztcbnZhciBSR0JBX1MzVENfRFhUM19Gb3JtYXQgPSAzMzc3ODtcbnZhciBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgPSAzMzc3OTtcbnZhciBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCA9IDM1ODQwO1xudmFyIFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ID0gMzU4NDE7XG52YXIgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0ID0gMzU4NDI7XG52YXIgUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ID0gMzU4NDM7XG52YXIgUkdCX0VUQzFfRm9ybWF0ID0gMzYxOTY7XG52YXIgUkdCQV9BU1RDXzR4NF9Gb3JtYXQgPSAzNzgwODtcbnZhciBSR0JBX0FTVENfNXg0X0Zvcm1hdCA9IDM3ODA5O1xudmFyIFJHQkFfQVNUQ181eDVfRm9ybWF0ID0gMzc4MTA7XG52YXIgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgPSAzNzgxMTtcbnZhciBSR0JBX0FTVENfNng2X0Zvcm1hdCA9IDM3ODEyO1xudmFyIFJHQkFfQVNUQ184eDVfRm9ybWF0ID0gMzc4MTM7XG52YXIgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQgPSAzNzgxNDtcbnZhciBSR0JBX0FTVENfOHg4X0Zvcm1hdCA9IDM3ODE1O1xudmFyIFJHQkFfQVNUQ18xMHg1X0Zvcm1hdCA9IDM3ODE2O1xudmFyIFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCA9IDM3ODE3O1xudmFyIFJHQkFfQVNUQ18xMHg4X0Zvcm1hdCA9IDM3ODE4O1xudmFyIFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQgPSAzNzgxOTtcbnZhciBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0ID0gMzc4MjA7XG52YXIgUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCA9IDM3ODIxO1xudmFyIExvb3BPbmNlID0gMjIwMDtcbnZhciBMb29wUmVwZWF0ID0gMjIwMTtcbnZhciBMb29wUGluZ1BvbmcgPSAyMjAyO1xudmFyIEludGVycG9sYXRlRGlzY3JldGUgPSAyMzAwO1xudmFyIEludGVycG9sYXRlTGluZWFyID0gMjMwMTtcbnZhciBJbnRlcnBvbGF0ZVNtb290aCA9IDIzMDI7XG52YXIgWmVyb0N1cnZhdHVyZUVuZGluZyA9IDI0MDA7XG52YXIgWmVyb1Nsb3BlRW5kaW5nID0gMjQwMTtcbnZhciBXcmFwQXJvdW5kRW5kaW5nID0gMjQwMjtcbnZhciBUcmlhbmdsZXNEcmF3TW9kZSA9IDA7XG52YXIgVHJpYW5nbGVTdHJpcERyYXdNb2RlID0gMTtcbnZhciBUcmlhbmdsZUZhbkRyYXdNb2RlID0gMjtcbnZhciBMaW5lYXJFbmNvZGluZyA9IDMwMDA7XG52YXIgc1JHQkVuY29kaW5nID0gMzAwMTtcbnZhciBHYW1tYUVuY29kaW5nID0gMzAwNztcbnZhciBSR0JFRW5jb2RpbmcgPSAzMDAyO1xudmFyIFJHQk03RW5jb2RpbmcgPSAzMDA0O1xudmFyIFJHQk0xNkVuY29kaW5nID0gMzAwNTtcbnZhciBSR0JERW5jb2RpbmcgPSAzMDA2O1xudmFyIEJhc2ljRGVwdGhQYWNraW5nID0gMzIwMDtcbnZhciBSR0JBRGVwdGhQYWNraW5nID0gMzIwMTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgX01hdGggPSB7XG5cblx0REVHMlJBRDogTWF0aC5QSSAvIDE4MCxcblx0UkFEMkRFRzogMTgwIC8gTWF0aC5QSSxcblxuXHRnZW5lcmF0ZVVVSUQ6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDUwMzQvaG93LXRvLWNyZWF0ZS1hLWd1aWQtdXVpZC1pbi1qYXZhc2NyaXB0LzIxOTYzMTM2IzIxOTYzMTM2XG5cblx0XHR2YXIgbHV0ID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCAyNTY7IGkgKysgKSB7XG5cblx0XHRcdGx1dFsgaSBdID0gKCBpIDwgMTYgPyAnMCcgOiAnJyApICsgKCBpICkudG9TdHJpbmcoIDE2ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKCkge1xuXG5cdFx0XHR2YXIgZDAgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XG5cdFx0XHR2YXIgZDEgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XG5cdFx0XHR2YXIgZDIgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XG5cdFx0XHR2YXIgZDMgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XG5cdFx0XHR2YXIgdXVpZCA9IGx1dFsgZDAgJiAweGZmIF0gKyBsdXRbIGQwID4+IDggJiAweGZmIF0gKyBsdXRbIGQwID4+IDE2ICYgMHhmZiBdICsgbHV0WyBkMCA+PiAyNCAmIDB4ZmYgXSArICctJyArXG5cdFx0XHRcdGx1dFsgZDEgJiAweGZmIF0gKyBsdXRbIGQxID4+IDggJiAweGZmIF0gKyAnLScgKyBsdXRbIGQxID4+IDE2ICYgMHgwZiB8IDB4NDAgXSArIGx1dFsgZDEgPj4gMjQgJiAweGZmIF0gKyAnLScgK1xuXHRcdFx0XHRsdXRbIGQyICYgMHgzZiB8IDB4ODAgXSArIGx1dFsgZDIgPj4gOCAmIDB4ZmYgXSArICctJyArIGx1dFsgZDIgPj4gMTYgJiAweGZmIF0gKyBsdXRbIGQyID4+IDI0ICYgMHhmZiBdICtcblx0XHRcdFx0bHV0WyBkMyAmIDB4ZmYgXSArIGx1dFsgZDMgPj4gOCAmIDB4ZmYgXSArIGx1dFsgZDMgPj4gMTYgJiAweGZmIF0gKyBsdXRbIGQzID4+IDI0ICYgMHhmZiBdO1xuXG5cdFx0XHQvLyAudG9VcHBlckNhc2UoKSBoZXJlIGZsYXR0ZW5zIGNvbmNhdGVuYXRlZCBzdHJpbmdzIHRvIHNhdmUgaGVhcCBtZW1vcnkgc3BhY2UuXG5cdFx0XHRyZXR1cm4gdXVpZC50b1VwcGVyQ2FzZSgpO1xuXG5cdFx0fTtcblxuXHR9ICkoKSxcblxuXHRjbGFtcDogZnVuY3Rpb24gKCB2YWx1ZSwgbWluLCBtYXggKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgdmFsdWUgKSApO1xuXG5cdH0sXG5cblx0Ly8gY29tcHV0ZSBldWNsaWRpYW4gbW9kdWxvIG9mIG0gJSBuXG5cdC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01vZHVsb19vcGVyYXRpb25cblxuXHRldWNsaWRlYW5Nb2R1bG86IGZ1bmN0aW9uICggbiwgbSApIHtcblxuXHRcdHJldHVybiAoICggbiAlIG0gKSArIG0gKSAlIG07XG5cblx0fSxcblxuXHQvLyBMaW5lYXIgbWFwcGluZyBmcm9tIHJhbmdlIDxhMSwgYTI+IHRvIHJhbmdlIDxiMSwgYjI+XG5cblx0bWFwTGluZWFyOiBmdW5jdGlvbiAoIHgsIGExLCBhMiwgYjEsIGIyICkge1xuXG5cdFx0cmV0dXJuIGIxICsgKCB4IC0gYTEgKSAqICggYjIgLSBiMSApIC8gKCBhMiAtIGExICk7XG5cblx0fSxcblxuXHQvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaW5lYXJfaW50ZXJwb2xhdGlvblxuXG5cdGxlcnA6IGZ1bmN0aW9uICggeCwgeSwgdCApIHtcblxuXHRcdHJldHVybiAoIDEgLSB0ICkgKiB4ICsgdCAqIHk7XG5cblx0fSxcblxuXHQvLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Ntb290aHN0ZXBcblxuXHRzbW9vdGhzdGVwOiBmdW5jdGlvbiAoIHgsIG1pbiwgbWF4ICkge1xuXG5cdFx0aWYgKCB4IDw9IG1pbiApIHJldHVybiAwO1xuXHRcdGlmICggeCA+PSBtYXggKSByZXR1cm4gMTtcblxuXHRcdHggPSAoIHggLSBtaW4gKSAvICggbWF4IC0gbWluICk7XG5cblx0XHRyZXR1cm4geCAqIHggKiAoIDMgLSAyICogeCApO1xuXG5cdH0sXG5cblx0c21vb3RoZXJzdGVwOiBmdW5jdGlvbiAoIHgsIG1pbiwgbWF4ICkge1xuXG5cdFx0aWYgKCB4IDw9IG1pbiApIHJldHVybiAwO1xuXHRcdGlmICggeCA+PSBtYXggKSByZXR1cm4gMTtcblxuXHRcdHggPSAoIHggLSBtaW4gKSAvICggbWF4IC0gbWluICk7XG5cblx0XHRyZXR1cm4geCAqIHggKiB4ICogKCB4ICogKCB4ICogNiAtIDE1ICkgKyAxMCApO1xuXG5cdH0sXG5cblx0Ly8gUmFuZG9tIGludGVnZXIgZnJvbSA8bG93LCBoaWdoPiBpbnRlcnZhbFxuXG5cdHJhbmRJbnQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkge1xuXG5cdFx0cmV0dXJuIGxvdyArIE1hdGguZmxvb3IoIE1hdGgucmFuZG9tKCkgKiAoIGhpZ2ggLSBsb3cgKyAxICkgKTtcblxuXHR9LFxuXG5cdC8vIFJhbmRvbSBmbG9hdCBmcm9tIDxsb3csIGhpZ2g+IGludGVydmFsXG5cblx0cmFuZEZsb2F0OiBmdW5jdGlvbiAoIGxvdywgaGlnaCApIHtcblxuXHRcdHJldHVybiBsb3cgKyBNYXRoLnJhbmRvbSgpICogKCBoaWdoIC0gbG93ICk7XG5cblx0fSxcblxuXHQvLyBSYW5kb20gZmxvYXQgZnJvbSA8LXJhbmdlLzIsIHJhbmdlLzI+IGludGVydmFsXG5cblx0cmFuZEZsb2F0U3ByZWFkOiBmdW5jdGlvbiAoIHJhbmdlICkge1xuXG5cdFx0cmV0dXJuIHJhbmdlICogKCAwLjUgLSBNYXRoLnJhbmRvbSgpICk7XG5cblx0fSxcblxuXHRkZWdUb1JhZDogZnVuY3Rpb24gKCBkZWdyZWVzICkge1xuXG5cdFx0cmV0dXJuIGRlZ3JlZXMgKiBfTWF0aC5ERUcyUkFEO1xuXG5cdH0sXG5cblx0cmFkVG9EZWc6IGZ1bmN0aW9uICggcmFkaWFucyApIHtcblxuXHRcdHJldHVybiByYWRpYW5zICogX01hdGguUkFEMkRFRztcblxuXHR9LFxuXG5cdGlzUG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHJldHVybiAoIHZhbHVlICYgKCB2YWx1ZSAtIDEgKSApID09PSAwICYmIHZhbHVlICE9PSAwO1xuXG5cdH0sXG5cblx0Y2VpbFBvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5wb3coIDIsIE1hdGguY2VpbCggTWF0aC5sb2coIHZhbHVlICkgLyBNYXRoLkxOMiApICk7XG5cblx0fSxcblxuXHRmbG9vclBvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5wb3coIDIsIE1hdGguZmxvb3IoIE1hdGgubG9nKCB2YWx1ZSApIC8gTWF0aC5MTjIgKSApO1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3IgZWdyYWV0aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yMiggeCwgeSApIHtcblxuXHR0aGlzLnggPSB4IHx8IDA7XG5cdHRoaXMueSA9IHkgfHwgMDtcblxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggVmVjdG9yMi5wcm90b3R5cGUsIHtcblxuXHRcIndpZHRoXCI6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy54O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy54ID0gdmFsdWU7XG5cblx0XHR9XG5cblx0fSxcblxuXHRcImhlaWdodFwiOiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMueTtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMueSA9IHZhbHVlO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBWZWN0b3IyLnByb3RvdHlwZSwge1xuXG5cdGlzVmVjdG9yMjogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHRoaXMueCA9IHg7XG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCA9IHNjYWxhcjtcblx0XHR0aGlzLnkgPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggeCApIHtcblxuXHRcdHRoaXMueCA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFk6IGZ1bmN0aW9uICggeSApIHtcblxuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCwgdmFsdWUgKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiB0aGlzLnggPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnkgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IHYueDtcblx0XHR0aGlzLnkgPSB2Lnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHM7XG5cdFx0dGhpcy55ICs9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHRoaXMueCA9IGEueCArIGIueDtcblx0XHR0aGlzLnkgPSBhLnkgKyBiLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YlNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy54IC09IHM7XG5cdFx0dGhpcy55IC09IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YlZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHRoaXMueCA9IGEueCAtIGIueDtcblx0XHR0aGlzLnkgPSBhLnkgLSBiLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggKj0gdi54O1xuXHRcdHRoaXMueSAqPSB2Lnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCAqPSBzY2FsYXI7XG5cdFx0dGhpcy55ICo9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggLz0gdi54O1xuXHRcdHRoaXMueSAvPSB2Lnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpdmlkZVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggMSAvIHNjYWxhciApO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXgzOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueTtcblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgMyBdICogeSArIGVbIDYgXTtcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDcgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWluOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWF4OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHQvLyBhc3N1bWVzIG1pbiA8IG1heCwgY29tcG9uZW50d2lzZVxuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIG1pbi54LCBNYXRoLm1pbiggbWF4LngsIHRoaXMueCApICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWluID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgbWF4ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHRcdG1pbi5zZXQoIG1pblZhbCwgbWluVmFsICk7XG5cdFx0XHRtYXguc2V0KCBtYXhWYWwsIG1heFZhbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jbGFtcCggbWluLCBtYXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsYW1wTGVuZ3RoOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIGxlbmd0aCB8fCAxICkubXVsdGlwbHlTY2FsYXIoIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIGxlbmd0aCApICkgKTtcblxuXHR9LFxuXG5cdGZsb29yOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2VpbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5jZWlsKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kVG9aZXJvOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAtIHRoaXMueDtcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55O1xuXG5cdH0sXG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnk7XG5cblx0fSxcblxuXHRsZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSApO1xuXG5cdH0sXG5cblx0bWFuaGF0dGFuTGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgfHwgMSApO1xuXG5cdH0sXG5cblx0YW5nbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGNvbXB1dGVzIHRoZSBhbmdsZSBpbiByYWRpYW5zIHdpdGggcmVzcGVjdCB0byB0aGUgcG9zaXRpdmUgeC1heGlzXG5cblx0XHR2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKCB0aGlzLnksIHRoaXMueCApO1xuXG5cdFx0aWYgKCBhbmdsZSA8IDAgKSBhbmdsZSArPSAyICogTWF0aC5QSTtcblxuXHRcdHJldHVybiBhbmdsZTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1NxdWFyZWQ6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHZhciBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlzLnkgLSB2Lnk7XG5cdFx0cmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xuXG5cdH0sXG5cblx0bWFuaGF0dGFuRGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggLSB2LnggKSArIE1hdGguYWJzKCB0aGlzLnkgLSB2LnkgKTtcblxuXHR9LFxuXG5cdHNldExlbmd0aDogZnVuY3Rpb24gKCBsZW5ndGggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwVmVjdG9yczogZnVuY3Rpb24gKCB2MSwgdjIsIGFscGhhICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdjIsIHYxICkubXVsdGlwbHlTY2FsYXIoIGFscGhhICkuYWRkKCB2MSApO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICk7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy54ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMueSA9IGFycmF5WyBvZmZzZXQgKyAxIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xuXHRcdHRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVBcm91bmQ6IGZ1bmN0aW9uICggY2VudGVyLCBhbmdsZSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIGFuZ2xlICksIHMgPSBNYXRoLnNpbiggYW5nbGUgKTtcblxuXHRcdHZhciB4ID0gdGhpcy54IC0gY2VudGVyLng7XG5cdFx0dmFyIHkgPSB0aGlzLnkgLSBjZW50ZXIueTtcblxuXHRcdHRoaXMueCA9IHggKiBjIC0geSAqIHMgKyBjZW50ZXIueDtcblx0XHR0aGlzLnkgPSB4ICogcyArIHkgKiBjICsgY2VudGVyLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBzdXBlcmVnZ2JlcnQgLyBodHRwOi8vd3d3LnBhdWxicnVudC5jby51ay9cbiAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvXG4gKiBAYXV0aG9yIGpvcmRpX3JvcyAvIGh0dHA6Ly9wbGF0dHNvZnQuY29tXG4gKiBAYXV0aG9yIEQxcGxvMWQgLyBodHRwOi8vZ2l0aHViLmNvbS9EMXBsbzFkXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgdGlta25pcCAvIGh0dHA6Ly93d3cuZmxvb3JwbGFubmVyLmNvbS9cbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIE1hdHJpeDQoKSB7XG5cblx0dGhpcy5lbGVtZW50cyA9IFtcblxuXHRcdDEsIDAsIDAsIDAsXG5cdFx0MCwgMSwgMCwgMCxcblx0XHQwLCAwLCAxLCAwLFxuXHRcdDAsIDAsIDAsIDFcblxuXHRdO1xuXG5cdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4nICk7XG5cblx0fVxuXG59XG5cbk9iamVjdC5hc3NpZ24oIE1hdHJpeDQucHJvdG90eXBlLCB7XG5cblx0aXNNYXRyaXg0OiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCBuMTEsIG4xMiwgbjEzLCBuMTQsIG4yMSwgbjIyLCBuMjMsIG4yNCwgbjMxLCBuMzIsIG4zMywgbjM0LCBuNDEsIG40MiwgbjQzLCBuNDQgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG4xMTsgdGVbIDQgXSA9IG4xMjsgdGVbIDggXSA9IG4xMzsgdGVbIDEyIF0gPSBuMTQ7XG5cdFx0dGVbIDEgXSA9IG4yMTsgdGVbIDUgXSA9IG4yMjsgdGVbIDkgXSA9IG4yMzsgdGVbIDEzIF0gPSBuMjQ7XG5cdFx0dGVbIDIgXSA9IG4zMTsgdGVbIDYgXSA9IG4zMjsgdGVbIDEwIF0gPSBuMzM7IHRlWyAxNCBdID0gbjM0O1xuXHRcdHRlWyAzIF0gPSBuNDE7IHRlWyA3IF0gPSBuNDI7IHRlWyAxMSBdID0gbjQzOyB0ZVsgMTUgXSA9IG40NDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aWRlbnRpdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQxLCAwLCAwLCAwLFxuXHRcdFx0MCwgMSwgMCwgMCxcblx0XHRcdDAsIDAsIDEsIDAsXG5cdFx0XHQwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyBNYXRyaXg0KCkuZnJvbUFycmF5KCB0aGlzLmVsZW1lbnRzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbWVbIDAgXTsgdGVbIDEgXSA9IG1lWyAxIF07IHRlWyAyIF0gPSBtZVsgMiBdOyB0ZVsgMyBdID0gbWVbIDMgXTtcblx0XHR0ZVsgNCBdID0gbWVbIDQgXTsgdGVbIDUgXSA9IG1lWyA1IF07IHRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBdID0gbWVbIDcgXTtcblx0XHR0ZVsgOCBdID0gbWVbIDggXTsgdGVbIDkgXSA9IG1lWyA5IF07IHRlWyAxMCBdID0gbWVbIDEwIF07IHRlWyAxMSBdID0gbWVbIDExIF07XG5cdFx0dGVbIDEyIF0gPSBtZVsgMTIgXTsgdGVbIDEzIF0gPSBtZVsgMTMgXTsgdGVbIDE0IF0gPSBtZVsgMTQgXTsgdGVbIDE1IF0gPSBtZVsgMTUgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVBvc2l0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzLCBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0ZVsgMTIgXSA9IG1lWyAxMiBdO1xuXHRcdHRlWyAxMyBdID0gbWVbIDEzIF07XG5cdFx0dGVbIDE0IF0gPSBtZVsgMTQgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXh0cmFjdEJhc2lzOiBmdW5jdGlvbiAoIHhBeGlzLCB5QXhpcywgekF4aXMgKSB7XG5cblx0XHR4QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAwICk7XG5cdFx0eUF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMSApO1xuXHRcdHpBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZUJhc2lzOiBmdW5jdGlvbiAoIHhBeGlzLCB5QXhpcywgekF4aXMgKSB7XG5cblx0XHR0aGlzLnNldChcblx0XHRcdHhBeGlzLngsIHlBeGlzLngsIHpBeGlzLngsIDAsXG5cdFx0XHR4QXhpcy55LCB5QXhpcy55LCB6QXhpcy55LCAwLFxuXHRcdFx0eEF4aXMueiwgeUF4aXMueiwgekF4aXMueiwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHRyYWN0Um90YXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZXh0cmFjdFJvdGF0aW9uKCBtICkge1xuXG5cdFx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdFx0dmFyIG1lID0gbS5lbGVtZW50cztcblxuXHRcdFx0dmFyIHNjYWxlWCA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAwICkubGVuZ3RoKCk7XG5cdFx0XHR2YXIgc2NhbGVZID0gMSAvIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDEgKS5sZW5ndGgoKTtcblx0XHRcdHZhciBzY2FsZVogPSAxIC8gdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMiApLmxlbmd0aCgpO1xuXG5cdFx0XHR0ZVsgMCBdID0gbWVbIDAgXSAqIHNjYWxlWDtcblx0XHRcdHRlWyAxIF0gPSBtZVsgMSBdICogc2NhbGVYO1xuXHRcdFx0dGVbIDIgXSA9IG1lWyAyIF0gKiBzY2FsZVg7XG5cblx0XHRcdHRlWyA0IF0gPSBtZVsgNCBdICogc2NhbGVZO1xuXHRcdFx0dGVbIDUgXSA9IG1lWyA1IF0gKiBzY2FsZVk7XG5cdFx0XHR0ZVsgNiBdID0gbWVbIDYgXSAqIHNjYWxlWTtcblxuXHRcdFx0dGVbIDggXSA9IG1lWyA4IF0gKiBzY2FsZVo7XG5cdFx0XHR0ZVsgOSBdID0gbWVbIDkgXSAqIHNjYWxlWjtcblx0XHRcdHRlWyAxMCBdID0gbWVbIDEwIF0gKiBzY2FsZVo7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bWFrZVJvdGF0aW9uRnJvbUV1bGVyOiBmdW5jdGlvbiAoIGV1bGVyICkge1xuXG5cdFx0aWYgKCAhICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLm1ha2VSb3RhdGlvbkZyb21FdWxlcigpIG5vdyBleHBlY3RzIGEgRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHR9XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIHggPSBldWxlci54LCB5ID0gZXVsZXIueSwgeiA9IGV1bGVyLno7XG5cdFx0dmFyIGEgPSBNYXRoLmNvcyggeCApLCBiID0gTWF0aC5zaW4oIHggKTtcblx0XHR2YXIgYyA9IE1hdGguY29zKCB5ICksIGQgPSBNYXRoLnNpbiggeSApO1xuXHRcdHZhciBlID0gTWF0aC5jb3MoIHogKSwgZiA9IE1hdGguc2luKCB6ICk7XG5cblx0XHRpZiAoIGV1bGVyLm9yZGVyID09PSAnWFlaJyApIHtcblxuXHRcdFx0dmFyIGFlID0gYSAqIGUsIGFmID0gYSAqIGYsIGJlID0gYiAqIGUsIGJmID0gYiAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSAtIGMgKiBmO1xuXHRcdFx0dGVbIDggXSA9IGQ7XG5cblx0XHRcdHRlWyAxIF0gPSBhZiArIGJlICogZDtcblx0XHRcdHRlWyA1IF0gPSBhZSAtIGJmICogZDtcblx0XHRcdHRlWyA5IF0gPSAtIGIgKiBjO1xuXG5cdFx0XHR0ZVsgMiBdID0gYmYgLSBhZSAqIGQ7XG5cdFx0XHR0ZVsgNiBdID0gYmUgKyBhZiAqIGQ7XG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHR2YXIgY2UgPSBjICogZSwgY2YgPSBjICogZiwgZGUgPSBkICogZSwgZGYgPSBkICogZjtcblxuXHRcdFx0dGVbIDAgXSA9IGNlICsgZGYgKiBiO1xuXHRcdFx0dGVbIDQgXSA9IGRlICogYiAtIGNmO1xuXHRcdFx0dGVbIDggXSA9IGEgKiBkO1xuXG5cdFx0XHR0ZVsgMSBdID0gYSAqIGY7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gLSBiO1xuXG5cdFx0XHR0ZVsgMiBdID0gY2YgKiBiIC0gZGU7XG5cdFx0XHR0ZVsgNiBdID0gZGYgKyBjZSAqIGI7XG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdaWFknICkge1xuXG5cdFx0XHR2YXIgY2UgPSBjICogZSwgY2YgPSBjICogZiwgZGUgPSBkICogZSwgZGYgPSBkICogZjtcblxuXHRcdFx0dGVbIDAgXSA9IGNlIC0gZGYgKiBiO1xuXHRcdFx0dGVbIDQgXSA9IC0gYSAqIGY7XG5cdFx0XHR0ZVsgOCBdID0gZGUgKyBjZiAqIGI7XG5cblx0XHRcdHRlWyAxIF0gPSBjZiArIGRlICogYjtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSBkZiAtIGNlICogYjtcblxuXHRcdFx0dGVbIDIgXSA9IC0gYSAqIGQ7XG5cdFx0XHR0ZVsgNiBdID0gYjtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1pZWCcgKSB7XG5cblx0XHRcdHZhciBhZSA9IGEgKiBlLCBhZiA9IGEgKiBmLCBiZSA9IGIgKiBlLCBiZiA9IGIgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XG5cdFx0XHR0ZVsgNCBdID0gYmUgKiBkIC0gYWY7XG5cdFx0XHR0ZVsgOCBdID0gYWUgKiBkICsgYmY7XG5cblx0XHRcdHRlWyAxIF0gPSBjICogZjtcblx0XHRcdHRlWyA1IF0gPSBiZiAqIGQgKyBhZTtcblx0XHRcdHRlWyA5IF0gPSBhZiAqIGQgLSBiZTtcblxuXHRcdFx0dGVbIDIgXSA9IC0gZDtcblx0XHRcdHRlWyA2IF0gPSBiICogYztcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1laWCcgKSB7XG5cblx0XHRcdHZhciBhYyA9IGEgKiBjLCBhZCA9IGEgKiBkLCBiYyA9IGIgKiBjLCBiZCA9IGIgKiBkO1xuXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XG5cdFx0XHR0ZVsgNCBdID0gYmQgLSBhYyAqIGY7XG5cdFx0XHR0ZVsgOCBdID0gYmMgKiBmICsgYWQ7XG5cblx0XHRcdHRlWyAxIF0gPSBmO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IC0gYiAqIGU7XG5cblx0XHRcdHRlWyAyIF0gPSAtIGQgKiBlO1xuXHRcdFx0dGVbIDYgXSA9IGFkICogZiArIGJjO1xuXHRcdFx0dGVbIDEwIF0gPSBhYyAtIGJkICogZjtcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWFpZJyApIHtcblxuXHRcdFx0dmFyIGFjID0gYSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSAtIGY7XG5cdFx0XHR0ZVsgOCBdID0gZCAqIGU7XG5cblx0XHRcdHRlWyAxIF0gPSBhYyAqIGYgKyBiZDtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSBhZCAqIGYgLSBiYztcblxuXHRcdFx0dGVbIDIgXSA9IGJjICogZiAtIGFkO1xuXHRcdFx0dGVbIDYgXSA9IGIgKiBlO1xuXHRcdFx0dGVbIDEwIF0gPSBiZCAqIGYgKyBhYztcblxuXHRcdH1cblxuXHRcdC8vIGxhc3QgY29sdW1uXG5cdFx0dGVbIDMgXSA9IDA7XG5cdFx0dGVbIDcgXSA9IDA7XG5cdFx0dGVbIDExIF0gPSAwO1xuXG5cdFx0Ly8gYm90dG9tIHJvd1xuXHRcdHRlWyAxMiBdID0gMDtcblx0XHR0ZVsgMTMgXSA9IDA7XG5cdFx0dGVbIDE0IF0gPSAwO1xuXHRcdHRlWyAxNSBdID0gMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgeCA9IHEuX3gsIHkgPSBxLl95LCB6ID0gcS5feiwgdyA9IHEuX3c7XG5cdFx0dmFyIHgyID0geCArIHgsIHkyID0geSArIHksIHoyID0geiArIHo7XG5cdFx0dmFyIHh4ID0geCAqIHgyLCB4eSA9IHggKiB5MiwgeHogPSB4ICogejI7XG5cdFx0dmFyIHl5ID0geSAqIHkyLCB5eiA9IHkgKiB6MiwgenogPSB6ICogejI7XG5cdFx0dmFyIHd4ID0gdyAqIHgyLCB3eSA9IHcgKiB5Miwgd3ogPSB3ICogejI7XG5cblx0XHR0ZVsgMCBdID0gMSAtICggeXkgKyB6eiApO1xuXHRcdHRlWyA0IF0gPSB4eSAtIHd6O1xuXHRcdHRlWyA4IF0gPSB4eiArIHd5O1xuXG5cdFx0dGVbIDEgXSA9IHh5ICsgd3o7XG5cdFx0dGVbIDUgXSA9IDEgLSAoIHh4ICsgenogKTtcblx0XHR0ZVsgOSBdID0geXogLSB3eDtcblxuXHRcdHRlWyAyIF0gPSB4eiAtIHd5O1xuXHRcdHRlWyA2IF0gPSB5eiArIHd4O1xuXHRcdHRlWyAxMCBdID0gMSAtICggeHggKyB5eSApO1xuXG5cdFx0Ly8gbGFzdCBjb2x1bW5cblx0XHR0ZVsgMyBdID0gMDtcblx0XHR0ZVsgNyBdID0gMDtcblx0XHR0ZVsgMTEgXSA9IDA7XG5cblx0XHQvLyBib3R0b20gcm93XG5cdFx0dGVbIDEyIF0gPSAwO1xuXHRcdHRlWyAxMyBdID0gMDtcblx0XHR0ZVsgMTQgXSA9IDA7XG5cdFx0dGVbIDE1IF0gPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB4ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgeSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHogPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggZXllLCB0YXJnZXQsIHVwICkge1xuXG5cdFx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0XHR6LnN1YlZlY3RvcnMoIGV5ZSwgdGFyZ2V0ICk7XG5cblx0XHRcdGlmICggei5sZW5ndGhTcSgpID09PSAwICkge1xuXG5cdFx0XHRcdC8vIGV5ZSBhbmQgdGFyZ2V0IGFyZSBpbiB0aGUgc2FtZSBwb3NpdGlvblxuXG5cdFx0XHRcdHoueiA9IDE7XG5cblx0XHRcdH1cblxuXHRcdFx0ei5ub3JtYWxpemUoKTtcblx0XHRcdHguY3Jvc3NWZWN0b3JzKCB1cCwgeiApO1xuXG5cdFx0XHRpZiAoIHgubGVuZ3RoU3EoKSA9PT0gMCApIHtcblxuXHRcdFx0XHQvLyB1cCBhbmQgeiBhcmUgcGFyYWxsZWxcblxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCB1cC56ICkgPT09IDEgKSB7XG5cblx0XHRcdFx0XHR6LnggKz0gMC4wMDAxO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR6LnogKz0gMC4wMDAxO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR6Lm5vcm1hbGl6ZSgpO1xuXHRcdFx0XHR4LmNyb3NzVmVjdG9ycyggdXAsIHogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR4Lm5vcm1hbGl6ZSgpO1xuXHRcdFx0eS5jcm9zc1ZlY3RvcnMoIHosIHggKTtcblxuXHRcdFx0dGVbIDAgXSA9IHgueDsgdGVbIDQgXSA9IHkueDsgdGVbIDggXSA9IHoueDtcblx0XHRcdHRlWyAxIF0gPSB4Lnk7IHRlWyA1IF0gPSB5Lnk7IHRlWyA5IF0gPSB6Lnk7XG5cdFx0XHR0ZVsgMiBdID0geC56OyB0ZVsgNiBdID0geS56OyB0ZVsgMTAgXSA9IHouejtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCBtLCBuICkge1xuXG5cdFx0aWYgKCBuICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5TWF0cmljZXMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIG4gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIHRoaXMsIG0gKTtcblxuXHR9LFxuXG5cdHByZW11bHRpcGx5OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCB0aGlzICk7XG5cblx0fSxcblxuXHRtdWx0aXBseU1hdHJpY2VzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR2YXIgYWUgPSBhLmVsZW1lbnRzO1xuXHRcdHZhciBiZSA9IGIuZWxlbWVudHM7XG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBhMTEgPSBhZVsgMCBdLCBhMTIgPSBhZVsgNCBdLCBhMTMgPSBhZVsgOCBdLCBhMTQgPSBhZVsgMTIgXTtcblx0XHR2YXIgYTIxID0gYWVbIDEgXSwgYTIyID0gYWVbIDUgXSwgYTIzID0gYWVbIDkgXSwgYTI0ID0gYWVbIDEzIF07XG5cdFx0dmFyIGEzMSA9IGFlWyAyIF0sIGEzMiA9IGFlWyA2IF0sIGEzMyA9IGFlWyAxMCBdLCBhMzQgPSBhZVsgMTQgXTtcblx0XHR2YXIgYTQxID0gYWVbIDMgXSwgYTQyID0gYWVbIDcgXSwgYTQzID0gYWVbIDExIF0sIGE0NCA9IGFlWyAxNSBdO1xuXG5cdFx0dmFyIGIxMSA9IGJlWyAwIF0sIGIxMiA9IGJlWyA0IF0sIGIxMyA9IGJlWyA4IF0sIGIxNCA9IGJlWyAxMiBdO1xuXHRcdHZhciBiMjEgPSBiZVsgMSBdLCBiMjIgPSBiZVsgNSBdLCBiMjMgPSBiZVsgOSBdLCBiMjQgPSBiZVsgMTMgXTtcblx0XHR2YXIgYjMxID0gYmVbIDIgXSwgYjMyID0gYmVbIDYgXSwgYjMzID0gYmVbIDEwIF0sIGIzNCA9IGJlWyAxNCBdO1xuXHRcdHZhciBiNDEgPSBiZVsgMyBdLCBiNDIgPSBiZVsgNyBdLCBiNDMgPSBiZVsgMTEgXSwgYjQ0ID0gYmVbIDE1IF07XG5cblx0XHR0ZVsgMCBdID0gYTExICogYjExICsgYTEyICogYjIxICsgYTEzICogYjMxICsgYTE0ICogYjQxO1xuXHRcdHRlWyA0IF0gPSBhMTEgKiBiMTIgKyBhMTIgKiBiMjIgKyBhMTMgKiBiMzIgKyBhMTQgKiBiNDI7XG5cdFx0dGVbIDggXSA9IGExMSAqIGIxMyArIGExMiAqIGIyMyArIGExMyAqIGIzMyArIGExNCAqIGI0Mztcblx0XHR0ZVsgMTIgXSA9IGExMSAqIGIxNCArIGExMiAqIGIyNCArIGExMyAqIGIzNCArIGExNCAqIGI0NDtcblxuXHRcdHRlWyAxIF0gPSBhMjEgKiBiMTEgKyBhMjIgKiBiMjEgKyBhMjMgKiBiMzEgKyBhMjQgKiBiNDE7XG5cdFx0dGVbIDUgXSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMiArIGEyNCAqIGI0Mjtcblx0XHR0ZVsgOSBdID0gYTIxICogYjEzICsgYTIyICogYjIzICsgYTIzICogYjMzICsgYTI0ICogYjQzO1xuXHRcdHRlWyAxMyBdID0gYTIxICogYjE0ICsgYTIyICogYjI0ICsgYTIzICogYjM0ICsgYTI0ICogYjQ0O1xuXG5cdFx0dGVbIDIgXSA9IGEzMSAqIGIxMSArIGEzMiAqIGIyMSArIGEzMyAqIGIzMSArIGEzNCAqIGI0MTtcblx0XHR0ZVsgNiBdID0gYTMxICogYjEyICsgYTMyICogYjIyICsgYTMzICogYjMyICsgYTM0ICogYjQyO1xuXHRcdHRlWyAxMCBdID0gYTMxICogYjEzICsgYTMyICogYjIzICsgYTMzICogYjMzICsgYTM0ICogYjQzO1xuXHRcdHRlWyAxNCBdID0gYTMxICogYjE0ICsgYTMyICogYjI0ICsgYTMzICogYjM0ICsgYTM0ICogYjQ0O1xuXG5cdFx0dGVbIDMgXSA9IGE0MSAqIGIxMSArIGE0MiAqIGIyMSArIGE0MyAqIGIzMSArIGE0NCAqIGI0MTtcblx0XHR0ZVsgNyBdID0gYTQxICogYjEyICsgYTQyICogYjIyICsgYTQzICogYjMyICsgYTQ0ICogYjQyO1xuXHRcdHRlWyAxMSBdID0gYTQxICogYjEzICsgYTQyICogYjIzICsgYTQzICogYjMzICsgYTQ0ICogYjQzO1xuXHRcdHRlWyAxNSBdID0gYTQxICogYjE0ICsgYTQyICogYjI0ICsgYTQzICogYjM0ICsgYTQ0ICogYjQ0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gKj0gczsgdGVbIDQgXSAqPSBzOyB0ZVsgOCBdICo9IHM7IHRlWyAxMiBdICo9IHM7XG5cdFx0dGVbIDEgXSAqPSBzOyB0ZVsgNSBdICo9IHM7IHRlWyA5IF0gKj0gczsgdGVbIDEzIF0gKj0gcztcblx0XHR0ZVsgMiBdICo9IHM7IHRlWyA2IF0gKj0gczsgdGVbIDEwIF0gKj0gczsgdGVbIDE0IF0gKj0gcztcblx0XHR0ZVsgMyBdICo9IHM7IHRlWyA3IF0gKj0gczsgdGVbIDExIF0gKj0gczsgdGVbIDE1IF0gKj0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0djEueCA9IGF0dHJpYnV0ZS5nZXRYKCBpICk7XG5cdFx0XHRcdHYxLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaSApO1xuXHRcdFx0XHR2MS56ID0gYXR0cmlidXRlLmdldFooIGkgKTtcblxuXHRcdFx0XHR2MS5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuc2V0WFlaKCBpLCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGF0dHJpYnV0ZTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGRldGVybWluYW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIG4xMSA9IHRlWyAwIF0sIG4xMiA9IHRlWyA0IF0sIG4xMyA9IHRlWyA4IF0sIG4xNCA9IHRlWyAxMiBdO1xuXHRcdHZhciBuMjEgPSB0ZVsgMSBdLCBuMjIgPSB0ZVsgNSBdLCBuMjMgPSB0ZVsgOSBdLCBuMjQgPSB0ZVsgMTMgXTtcblx0XHR2YXIgbjMxID0gdGVbIDIgXSwgbjMyID0gdGVbIDYgXSwgbjMzID0gdGVbIDEwIF0sIG4zNCA9IHRlWyAxNCBdO1xuXHRcdHZhciBuNDEgPSB0ZVsgMyBdLCBuNDIgPSB0ZVsgNyBdLCBuNDMgPSB0ZVsgMTEgXSwgbjQ0ID0gdGVbIDE1IF07XG5cblx0XHQvL1RPRE86IG1ha2UgdGhpcyBtb3JlIGVmZmljaWVudFxuXHRcdC8vKCBiYXNlZCBvbiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL21hdHJpeC9mdW5jdGlvbnMvaW52ZXJzZS9mb3VyRC9pbmRleC5odG0gKVxuXG5cdFx0cmV0dXJuIChcblx0XHRcdG40MSAqIChcblx0XHRcdFx0KyBuMTQgKiBuMjMgKiBuMzJcblx0XHRcdFx0IC0gbjEzICogbjI0ICogbjMyXG5cdFx0XHRcdCAtIG4xNCAqIG4yMiAqIG4zM1xuXHRcdFx0XHQgKyBuMTIgKiBuMjQgKiBuMzNcblx0XHRcdFx0ICsgbjEzICogbjIyICogbjM0XG5cdFx0XHRcdCAtIG4xMiAqIG4yMyAqIG4zNFxuXHRcdFx0KSArXG5cdFx0XHRuNDIgKiAoXG5cdFx0XHRcdCsgbjExICogbjIzICogbjM0XG5cdFx0XHRcdCAtIG4xMSAqIG4yNCAqIG4zM1xuXHRcdFx0XHQgKyBuMTQgKiBuMjEgKiBuMzNcblx0XHRcdFx0IC0gbjEzICogbjIxICogbjM0XG5cdFx0XHRcdCArIG4xMyAqIG4yNCAqIG4zMVxuXHRcdFx0XHQgLSBuMTQgKiBuMjMgKiBuMzFcblx0XHRcdCkgK1xuXHRcdFx0bjQzICogKFxuXHRcdFx0XHQrIG4xMSAqIG4yNCAqIG4zMlxuXHRcdFx0XHQgLSBuMTEgKiBuMjIgKiBuMzRcblx0XHRcdFx0IC0gbjE0ICogbjIxICogbjMyXG5cdFx0XHRcdCArIG4xMiAqIG4yMSAqIG4zNFxuXHRcdFx0XHQgKyBuMTQgKiBuMjIgKiBuMzFcblx0XHRcdFx0IC0gbjEyICogbjI0ICogbjMxXG5cdFx0XHQpICtcblx0XHRcdG40NCAqIChcblx0XHRcdFx0LSBuMTMgKiBuMjIgKiBuMzFcblx0XHRcdFx0IC0gbjExICogbjIzICogbjMyXG5cdFx0XHRcdCArIG4xMSAqIG4yMiAqIG4zM1xuXHRcdFx0XHQgKyBuMTMgKiBuMjEgKiBuMzJcblx0XHRcdFx0IC0gbjEyICogbjIxICogbjMzXG5cdFx0XHRcdCArIG4xMiAqIG4yMyAqIG4zMVxuXHRcdFx0KVxuXG5cdFx0KTtcblxuXHR9LFxuXG5cdHRyYW5zcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgdG1wO1xuXG5cdFx0dG1wID0gdGVbIDEgXTsgdGVbIDEgXSA9IHRlWyA0IF07IHRlWyA0IF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDIgXTsgdGVbIDIgXSA9IHRlWyA4IF07IHRlWyA4IF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDYgXTsgdGVbIDYgXSA9IHRlWyA5IF07IHRlWyA5IF0gPSB0bXA7XG5cblx0XHR0bXAgPSB0ZVsgMyBdOyB0ZVsgMyBdID0gdGVbIDEyIF07IHRlWyAxMiBdID0gdG1wO1xuXHRcdHRtcCA9IHRlWyA3IF07IHRlWyA3IF0gPSB0ZVsgMTMgXTsgdGVbIDEzIF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDExIF07IHRlWyAxMSBdID0gdGVbIDE0IF07IHRlWyAxNCBdID0gdG1wO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRQb3NpdGlvbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAxMiBdID0gdi54O1xuXHRcdHRlWyAxMyBdID0gdi55O1xuXHRcdHRlWyAxNCBdID0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRJbnZlcnNlOiBmdW5jdGlvbiAoIG0sIHRocm93T25EZWdlbmVyYXRlICkge1xuXG5cdFx0Ly8gYmFzZWQgb24gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9tYXRyaXgvZnVuY3Rpb25zL2ludmVyc2UvZm91ckQvaW5kZXguaHRtXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cyxcblx0XHRcdG1lID0gbS5lbGVtZW50cyxcblxuXHRcdFx0bjExID0gbWVbIDAgXSwgbjIxID0gbWVbIDEgXSwgbjMxID0gbWVbIDIgXSwgbjQxID0gbWVbIDMgXSxcblx0XHRcdG4xMiA9IG1lWyA0IF0sIG4yMiA9IG1lWyA1IF0sIG4zMiA9IG1lWyA2IF0sIG40MiA9IG1lWyA3IF0sXG5cdFx0XHRuMTMgPSBtZVsgOCBdLCBuMjMgPSBtZVsgOSBdLCBuMzMgPSBtZVsgMTAgXSwgbjQzID0gbWVbIDExIF0sXG5cdFx0XHRuMTQgPSBtZVsgMTIgXSwgbjI0ID0gbWVbIDEzIF0sIG4zNCA9IG1lWyAxNCBdLCBuNDQgPSBtZVsgMTUgXSxcblxuXHRcdFx0dDExID0gbjIzICogbjM0ICogbjQyIC0gbjI0ICogbjMzICogbjQyICsgbjI0ICogbjMyICogbjQzIC0gbjIyICogbjM0ICogbjQzIC0gbjIzICogbjMyICogbjQ0ICsgbjIyICogbjMzICogbjQ0LFxuXHRcdFx0dDEyID0gbjE0ICogbjMzICogbjQyIC0gbjEzICogbjM0ICogbjQyIC0gbjE0ICogbjMyICogbjQzICsgbjEyICogbjM0ICogbjQzICsgbjEzICogbjMyICogbjQ0IC0gbjEyICogbjMzICogbjQ0LFxuXHRcdFx0dDEzID0gbjEzICogbjI0ICogbjQyIC0gbjE0ICogbjIzICogbjQyICsgbjE0ICogbjIyICogbjQzIC0gbjEyICogbjI0ICogbjQzIC0gbjEzICogbjIyICogbjQ0ICsgbjEyICogbjIzICogbjQ0LFxuXHRcdFx0dDE0ID0gbjE0ICogbjIzICogbjMyIC0gbjEzICogbjI0ICogbjMyIC0gbjE0ICogbjIyICogbjMzICsgbjEyICogbjI0ICogbjMzICsgbjEzICogbjIyICogbjM0IC0gbjEyICogbjIzICogbjM0O1xuXG5cdFx0dmFyIGRldCA9IG4xMSAqIHQxMSArIG4yMSAqIHQxMiArIG4zMSAqIHQxMyArIG40MSAqIHQxNDtcblxuXHRcdGlmICggZGV0ID09PSAwICkge1xuXG5cdFx0XHR2YXIgbXNnID0gXCJUSFJFRS5NYXRyaXg0OiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDBcIjtcblxuXHRcdFx0aWYgKCB0aHJvd09uRGVnZW5lcmF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggbXNnICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuaWRlbnRpdHkoKTtcblxuXHRcdH1cblxuXHRcdHZhciBkZXRJbnYgPSAxIC8gZGV0O1xuXG5cdFx0dGVbIDAgXSA9IHQxMSAqIGRldEludjtcblx0XHR0ZVsgMSBdID0gKCBuMjQgKiBuMzMgKiBuNDEgLSBuMjMgKiBuMzQgKiBuNDEgLSBuMjQgKiBuMzEgKiBuNDMgKyBuMjEgKiBuMzQgKiBuNDMgKyBuMjMgKiBuMzEgKiBuNDQgLSBuMjEgKiBuMzMgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgMiBdID0gKCBuMjIgKiBuMzQgKiBuNDEgLSBuMjQgKiBuMzIgKiBuNDEgKyBuMjQgKiBuMzEgKiBuNDIgLSBuMjEgKiBuMzQgKiBuNDIgLSBuMjIgKiBuMzEgKiBuNDQgKyBuMjEgKiBuMzIgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgMyBdID0gKCBuMjMgKiBuMzIgKiBuNDEgLSBuMjIgKiBuMzMgKiBuNDEgLSBuMjMgKiBuMzEgKiBuNDIgKyBuMjEgKiBuMzMgKiBuNDIgKyBuMjIgKiBuMzEgKiBuNDMgLSBuMjEgKiBuMzIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyA0IF0gPSB0MTIgKiBkZXRJbnY7XG5cdFx0dGVbIDUgXSA9ICggbjEzICogbjM0ICogbjQxIC0gbjE0ICogbjMzICogbjQxICsgbjE0ICogbjMxICogbjQzIC0gbjExICogbjM0ICogbjQzIC0gbjEzICogbjMxICogbjQ0ICsgbjExICogbjMzICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDYgXSA9ICggbjE0ICogbjMyICogbjQxIC0gbjEyICogbjM0ICogbjQxIC0gbjE0ICogbjMxICogbjQyICsgbjExICogbjM0ICogbjQyICsgbjEyICogbjMxICogbjQ0IC0gbjExICogbjMyICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDcgXSA9ICggbjEyICogbjMzICogbjQxIC0gbjEzICogbjMyICogbjQxICsgbjEzICogbjMxICogbjQyIC0gbjExICogbjMzICogbjQyIC0gbjEyICogbjMxICogbjQzICsgbjExICogbjMyICogbjQzICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgOCBdID0gdDEzICogZGV0SW52O1xuXHRcdHRlWyA5IF0gPSAoIG4xNCAqIG4yMyAqIG40MSAtIG4xMyAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMSAqIG40MyArIG4xMSAqIG4yNCAqIG40MyArIG4xMyAqIG4yMSAqIG40NCAtIG4xMSAqIG4yMyAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAxMCBdID0gKCBuMTIgKiBuMjQgKiBuNDEgLSBuMTQgKiBuMjIgKiBuNDEgKyBuMTQgKiBuMjEgKiBuNDIgLSBuMTEgKiBuMjQgKiBuNDIgLSBuMTIgKiBuMjEgKiBuNDQgKyBuMTEgKiBuMjIgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgMTEgXSA9ICggbjEzICogbjIyICogbjQxIC0gbjEyICogbjIzICogbjQxIC0gbjEzICogbjIxICogbjQyICsgbjExICogbjIzICogbjQyICsgbjEyICogbjIxICogbjQzIC0gbjExICogbjIyICogbjQzICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgMTIgXSA9IHQxNCAqIGRldEludjtcblx0XHR0ZVsgMTMgXSA9ICggbjEzICogbjI0ICogbjMxIC0gbjE0ICogbjIzICogbjMxICsgbjE0ICogbjIxICogbjMzIC0gbjExICogbjI0ICogbjMzIC0gbjEzICogbjIxICogbjM0ICsgbjExICogbjIzICogbjM0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDE0IF0gPSAoIG4xNCAqIG4yMiAqIG4zMSAtIG4xMiAqIG4yNCAqIG4zMSAtIG4xNCAqIG4yMSAqIG4zMiArIG4xMSAqIG4yNCAqIG4zMiArIG4xMiAqIG4yMSAqIG4zNCAtIG4xMSAqIG4yMiAqIG4zNCApICogZGV0SW52O1xuXHRcdHRlWyAxNSBdID0gKCBuMTIgKiBuMjMgKiBuMzEgLSBuMTMgKiBuMjIgKiBuMzEgKyBuMTMgKiBuMjEgKiBuMzIgLSBuMTEgKiBuMjMgKiBuMzIgLSBuMTIgKiBuMjEgKiBuMzMgKyBuMTEgKiBuMjIgKiBuMzMgKSAqIGRldEludjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2NhbGU6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIHggPSB2LngsIHkgPSB2LnksIHogPSB2Lno7XG5cblx0XHR0ZVsgMCBdICo9IHg7IHRlWyA0IF0gKj0geTsgdGVbIDggXSAqPSB6O1xuXHRcdHRlWyAxIF0gKj0geDsgdGVbIDUgXSAqPSB5OyB0ZVsgOSBdICo9IHo7XG5cdFx0dGVbIDIgXSAqPSB4OyB0ZVsgNiBdICo9IHk7IHRlWyAxMCBdICo9IHo7XG5cdFx0dGVbIDMgXSAqPSB4OyB0ZVsgNyBdICo9IHk7IHRlWyAxMSBdICo9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldE1heFNjYWxlT25BeGlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIHNjYWxlWFNxID0gdGVbIDAgXSAqIHRlWyAwIF0gKyB0ZVsgMSBdICogdGVbIDEgXSArIHRlWyAyIF0gKiB0ZVsgMiBdO1xuXHRcdHZhciBzY2FsZVlTcSA9IHRlWyA0IF0gKiB0ZVsgNCBdICsgdGVbIDUgXSAqIHRlWyA1IF0gKyB0ZVsgNiBdICogdGVbIDYgXTtcblx0XHR2YXIgc2NhbGVaU3EgPSB0ZVsgOCBdICogdGVbIDggXSArIHRlWyA5IF0gKiB0ZVsgOSBdICsgdGVbIDEwIF0gKiB0ZVsgMTAgXTtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIE1hdGgubWF4KCBzY2FsZVhTcSwgc2NhbGVZU3EsIHNjYWxlWlNxICkgKTtcblxuXHR9LFxuXG5cdG1ha2VUcmFuc2xhdGlvbjogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsIHgsXG5cdFx0XHQwLCAxLCAwLCB5LFxuXHRcdFx0MCwgMCwgMSwgeixcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VSb3RhdGlvblg6IGZ1bmN0aW9uICggdGhldGEgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCwgMCxcblx0XHRcdDAsIGMsIC0gcywgMCxcblx0XHRcdDAsIHMsIGMsIDAsXG5cdFx0XHQwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25ZOiBmdW5jdGlvbiAoIHRoZXRhICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdCBjLCAwLCBzLCAwLFxuXHRcdFx0IDAsIDEsIDAsIDAsXG5cdFx0XHQtIHMsIDAsIGMsIDAsXG5cdFx0XHQgMCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uWjogZnVuY3Rpb24gKCB0aGV0YSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHRjLCAtIHMsIDAsIDAsXG5cdFx0XHRzLCBjLCAwLCAwLFxuXHRcdFx0MCwgMCwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VSb3RhdGlvbkF4aXM6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyBCYXNlZCBvbiBodHRwOi8vd3d3LmdhbWVkZXYubmV0L3JlZmVyZW5jZS9hcnRpY2xlcy9hcnRpY2xlMTE5OS5hc3BcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIGFuZ2xlICk7XG5cdFx0dmFyIHMgPSBNYXRoLnNpbiggYW5nbGUgKTtcblx0XHR2YXIgdCA9IDEgLSBjO1xuXHRcdHZhciB4ID0gYXhpcy54LCB5ID0gYXhpcy55LCB6ID0gYXhpcy56O1xuXHRcdHZhciB0eCA9IHQgKiB4LCB0eSA9IHQgKiB5O1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdHR4ICogeCArIGMsIHR4ICogeSAtIHMgKiB6LCB0eCAqIHogKyBzICogeSwgMCxcblx0XHRcdHR4ICogeSArIHMgKiB6LCB0eSAqIHkgKyBjLCB0eSAqIHogLSBzICogeCwgMCxcblx0XHRcdHR4ICogeiAtIHMgKiB5LCB0eSAqIHogKyBzICogeCwgdCAqIHogKiB6ICsgYywgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHQgcmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlU2NhbGU6IGZ1bmN0aW9uICggeCwgeSwgeiApIHtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHR4LCAwLCAwLCAwLFxuXHRcdFx0MCwgeSwgMCwgMCxcblx0XHRcdDAsIDAsIHosIDAsXG5cdFx0XHQwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlU2hlYXI6IGZ1bmN0aW9uICggeCwgeSwgeiApIHtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQxLCB5LCB6LCAwLFxuXHRcdFx0eCwgMSwgeiwgMCxcblx0XHRcdHgsIHksIDEsIDAsXG5cdFx0XHQwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb21wb3NlOiBmdW5jdGlvbiAoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApIHtcblxuXHRcdHRoaXMubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblx0XHR0aGlzLnNjYWxlKCBzY2FsZSApO1xuXHRcdHRoaXMuc2V0UG9zaXRpb24oIHBvc2l0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRlY29tcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKSB7XG5cblx0XHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRcdHZhciBzeCA9IHZlY3Rvci5zZXQoIHRlWyAwIF0sIHRlWyAxIF0sIHRlWyAyIF0gKS5sZW5ndGgoKTtcblx0XHRcdHZhciBzeSA9IHZlY3Rvci5zZXQoIHRlWyA0IF0sIHRlWyA1IF0sIHRlWyA2IF0gKS5sZW5ndGgoKTtcblx0XHRcdHZhciBzeiA9IHZlY3Rvci5zZXQoIHRlWyA4IF0sIHRlWyA5IF0sIHRlWyAxMCBdICkubGVuZ3RoKCk7XG5cblx0XHRcdC8vIGlmIGRldGVybWluZSBpcyBuZWdhdGl2ZSwgd2UgbmVlZCB0byBpbnZlcnQgb25lIHNjYWxlXG5cdFx0XHR2YXIgZGV0ID0gdGhpcy5kZXRlcm1pbmFudCgpO1xuXHRcdFx0aWYgKCBkZXQgPCAwICkgc3ggPSAtIHN4O1xuXG5cdFx0XHRwb3NpdGlvbi54ID0gdGVbIDEyIF07XG5cdFx0XHRwb3NpdGlvbi55ID0gdGVbIDEzIF07XG5cdFx0XHRwb3NpdGlvbi56ID0gdGVbIDE0IF07XG5cblx0XHRcdC8vIHNjYWxlIHRoZSByb3RhdGlvbiBwYXJ0XG5cdFx0XHRtYXRyaXguY29weSggdGhpcyApO1xuXG5cdFx0XHR2YXIgaW52U1ggPSAxIC8gc3g7XG5cdFx0XHR2YXIgaW52U1kgPSAxIC8gc3k7XG5cdFx0XHR2YXIgaW52U1ogPSAxIC8gc3o7XG5cblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMCBdICo9IGludlNYO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyAxIF0gKj0gaW52U1g7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDIgXSAqPSBpbnZTWDtcblxuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA0IF0gKj0gaW52U1k7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDUgXSAqPSBpbnZTWTtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgNiBdICo9IGludlNZO1xuXG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDggXSAqPSBpbnZTWjtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgOSBdICo9IGludlNaO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyAxMCBdICo9IGludlNaO1xuXG5cdFx0XHRxdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRcdHNjYWxlLnggPSBzeDtcblx0XHRcdHNjYWxlLnkgPSBzeTtcblx0XHRcdHNjYWxlLnogPSBzejtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtYWtlUGVyc3BlY3RpdmU6IGZ1bmN0aW9uICggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSB7XG5cblx0XHRpZiAoIGZhciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubWFrZVBlcnNwZWN0aXZlKCkgaGFzIGJlZW4gcmVkZWZpbmVkIGFuZCBoYXMgYSBuZXcgc2lnbmF0dXJlLiBQbGVhc2UgY2hlY2sgdGhlIGRvY3MuJyApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgeCA9IDIgKiBuZWFyIC8gKCByaWdodCAtIGxlZnQgKTtcblx0XHR2YXIgeSA9IDIgKiBuZWFyIC8gKCB0b3AgLSBib3R0b20gKTtcblxuXHRcdHZhciBhID0gKCByaWdodCArIGxlZnQgKSAvICggcmlnaHQgLSBsZWZ0ICk7XG5cdFx0dmFyIGIgPSAoIHRvcCArIGJvdHRvbSApIC8gKCB0b3AgLSBib3R0b20gKTtcblx0XHR2YXIgYyA9IC0gKCBmYXIgKyBuZWFyICkgLyAoIGZhciAtIG5lYXIgKTtcblx0XHR2YXIgZCA9IC0gMiAqIGZhciAqIG5lYXIgLyAoIGZhciAtIG5lYXIgKTtcblxuXHRcdHRlWyAwIF0gPSB4O1x0dGVbIDQgXSA9IDA7XHR0ZVsgOCBdID0gYTtcdHRlWyAxMiBdID0gMDtcblx0XHR0ZVsgMSBdID0gMDtcdHRlWyA1IF0gPSB5O1x0dGVbIDkgXSA9IGI7XHR0ZVsgMTMgXSA9IDA7XG5cdFx0dGVbIDIgXSA9IDA7XHR0ZVsgNiBdID0gMDtcdHRlWyAxMCBdID0gYztcdHRlWyAxNCBdID0gZDtcblx0XHR0ZVsgMyBdID0gMDtcdHRlWyA3IF0gPSAwO1x0dGVbIDExIF0gPSAtIDE7XHR0ZVsgMTUgXSA9IDA7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VPcnRob2dyYXBoaWM6IGZ1bmN0aW9uICggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB3ID0gMS4wIC8gKCByaWdodCAtIGxlZnQgKTtcblx0XHR2YXIgaCA9IDEuMCAvICggdG9wIC0gYm90dG9tICk7XG5cdFx0dmFyIHAgPSAxLjAgLyAoIGZhciAtIG5lYXIgKTtcblxuXHRcdHZhciB4ID0gKCByaWdodCArIGxlZnQgKSAqIHc7XG5cdFx0dmFyIHkgPSAoIHRvcCArIGJvdHRvbSApICogaDtcblx0XHR2YXIgeiA9ICggZmFyICsgbmVhciApICogcDtcblxuXHRcdHRlWyAwIF0gPSAyICogdztcdHRlWyA0IF0gPSAwO1x0dGVbIDggXSA9IDA7XHR0ZVsgMTIgXSA9IC0geDtcblx0XHR0ZVsgMSBdID0gMDtcdHRlWyA1IF0gPSAyICogaDtcdHRlWyA5IF0gPSAwO1x0dGVbIDEzIF0gPSAtIHk7XG5cdFx0dGVbIDIgXSA9IDA7XHR0ZVsgNiBdID0gMDtcdHRlWyAxMCBdID0gLSAyICogcDtcdHRlWyAxNCBdID0gLSB6O1xuXHRcdHRlWyAzIF0gPSAwO1x0dGVbIDcgXSA9IDA7XHR0ZVsgMTEgXSA9IDA7XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciBtZSA9IG1hdHJpeC5lbGVtZW50cztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDE2OyBpICsrICkge1xuXG5cdFx0XHRpZiAoIHRlWyBpIF0gIT09IG1lWyBpIF0gKSByZXR1cm4gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCAxNjsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5lbGVtZW50c1sgaSBdID0gYXJyYXlbIGkgKyBvZmZzZXQgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0ZVsgMCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0ZVsgMSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0ZVsgMiBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0ZVsgMyBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDQgXSA9IHRlWyA0IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDUgXSA9IHRlWyA1IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDYgXSA9IHRlWyA2IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDcgXSA9IHRlWyA3IF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgOCBdID0gdGVbIDggXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgOSBdID0gdGVbIDkgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTAgXSA9IHRlWyAxMCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxMSBdID0gdGVbIDExIF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgMTIgXSA9IHRlWyAxMiBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxMyBdID0gdGVbIDEzIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDE0IF0gPSB0ZVsgMTQgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTUgXSA9IHRlWyAxNSBdO1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gUXVhdGVybmlvbiggeCwgeSwgeiwgdyApIHtcblxuXHR0aGlzLl94ID0geCB8fCAwO1xuXHR0aGlzLl95ID0geSB8fCAwO1xuXHR0aGlzLl96ID0geiB8fCAwO1xuXHR0aGlzLl93ID0gKCB3ICE9PSB1bmRlZmluZWQgKSA/IHcgOiAxO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFF1YXRlcm5pb24sIHtcblxuXHRzbGVycDogZnVuY3Rpb24gKCBxYSwgcWIsIHFtLCB0ICkge1xuXG5cdFx0cmV0dXJuIHFtLmNvcHkoIHFhICkuc2xlcnAoIHFiLCB0ICk7XG5cblx0fSxcblxuXHRzbGVycEZsYXQ6IGZ1bmN0aW9uICggZHN0LCBkc3RPZmZzZXQsIHNyYzAsIHNyY09mZnNldDAsIHNyYzEsIHNyY09mZnNldDEsIHQgKSB7XG5cblx0XHQvLyBmdXp6LWZyZWUsIGFycmF5LWJhc2VkIFF1YXRlcm5pb24gU0xFUlAgb3BlcmF0aW9uXG5cblx0XHR2YXIgeDAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMCBdLFxuXHRcdFx0eTAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMSBdLFxuXHRcdFx0ejAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMiBdLFxuXHRcdFx0dzAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMyBdLFxuXG5cdFx0XHR4MSA9IHNyYzFbIHNyY09mZnNldDEgKyAwIF0sXG5cdFx0XHR5MSA9IHNyYzFbIHNyY09mZnNldDEgKyAxIF0sXG5cdFx0XHR6MSA9IHNyYzFbIHNyY09mZnNldDEgKyAyIF0sXG5cdFx0XHR3MSA9IHNyYzFbIHNyY09mZnNldDEgKyAzIF07XG5cblx0XHRpZiAoIHcwICE9PSB3MSB8fCB4MCAhPT0geDEgfHwgeTAgIT09IHkxIHx8IHowICE9PSB6MSApIHtcblxuXHRcdFx0dmFyIHMgPSAxIC0gdCxcblxuXHRcdFx0XHRjb3MgPSB4MCAqIHgxICsgeTAgKiB5MSArIHowICogejEgKyB3MCAqIHcxLFxuXG5cdFx0XHRcdGRpciA9ICggY29zID49IDAgPyAxIDogLSAxICksXG5cdFx0XHRcdHNxclNpbiA9IDEgLSBjb3MgKiBjb3M7XG5cblx0XHRcdC8vIFNraXAgdGhlIFNsZXJwIGZvciB0aW55IHN0ZXBzIHRvIGF2b2lkIG51bWVyaWMgcHJvYmxlbXM6XG5cdFx0XHRpZiAoIHNxclNpbiA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdHZhciBzaW4gPSBNYXRoLnNxcnQoIHNxclNpbiApLFxuXHRcdFx0XHRcdGxlbiA9IE1hdGguYXRhbjIoIHNpbiwgY29zICogZGlyICk7XG5cblx0XHRcdFx0cyA9IE1hdGguc2luKCBzICogbGVuICkgLyBzaW47XG5cdFx0XHRcdHQgPSBNYXRoLnNpbiggdCAqIGxlbiApIC8gc2luO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB0RGlyID0gdCAqIGRpcjtcblxuXHRcdFx0eDAgPSB4MCAqIHMgKyB4MSAqIHREaXI7XG5cdFx0XHR5MCA9IHkwICogcyArIHkxICogdERpcjtcblx0XHRcdHowID0gejAgKiBzICsgejEgKiB0RGlyO1xuXHRcdFx0dzAgPSB3MCAqIHMgKyB3MSAqIHREaXI7XG5cblx0XHRcdC8vIE5vcm1hbGl6ZSBpbiBjYXNlIHdlIGp1c3QgZGlkIGEgbGVycDpcblx0XHRcdGlmICggcyA9PT0gMSAtIHQgKSB7XG5cblx0XHRcdFx0dmFyIGYgPSAxIC8gTWF0aC5zcXJ0KCB4MCAqIHgwICsgeTAgKiB5MCArIHowICogejAgKyB3MCAqIHcwICk7XG5cblx0XHRcdFx0eDAgKj0gZjtcblx0XHRcdFx0eTAgKj0gZjtcblx0XHRcdFx0ejAgKj0gZjtcblx0XHRcdFx0dzAgKj0gZjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZHN0WyBkc3RPZmZzZXQgXSA9IHgwO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMSBdID0geTA7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MDtcblx0XHRkc3RbIGRzdE9mZnNldCArIDMgXSA9IHcwO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggUXVhdGVybmlvbi5wcm90b3R5cGUsIHtcblxuXHR4OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3g7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl94ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHk6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feTtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0ejoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl96O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feiA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR3OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3c7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl93ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggUXVhdGVybmlvbi5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgdyApIHtcblxuXHRcdHRoaXMuX3ggPSB4O1xuXHRcdHRoaXMuX3kgPSB5O1xuXHRcdHRoaXMuX3ogPSB6O1xuXHRcdHRoaXMuX3cgPSB3O1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3osIHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHtcblxuXHRcdHRoaXMuX3ggPSBxdWF0ZXJuaW9uLng7XG5cdFx0dGhpcy5feSA9IHF1YXRlcm5pb24ueTtcblx0XHR0aGlzLl96ID0gcXVhdGVybmlvbi56O1xuXHRcdHRoaXMuX3cgPSBxdWF0ZXJuaW9uLnc7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUV1bGVyOiBmdW5jdGlvbiAoIGV1bGVyLCB1cGRhdGUgKSB7XG5cblx0XHRpZiAoICEgKCBldWxlciAmJiBldWxlci5pc0V1bGVyICkgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTtcblxuXHRcdH1cblxuXHRcdHZhciB4ID0gZXVsZXIuX3gsIHkgPSBldWxlci5feSwgeiA9IGV1bGVyLl96LCBvcmRlciA9IGV1bGVyLm9yZGVyO1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5tYXRod29ya3MuY29tL21hdGxhYmNlbnRyYWwvZmlsZWV4Y2hhbmdlL1xuXHRcdC8vIFx0MjA2OTYtZnVuY3Rpb24tdG8tY29udmVydC1iZXR3ZWVuLWRjbS1ldWxlci1hbmdsZXMtcXVhdGVybmlvbnMtYW5kLWV1bGVyLXZlY3RvcnMvXG5cdFx0Ly9cdGNvbnRlbnQvU3BpbkNhbGMubVxuXG5cdFx0dmFyIGNvcyA9IE1hdGguY29zO1xuXHRcdHZhciBzaW4gPSBNYXRoLnNpbjtcblxuXHRcdHZhciBjMSA9IGNvcyggeCAvIDIgKTtcblx0XHR2YXIgYzIgPSBjb3MoIHkgLyAyICk7XG5cdFx0dmFyIGMzID0gY29zKCB6IC8gMiApO1xuXG5cdFx0dmFyIHMxID0gc2luKCB4IC8gMiApO1xuXHRcdHZhciBzMiA9IHNpbiggeSAvIDIgKTtcblx0XHR2YXIgczMgPSBzaW4oIHogLyAyICk7XG5cblx0XHRpZiAoIG9yZGVyID09PSAnWFlaJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVhaJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWlhZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWllYJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVpYJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWFpZJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyAtIGMxICogczIgKiBzMztcblx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblxuXHRcdH1cblxuXHRcdGlmICggdXBkYXRlICE9PSBmYWxzZSApIHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQXhpc0FuZ2xlOiBmdW5jdGlvbiAoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL2FuZ2xlVG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyBheGlzIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHZhciBoYWxmQW5nbGUgPSBhbmdsZSAvIDIsIHMgPSBNYXRoLnNpbiggaGFsZkFuZ2xlICk7XG5cblx0XHR0aGlzLl94ID0gYXhpcy54ICogcztcblx0XHR0aGlzLl95ID0gYXhpcy55ICogcztcblx0XHR0aGlzLl96ID0gYXhpcy56ICogcztcblx0XHR0aGlzLl93ID0gTWF0aC5jb3MoIGhhbGZBbmdsZSApO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL21hdHJpeFRvUXVhdGVybmlvbi9pbmRleC5odG1cblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHR2YXIgdGUgPSBtLmVsZW1lbnRzLFxuXG5cdFx0XHRtMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdLFxuXHRcdFx0bTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXSxcblx0XHRcdG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdLFxuXG5cdFx0XHR0cmFjZSA9IG0xMSArIG0yMiArIG0zMyxcblx0XHRcdHM7XG5cblx0XHRpZiAoIHRyYWNlID4gMCApIHtcblxuXHRcdFx0cyA9IDAuNSAvIE1hdGguc3FydCggdHJhY2UgKyAxLjAgKTtcblxuXHRcdFx0dGhpcy5fdyA9IDAuMjUgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTMyIC0gbTIzICkgKiBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTEzIC0gbTMxICkgKiBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTIxIC0gbTEyICkgKiBzO1xuXG5cdFx0fSBlbHNlIGlmICggbTExID4gbTIyICYmIG0xMSA+IG0zMyApIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTExIC0gbTIyIC0gbTMzICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0zMiAtIG0yMyApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAwLjI1ICogcztcblx0XHRcdHRoaXMuX3kgPSAoIG0xMiArIG0yMSApIC8gcztcblx0XHRcdHRoaXMuX3ogPSAoIG0xMyArIG0zMSApIC8gcztcblxuXHRcdH0gZWxzZSBpZiAoIG0yMiA+IG0zMyApIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTIyIC0gbTExIC0gbTMzICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0xMyAtIG0zMSApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0xMiArIG0yMSApIC8gcztcblx0XHRcdHRoaXMuX3kgPSAwLjI1ICogcztcblx0XHRcdHRoaXMuX3ogPSAoIG0yMyArIG0zMiApIC8gcztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0zMyAtIG0xMSAtIG0yMiApO1xuXG5cdFx0XHR0aGlzLl93ID0gKCBtMjEgLSBtMTIgKSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMTMgKyBtMzEgKSAvIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMjMgKyBtMzIgKSAvIHM7XG5cdFx0XHR0aGlzLl96ID0gMC4yNSAqIHM7XG5cblx0XHR9XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVVuaXRWZWN0b3JzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBhc3N1bWVzIGRpcmVjdGlvbiB2ZWN0b3JzIHZGcm9tIGFuZCB2VG8gYXJlIG5vcm1hbGl6ZWRcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHI7XG5cblx0XHR2YXIgRVBTID0gMC4wMDAwMDE7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbVVuaXRWZWN0b3JzKCB2RnJvbSwgdlRvICkge1xuXG5cdFx0XHRpZiAoIHYxID09PSB1bmRlZmluZWQgKSB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdHIgPSB2RnJvbS5kb3QoIHZUbyApICsgMTtcblxuXHRcdFx0aWYgKCByIDwgRVBTICkge1xuXG5cdFx0XHRcdHIgPSAwO1xuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIHZGcm9tLnggKSA+IE1hdGguYWJzKCB2RnJvbS56ICkgKSB7XG5cblx0XHRcdFx0XHR2MS5zZXQoIC0gdkZyb20ueSwgdkZyb20ueCwgMCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR2MS5zZXQoIDAsIC0gdkZyb20ueiwgdkZyb20ueSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2MS5jcm9zc1ZlY3RvcnMoIHZGcm9tLCB2VG8gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl94ID0gdjEueDtcblx0XHRcdHRoaXMuX3kgPSB2MS55O1xuXHRcdFx0dGhpcy5feiA9IHYxLno7XG5cdFx0XHR0aGlzLl93ID0gcjtcblxuXHRcdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnZlcnNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBxdWF0ZXJuaW9uIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aFxuXG5cdFx0cmV0dXJuIHRoaXMuY29uanVnYXRlKCk7XG5cblx0fSxcblxuXHRjb25qdWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuX3ggKj0gLSAxO1xuXHRcdHRoaXMuX3kgKj0gLSAxO1xuXHRcdHRoaXMuX3ogKj0gLSAxO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRvdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ggKiB2Ll94ICsgdGhpcy5feSAqIHYuX3kgKyB0aGlzLl96ICogdi5feiArIHRoaXMuX3cgKiB2Ll93O1xuXG5cdH0sXG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl94ICogdGhpcy5feCArIHRoaXMuX3kgKiB0aGlzLl95ICsgdGhpcy5feiAqIHRoaXMuX3ogKyB0aGlzLl93ICogdGhpcy5fdztcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGwgPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0aWYgKCBsID09PSAwICkge1xuXG5cdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdHRoaXMuX3kgPSAwO1xuXHRcdFx0dGhpcy5feiA9IDA7XG5cdFx0XHR0aGlzLl93ID0gMTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGwgPSAxIC8gbDtcblxuXHRcdFx0dGhpcy5feCA9IHRoaXMuX3ggKiBsO1xuXHRcdFx0dGhpcy5feSA9IHRoaXMuX3kgKiBsO1xuXHRcdFx0dGhpcy5feiA9IHRoaXMuX3ogKiBsO1xuXHRcdFx0dGhpcy5fdyA9IHRoaXMuX3cgKiBsO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIHEsIHAgKSB7XG5cblx0XHRpZiAoIHAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlRdWF0ZXJuaW9ucyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggcSwgcCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggdGhpcywgcSApO1xuXG5cdH0sXG5cblx0cHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHEsIHRoaXMgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5UXVhdGVybmlvbnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdC8vIGZyb20gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9yZWFsTm9ybWVkQWxnZWJyYS9xdWF0ZXJuaW9ucy9jb2RlL2luZGV4Lmh0bVxuXG5cdFx0dmFyIHFheCA9IGEuX3gsIHFheSA9IGEuX3ksIHFheiA9IGEuX3osIHFhdyA9IGEuX3c7XG5cdFx0dmFyIHFieCA9IGIuX3gsIHFieSA9IGIuX3ksIHFieiA9IGIuX3osIHFidyA9IGIuX3c7XG5cblx0XHR0aGlzLl94ID0gcWF4ICogcWJ3ICsgcWF3ICogcWJ4ICsgcWF5ICogcWJ6IC0gcWF6ICogcWJ5O1xuXHRcdHRoaXMuX3kgPSBxYXkgKiBxYncgKyBxYXcgKiBxYnkgKyBxYXogKiBxYnggLSBxYXggKiBxYno7XG5cdFx0dGhpcy5feiA9IHFheiAqIHFidyArIHFhdyAqIHFieiArIHFheCAqIHFieSAtIHFheSAqIHFieDtcblx0XHR0aGlzLl93ID0gcWF3ICogcWJ3IC0gcWF4ICogcWJ4IC0gcWF5ICogcWJ5IC0gcWF6ICogcWJ6O1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNsZXJwOiBmdW5jdGlvbiAoIHFiLCB0ICkge1xuXG5cdFx0aWYgKCB0ID09PSAwICkgcmV0dXJuIHRoaXM7XG5cdFx0aWYgKCB0ID09PSAxICkgcmV0dXJuIHRoaXMuY29weSggcWIgKTtcblxuXHRcdHZhciB4ID0gdGhpcy5feCwgeSA9IHRoaXMuX3ksIHogPSB0aGlzLl96LCB3ID0gdGhpcy5fdztcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1lZEFsZ2VicmEvcXVhdGVybmlvbnMvc2xlcnAvXG5cblx0XHR2YXIgY29zSGFsZlRoZXRhID0gdyAqIHFiLl93ICsgeCAqIHFiLl94ICsgeSAqIHFiLl95ICsgeiAqIHFiLl96O1xuXG5cdFx0aWYgKCBjb3NIYWxmVGhldGEgPCAwICkge1xuXG5cdFx0XHR0aGlzLl93ID0gLSBxYi5fdztcblx0XHRcdHRoaXMuX3ggPSAtIHFiLl94O1xuXHRcdFx0dGhpcy5feSA9IC0gcWIuX3k7XG5cdFx0XHR0aGlzLl96ID0gLSBxYi5fejtcblxuXHRcdFx0Y29zSGFsZlRoZXRhID0gLSBjb3NIYWxmVGhldGE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmNvcHkoIHFiICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGNvc0hhbGZUaGV0YSA+PSAxLjAgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSB3O1xuXHRcdFx0dGhpcy5feCA9IHg7XG5cdFx0XHR0aGlzLl95ID0geTtcblx0XHRcdHRoaXMuX3ogPSB6O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdHZhciBzaW5IYWxmVGhldGEgPSBNYXRoLnNxcnQoIDEuMCAtIGNvc0hhbGZUaGV0YSAqIGNvc0hhbGZUaGV0YSApO1xuXG5cdFx0aWYgKCBNYXRoLmFicyggc2luSGFsZlRoZXRhICkgPCAwLjAwMSApIHtcblxuXHRcdFx0dGhpcy5fdyA9IDAuNSAqICggdyArIHRoaXMuX3cgKTtcblx0XHRcdHRoaXMuX3ggPSAwLjUgKiAoIHggKyB0aGlzLl94ICk7XG5cdFx0XHR0aGlzLl95ID0gMC41ICogKCB5ICsgdGhpcy5feSApO1xuXHRcdFx0dGhpcy5feiA9IDAuNSAqICggeiArIHRoaXMuX3ogKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHR2YXIgaGFsZlRoZXRhID0gTWF0aC5hdGFuMiggc2luSGFsZlRoZXRhLCBjb3NIYWxmVGhldGEgKTtcblx0XHR2YXIgcmF0aW9BID0gTWF0aC5zaW4oICggMSAtIHQgKSAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhLFxuXHRcdFx0cmF0aW9CID0gTWF0aC5zaW4oIHQgKiBoYWxmVGhldGEgKSAvIHNpbkhhbGZUaGV0YTtcblxuXHRcdHRoaXMuX3cgPSAoIHcgKiByYXRpb0EgKyB0aGlzLl93ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feCA9ICggeCAqIHJhdGlvQSArIHRoaXMuX3ggKiByYXRpb0IgKTtcblx0XHR0aGlzLl95ID0gKCB5ICogcmF0aW9BICsgdGhpcy5feSAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3ogPSAoIHogKiByYXRpb0EgKyB0aGlzLl96ICogcmF0aW9CICk7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHF1YXRlcm5pb24gKSB7XG5cblx0XHRyZXR1cm4gKCBxdWF0ZXJuaW9uLl94ID09PSB0aGlzLl94ICkgJiYgKCBxdWF0ZXJuaW9uLl95ID09PSB0aGlzLl95ICkgJiYgKCBxdWF0ZXJuaW9uLl96ID09PSB0aGlzLl96ICkgJiYgKCBxdWF0ZXJuaW9uLl93ID09PSB0aGlzLl93ICk7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy5feCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLl95ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLl96ID0gYXJyYXlbIG9mZnNldCArIDIgXTtcblx0XHR0aGlzLl93ID0gYXJyYXlbIG9mZnNldCArIDMgXTtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5feDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy5feTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5fejtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy5fdztcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdG9uQ2hhbmdlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG9uQ2hhbmdlQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHt9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBraWxlIC8gaHR0cDovL2tpbGUuc3RyYXZhZ2FuemEub3JnL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yMyggeCwgeSwgeiApIHtcblxuXHR0aGlzLnggPSB4IHx8IDA7XG5cdHRoaXMueSA9IHkgfHwgMDtcblx0dGhpcy56ID0geiB8fCAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjMucHJvdG90eXBlLCB7XG5cblx0aXNWZWN0b3IzOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXHRcdHRoaXMueiA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggPSBzY2FsYXI7XG5cdFx0dGhpcy55ID0gc2NhbGFyO1xuXHRcdHRoaXMueiA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCB4ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCB5ICkge1xuXG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCB6ICkge1xuXG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2YWx1ZSApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAyOiB0aGlzLnogPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiByZXR1cm4gdGhpcy54O1xuXHRcdFx0Y2FzZSAxOiByZXR1cm4gdGhpcy55O1xuXHRcdFx0Y2FzZSAyOiByZXR1cm4gdGhpcy56O1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55LCB0aGlzLnogKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IHYueDtcblx0XHR0aGlzLnkgPSB2Lnk7XG5cdFx0dGhpcy56ID0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRkVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ICs9IHYueDtcblx0XHR0aGlzLnkgKz0gdi55O1xuXHRcdHRoaXMueiArPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHM7XG5cdFx0dGhpcy55ICs9IHM7XG5cdFx0dGhpcy56ICs9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHRoaXMueCA9IGEueCArIGIueDtcblx0XHR0aGlzLnkgPSBhLnkgKyBiLnk7XG5cdFx0dGhpcy56ID0gYS56ICsgYi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsZWRWZWN0b3I6IGZ1bmN0aW9uICggdiwgcyApIHtcblxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xuXHRcdHRoaXMueSArPSB2LnkgKiBzO1xuXHRcdHRoaXMueiArPSB2LnogKiBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWI6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54IC09IHYueDtcblx0XHR0aGlzLnkgLT0gdi55O1xuXHRcdHRoaXMueiAtPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YlNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy54IC09IHM7XG5cdFx0dGhpcy55IC09IHM7XG5cdFx0dGhpcy56IC09IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YlZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHRoaXMueCA9IGEueCAtIGIueDtcblx0XHR0aGlzLnkgPSBhLnkgLSBiLnk7XG5cdFx0dGhpcy56ID0gYS56IC0gYi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5VmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKj0gdi54O1xuXHRcdHRoaXMueSAqPSB2Lnk7XG5cdFx0dGhpcy56ICo9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xuXHRcdHRoaXMueiAqPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5VmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICogYi54O1xuXHRcdHRoaXMueSA9IGEueSAqIGIueTtcblx0XHR0aGlzLnogPSBhLnogKiBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5RXVsZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseUV1bGVyKCBldWxlciApIHtcblxuXHRcdFx0aWYgKCAhICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuYXBwbHlFdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuJyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIGV1bGVyICkgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGFwcGx5QXhpc0FuZ2xlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlBeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YXBwbHlNYXRyaXgzOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgMyBdICogeSArIGVbIDYgXSAqIHo7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA3IF0gKiB6O1xuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOCBdICogejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR2YXIgdyA9IDEgLyAoIGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICk7XG5cblx0XHR0aGlzLnggPSAoIGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogeiArIGVbIDEyIF0gKSAqIHc7XG5cdFx0dGhpcy55ID0gKCBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAqIHogKyBlWyAxMyBdICkgKiB3O1xuXHRcdHRoaXMueiA9ICggZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF0gKSAqIHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5UXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cdFx0dmFyIHF4ID0gcS54LCBxeSA9IHEueSwgcXogPSBxLnosIHF3ID0gcS53O1xuXG5cdFx0Ly8gY2FsY3VsYXRlIHF1YXQgKiB2ZWN0b3JcblxuXHRcdHZhciBpeCA9IHF3ICogeCArIHF5ICogeiAtIHF6ICogeTtcblx0XHR2YXIgaXkgPSBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHo7XG5cdFx0dmFyIGl6ID0gcXcgKiB6ICsgcXggKiB5IC0gcXkgKiB4O1xuXHRcdHZhciBpdyA9IC0gcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6O1xuXG5cdFx0Ly8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuXG5cdFx0dGhpcy54ID0gaXggKiBxdyArIGl3ICogLSBxeCArIGl5ICogLSBxeiAtIGl6ICogLSBxeTtcblx0XHR0aGlzLnkgPSBpeSAqIHF3ICsgaXcgKiAtIHF5ICsgaXogKiAtIHF4IC0gaXggKiAtIHF6O1xuXHRcdHRoaXMueiA9IGl6ICogcXcgKyBpdyAqIC0gcXogKyBpeCAqIC0gcXkgLSBpeSAqIC0gcXg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHByb2plY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHByb2plY3QoIGNhbWVyYSApIHtcblxuXHRcdFx0bWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBtYXRyaXguZ2V0SW52ZXJzZSggY2FtZXJhLm1hdHJpeFdvcmxkICkgKTtcblx0XHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR1bnByb2plY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVucHJvamVjdCggY2FtZXJhICkge1xuXG5cdFx0XHRtYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkLCBtYXRyaXguZ2V0SW52ZXJzZSggY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKSApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zZm9ybURpcmVjdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Ly8gaW5wdXQ6IFRIUkVFLk1hdHJpeDQgYWZmaW5lIG1hdHJpeFxuXHRcdC8vIHZlY3RvciBpbnRlcnByZXRlZCBhcyBhIGRpcmVjdGlvblxuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6O1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICogejtcblx0XHR0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6O1xuXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCk7XG5cblx0fSxcblxuXHRkaXZpZGU6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCAvPSB2Lng7XG5cdFx0dGhpcy55IC89IHYueTtcblx0XHR0aGlzLnogLz0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXZpZGVTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTtcblxuXHR9LFxuXG5cdG1pbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5taW4oIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5taW4oIHRoaXMueSwgdi55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5taW4oIHRoaXMueiwgdi56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1heDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIHRoaXMueSwgdi55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIHRoaXMueiwgdi56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBtaW4gPCBtYXgsIGNvbXBvbmVudHdpc2VcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCBtaW4ueCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCBtaW4ueSwgTWF0aC5taW4oIG1heC55LCB0aGlzLnkgKSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCBtaW4ueiwgTWF0aC5taW4oIG1heC56LCB0aGlzLnogKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcFNjYWxhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1pbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG1heCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xhbXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkge1xuXG5cdFx0XHRtaW4uc2V0KCBtaW5WYWwsIG1pblZhbCwgbWluVmFsICk7XG5cdFx0XHRtYXguc2V0KCBtYXhWYWwsIG1heFZhbCwgbWF4VmFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmNsYW1wKCBtaW4sIG1heCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApO1xuXG5cdH0sXG5cblx0Zmxvb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGguZmxvb3IoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZWlsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5jZWlsKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGgucm91bmQoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGgucm91bmQoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZFRvWmVybzogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gKCB0aGlzLnggPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueCApIDogTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gKCB0aGlzLnkgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueSApIDogTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gKCB0aGlzLnogPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueiApIDogTWF0aC5mbG9vciggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5lZ2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gLSB0aGlzLng7XG5cdFx0dGhpcy55ID0gLSB0aGlzLnk7XG5cdFx0dGhpcy56ID0gLSB0aGlzLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRvdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueSArIHRoaXMueiAqIHYuejtcblxuXHR9LFxuXG5cdC8vIFRPRE8gbGVuZ3RoU3F1YXJlZD9cblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMuejtcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICk7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5MZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICkgKyBNYXRoLmFicyggdGhpcy56ICk7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7XG5cblx0fSxcblxuXHRzZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3RoICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCApO1xuXG5cdH0sXG5cblx0bGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHtcblxuXHRcdHRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7XG5cdFx0dGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTtcblx0XHR0aGlzLnogKz0gKCB2LnogLSB0aGlzLnogKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwVmVjdG9yczogZnVuY3Rpb24gKCB2MSwgdjIsIGFscGhhICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdjIsIHYxICkubXVsdGlwbHlTY2FsYXIoIGFscGhhICkuYWRkKCB2MSApO1xuXG5cdH0sXG5cblx0Y3Jvc3M6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuY3Jvc3MoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5jcm9zc1ZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmNyb3NzVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKCB0aGlzLCB2ICk7XG5cblx0fSxcblxuXHRjcm9zc1ZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHZhciBheCA9IGEueCwgYXkgPSBhLnksIGF6ID0gYS56O1xuXHRcdHZhciBieCA9IGIueCwgYnkgPSBiLnksIGJ6ID0gYi56O1xuXG5cdFx0dGhpcy54ID0gYXkgKiBieiAtIGF6ICogYnk7XG5cdFx0dGhpcy55ID0gYXogKiBieCAtIGF4ICogYno7XG5cdFx0dGhpcy56ID0gYXggKiBieSAtIGF5ICogYng7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHByb2plY3RPblZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHR2YXIgc2NhbGFyID0gdmVjdG9yLmRvdCggdGhpcyApIC8gdmVjdG9yLmxlbmd0aFNxKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5jb3B5KCB2ZWN0b3IgKS5tdWx0aXBseVNjYWxhciggc2NhbGFyICk7XG5cblx0fSxcblxuXHRwcm9qZWN0T25QbGFuZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBwcm9qZWN0T25QbGFuZSggcGxhbmVOb3JtYWwgKSB7XG5cblx0XHRcdHYxLmNvcHkoIHRoaXMgKS5wcm9qZWN0T25WZWN0b3IoIHBsYW5lTm9ybWFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzLnN1YiggdjEgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJlZmxlY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJlZmxlY3QgaW5jaWRlbnQgdmVjdG9yIG9mZiBwbGFuZSBvcnRob2dvbmFsIHRvIG5vcm1hbFxuXHRcdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGhcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmVmbGVjdCggbm9ybWFsICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zdWIoIHYxLmNvcHkoIG5vcm1hbCApLm11bHRpcGx5U2NhbGFyKCAyICogdGhpcy5kb3QoIG5vcm1hbCApICkgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGFuZ2xlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHZhciB0aGV0YSA9IHRoaXMuZG90KCB2ICkgLyAoIE1hdGguc3FydCggdGhpcy5sZW5ndGhTcSgpICogdi5sZW5ndGhTcSgpICkgKTtcblxuXHRcdC8vIGNsYW1wLCB0byBoYW5kbGUgbnVtZXJpY2FsIHByb2JsZW1zXG5cblx0XHRyZXR1cm4gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdGhldGEsIC0gMSwgMSApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKCB2ICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9TcXVhcmVkOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgZHggPSB0aGlzLnggLSB2LngsIGR5ID0gdGhpcy55IC0gdi55LCBkeiA9IHRoaXMueiAtIHYuejtcblxuXHRcdHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeSArIGR6ICogZHo7XG5cblx0fSxcblxuXHRtYW5oYXR0YW5EaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCAtIHYueCApICsgTWF0aC5hYnMoIHRoaXMueSAtIHYueSApICsgTWF0aC5hYnMoIHRoaXMueiAtIHYueiApO1xuXG5cdH0sXG5cblx0c2V0RnJvbVNwaGVyaWNhbDogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dmFyIHNpblBoaVJhZGl1cyA9IE1hdGguc2luKCBzLnBoaSApICogcy5yYWRpdXM7XG5cblx0XHR0aGlzLnggPSBzaW5QaGlSYWRpdXMgKiBNYXRoLnNpbiggcy50aGV0YSApO1xuXHRcdHRoaXMueSA9IE1hdGguY29zKCBzLnBoaSApICogcy5yYWRpdXM7XG5cdFx0dGhpcy56ID0gc2luUGhpUmFkaXVzICogTWF0aC5jb3MoIHMudGhldGEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUN5bGluZHJpY2FsOiBmdW5jdGlvbiAoIGMgKSB7XG5cblx0XHR0aGlzLnggPSBjLnJhZGl1cyAqIE1hdGguc2luKCBjLnRoZXRhICk7XG5cdFx0dGhpcy55ID0gYy55O1xuXHRcdHRoaXMueiA9IGMucmFkaXVzICogTWF0aC5jb3MoIGMudGhldGEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeFBvc2l0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAxMiBdO1xuXHRcdHRoaXMueSA9IGVbIDEzIF07XG5cdFx0dGhpcy56ID0gZVsgMTQgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeFNjYWxlOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgc3ggPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDAgKS5sZW5ndGgoKTtcblx0XHR2YXIgc3kgPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDEgKS5sZW5ndGgoKTtcblx0XHR2YXIgc3ogPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDIgKS5sZW5ndGgoKTtcblxuXHRcdHRoaXMueCA9IHN4O1xuXHRcdHRoaXMueSA9IHN5O1xuXHRcdHRoaXMueiA9IHN6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4Q29sdW1uOiBmdW5jdGlvbiAoIG0sIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZnJvbUFycmF5KCBtLmVsZW1lbnRzLCBpbmRleCAqIDQgKTtcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSAmJiAoIHYueiA9PT0gdGhpcy56ICkgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLnogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy54O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuejtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xuXHRcdHRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApO1xuXHRcdHRoaXMueiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRleCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIE1hdHJpeDMoKSB7XG5cblx0dGhpcy5lbGVtZW50cyA9IFtcblxuXHRcdDEsIDAsIDAsXG5cdFx0MCwgMSwgMCxcblx0XHQwLCAwLCAxXG5cblx0XTtcblxuXHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAwICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDM6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuJyApO1xuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBNYXRyaXgzLnByb3RvdHlwZSwge1xuXG5cdGlzTWF0cml4MzogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggbjExLCBuMTIsIG4xMywgbjIxLCBuMjIsIG4yMywgbjMxLCBuMzIsIG4zMyApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbjExOyB0ZVsgMSBdID0gbjIxOyB0ZVsgMiBdID0gbjMxO1xuXHRcdHRlWyAzIF0gPSBuMTI7IHRlWyA0IF0gPSBuMjI7IHRlWyA1IF0gPSBuMzI7XG5cdFx0dGVbIDYgXSA9IG4xMzsgdGVbIDcgXSA9IG4yMzsgdGVbIDggXSA9IG4zMztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aWRlbnRpdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQxLCAwLCAwLFxuXHRcdFx0MCwgMSwgMCxcblx0XHRcdDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBtZVsgMCBdOyB0ZVsgMSBdID0gbWVbIDEgXTsgdGVbIDIgXSA9IG1lWyAyIF07XG5cdFx0dGVbIDMgXSA9IG1lWyAzIF07IHRlWyA0IF0gPSBtZVsgNCBdOyB0ZVsgNSBdID0gbWVbIDUgXTtcblx0XHR0ZVsgNiBdID0gbWVbIDYgXTsgdGVbIDcgXSA9IG1lWyA3IF07IHRlWyA4IF0gPSBtZVsgOCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHRtZVsgMCBdLCBtZVsgNCBdLCBtZVsgOCBdLFxuXHRcdFx0bWVbIDEgXSwgbWVbIDUgXSwgbWVbIDkgXSxcblx0XHRcdG1lWyAyIF0sIG1lWyA2IF0sIG1lWyAxMCBdXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseVRvQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2MS54ID0gYXR0cmlidXRlLmdldFgoIGkgKTtcblx0XHRcdFx0djEueSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7XG5cdFx0XHRcdHYxLnogPSBhdHRyaWJ1dGUuZ2V0WiggaSApO1xuXG5cdFx0XHRcdHYxLmFwcGx5TWF0cml4MyggdGhpcyApO1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5zZXRYWVooIGksIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYXR0cmlidXRlO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIHRoaXMsIG0gKTtcblxuXHR9LFxuXG5cdHByZW11bHRpcGx5OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCB0aGlzICk7XG5cblx0fSxcblxuXHRtdWx0aXBseU1hdHJpY2VzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR2YXIgYWUgPSBhLmVsZW1lbnRzO1xuXHRcdHZhciBiZSA9IGIuZWxlbWVudHM7XG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBhMTEgPSBhZVsgMCBdLCBhMTIgPSBhZVsgMyBdLCBhMTMgPSBhZVsgNiBdO1xuXHRcdHZhciBhMjEgPSBhZVsgMSBdLCBhMjIgPSBhZVsgNCBdLCBhMjMgPSBhZVsgNyBdO1xuXHRcdHZhciBhMzEgPSBhZVsgMiBdLCBhMzIgPSBhZVsgNSBdLCBhMzMgPSBhZVsgOCBdO1xuXG5cdFx0dmFyIGIxMSA9IGJlWyAwIF0sIGIxMiA9IGJlWyAzIF0sIGIxMyA9IGJlWyA2IF07XG5cdFx0dmFyIGIyMSA9IGJlWyAxIF0sIGIyMiA9IGJlWyA0IF0sIGIyMyA9IGJlWyA3IF07XG5cdFx0dmFyIGIzMSA9IGJlWyAyIF0sIGIzMiA9IGJlWyA1IF0sIGIzMyA9IGJlWyA4IF07XG5cblx0XHR0ZVsgMCBdID0gYTExICogYjExICsgYTEyICogYjIxICsgYTEzICogYjMxO1xuXHRcdHRlWyAzIF0gPSBhMTEgKiBiMTIgKyBhMTIgKiBiMjIgKyBhMTMgKiBiMzI7XG5cdFx0dGVbIDYgXSA9IGExMSAqIGIxMyArIGExMiAqIGIyMyArIGExMyAqIGIzMztcblxuXHRcdHRlWyAxIF0gPSBhMjEgKiBiMTEgKyBhMjIgKiBiMjEgKyBhMjMgKiBiMzE7XG5cdFx0dGVbIDQgXSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMjtcblx0XHR0ZVsgNyBdID0gYTIxICogYjEzICsgYTIyICogYjIzICsgYTIzICogYjMzO1xuXG5cdFx0dGVbIDIgXSA9IGEzMSAqIGIxMSArIGEzMiAqIGIyMSArIGEzMyAqIGIzMTtcblx0XHR0ZVsgNSBdID0gYTMxICogYjEyICsgYTMyICogYjIyICsgYTMzICogYjMyO1xuXHRcdHRlWyA4IF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMgKyBhMzMgKiBiMzM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSAqPSBzOyB0ZVsgMyBdICo9IHM7IHRlWyA2IF0gKj0gcztcblx0XHR0ZVsgMSBdICo9IHM7IHRlWyA0IF0gKj0gczsgdGVbIDcgXSAqPSBzO1xuXHRcdHRlWyAyIF0gKj0gczsgdGVbIDUgXSAqPSBzOyB0ZVsgOCBdICo9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRldGVybWluYW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGEgPSB0ZVsgMCBdLCBiID0gdGVbIDEgXSwgYyA9IHRlWyAyIF0sXG5cdFx0XHRkID0gdGVbIDMgXSwgZSA9IHRlWyA0IF0sIGYgPSB0ZVsgNSBdLFxuXHRcdFx0ZyA9IHRlWyA2IF0sIGggPSB0ZVsgNyBdLCBpID0gdGVbIDggXTtcblxuXHRcdHJldHVybiBhICogZSAqIGkgLSBhICogZiAqIGggLSBiICogZCAqIGkgKyBiICogZiAqIGcgKyBjICogZCAqIGggLSBjICogZSAqIGc7XG5cblx0fSxcblxuXHRnZXRJbnZlcnNlOiBmdW5jdGlvbiAoIG1hdHJpeCwgdGhyb3dPbkRlZ2VuZXJhdGUgKSB7XG5cblx0XHRpZiAoIG1hdHJpeCAmJiBtYXRyaXguaXNNYXRyaXg0ICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIlRIUkVFLk1hdHJpeDM6IC5nZXRJbnZlcnNlKCkgbm8gbG9uZ2VyIHRha2VzIGEgTWF0cml4NCBhcmd1bWVudC5cIiApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG1lID0gbWF0cml4LmVsZW1lbnRzLFxuXHRcdFx0dGUgPSB0aGlzLmVsZW1lbnRzLFxuXG5cdFx0XHRuMTEgPSBtZVsgMCBdLCBuMjEgPSBtZVsgMSBdLCBuMzEgPSBtZVsgMiBdLFxuXHRcdFx0bjEyID0gbWVbIDMgXSwgbjIyID0gbWVbIDQgXSwgbjMyID0gbWVbIDUgXSxcblx0XHRcdG4xMyA9IG1lWyA2IF0sIG4yMyA9IG1lWyA3IF0sIG4zMyA9IG1lWyA4IF0sXG5cblx0XHRcdHQxMSA9IG4zMyAqIG4yMiAtIG4zMiAqIG4yMyxcblx0XHRcdHQxMiA9IG4zMiAqIG4xMyAtIG4zMyAqIG4xMixcblx0XHRcdHQxMyA9IG4yMyAqIG4xMiAtIG4yMiAqIG4xMyxcblxuXHRcdFx0ZGV0ID0gbjExICogdDExICsgbjIxICogdDEyICsgbjMxICogdDEzO1xuXG5cdFx0aWYgKCBkZXQgPT09IDAgKSB7XG5cblx0XHRcdHZhciBtc2cgPSBcIlRIUkVFLk1hdHJpeDM6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMFwiO1xuXG5cdFx0XHRpZiAoIHRocm93T25EZWdlbmVyYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggbXNnICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBtc2cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5pZGVudGl0eSgpO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRldEludiA9IDEgLyBkZXQ7XG5cblx0XHR0ZVsgMCBdID0gdDExICogZGV0SW52O1xuXHRcdHRlWyAxIF0gPSAoIG4zMSAqIG4yMyAtIG4zMyAqIG4yMSApICogZGV0SW52O1xuXHRcdHRlWyAyIF0gPSAoIG4zMiAqIG4yMSAtIG4zMSAqIG4yMiApICogZGV0SW52O1xuXG5cdFx0dGVbIDMgXSA9IHQxMiAqIGRldEludjtcblx0XHR0ZVsgNCBdID0gKCBuMzMgKiBuMTEgLSBuMzEgKiBuMTMgKSAqIGRldEludjtcblx0XHR0ZVsgNSBdID0gKCBuMzEgKiBuMTIgLSBuMzIgKiBuMTEgKSAqIGRldEludjtcblxuXHRcdHRlWyA2IF0gPSB0MTMgKiBkZXRJbnY7XG5cdFx0dGVbIDcgXSA9ICggbjIxICogbjEzIC0gbjIzICogbjExICkgKiBkZXRJbnY7XG5cdFx0dGVbIDggXSA9ICggbjIyICogbjExIC0gbjIxICogbjEyICkgKiBkZXRJbnY7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRtcCwgbSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0bXAgPSBtWyAxIF07IG1bIDEgXSA9IG1bIDMgXTsgbVsgMyBdID0gdG1wO1xuXHRcdHRtcCA9IG1bIDIgXTsgbVsgMiBdID0gbVsgNiBdOyBtWyA2IF0gPSB0bXA7XG5cdFx0dG1wID0gbVsgNSBdOyBtWyA1IF0gPSBtWyA3IF07IG1bIDcgXSA9IHRtcDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Tm9ybWFsTWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeDQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCggbWF0cml4NCApLmdldEludmVyc2UoIHRoaXMgKS50cmFuc3Bvc2UoKTtcblxuXHR9LFxuXG5cdHRyYW5zcG9zZUludG9BcnJheTogZnVuY3Rpb24gKCByICkge1xuXG5cdFx0dmFyIG0gPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0clsgMCBdID0gbVsgMCBdO1xuXHRcdHJbIDEgXSA9IG1bIDMgXTtcblx0XHRyWyAyIF0gPSBtWyA2IF07XG5cdFx0clsgMyBdID0gbVsgMSBdO1xuXHRcdHJbIDQgXSA9IG1bIDQgXTtcblx0XHRyWyA1IF0gPSBtWyA3IF07XG5cdFx0clsgNiBdID0gbVsgMiBdO1xuXHRcdHJbIDcgXSA9IG1bIDUgXTtcblx0XHRyWyA4IF0gPSBtWyA4IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFV2VHJhbnNmb3JtOiBmdW5jdGlvbiAoIHR4LCB0eSwgc3gsIHN5LCByb3RhdGlvbiwgY3gsIGN5ICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggcm90YXRpb24gKTtcblx0XHR2YXIgcyA9IE1hdGguc2luKCByb3RhdGlvbiApO1xuXG5cdFx0dGhpcy5zZXQoXG5cdFx0XHRzeCAqIGMsIHN4ICogcywgLSBzeCAqICggYyAqIGN4ICsgcyAqIGN5ICkgKyBjeCArIHR4LFxuXHRcdFx0LSBzeSAqIHMsIHN5ICogYywgLSBzeSAqICggLSBzICogY3ggKyBjICogY3kgKSArIGN5ICsgdHksXG5cdFx0XHQwLCAwLCAxXG5cdFx0KTtcblxuXHR9LFxuXG5cdHNjYWxlOiBmdW5jdGlvbiAoIHN4LCBzeSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHN4OyB0ZVsgMyBdICo9IHN4OyB0ZVsgNiBdICo9IHN4O1xuXHRcdHRlWyAxIF0gKj0gc3k7IHRlWyA0IF0gKj0gc3k7IHRlWyA3IF0gKj0gc3k7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZTogZnVuY3Rpb24gKCB0aGV0YSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIHRoZXRhICk7XG5cdFx0dmFyIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgYTExID0gdGVbIDAgXSwgYTEyID0gdGVbIDMgXSwgYTEzID0gdGVbIDYgXTtcblx0XHR2YXIgYTIxID0gdGVbIDEgXSwgYTIyID0gdGVbIDQgXSwgYTIzID0gdGVbIDcgXTtcblxuXHRcdHRlWyAwIF0gPSBjICogYTExICsgcyAqIGEyMTtcblx0XHR0ZVsgMyBdID0gYyAqIGExMiArIHMgKiBhMjI7XG5cdFx0dGVbIDYgXSA9IGMgKiBhMTMgKyBzICogYTIzO1xuXG5cdFx0dGVbIDEgXSA9IC0gcyAqIGExMSArIGMgKiBhMjE7XG5cdFx0dGVbIDQgXSA9IC0gcyAqIGExMiArIGMgKiBhMjI7XG5cdFx0dGVbIDcgXSA9IC0gcyAqIGExMyArIGMgKiBhMjM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCB0eCwgdHkgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSArPSB0eCAqIHRlWyAyIF07IHRlWyAzIF0gKz0gdHggKiB0ZVsgNSBdOyB0ZVsgNiBdICs9IHR4ICogdGVbIDggXTtcblx0XHR0ZVsgMSBdICs9IHR5ICogdGVbIDIgXTsgdGVbIDQgXSArPSB0eSAqIHRlWyA1IF07IHRlWyA3IF0gKz0gdHkgKiB0ZVsgOCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgbWUgPSBtYXRyaXguZWxlbWVudHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA5OyBpICsrICkge1xuXG5cdFx0XHRpZiAoIHRlWyBpIF0gIT09IG1lWyBpIF0gKSByZXR1cm4gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA5OyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRlWyAwIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRlWyAxIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRlWyAyIF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGVbIDMgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNCBdID0gdGVbIDQgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNSBdID0gdGVbIDUgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyA2IF0gPSB0ZVsgNiBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA3IF0gPSB0ZVsgNyBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA4IF0gPSB0ZVsgOCBdO1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBzemltZWsgLyBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVrL1xuICovXG5cbnZhciB0ZXh0dXJlSWQgPSAwO1xuXG5mdW5jdGlvbiBUZXh0dXJlKCBpbWFnZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IHRleHR1cmVJZCArKyB9ICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cblx0dGhpcy5pbWFnZSA9IGltYWdlICE9PSB1bmRlZmluZWQgPyBpbWFnZSA6IFRleHR1cmUuREVGQVVMVF9JTUFHRTtcblx0dGhpcy5taXBtYXBzID0gW107XG5cblx0dGhpcy5tYXBwaW5nID0gbWFwcGluZyAhPT0gdW5kZWZpbmVkID8gbWFwcGluZyA6IFRleHR1cmUuREVGQVVMVF9NQVBQSU5HO1xuXG5cdHRoaXMud3JhcFMgPSB3cmFwUyAhPT0gdW5kZWZpbmVkID8gd3JhcFMgOiBDbGFtcFRvRWRnZVdyYXBwaW5nO1xuXHR0aGlzLndyYXBUID0gd3JhcFQgIT09IHVuZGVmaW5lZCA/IHdyYXBUIDogQ2xhbXBUb0VkZ2VXcmFwcGluZztcblxuXHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXHR0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmlsdGVyIDogTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyO1xuXG5cdHRoaXMuYW5pc290cm9weSA9IGFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCA/IGFuaXNvdHJvcHkgOiAxO1xuXG5cdHRoaXMuZm9ybWF0ID0gZm9ybWF0ICE9PSB1bmRlZmluZWQgPyBmb3JtYXQgOiBSR0JBRm9ybWF0O1xuXHR0aGlzLnR5cGUgPSB0eXBlICE9PSB1bmRlZmluZWQgPyB0eXBlIDogVW5zaWduZWRCeXRlVHlwZTtcblxuXHR0aGlzLm9mZnNldCA9IG5ldyBWZWN0b3IyKCAwLCAwICk7XG5cdHRoaXMucmVwZWF0ID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblx0dGhpcy5jZW50ZXIgPSBuZXcgVmVjdG9yMiggMCwgMCApO1xuXHR0aGlzLnJvdGF0aW9uID0gMDtcblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSB0cnVlO1xuXHR0aGlzLm1hdHJpeCA9IG5ldyBNYXRyaXgzKCk7XG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSB0cnVlO1xuXHR0aGlzLnByZW11bHRpcGx5QWxwaGEgPSBmYWxzZTtcblx0dGhpcy5mbGlwWSA9IHRydWU7XG5cdHRoaXMudW5wYWNrQWxpZ25tZW50ID0gNDtcdC8vIHZhbGlkIHZhbHVlczogMSwgMiwgNCwgOCAoc2VlIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvb3BlbmdsZXMvc2RrL2RvY3MvbWFuL3hodG1sL2dsUGl4ZWxTdG9yZWkueG1sKVxuXG5cdC8vIFZhbHVlcyBvZiBlbmNvZGluZyAhPT0gVEhSRUUuTGluZWFyRW5jb2Rpbmcgb25seSBzdXBwb3J0ZWQgb24gbWFwLCBlbnZNYXAgYW5kIGVtaXNzaXZlTWFwLlxuXHQvL1xuXHQvLyBBbHNvIGNoYW5naW5nIHRoZSBlbmNvZGluZyBhZnRlciBhbHJlYWR5IHVzZWQgYnkgYSBNYXRlcmlhbCB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IG1ha2UgdGhlIE1hdGVyaWFsXG5cdC8vIHVwZGF0ZS4gIFlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgY2FsbCBNYXRlcmlhbC5uZWVkc1VwZGF0ZSB0byB0cmlnZ2VyIGl0IHRvIHJlY29tcGlsZS5cblx0dGhpcy5lbmNvZGluZyA9IGVuY29kaW5nICE9PSB1bmRlZmluZWQgPyBlbmNvZGluZyA6IExpbmVhckVuY29kaW5nO1xuXG5cdHRoaXMudmVyc2lvbiA9IDA7XG5cdHRoaXMub25VcGRhdGUgPSBudWxsO1xuXG59XG5cblRleHR1cmUuREVGQVVMVF9JTUFHRSA9IHVuZGVmaW5lZDtcblRleHR1cmUuREVGQVVMVF9NQVBQSU5HID0gVVZNYXBwaW5nO1xuXG5UZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBUZXh0dXJlLFxuXG5cdGlzVGV4dHVyZTogdHJ1ZSxcblxuXHR1cGRhdGVNYXRyaXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKCB0aGlzLm9mZnNldC54LCB0aGlzLm9mZnNldC55LCB0aGlzLnJlcGVhdC54LCB0aGlzLnJlcGVhdC55LCB0aGlzLnJvdGF0aW9uLCB0aGlzLmNlbnRlci54LCB0aGlzLmNlbnRlci55ICk7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdHRoaXMuaW1hZ2UgPSBzb3VyY2UuaW1hZ2U7XG5cdFx0dGhpcy5taXBtYXBzID0gc291cmNlLm1pcG1hcHMuc2xpY2UoIDAgKTtcblxuXHRcdHRoaXMubWFwcGluZyA9IHNvdXJjZS5tYXBwaW5nO1xuXG5cdFx0dGhpcy53cmFwUyA9IHNvdXJjZS53cmFwUztcblx0XHR0aGlzLndyYXBUID0gc291cmNlLndyYXBUO1xuXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBzb3VyY2UubWFnRmlsdGVyO1xuXHRcdHRoaXMubWluRmlsdGVyID0gc291cmNlLm1pbkZpbHRlcjtcblxuXHRcdHRoaXMuYW5pc290cm9weSA9IHNvdXJjZS5hbmlzb3Ryb3B5O1xuXG5cdFx0dGhpcy5mb3JtYXQgPSBzb3VyY2UuZm9ybWF0O1xuXHRcdHRoaXMudHlwZSA9IHNvdXJjZS50eXBlO1xuXG5cdFx0dGhpcy5vZmZzZXQuY29weSggc291cmNlLm9mZnNldCApO1xuXHRcdHRoaXMucmVwZWF0LmNvcHkoIHNvdXJjZS5yZXBlYXQgKTtcblx0XHR0aGlzLmNlbnRlci5jb3B5KCBzb3VyY2UuY2VudGVyICk7XG5cdFx0dGhpcy5yb3RhdGlvbiA9IHNvdXJjZS5yb3RhdGlvbjtcblxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xuXHRcdHRoaXMubWF0cml4LmNvcHkoIHNvdXJjZS5tYXRyaXggKTtcblxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gc291cmNlLmdlbmVyYXRlTWlwbWFwcztcblx0XHR0aGlzLnByZW11bHRpcGx5QWxwaGEgPSBzb3VyY2UucHJlbXVsdGlwbHlBbHBoYTtcblx0XHR0aGlzLmZsaXBZID0gc291cmNlLmZsaXBZO1xuXHRcdHRoaXMudW5wYWNrQWxpZ25tZW50ID0gc291cmNlLnVucGFja0FsaWdubWVudDtcblx0XHR0aGlzLmVuY29kaW5nID0gc291cmNlLmVuY29kaW5nO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBpc1Jvb3RPYmplY3QgPSAoIG1ldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWV0YSA9PT0gJ3N0cmluZycgKTtcblxuXHRcdGlmICggISBpc1Jvb3RPYmplY3QgJiYgbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0RGF0YVVSTCggaW1hZ2UgKSB7XG5cblx0XHRcdHZhciBjYW52YXM7XG5cblx0XHRcdGlmICggaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCApIHtcblxuXHRcdFx0XHRjYW52YXMgPSBpbWFnZTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblx0XHRcdFx0Y2FudmFzLndpZHRoID0gaW1hZ2Uud2lkdGg7XG5cdFx0XHRcdGNhbnZhcy5oZWlnaHQgPSBpbWFnZS5oZWlnaHQ7XG5cblx0XHRcdFx0dmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXG5cdFx0XHRcdGlmICggaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZURhdGEgKSB7XG5cblx0XHRcdFx0XHRjb250ZXh0LnB1dEltYWdlRGF0YSggaW1hZ2UsIDAsIDAgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggY2FudmFzLndpZHRoID4gMjA0OCB8fCBjYW52YXMuaGVpZ2h0ID4gMjA0OCApIHtcblxuXHRcdFx0XHRyZXR1cm4gY2FudmFzLnRvRGF0YVVSTCggJ2ltYWdlL2pwZWcnLCAwLjYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXR1cm4gY2FudmFzLnRvRGF0YVVSTCggJ2ltYWdlL3BuZycgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIG91dHB1dCA9IHtcblxuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnVGV4dHVyZScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ1RleHR1cmUudG9KU09OJ1xuXHRcdFx0fSxcblxuXHRcdFx0dXVpZDogdGhpcy51dWlkLFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLFxuXG5cdFx0XHRtYXBwaW5nOiB0aGlzLm1hcHBpbmcsXG5cblx0XHRcdHJlcGVhdDogWyB0aGlzLnJlcGVhdC54LCB0aGlzLnJlcGVhdC55IF0sXG5cdFx0XHRvZmZzZXQ6IFsgdGhpcy5vZmZzZXQueCwgdGhpcy5vZmZzZXQueSBdLFxuXHRcdFx0Y2VudGVyOiBbIHRoaXMuY2VudGVyLngsIHRoaXMuY2VudGVyLnkgXSxcblx0XHRcdHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxuXG5cdFx0XHR3cmFwOiBbIHRoaXMud3JhcFMsIHRoaXMud3JhcFQgXSxcblxuXHRcdFx0Zm9ybWF0OiB0aGlzLmZvcm1hdCxcblx0XHRcdG1pbkZpbHRlcjogdGhpcy5taW5GaWx0ZXIsXG5cdFx0XHRtYWdGaWx0ZXI6IHRoaXMubWFnRmlsdGVyLFxuXHRcdFx0YW5pc290cm9weTogdGhpcy5hbmlzb3Ryb3B5LFxuXG5cdFx0XHRmbGlwWTogdGhpcy5mbGlwWVxuXG5cdFx0fTtcblxuXHRcdGlmICggdGhpcy5pbWFnZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBUT0RPOiBNb3ZlIHRvIFRIUkVFLkltYWdlXG5cblx0XHRcdHZhciBpbWFnZSA9IHRoaXMuaW1hZ2U7XG5cblx0XHRcdGlmICggaW1hZ2UudXVpZCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGltYWdlLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsgLy8gVUdIXG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCAhIGlzUm9vdE9iamVjdCAmJiBtZXRhLmltYWdlc1sgaW1hZ2UudXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bWV0YS5pbWFnZXNbIGltYWdlLnV1aWQgXSA9IHtcblx0XHRcdFx0XHR1dWlkOiBpbWFnZS51dWlkLFxuXHRcdFx0XHRcdHVybDogZ2V0RGF0YVVSTCggaW1hZ2UgKVxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dHB1dC5pbWFnZSA9IGltYWdlLnV1aWQ7XG5cblx0XHR9XG5cblx0XHRpZiAoICEgaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHRtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXSA9IG91dHB1dDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBvdXRwdXQ7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9LFxuXG5cdHRyYW5zZm9ybVV2OiBmdW5jdGlvbiAoIHV2ICkge1xuXG5cdFx0aWYgKCB0aGlzLm1hcHBpbmcgIT09IFVWTWFwcGluZyApIHJldHVybjtcblxuXHRcdHV2LmFwcGx5TWF0cml4MyggdGhpcy5tYXRyaXggKTtcblxuXHRcdGlmICggdXYueCA8IDAgfHwgdXYueCA+IDEgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMud3JhcFMgKSB7XG5cblx0XHRcdFx0Y2FzZSBSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnggPSB1di54IC0gTWF0aC5mbG9vciggdXYueCApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ2xhbXBUb0VkZ2VXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnggPSB1di54IDwgMCA/IDAgOiAxO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdGlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnggKSAlIDIgKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0dXYueCA9IE1hdGguY2VpbCggdXYueCApIC0gdXYueDtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHV2LnggPSB1di54IC0gTWF0aC5mbG9vciggdXYueCApO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHV2LnkgPCAwIHx8IHV2LnkgPiAxICkge1xuXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLndyYXBUICkge1xuXG5cdFx0XHRcdGNhc2UgUmVwZWF0V3JhcHBpbmc6XG5cblx0XHRcdFx0XHR1di55ID0gdXYueSAtIE1hdGguZmxvb3IoIHV2LnkgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIENsYW1wVG9FZGdlV3JhcHBpbmc6XG5cblx0XHRcdFx0XHR1di55ID0gdXYueSA8IDAgPyAwIDogMTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc6XG5cblx0XHRcdFx0XHRpZiAoIE1hdGguYWJzKCBNYXRoLmZsb29yKCB1di55ICkgJSAyICkgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdHV2LnkgPSBNYXRoLmNlaWwoIHV2LnkgKSAtIHV2Lnk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR1di55ID0gdXYueSAtIE1hdGguZmxvb3IoIHV2LnkgKTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmZsaXBZICkge1xuXG5cdFx0XHR1di55ID0gMSAtIHV2Lnk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggVGV4dHVyZS5wcm90b3R5cGUsIFwibmVlZHNVcGRhdGVcIiwge1xuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBzdXBlcmVnZ2JlcnQgLyBodHRwOi8vd3d3LnBhdWxicnVudC5jby51ay9cbiAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVyLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIFZlY3RvcjQoIHgsIHksIHosIHcgKSB7XG5cblx0dGhpcy54ID0geCB8fCAwO1xuXHR0aGlzLnkgPSB5IHx8IDA7XG5cdHRoaXMueiA9IHogfHwgMDtcblx0dGhpcy53ID0gKCB3ICE9PSB1bmRlZmluZWQgKSA/IHcgOiAxO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjQucHJvdG90eXBlLCB7XG5cblx0aXNWZWN0b3I0OiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXHRcdHRoaXMueiA9IHo7XG5cdFx0dGhpcy53ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCA9IHNjYWxhcjtcblx0XHR0aGlzLnkgPSBzY2FsYXI7XG5cdFx0dGhpcy56ID0gc2NhbGFyO1xuXHRcdHRoaXMudyA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCB4ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCB5ICkge1xuXG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCB6ICkge1xuXG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCB3ICkge1xuXG5cdFx0dGhpcy53ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4LCB2YWx1ZSApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAyOiB0aGlzLnogPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDM6IHRoaXMudyA9IHZhbHVlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XG5cdFx0XHRjYXNlIDI6IHJldHVybiB0aGlzLno7XG5cdFx0XHRjYXNlIDM6IHJldHVybiB0aGlzLnc7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53ICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSB2Lng7XG5cdFx0dGhpcy55ID0gdi55O1xuXHRcdHRoaXMueiA9IHYuejtcblx0XHR0aGlzLncgPSAoIHYudyAhPT0gdW5kZWZpbmVkICkgPyB2LncgOiAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRkVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ICs9IHYueDtcblx0XHR0aGlzLnkgKz0gdi55O1xuXHRcdHRoaXMueiArPSB2Lno7XG5cdFx0dGhpcy53ICs9IHYudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblx0XHR0aGlzLnogKz0gcztcblx0XHR0aGlzLncgKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XG5cdFx0dGhpcy53ID0gYS53ICsgYi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsZWRWZWN0b3I6IGZ1bmN0aW9uICggdiwgcyApIHtcblxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xuXHRcdHRoaXMueSArPSB2LnkgKiBzO1xuXHRcdHRoaXMueiArPSB2LnogKiBzO1xuXHRcdHRoaXMudyArPSB2LncgKiBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWI6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54IC09IHYueDtcblx0XHR0aGlzLnkgLT0gdi55O1xuXHRcdHRoaXMueiAtPSB2Lno7XG5cdFx0dGhpcy53IC09IHYudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblx0XHR0aGlzLnogLT0gcztcblx0XHR0aGlzLncgLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XG5cdFx0dGhpcy53ID0gYS53IC0gYi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cdFx0dGhpcy56ICo9IHNjYWxhcjtcblx0XHR0aGlzLncgKj0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56LCB3ID0gdGhpcy53O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogeiArIGVbIDEyIF0gKiB3O1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICogeiArIGVbIDEzIF0gKiB3O1xuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHogKyBlWyAxNCBdICogdztcblx0XHR0aGlzLncgPSBlWyAzIF0gKiB4ICsgZVsgNyBdICogeSArIGVbIDExIF0gKiB6ICsgZVsgMTUgXSAqIHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpdmlkZVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggMSAvIHNjYWxhciApO1xuXG5cdH0sXG5cblx0c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9xdWF0ZXJuaW9uVG9BbmdsZS9pbmRleC5odG1cblxuXHRcdC8vIHEgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0XHR0aGlzLncgPSAyICogTWF0aC5hY29zKCBxLncgKTtcblxuXHRcdHZhciBzID0gTWF0aC5zcXJ0KCAxIC0gcS53ICogcS53ICk7XG5cblx0XHRpZiAoIHMgPCAwLjAwMDEgKSB7XG5cblx0XHRcdHRoaXMueCA9IDE7XG5cdFx0XHR0aGlzLnkgPSAwO1xuXHRcdFx0dGhpcy56ID0gMDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMueCA9IHEueCAvIHM7XG5cdFx0XHR0aGlzLnkgPSBxLnkgLyBzO1xuXHRcdFx0dGhpcy56ID0gcS56IC8gcztcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9BbmdsZS9pbmRleC5odG1cblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHR2YXIgYW5nbGUsIHgsIHksIHosXHRcdC8vIHZhcmlhYmxlcyBmb3IgcmVzdWx0XG5cdFx0XHRlcHNpbG9uID0gMC4wMSxcdFx0Ly8gbWFyZ2luIHRvIGFsbG93IGZvciByb3VuZGluZyBlcnJvcnNcblx0XHRcdGVwc2lsb24yID0gMC4xLFx0XHQvLyBtYXJnaW4gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiAwIGFuZCAxODAgZGVncmVlc1xuXG5cdFx0XHR0ZSA9IG0uZWxlbWVudHMsXG5cblx0XHRcdG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF0sXG5cdFx0XHRtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdLFxuXHRcdFx0bTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF07XG5cblx0XHRpZiAoICggTWF0aC5hYnMoIG0xMiAtIG0yMSApIDwgZXBzaWxvbiApICYmXG5cdFx0ICAgICAoIE1hdGguYWJzKCBtMTMgLSBtMzEgKSA8IGVwc2lsb24gKSAmJlxuXHRcdCAgICAgKCBNYXRoLmFicyggbTIzIC0gbTMyICkgPCBlcHNpbG9uICkgKSB7XG5cblx0XHRcdC8vIHNpbmd1bGFyaXR5IGZvdW5kXG5cdFx0XHQvLyBmaXJzdCBjaGVjayBmb3IgaWRlbnRpdHkgbWF0cml4IHdoaWNoIG11c3QgaGF2ZSArMSBmb3IgYWxsIHRlcm1zXG5cdFx0XHQvLyBpbiBsZWFkaW5nIGRpYWdvbmFsIGFuZCB6ZXJvIGluIG90aGVyIHRlcm1zXG5cblx0XHRcdGlmICggKCBNYXRoLmFicyggbTEyICsgbTIxICkgPCBlcHNpbG9uMiApICYmXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0xMyArIG0zMSApIDwgZXBzaWxvbjIgKSAmJlxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMjMgKyBtMzIgKSA8IGVwc2lsb24yICkgJiZcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTExICsgbTIyICsgbTMzIC0gMyApIDwgZXBzaWxvbjIgKSApIHtcblxuXHRcdFx0XHQvLyB0aGlzIHNpbmd1bGFyaXR5IGlzIGlkZW50aXR5IG1hdHJpeCBzbyBhbmdsZSA9IDBcblxuXHRcdFx0XHR0aGlzLnNldCggMSwgMCwgMCwgMCApO1xuXG5cdFx0XHRcdHJldHVybiB0aGlzOyAvLyB6ZXJvIGFuZ2xlLCBhcmJpdHJhcnkgYXhpc1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG90aGVyd2lzZSB0aGlzIHNpbmd1bGFyaXR5IGlzIGFuZ2xlID0gMTgwXG5cblx0XHRcdGFuZ2xlID0gTWF0aC5QSTtcblxuXHRcdFx0dmFyIHh4ID0gKCBtMTEgKyAxICkgLyAyO1xuXHRcdFx0dmFyIHl5ID0gKCBtMjIgKyAxICkgLyAyO1xuXHRcdFx0dmFyIHp6ID0gKCBtMzMgKyAxICkgLyAyO1xuXHRcdFx0dmFyIHh5ID0gKCBtMTIgKyBtMjEgKSAvIDQ7XG5cdFx0XHR2YXIgeHogPSAoIG0xMyArIG0zMSApIC8gNDtcblx0XHRcdHZhciB5eiA9ICggbTIzICsgbTMyICkgLyA0O1xuXG5cdFx0XHRpZiAoICggeHggPiB5eSApICYmICggeHggPiB6eiApICkge1xuXG5cdFx0XHRcdC8vIG0xMSBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtXG5cblx0XHRcdFx0aWYgKCB4eCA8IGVwc2lsb24gKSB7XG5cblx0XHRcdFx0XHR4ID0gMDtcblx0XHRcdFx0XHR5ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eiA9IDAuNzA3MTA2NzgxO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR4ID0gTWF0aC5zcXJ0KCB4eCApO1xuXHRcdFx0XHRcdHkgPSB4eSAvIHg7XG5cdFx0XHRcdFx0eiA9IHh6IC8geDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIHl5ID4genogKSB7XG5cblx0XHRcdFx0Ly8gbTIyIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm1cblxuXHRcdFx0XHRpZiAoIHl5IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR5ID0gMDtcblx0XHRcdFx0XHR6ID0gMC43MDcxMDY3ODE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHkgPSBNYXRoLnNxcnQoIHl5ICk7XG5cdFx0XHRcdFx0eCA9IHh5IC8geTtcblx0XHRcdFx0XHR6ID0geXogLyB5O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBtMzMgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybSBzbyBiYXNlIHJlc3VsdCBvbiB0aGlzXG5cblx0XHRcdFx0aWYgKCB6eiA8IGVwc2lsb24gKSB7XG5cblx0XHRcdFx0XHR4ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eSA9IDAuNzA3MTA2NzgxO1xuXHRcdFx0XHRcdHogPSAwO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR6ID0gTWF0aC5zcXJ0KCB6eiApO1xuXHRcdFx0XHRcdHggPSB4eiAvIHo7XG5cdFx0XHRcdFx0eSA9IHl6IC8gejtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zZXQoIHgsIHksIHosIGFuZ2xlICk7XG5cblx0XHRcdHJldHVybiB0aGlzOyAvLyByZXR1cm4gMTgwIGRlZyByb3RhdGlvblxuXG5cdFx0fVxuXG5cdFx0Ly8gYXMgd2UgaGF2ZSByZWFjaGVkIGhlcmUgdGhlcmUgYXJlIG5vIHNpbmd1bGFyaXRpZXMgc28gd2UgY2FuIGhhbmRsZSBub3JtYWxseVxuXG5cdFx0dmFyIHMgPSBNYXRoLnNxcnQoICggbTMyIC0gbTIzICkgKiAoIG0zMiAtIG0yMyApICtcblx0XHQgICAgICAgICAgICAgICAgICAgKCBtMTMgLSBtMzEgKSAqICggbTEzIC0gbTMxICkgK1xuXHRcdCAgICAgICAgICAgICAgICAgICAoIG0yMSAtIG0xMiApICogKCBtMjEgLSBtMTIgKSApOyAvLyB1c2VkIHRvIG5vcm1hbGl6ZVxuXG5cdFx0aWYgKCBNYXRoLmFicyggcyApIDwgMC4wMDEgKSBzID0gMTtcblxuXHRcdC8vIHByZXZlbnQgZGl2aWRlIGJ5IHplcm8sIHNob3VsZCBub3QgaGFwcGVuIGlmIG1hdHJpeCBpcyBvcnRob2dvbmFsIGFuZCBzaG91bGQgYmVcblx0XHQvLyBjYXVnaHQgYnkgc2luZ3VsYXJpdHkgdGVzdCBhYm92ZSwgYnV0IEkndmUgbGVmdCBpdCBpbiBqdXN0IGluIGNhc2VcblxuXHRcdHRoaXMueCA9ICggbTMyIC0gbTIzICkgLyBzO1xuXHRcdHRoaXMueSA9ICggbTEzIC0gbTMxICkgLyBzO1xuXHRcdHRoaXMueiA9ICggbTIxIC0gbTEyICkgLyBzO1xuXHRcdHRoaXMudyA9IE1hdGguYWNvcyggKCBtMTEgKyBtMjIgKyBtMzMgLSAxICkgLyAyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1pbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5taW4oIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5taW4oIHRoaXMueSwgdi55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5taW4oIHRoaXMueiwgdi56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5taW4oIHRoaXMudywgdi53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1heDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIHRoaXMueSwgdi55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIHRoaXMueiwgdi56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5tYXgoIHRoaXMudywgdi53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBtaW4gPCBtYXgsIGNvbXBvbmVudHdpc2VcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCBtaW4ueCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCBtaW4ueSwgTWF0aC5taW4oIG1heC55LCB0aGlzLnkgKSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCBtaW4ueiwgTWF0aC5taW4oIG1heC56LCB0aGlzLnogKSApO1xuXHRcdHRoaXMudyA9IE1hdGgubWF4KCBtaW4udywgTWF0aC5taW4oIG1heC53LCB0aGlzLncgKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcFNjYWxhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1pbiwgbWF4O1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHtcblxuXHRcdFx0aWYgKCBtaW4gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtaW4gPSBuZXcgVmVjdG9yNCgpO1xuXHRcdFx0XHRtYXggPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdG1pbi5zZXQoIG1pblZhbCwgbWluVmFsLCBtaW5WYWwsIG1pblZhbCApO1xuXHRcdFx0bWF4LnNldCggbWF4VmFsLCBtYXhWYWwsIG1heFZhbCwgbWF4VmFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmNsYW1wKCBtaW4sIG1heCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xhbXBMZW5ndGg6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApO1xuXG5cdH0sXG5cblx0Zmxvb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGguZmxvb3IoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9IE1hdGguZmxvb3IoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZWlsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5jZWlsKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSBNYXRoLmNlaWwoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5yb3VuZCggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5yb3VuZCggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kVG9aZXJvOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSAoIHRoaXMueiA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSAoIHRoaXMudyA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy53ICkgOiBNYXRoLmZsb29yKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAtIHRoaXMueDtcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcblx0XHR0aGlzLnogPSAtIHRoaXMuejtcblx0XHR0aGlzLncgPSAtIHRoaXMudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56ICsgdGhpcy53ICogdi53O1xuXG5cdH0sXG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLnc7XG5cblx0fSxcblxuXHRsZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiArIHRoaXMudyAqIHRoaXMudyApO1xuXG5cdH0sXG5cblx0bWFuaGF0dGFuTGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApICsgTWF0aC5hYnMoIHRoaXMueiApICsgTWF0aC5hYnMoIHRoaXMudyApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgfHwgMSApO1xuXG5cdH0sXG5cblx0c2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTtcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggdiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XG5cdFx0dGhpcy56ICs9ICggdi56IC0gdGhpcy56ICkgKiBhbHBoYTtcblx0XHR0aGlzLncgKz0gKCB2LncgLSB0aGlzLncgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwVmVjdG9yczogZnVuY3Rpb24gKCB2MSwgdjIsIGFscGhhICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdjIsIHYxICkubXVsdGlwbHlTY2FsYXIoIGFscGhhICkuYWRkKCB2MSApO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSAmJiAoIHYudyA9PT0gdGhpcy53ICkgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLnogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXHRcdHRoaXMudyA9IGFycmF5WyBvZmZzZXQgKyAzIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy56O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLnc7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblx0XHR0aGlzLnogPSBhdHRyaWJ1dGUuZ2V0WiggaW5kZXggKTtcblx0XHR0aGlzLncgPSBhdHRyaWJ1dGUuZ2V0VyggaW5kZXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igc3ppbWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIE1hcml1cyBLaW50ZWwgLyBodHRwczovL2dpdGh1Yi5jb20va2ludGVsXG4gKi9cblxuLypcbiBJbiBvcHRpb25zLCB3ZSBjYW4gc3BlY2lmeTpcbiAqIFRleHR1cmUgcGFyYW1ldGVycyBmb3IgYW4gYXV0by1nZW5lcmF0ZWQgdGFyZ2V0IHRleHR1cmVcbiAqIGRlcHRoQnVmZmVyL3N0ZW5jaWxCdWZmZXI6IEJvb2xlYW5zIHRvIGluZGljYXRlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSB0aGVzZSBidWZmZXJzXG4qL1xuZnVuY3Rpb24gV2ViR0xSZW5kZXJUYXJnZXQoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKSB7XG5cblx0dGhpcy53aWR0aCA9IHdpZHRoO1xuXHR0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuXHR0aGlzLnNjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXHR0aGlzLnNjaXNzb3JUZXN0ID0gZmFsc2U7XG5cblx0dGhpcy52aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0aWYgKCBvcHRpb25zLm1pbkZpbHRlciA9PT0gdW5kZWZpbmVkICkgb3B0aW9ucy5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XG5cblx0dGhpcy50ZXh0dXJlID0gbmV3IFRleHR1cmUoIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBvcHRpb25zLndyYXBTLCBvcHRpb25zLndyYXBULCBvcHRpb25zLm1hZ0ZpbHRlciwgb3B0aW9ucy5taW5GaWx0ZXIsIG9wdGlvbnMuZm9ybWF0LCBvcHRpb25zLnR5cGUsIG9wdGlvbnMuYW5pc290cm9weSwgb3B0aW9ucy5lbmNvZGluZyApO1xuXG5cdHRoaXMuZGVwdGhCdWZmZXIgPSBvcHRpb25zLmRlcHRoQnVmZmVyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlcHRoQnVmZmVyIDogdHJ1ZTtcblx0dGhpcy5zdGVuY2lsQnVmZmVyID0gb3B0aW9ucy5zdGVuY2lsQnVmZmVyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0ZW5jaWxCdWZmZXIgOiB0cnVlO1xuXHR0aGlzLmRlcHRoVGV4dHVyZSA9IG9wdGlvbnMuZGVwdGhUZXh0dXJlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlcHRoVGV4dHVyZSA6IG51bGw7XG5cbn1cblxuV2ViR0xSZW5kZXJUYXJnZXQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFdlYkdMUmVuZGVyVGFyZ2V0LFxuXG5cdGlzV2ViR0xSZW5kZXJUYXJnZXQ6IHRydWUsXG5cblx0c2V0U2l6ZTogZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0aWYgKCB0aGlzLndpZHRoICE9PSB3aWR0aCB8fCB0aGlzLmhlaWdodCAhPT0gaGVpZ2h0ICkge1xuXG5cdFx0XHR0aGlzLndpZHRoID0gd2lkdGg7XG5cdFx0XHR0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuXHRcdFx0dGhpcy5kaXNwb3NlKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnZpZXdwb3J0LnNldCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXHRcdHRoaXMuc2Npc3Nvci5zZXQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMud2lkdGggPSBzb3VyY2Uud2lkdGg7XG5cdFx0dGhpcy5oZWlnaHQgPSBzb3VyY2UuaGVpZ2h0O1xuXG5cdFx0dGhpcy52aWV3cG9ydC5jb3B5KCBzb3VyY2Uudmlld3BvcnQgKTtcblxuXHRcdHRoaXMudGV4dHVyZSA9IHNvdXJjZS50ZXh0dXJlLmNsb25lKCk7XG5cblx0XHR0aGlzLmRlcHRoQnVmZmVyID0gc291cmNlLmRlcHRoQnVmZmVyO1xuXHRcdHRoaXMuc3RlbmNpbEJ1ZmZlciA9IHNvdXJjZS5zdGVuY2lsQnVmZmVyO1xuXHRcdHRoaXMuZGVwdGhUZXh0dXJlID0gc291cmNlLmRlcHRoVGV4dHVyZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbVxuICovXG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHtcblxuXHRXZWJHTFJlbmRlclRhcmdldC5jYWxsKCB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICk7XG5cblx0dGhpcy5hY3RpdmVDdWJlRmFjZSA9IDA7IC8vIFBYIDAsIE5YIDEsIFBZIDIsIE5ZIDMsIFBaIDQsIE5aIDVcblx0dGhpcy5hY3RpdmVNaXBNYXBMZXZlbCA9IDA7XG5cbn1cblxuV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFdlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZSApO1xuV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZTtcblxuV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnByb3RvdHlwZS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBEYXRhVGV4dHVyZSggZGF0YSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKTtcblxuXHR0aGlzLmltYWdlID0geyBkYXRhOiBkYXRhLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG5cblx0dGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cdHRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBOZWFyZXN0RmlsdGVyO1xuXG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cdHRoaXMuZmxpcFkgPSBmYWxzZTtcblx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSAxO1xuXG59XG5cbkRhdGFUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5EYXRhVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEYXRhVGV4dHVyZTtcblxuRGF0YVRleHR1cmUucHJvdG90eXBlLmlzRGF0YVRleHR1cmUgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIEJveDMoIG1pbiwgbWF4ICkge1xuXG5cdHRoaXMubWluID0gKCBtaW4gIT09IHVuZGVmaW5lZCApID8gbWluIDogbmV3IFZlY3RvcjMoICsgSW5maW5pdHksICsgSW5maW5pdHksICsgSW5maW5pdHkgKTtcblx0dGhpcy5tYXggPSAoIG1heCAhPT0gdW5kZWZpbmVkICkgPyBtYXggOiBuZXcgVmVjdG9yMyggLSBJbmZpbml0eSwgLSBJbmZpbml0eSwgLSBJbmZpbml0eSApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEJveDMucHJvdG90eXBlLCB7XG5cblx0aXNCb3gzOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIG1pbiApO1xuXHRcdHRoaXMubWF4LmNvcHkoIG1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHR2YXIgbWluWCA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblkgPSArIEluZmluaXR5O1xuXHRcdHZhciBtaW5aID0gKyBJbmZpbml0eTtcblxuXHRcdHZhciBtYXhYID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WSA9IC0gSW5maW5pdHk7XG5cdFx0dmFyIG1heFogPSAtIEluZmluaXR5O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHR2YXIgeCA9IGFycmF5WyBpIF07XG5cdFx0XHR2YXIgeSA9IGFycmF5WyBpICsgMSBdO1xuXHRcdFx0dmFyIHogPSBhcnJheVsgaSArIDIgXTtcblxuXHRcdFx0aWYgKCB4IDwgbWluWCApIG1pblggPSB4O1xuXHRcdFx0aWYgKCB5IDwgbWluWSApIG1pblkgPSB5O1xuXHRcdFx0aWYgKCB6IDwgbWluWiApIG1pblogPSB6O1xuXG5cdFx0XHRpZiAoIHggPiBtYXhYICkgbWF4WCA9IHg7XG5cdFx0XHRpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7XG5cdFx0XHRpZiAoIHogPiBtYXhaICkgbWF4WiA9IHo7XG5cblx0XHR9XG5cblx0XHR0aGlzLm1pbi5zZXQoIG1pblgsIG1pblksIG1pblogKTtcblx0XHR0aGlzLm1heC5zZXQoIG1heFgsIG1heFksIG1heFogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHR2YXIgbWluWCA9ICsgSW5maW5pdHk7XG5cdFx0dmFyIG1pblkgPSArIEluZmluaXR5O1xuXHRcdHZhciBtaW5aID0gKyBJbmZpbml0eTtcblxuXHRcdHZhciBtYXhYID0gLSBJbmZpbml0eTtcblx0XHR2YXIgbWF4WSA9IC0gSW5maW5pdHk7XG5cdFx0dmFyIG1heFogPSAtIEluZmluaXR5O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHggPSBhdHRyaWJ1dGUuZ2V0WCggaSApO1xuXHRcdFx0dmFyIHkgPSBhdHRyaWJ1dGUuZ2V0WSggaSApO1xuXHRcdFx0dmFyIHogPSBhdHRyaWJ1dGUuZ2V0WiggaSApO1xuXG5cdFx0XHRpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7XG5cdFx0XHRpZiAoIHkgPCBtaW5ZICkgbWluWSA9IHk7XG5cdFx0XHRpZiAoIHogPCBtaW5aICkgbWluWiA9IHo7XG5cblx0XHRcdGlmICggeCA+IG1heFggKSBtYXhYID0geDtcblx0XHRcdGlmICggeSA+IG1heFkgKSBtYXhZID0geTtcblx0XHRcdGlmICggeiA+IG1heFogKSBtYXhaID0gejtcblxuXHRcdH1cblxuXHRcdHRoaXMubWluLnNldCggbWluWCwgbWluWSwgbWluWiApO1xuXHRcdHRoaXMubWF4LnNldCggbWF4WCwgbWF4WSwgbWF4WiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMubWFrZUVtcHR5KCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmV4cGFuZEJ5UG9pbnQoIHBvaW50c1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21DZW50ZXJBbmRTaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21DZW50ZXJBbmRTaXplKCBjZW50ZXIsIHNpemUgKSB7XG5cblx0XHRcdHZhciBoYWxmU2l6ZSA9IHYxLmNvcHkoIHNpemUgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0XHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcblx0XHRcdHRoaXMubWF4LmNvcHkoIGNlbnRlciApLmFkZCggaGFsZlNpemUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzZXRGcm9tT2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdHRoaXMubWFrZUVtcHR5KCk7XG5cblx0XHRyZXR1cm4gdGhpcy5leHBhbmRCeU9iamVjdCggb2JqZWN0ICk7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXguY29weSggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubWluLnggPSB0aGlzLm1pbi55ID0gdGhpcy5taW4ueiA9ICsgSW5maW5pdHk7XG5cdFx0dGhpcy5tYXgueCA9IHRoaXMubWF4LnkgPSB0aGlzLm1heC56ID0gLSBJbmZpbml0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aXNFbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdGhpcyBpcyBhIG1vcmUgcm9idXN0IGNoZWNrIGZvciBlbXB0eSB0aGFuICggdm9sdW1lIDw9IDAgKSBiZWNhdXNlIHZvbHVtZSBjYW4gZ2V0IHBvc2l0aXZlIHdpdGggdHdvIG5lZ2F0aXZlIGF4ZXNcblxuXHRcdHJldHVybiAoIHRoaXMubWF4LnggPCB0aGlzLm1pbi54ICkgfHwgKCB0aGlzLm1heC55IDwgdGhpcy5taW4ueSApIHx8ICggdGhpcy5tYXgueiA8IHRoaXMubWluLnogKTtcblxuXHR9LFxuXG5cdGdldENlbnRlcjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuZ2V0Q2VudGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwLCAwICkgOiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRoaXMubWF4ICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdH0sXG5cblx0Z2V0U2l6ZTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCggMCwgMCwgMCApIDogdGFyZ2V0LnN1YlZlY3RvcnMoIHRoaXMubWF4LCB0aGlzLm1pbiApO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggcG9pbnQgKTtcblx0XHR0aGlzLm1heC5tYXgoIHBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5VmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHRoaXMubWluLnN1YiggdmVjdG9yICk7XG5cdFx0dGhpcy5tYXguYWRkKCB2ZWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciApO1xuXHRcdHRoaXMubWF4LmFkZFNjYWxhciggc2NhbGFyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5T2JqZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBDb21wdXRlcyB0aGUgd29ybGQtYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveCBvZiBhbiBvYmplY3QgKGluY2x1ZGluZyBpdHMgY2hpbGRyZW4pLFxuXHRcdC8vIGFjY291bnRpbmcgZm9yIGJvdGggdGhlIG9iamVjdCdzLCBhbmQgY2hpbGRyZW4ncywgd29ybGQgdHJhbnNmb3Jtc1xuXG5cdFx0dmFyIHNjb3BlLCBpLCBsO1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZ1bmN0aW9uIHRyYXZlcnNlKCBub2RlICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSBub2RlLmdlb21ldHJ5O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cblx0XHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHYxLmNvcHkoIHZlcnRpY2VzWyBpIF0gKTtcblx0XHRcdFx0XHRcdHYxLmFwcGx5TWF0cml4NCggbm9kZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0XHRzY29wZS5leHBhbmRCeVBvaW50KCB2MSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHR2YXIgYXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2MS5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGkgKS5hcHBseU1hdHJpeDQoIG5vZGUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHRcdFx0XHRzY29wZS5leHBhbmRCeVBvaW50KCB2MSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZXhwYW5kQnlPYmplY3QoIG9iamVjdCApIHtcblxuXHRcdFx0c2NvcGUgPSB0aGlzO1xuXG5cdFx0XHRvYmplY3QudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdFx0b2JqZWN0LnRyYXZlcnNlKCB0cmF2ZXJzZSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gcG9pbnQueCA8IHRoaXMubWluLnggfHwgcG9pbnQueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdHBvaW50LnkgPCB0aGlzLm1pbi55IHx8IHBvaW50LnkgPiB0aGlzLm1heC55IHx8XG5cdFx0XHRwb2ludC56IDwgdGhpcy5taW4ueiB8fCBwb2ludC56ID4gdGhpcy5tYXgueiA/IGZhbHNlIDogdHJ1ZTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiB0aGlzLm1pbi54IDw9IGJveC5taW4ueCAmJiBib3gubWF4LnggPD0gdGhpcy5tYXgueCAmJlxuXHRcdFx0dGhpcy5taW4ueSA8PSBib3gubWluLnkgJiYgYm94Lm1heC55IDw9IHRoaXMubWF4LnkgJiZcblx0XHRcdHRoaXMubWluLnogPD0gYm94Lm1pbi56ICYmIGJveC5tYXgueiA8PSB0aGlzLm1heC56O1xuXG5cdH0sXG5cblx0Z2V0UGFyYW1ldGVyOiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHQvLyBUaGlzIGNhbiBwb3RlbnRpYWxseSBoYXZlIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIGJveFxuXHRcdC8vIGhhcyBhIHNpemUgZGltZW5zaW9uIG9mIDAuXG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldChcblx0XHRcdCggcG9pbnQueCAtIHRoaXMubWluLnggKSAvICggdGhpcy5tYXgueCAtIHRoaXMubWluLnggKSxcblx0XHRcdCggcG9pbnQueSAtIHRoaXMubWluLnkgKSAvICggdGhpcy5tYXgueSAtIHRoaXMubWluLnkgKSxcblx0XHRcdCggcG9pbnQueiAtIHRoaXMubWluLnogKSAvICggdGhpcy5tYXgueiAtIHRoaXMubWluLnogKVxuXHRcdCk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdC8vIHVzaW5nIDYgc3BsaXR0aW5nIHBsYW5lcyB0byBydWxlIG91dCBpbnRlcnNlY3Rpb25zLlxuXHRcdHJldHVybiBib3gubWF4LnggPCB0aGlzLm1pbi54IHx8IGJveC5taW4ueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdGJveC5tYXgueSA8IHRoaXMubWluLnkgfHwgYm94Lm1pbi55ID4gdGhpcy5tYXgueSB8fFxuXHRcdFx0Ym94Lm1heC56IDwgdGhpcy5taW4ueiB8fCBib3gubWluLnogPiB0aGlzLm1heC56ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1NwaGVyZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgY2xvc2VzdFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSB7XG5cblx0XHRcdC8vIEZpbmQgdGhlIHBvaW50IG9uIHRoZSBBQUJCIGNsb3Nlc3QgdG8gdGhlIHNwaGVyZSBjZW50ZXIuXG5cdFx0XHR0aGlzLmNsYW1wUG9pbnQoIHNwaGVyZS5jZW50ZXIsIGNsb3Nlc3RQb2ludCApO1xuXG5cdFx0XHQvLyBJZiB0aGF0IHBvaW50IGlzIGluc2lkZSB0aGUgc3BoZXJlLCB0aGUgQUFCQiBhbmQgc3BoZXJlIGludGVyc2VjdC5cblx0XHRcdHJldHVybiBjbG9zZXN0UG9pbnQuZGlzdGFuY2VUb1NxdWFyZWQoIHNwaGVyZS5jZW50ZXIgKSA8PSAoIHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpLFxuXG5cdGludGVyc2VjdHNQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdC8vIFdlIGNvbXB1dGUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZG90IHByb2R1Y3QgdmFsdWVzLiBJZiB0aG9zZSB2YWx1ZXNcblx0XHQvLyBhcmUgb24gdGhlIHNhbWUgc2lkZSAoYmFjayBvciBmcm9udCkgb2YgdGhlIHBsYW5lLCB0aGVuIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbi5cblxuXHRcdHZhciBtaW4sIG1heDtcblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnggPiAwICkge1xuXG5cdFx0XHRtaW4gPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7XG5cdFx0XHRtYXggPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWF4Lng7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtaW4gPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWF4Lng7XG5cdFx0XHRtYXggPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7XG5cblx0XHR9XG5cblx0XHRpZiAoIHBsYW5lLm5vcm1hbC55ID4gMCApIHtcblxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5taW4ueTtcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1heC55O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5taW4ueTtcblxuXHRcdH1cblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnogPiAwICkge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5tYXguejtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWF4Lno7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuICggbWluIDw9IHBsYW5lLmNvbnN0YW50ICYmIG1heCA+PSBwbGFuZS5jb25zdGFudCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1RyaWFuZ2xlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRyaWFuZ2xlIGNlbnRlcmVkIHZlcnRpY2VzXG5cdFx0dmFyIHYwID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyB0cmlhbmdsZSBlZGdlIHZlY3RvcnNcblx0XHR2YXIgZjAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBmMSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGYyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB0ZXN0QXhpcyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgY2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZXh0ZW50cyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgdHJpYW5nbGVOb3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0ZnVuY3Rpb24gc2F0Rm9yQXhlcyggYXhlcyApIHtcblxuXHRcdFx0dmFyIGksIGo7XG5cblx0XHRcdGZvciAoIGkgPSAwLCBqID0gYXhlcy5sZW5ndGggLSAzOyBpIDw9IGo7IGkgKz0gMyApIHtcblxuXHRcdFx0XHR0ZXN0QXhpcy5mcm9tQXJyYXkoIGF4ZXMsIGkgKTtcblx0XHRcdFx0Ly8gcHJvamVjdCB0aGUgYWFiYiBvbnRvIHRoZSBzZXBlcmF0aW5nIGF4aXNcblx0XHRcdFx0dmFyIHIgPSBleHRlbnRzLnggKiBNYXRoLmFicyggdGVzdEF4aXMueCApICsgZXh0ZW50cy55ICogTWF0aC5hYnMoIHRlc3RBeGlzLnkgKSArIGV4dGVudHMueiAqIE1hdGguYWJzKCB0ZXN0QXhpcy56ICk7XG5cdFx0XHRcdC8vIHByb2plY3QgYWxsIDMgdmVydGljZXMgb2YgdGhlIHRyaWFuZ2xlIG9udG8gdGhlIHNlcGVyYXRpbmcgYXhpc1xuXHRcdFx0XHR2YXIgcDAgPSB2MC5kb3QoIHRlc3RBeGlzICk7XG5cdFx0XHRcdHZhciBwMSA9IHYxLmRvdCggdGVzdEF4aXMgKTtcblx0XHRcdFx0dmFyIHAyID0gdjIuZG90KCB0ZXN0QXhpcyApO1xuXHRcdFx0XHQvLyBhY3R1YWwgdGVzdCwgYmFzaWNhbGx5IHNlZSBpZiBlaXRoZXIgb2YgdGhlIG1vc3QgZXh0cmVtZSBvZiB0aGUgdHJpYW5nbGUgcG9pbnRzIGludGVyc2VjdHMgclxuXHRcdFx0XHRpZiAoIE1hdGgubWF4KCAtIE1hdGgubWF4KCBwMCwgcDEsIHAyICksIE1hdGgubWluKCBwMCwgcDEsIHAyICkgKSA+IHIgKSB7XG5cblx0XHRcdFx0XHQvLyBwb2ludHMgb2YgdGhlIHByb2plY3RlZCB0cmlhbmdsZSBhcmUgb3V0c2lkZSB0aGUgcHJvamVjdGVkIGhhbGYtbGVuZ3RoIG9mIHRoZSBhYWJiXG5cdFx0XHRcdFx0Ly8gdGhlIGF4aXMgaXMgc2VwZXJhdGluZyBhbmQgd2UgY2FuIGV4aXRcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNUcmlhbmdsZSggdHJpYW5nbGUgKSB7XG5cblx0XHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGNvbXB1dGUgYm94IGNlbnRlciBhbmQgZXh0ZW50c1xuXHRcdFx0dGhpcy5nZXRDZW50ZXIoIGNlbnRlciApO1xuXHRcdFx0ZXh0ZW50cy5zdWJWZWN0b3JzKCB0aGlzLm1heCwgY2VudGVyICk7XG5cblx0XHRcdC8vIHRyYW5zbGF0ZSB0cmlhbmdsZSB0byBhYWJiIG9yaWdpblxuXHRcdFx0djAuc3ViVmVjdG9ycyggdHJpYW5nbGUuYSwgY2VudGVyICk7XG5cdFx0XHR2MS5zdWJWZWN0b3JzKCB0cmlhbmdsZS5iLCBjZW50ZXIgKTtcblx0XHRcdHYyLnN1YlZlY3RvcnMoIHRyaWFuZ2xlLmMsIGNlbnRlciApO1xuXG5cdFx0XHQvLyBjb21wdXRlIGVkZ2UgdmVjdG9ycyBmb3IgdHJpYW5nbGVcblx0XHRcdGYwLnN1YlZlY3RvcnMoIHYxLCB2MCApO1xuXHRcdFx0ZjEuc3ViVmVjdG9ycyggdjIsIHYxICk7XG5cdFx0XHRmMi5zdWJWZWN0b3JzKCB2MCwgdjIgKTtcblxuXHRcdFx0Ly8gdGVzdCBhZ2FpbnN0IGF4ZXMgdGhhdCBhcmUgZ2l2ZW4gYnkgY3Jvc3MgcHJvZHVjdCBjb21iaW5hdGlvbnMgb2YgdGhlIGVkZ2VzIG9mIHRoZSB0cmlhbmdsZSBhbmQgdGhlIGVkZ2VzIG9mIHRoZSBhYWJiXG5cdFx0XHQvLyBtYWtlIGFuIGF4aXMgdGVzdGluZyBvZiBlYWNoIG9mIHRoZSAzIHNpZGVzIG9mIHRoZSBhYWJiIGFnYWluc3QgZWFjaCBvZiB0aGUgMyBzaWRlcyBvZiB0aGUgdHJpYW5nbGUgPSA5IGF4aXMgb2Ygc2VwYXJhdGlvblxuXHRcdFx0Ly8gYXhpc19paiA9IHVfaSB4IGZfaiAodTAsIHUxLCB1MiA9IGZhY2Ugbm9ybWFscyBvZiBhYWJiID0geCx5LHogYXhlcyB2ZWN0b3JzIHNpbmNlIGFhYmIgaXMgYXhpcyBhbGlnbmVkKVxuXHRcdFx0dmFyIGF4ZXMgPSBbXG5cdFx0XHRcdDAsIC0gZjAueiwgZjAueSwgMCwgLSBmMS56LCBmMS55LCAwLCAtIGYyLnosIGYyLnksXG5cdFx0XHRcdGYwLnosIDAsIC0gZjAueCwgZjEueiwgMCwgLSBmMS54LCBmMi56LCAwLCAtIGYyLngsXG5cdFx0XHRcdC0gZjAueSwgZjAueCwgMCwgLSBmMS55LCBmMS54LCAwLCAtIGYyLnksIGYyLngsIDBcblx0XHRcdF07XG5cdFx0XHRpZiAoICEgc2F0Rm9yQXhlcyggYXhlcyApICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyB0ZXN0IDMgZmFjZSBub3JtYWxzIGZyb20gdGhlIGFhYmJcblx0XHRcdGF4ZXMgPSBbIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEgXTtcblx0XHRcdGlmICggISBzYXRGb3JBeGVzKCBheGVzICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGZpbmFsbHkgdGVzdGluZyB0aGUgZmFjZSBub3JtYWwgb2YgdGhlIHRyaWFuZ2xlXG5cdFx0XHQvLyB1c2UgYWxyZWFkeSBleGlzdGluZyB0cmlhbmdsZSBlZGdlIHZlY3RvcnMgaGVyZVxuXHRcdFx0dHJpYW5nbGVOb3JtYWwuY3Jvc3NWZWN0b3JzKCBmMCwgZjEgKTtcblx0XHRcdGF4ZXMgPSBbIHRyaWFuZ2xlTm9ybWFsLngsIHRyaWFuZ2xlTm9ybWFsLnksIHRyaWFuZ2xlTm9ybWFsLnogXTtcblx0XHRcdHJldHVybiBzYXRGb3JBeGVzKCBheGVzICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpLFxuXG5cdGNsYW1wUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSB7XG5cblx0XHRcdHZhciBjbGFtcGVkUG9pbnQgPSB2MS5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblx0XHRcdHJldHVybiBjbGFtcGVkUG9pbnQuc3ViKCBwb2ludCApLmxlbmd0aCgpO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Z2V0Qm91bmRpbmdTcGhlcmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0Qm91bmRpbmdTcGhlcmUoIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuZ2V0Qm91bmRpbmdTcGhlcmUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5nZXRDZW50ZXIoIHRhcmdldC5jZW50ZXIgKTtcblxuXHRcdFx0dGFyZ2V0LnJhZGl1cyA9IHRoaXMuZ2V0U2l6ZSggdjEgKS5sZW5ndGgoKSAqIDAuNTtcblxuXHRcdFx0cmV0dXJuIHRhcmdldDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5tYXgoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5taW4oIGJveC5tYXggKTtcblxuXHRcdC8vIGVuc3VyZSB0aGF0IGlmIHRoZXJlIGlzIG5vIG92ZXJsYXAsIHRoZSByZXN1bHQgaXMgZnVsbHkgZW1wdHksIG5vdCBzbGlnaHRseSBlbXB0eSB3aXRoIG5vbi1pbmYvK2luZiB2YWx1ZXMgdGhhdCB3aWxsIGNhdXNlIHN1YnNlcXVlbmNlIGludGVyc2VjdHMgdG8gZXJyb25lb3VzbHkgcmV0dXJuIHZhbGlkIHZhbHVlcy5cblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkgdGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dW5pb246IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWF4KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvaW50cyA9IFtcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpXG5cdFx0XTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseU1hdHJpeDQoIG1hdHJpeCApIHtcblxuXHRcdFx0Ly8gdHJhbnNmb3JtIG9mIGVtcHR5IGJveCBpcyBhbiBlbXB0eSBib3guXG5cdFx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkgcmV0dXJuIHRoaXM7XG5cblx0XHRcdC8vIE5PVEU6IEkgYW0gdXNpbmcgYSBiaW5hcnkgcGF0dGVybiB0byBzcGVjaWZ5IGFsbCAyXjMgY29tYmluYXRpb25zIGJlbG93XG5cdFx0XHRwb2ludHNbIDAgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMDBcblx0XHRcdHBvaW50c1sgMSBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAwMVxuXHRcdFx0cG9pbnRzWyAyIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1heC55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDEwXG5cdFx0XHRwb2ludHNbIDMgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWF4LnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMTFcblx0XHRcdHBvaW50c1sgNCBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDEwMFxuXHRcdFx0cG9pbnRzWyA1IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTAxXG5cdFx0XHRwb2ludHNbIDYgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWF4LnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMTBcblx0XHRcdHBvaW50c1sgNyBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5tYXgueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XHQvLyAxMTFcblxuXHRcdFx0dGhpcy5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5taW4uYWRkKCBvZmZzZXQgKTtcblx0XHR0aGlzLm1heC5hZGQoIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5taW4uZXF1YWxzKCB0aGlzLm1pbiApICYmIGJveC5tYXguZXF1YWxzKCB0aGlzLm1heCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3BoZXJlKCBjZW50ZXIsIHJhZGl1cyApIHtcblxuXHR0aGlzLmNlbnRlciA9ICggY2VudGVyICE9PSB1bmRlZmluZWQgKSA/IGNlbnRlciA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMucmFkaXVzID0gKCByYWRpdXMgIT09IHVuZGVmaW5lZCApID8gcmFkaXVzIDogMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBTcGhlcmUucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIGNlbnRlciwgcmFkaXVzICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuY29weSggY2VudGVyICk7XG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBib3ggPSBuZXcgQm94MygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21Qb2ludHMoIHBvaW50cywgb3B0aW9uYWxDZW50ZXIgKSB7XG5cblx0XHRcdHZhciBjZW50ZXIgPSB0aGlzLmNlbnRlcjtcblxuXHRcdFx0aWYgKCBvcHRpb25hbENlbnRlciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNlbnRlci5jb3B5KCBvcHRpb25hbENlbnRlciApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGJveC5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKS5nZXRDZW50ZXIoIGNlbnRlciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtYXhSYWRpdXNTcSA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0bWF4UmFkaXVzU3EgPSBNYXRoLm1heCggbWF4UmFkaXVzU3EsIGNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnRzWyBpIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHRoaXMuY2VudGVyLmNvcHkoIHNwaGVyZS5jZW50ZXIgKTtcblx0XHR0aGlzLnJhZGl1cyA9IHNwaGVyZS5yYWRpdXM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gKCB0aGlzLnJhZGl1cyA8PSAwICk7XG5cblx0fSxcblxuXHRjb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuICggcG9pbnQuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuY2VudGVyICkgPD0gKCB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiAoIHBvaW50LmRpc3RhbmNlVG8oIHRoaXMuY2VudGVyICkgLSB0aGlzLnJhZGl1cyApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHR2YXIgcmFkaXVzU3VtID0gdGhpcy5yYWRpdXMgKyBzcGhlcmUucmFkaXVzO1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuY2VudGVyICkgPD0gKCByYWRpdXNTdW0gKiByYWRpdXNTdW0gKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzU3BoZXJlKCB0aGlzICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5jZW50ZXIgKSApIDw9IHRoaXMucmFkaXVzO1xuXG5cdH0sXG5cblx0Y2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0dmFyIGRlbHRhTGVuZ3RoU3EgPSB0aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNwaGVyZTogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHRhcmdldC5jb3B5KCBwb2ludCApO1xuXG5cdFx0aWYgKCBkZWx0YUxlbmd0aFNxID4gKCB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzICkgKSB7XG5cblx0XHRcdHRhcmdldC5zdWIoIHRoaXMuY2VudGVyICkubm9ybWFsaXplKCk7XG5cdFx0XHR0YXJnZXQubXVsdGlwbHlTY2FsYXIoIHRoaXMucmFkaXVzICkuYWRkKCB0aGlzLmNlbnRlciApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdGdldEJvdW5kaW5nQm94OiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNwaGVyZTogLmdldEJvdW5kaW5nQm94KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBCb3gzKCk7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQuc2V0KCB0aGlzLmNlbnRlciwgdGhpcy5jZW50ZXIgKTtcblx0XHR0YXJnZXQuZXhwYW5kQnlTY2FsYXIoIHRoaXMucmFkaXVzICk7XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cdFx0dGhpcy5yYWRpdXMgPSB0aGlzLnJhZGl1cyAqIG1hdHJpeC5nZXRNYXhTY2FsZU9uQXhpcygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuYWRkKCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHJldHVybiBzcGhlcmUuY2VudGVyLmVxdWFscyggdGhpcy5jZW50ZXIgKSAmJiAoIHNwaGVyZS5yYWRpdXMgPT09IHRoaXMucmFkaXVzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIFBsYW5lKCBub3JtYWwsIGNvbnN0YW50ICkge1xuXG5cdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHR0aGlzLm5vcm1hbCA9ICggbm9ybWFsICE9PSB1bmRlZmluZWQgKSA/IG5vcm1hbCA6IG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7XG5cdHRoaXMuY29uc3RhbnQgPSAoIGNvbnN0YW50ICE9PSB1bmRlZmluZWQgKSA/IGNvbnN0YW50IDogMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBQbGFuZS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggbm9ybWFsLCBjb25zdGFudCApIHtcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIG5vcm1hbCApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSBjb25zdGFudDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Q29tcG9uZW50czogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0dGhpcy5ub3JtYWwuc2V0KCB4LCB5LCB6ICk7XG5cdFx0dGhpcy5jb25zdGFudCA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50OiBmdW5jdGlvbiAoIG5vcm1hbCwgcG9pbnQgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBub3JtYWwgKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gLSBwb2ludC5kb3QoIHRoaXMubm9ybWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Db3BsYW5hclBvaW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21Db3BsYW5hclBvaW50cyggYSwgYiwgYyApIHtcblxuXHRcdFx0dmFyIG5vcm1hbCA9IHYxLnN1YlZlY3RvcnMoIGMsIGIgKS5jcm9zcyggdjIuc3ViVmVjdG9ycyggYSwgYiApICkubm9ybWFsaXplKCk7XG5cblx0XHRcdC8vIFE6IHNob3VsZCBhbiBlcnJvciBiZSB0aHJvd24gaWYgbm9ybWFsIGlzIHplcm8gKGUuZy4gZGVnZW5lcmF0ZSBwbGFuZSk/XG5cblx0XHRcdHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoIG5vcm1hbCwgYSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0dGhpcy5ub3JtYWwuY29weSggcGxhbmUubm9ybWFsICk7XG5cdFx0dGhpcy5jb25zdGFudCA9IHBsYW5lLmNvbnN0YW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIE5vdGU6IHdpbGwgbGVhZCB0byBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBwbGFuZSBpcyBpbnZhbGlkLlxuXG5cdFx0dmFyIGludmVyc2VOb3JtYWxMZW5ndGggPSAxLjAgLyB0aGlzLm5vcm1hbC5sZW5ndGgoKTtcblx0XHR0aGlzLm5vcm1hbC5tdWx0aXBseVNjYWxhciggaW52ZXJzZU5vcm1hbExlbmd0aCApO1xuXHRcdHRoaXMuY29uc3RhbnQgKj0gaW52ZXJzZU5vcm1hbExlbmd0aDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNvbnN0YW50ICo9IC0gMTtcblx0XHR0aGlzLm5vcm1hbC5uZWdhdGUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsLmRvdCggcG9pbnQgKSArIHRoaXMuY29uc3RhbnQ7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHJldHVybiB0aGlzLmRpc3RhbmNlVG9Qb2ludCggc3BoZXJlLmNlbnRlciApIC0gc3BoZXJlLnJhZGl1cztcblxuXHR9LFxuXG5cdHByb2plY3RQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5wcm9qZWN0UG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5ub3JtYWwgKS5tdWx0aXBseVNjYWxhciggLSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSApLmFkZCggcG9pbnQgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdExpbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0TGluZSggbGluZSwgdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlBsYW5lOiAuaW50ZXJzZWN0TGluZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGRpcmVjdGlvbiA9IGxpbmUuZGVsdGEoIHYxICk7XG5cblx0XHRcdHZhciBkZW5vbWluYXRvciA9IHRoaXMubm9ybWFsLmRvdCggZGlyZWN0aW9uICk7XG5cblx0XHRcdGlmICggZGVub21pbmF0b3IgPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gbGluZSBpcyBjb3BsYW5hciwgcmV0dXJuIG9yaWdpblxuXHRcdFx0XHRpZiAoIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLnN0YXJ0ICkgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGxpbmUuc3RhcnQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVW5zdXJlIGlmIHRoaXMgaXMgdGhlIGNvcnJlY3QgbWV0aG9kIHRvIGhhbmRsZSB0aGlzIGNhc2UuXG5cdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHQgPSAtICggbGluZS5zdGFydC5kb3QoIHRoaXMubm9ybWFsICkgKyB0aGlzLmNvbnN0YW50ICkgLyBkZW5vbWluYXRvcjtcblxuXHRcdFx0aWYgKCB0IDwgMCB8fCB0ID4gMSApIHtcblxuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIGxpbmUuc3RhcnQgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdHNMaW5lOiBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0XHQvLyBOb3RlOiB0aGlzIHRlc3RzIGlmIGEgbGluZSBpbnRlcnNlY3RzIHRoZSBwbGFuZSwgbm90IHdoZXRoZXIgaXQgKG9yIGl0cyBlbmQtcG9pbnRzKSBhcmUgY29wbGFuYXIgd2l0aCBpdC5cblxuXHRcdHZhciBzdGFydFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5zdGFydCApO1xuXHRcdHZhciBlbmRTaWduID0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuZW5kICk7XG5cblx0XHRyZXR1cm4gKCBzdGFydFNpZ24gPCAwICYmIGVuZFNpZ24gPiAwICkgfHwgKCBlbmRTaWduIDwgMCAmJiBzdGFydFNpZ24gPiAwICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiBib3guaW50ZXJzZWN0c1BsYW5lKCB0aGlzICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHJldHVybiBzcGhlcmUuaW50ZXJzZWN0c1BsYW5lKCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3BsYW5hclBvaW50OiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlBsYW5lOiAuY29wbGFuYXJQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLm5vcm1hbCApLm11bHRpcGx5U2NhbGFyKCAtIHRoaXMuY29uc3RhbnQgKTtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4MygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5TWF0cml4NCggbWF0cml4LCBvcHRpb25hbE5vcm1hbE1hdHJpeCApIHtcblxuXHRcdFx0dmFyIG5vcm1hbE1hdHJpeCA9IG9wdGlvbmFsTm9ybWFsTWF0cml4IHx8IG0xLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRcdHZhciByZWZlcmVuY2VQb2ludCA9IHRoaXMuY29wbGFuYXJQb2ludCggdjEgKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0XHR2YXIgbm9ybWFsID0gdGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0dGhpcy5jb25zdGFudCA9IC0gcmVmZXJlbmNlUG9pbnQuZG90KCBub3JtYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5jb25zdGFudCAtPSBvZmZzZXQuZG90KCB0aGlzLm5vcm1hbCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHRyZXR1cm4gcGxhbmUubm9ybWFsLmVxdWFscyggdGhpcy5ub3JtYWwgKSAmJiAoIHBsYW5lLmNvbnN0YW50ID09PSB0aGlzLmNvbnN0YW50ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gRnJ1c3R1bSggcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSApIHtcblxuXHR0aGlzLnBsYW5lcyA9IFtcblxuXHRcdCggcDAgIT09IHVuZGVmaW5lZCApID8gcDAgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHAxICE9PSB1bmRlZmluZWQgKSA/IHAxIDogbmV3IFBsYW5lKCksXG5cdFx0KCBwMiAhPT0gdW5kZWZpbmVkICkgPyBwMiA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDMgIT09IHVuZGVmaW5lZCApID8gcDMgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHA0ICE9PSB1bmRlZmluZWQgKSA/IHA0IDogbmV3IFBsYW5lKCksXG5cdFx0KCBwNSAhPT0gdW5kZWZpbmVkICkgPyBwNSA6IG5ldyBQbGFuZSgpXG5cblx0XTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGcnVzdHVtLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1ICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0cGxhbmVzWyAwIF0uY29weSggcDAgKTtcblx0XHRwbGFuZXNbIDEgXS5jb3B5KCBwMSApO1xuXHRcdHBsYW5lc1sgMiBdLmNvcHkoIHAyICk7XG5cdFx0cGxhbmVzWyAzIF0uY29weSggcDMgKTtcblx0XHRwbGFuZXNbIDQgXS5jb3B5KCBwNCApO1xuXHRcdHBsYW5lc1sgNSBdLmNvcHkoIHA1ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGZydXN0dW0gKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRwbGFuZXNbIGkgXS5jb3B5KCBmcnVzdHVtLnBsYW5lc1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXHRcdHZhciBtZTAgPSBtZVsgMCBdLCBtZTEgPSBtZVsgMSBdLCBtZTIgPSBtZVsgMiBdLCBtZTMgPSBtZVsgMyBdO1xuXHRcdHZhciBtZTQgPSBtZVsgNCBdLCBtZTUgPSBtZVsgNSBdLCBtZTYgPSBtZVsgNiBdLCBtZTcgPSBtZVsgNyBdO1xuXHRcdHZhciBtZTggPSBtZVsgOCBdLCBtZTkgPSBtZVsgOSBdLCBtZTEwID0gbWVbIDEwIF0sIG1lMTEgPSBtZVsgMTEgXTtcblx0XHR2YXIgbWUxMiA9IG1lWyAxMiBdLCBtZTEzID0gbWVbIDEzIF0sIG1lMTQgPSBtZVsgMTQgXSwgbWUxNSA9IG1lWyAxNSBdO1xuXG5cdFx0cGxhbmVzWyAwIF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUwLCBtZTcgLSBtZTQsIG1lMTEgLSBtZTgsIG1lMTUgLSBtZTEyICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyAxIF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUwLCBtZTcgKyBtZTQsIG1lMTEgKyBtZTgsIG1lMTUgKyBtZTEyICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyAyIF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUxLCBtZTcgKyBtZTUsIG1lMTEgKyBtZTksIG1lMTUgKyBtZTEzICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyAzIF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUxLCBtZTcgLSBtZTUsIG1lMTEgLSBtZTksIG1lMTUgLSBtZTEzICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyA0IF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUyLCBtZTcgLSBtZTYsIG1lMTEgLSBtZTEwLCBtZTE1IC0gbWUxNCApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgNSBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMiwgbWU3ICsgbWU2LCBtZTExICsgbWUxMCwgbWUxNSArIG1lMTQgKS5ub3JtYWxpemUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c09iamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApXG5cdFx0XHRcdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0XHRzcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKVxuXHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3RzU3ByaXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNTcHJpdGUoIHNwcml0ZSApIHtcblxuXHRcdFx0c3BoZXJlLmNlbnRlci5zZXQoIDAsIDAsIDAgKTtcblx0XHRcdHNwaGVyZS5yYWRpdXMgPSAwLjcwNzEwNjc4MTE4NjU0NzY7XG5cdFx0XHRzcGhlcmUuYXBwbHlNYXRyaXg0KCBzcHJpdGUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblx0XHR2YXIgY2VudGVyID0gc3BoZXJlLmNlbnRlcjtcblx0XHR2YXIgbmVnUmFkaXVzID0gLSBzcGhlcmUucmFkaXVzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0dmFyIGRpc3RhbmNlID0gcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBjZW50ZXIgKTtcblxuXHRcdFx0aWYgKCBkaXN0YW5jZSA8IG5lZ1JhZGl1cyApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHAxID0gbmV3IFZlY3RvcjMoKSxcblx0XHRcdHAyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzQm94KCBib3ggKSB7XG5cblx0XHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgcGxhbmUgPSBwbGFuZXNbIGkgXTtcblxuXHRcdFx0XHRwMS54ID0gcGxhbmUubm9ybWFsLnggPiAwID8gYm94Lm1pbi54IDogYm94Lm1heC54O1xuXHRcdFx0XHRwMi54ID0gcGxhbmUubm9ybWFsLnggPiAwID8gYm94Lm1heC54IDogYm94Lm1pbi54O1xuXHRcdFx0XHRwMS55ID0gcGxhbmUubm9ybWFsLnkgPiAwID8gYm94Lm1pbi55IDogYm94Lm1heC55O1xuXHRcdFx0XHRwMi55ID0gcGxhbmUubm9ybWFsLnkgPiAwID8gYm94Lm1heC55IDogYm94Lm1pbi55O1xuXHRcdFx0XHRwMS56ID0gcGxhbmUubm9ybWFsLnogPiAwID8gYm94Lm1pbi56IDogYm94Lm1heC56O1xuXHRcdFx0XHRwMi56ID0gcGxhbmUubm9ybWFsLnogPiAwID8gYm94Lm1heC56IDogYm94Lm1pbi56O1xuXG5cdFx0XHRcdHZhciBkMSA9IHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggcDEgKTtcblx0XHRcdFx0dmFyIGQyID0gcGxhbmUuZGlzdGFuY2VUb1BvaW50KCBwMiApO1xuXG5cdFx0XHRcdC8vIGlmIGJvdGggb3V0c2lkZSBwbGFuZSwgbm8gaW50ZXJzZWN0aW9uXG5cblx0XHRcdFx0aWYgKCBkMSA8IDAgJiYgZDIgPCAwICkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRpZiAoIHBsYW5lc1sgaSBdLmRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9XG5cbn0gKTtcblxudmFyIGFscGhhbWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0FMUEhBTUFQXFxuXFx0ZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdlV2ICkuZztcXG4jZW5kaWZcXG5cIjtcblxudmFyIGFscGhhbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQUxQSEFNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGFscGhhdGVzdF9mcmFnbWVudCA9IFwiI2lmZGVmIEFMUEhBVEVTVFxcblxcdGlmICggZGlmZnVzZUNvbG9yLmEgPCBBTFBIQVRFU1QgKSBkaXNjYXJkO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgYW9tYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQU9NQVBcXG5cXHRmbG9hdCBhbWJpZW50T2NjbHVzaW9uID0gKCB0ZXh0dXJlMkQoIGFvTWFwLCB2VXYyICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGFtYmllbnRPY2NsdXNpb247XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBQSFlTSUNBTCApXFxuXFx0XFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKj0gY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBkb3ROViwgYW1iaWVudE9jY2x1c2lvbiwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGFvbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQU9NQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGFvTWFwSW50ZW5zaXR5O1xcbiNlbmRpZlwiO1xuXG52YXIgYmVnaW5fdmVydGV4ID0gXCJcXG52ZWMzIHRyYW5zZm9ybWVkID0gdmVjMyggcG9zaXRpb24gKTtcXG5cIjtcblxudmFyIGJlZ2lubm9ybWFsX3ZlcnRleCA9IFwiXFxudmVjMyBvYmplY3ROb3JtYWwgPSB2ZWMzKCBub3JtYWwgKTtcXG5cIjtcblxudmFyIGJzZGZzID0gXCJmbG9hdCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHtcXG5cXHRpZiggZGVjYXlFeHBvbmVudCA+IDAuMCApIHtcXG4jaWYgZGVmaW5lZCAoIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFMgKVxcblxcdFxcdGZsb2F0IGRpc3RhbmNlRmFsbG9mZiA9IDEuMCAvIG1heCggcG93KCBsaWdodERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTtcXG5cXHRcXHRmbG9hdCBtYXhEaXN0YW5jZUN1dG9mZkZhY3RvciA9IHBvdzIoIHNhdHVyYXRlKCAxLjAgLSBwb3c0KCBsaWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKSApICk7XFxuXFx0XFx0cmV0dXJuIGRpc3RhbmNlRmFsbG9mZiAqIG1heERpc3RhbmNlQ3V0b2ZmRmFjdG9yO1xcbiNlbHNlXFxuXFx0XFx0cmV0dXJuIHBvdyggc2F0dXJhdGUoIC1saWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKyAxLjAgKSwgZGVjYXlFeHBvbmVudCApO1xcbiNlbmRpZlxcblxcdH1cXG5cXHRyZXR1cm4gMS4wO1xcbn1cXG52ZWMzIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBjb25zdCBpbiB2ZWMzIGRpZmZ1c2VDb2xvciApIHtcXG5cXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjtcXG59XFxudmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgZG90TEggKSB7XFxuXFx0ZmxvYXQgZnJlc25lbCA9IGV4cDIoICggLTUuNTU0NzMgKiBkb3RMSCAtIDYuOTgzMTYgKSAqIGRvdExIICk7XFxuXFx0cmV0dXJuICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogZnJlc25lbCArIHNwZWN1bGFyQ29sb3I7XFxufVxcbmZsb2F0IEdfR0dYX1NtaXRoKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xcblxcdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcXG5cXHRmbG9hdCBnbCA9IGRvdE5MICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XFxuXFx0ZmxvYXQgZ3YgPSBkb3ROViArIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xcblxcdHJldHVybiAxLjAgLyAoIGdsICogZ3YgKTtcXG59XFxuZmxvYXQgR19HR1hfU21pdGhDb3JyZWxhdGVkKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xcblxcdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcXG5cXHRmbG9hdCBndiA9IGRvdE5MICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROViApICk7XFxuXFx0ZmxvYXQgZ2wgPSBkb3ROViAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApO1xcblxcdHJldHVybiAwLjUgLyBtYXgoIGd2ICsgZ2wsIEVQU0lMT04gKTtcXG59XFxuZmxvYXQgRF9HR1goIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcXG5cXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XFxuXFx0ZmxvYXQgZGVub20gPSBwb3cyKCBkb3ROSCApICogKCBhMiAtIDEuMCApICsgMS4wO1xcblxcdHJldHVybiBSRUNJUFJPQ0FMX1BJICogYTIgLyBwb3cyKCBkZW5vbSApO1xcbn1cXG52ZWMzIEJSREZfU3BlY3VsYXJfR0dYKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGluY2lkZW50TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGZsb2F0IGFscGhhID0gcG93Miggcm91Z2huZXNzICk7XFxuXFx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcXG5cXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKSApO1xcblxcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcXG5cXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGFsZkRpciApICk7XFxuXFx0ZmxvYXQgZG90TEggPSBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XFxuXFx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xcblxcdGZsb2F0IEcgPSBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGFscGhhLCBkb3ROTCwgZG90TlYgKTtcXG5cXHRmbG9hdCBEID0gRF9HR1goIGFscGhhLCBkb3ROSCApO1xcblxcdHJldHVybiBGICogKCBHICogRCApO1xcbn1cXG52ZWMyIExUQ19VdiggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRjb25zdCBmbG9hdCBMVVRfU0laRSAgPSA2NC4wO1xcblxcdGNvbnN0IGZsb2F0IExVVF9TQ0FMRSA9ICggTFVUX1NJWkUgLSAxLjAgKSAvIExVVF9TSVpFO1xcblxcdGNvbnN0IGZsb2F0IExVVF9CSUFTICA9IDAuNSAvIExVVF9TSVpFO1xcblxcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggTiwgViApICk7XFxuXFx0dmVjMiB1diA9IHZlYzIoIHJvdWdobmVzcywgc3FydCggMS4wIC0gZG90TlYgKSApO1xcblxcdHV2ID0gdXYgKiBMVVRfU0NBTEUgKyBMVVRfQklBUztcXG5cXHRyZXR1cm4gdXY7XFxufVxcbmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkge1xcblxcdGZsb2F0IGwgPSBsZW5ndGgoIGYgKTtcXG5cXHRyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7XFxufVxcbnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkge1xcblxcdGZsb2F0IHggPSBkb3QoIHYxLCB2MiApO1xcblxcdGZsb2F0IHkgPSBhYnMoIHggKTtcXG5cXHRmbG9hdCBhID0gMC44NTQzOTg1ICsgKCAwLjQ5NjUxNTUgKyAwLjAxNDUyMDYgKiB5ICkgKiB5O1xcblxcdGZsb2F0IGIgPSAzLjQxNzU5NDAgKyAoIDQuMTYxNjcyNCArIHkgKSAqIHk7XFxuXFx0ZmxvYXQgdiA9IGEgLyBiO1xcblxcdGZsb2F0IHRoZXRhX3NpbnRoZXRhID0gKCB4ID4gMC4wICkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIG1heCggMS4wIC0geCAqIHgsIDFlLTcgKSApIC0gdjtcXG5cXHRyZXR1cm4gY3Jvc3MoIHYxLCB2MiApICogdGhldGFfc2ludGhldGE7XFxufVxcbnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkge1xcblxcdHZlYzMgdjEgPSByZWN0Q29vcmRzWyAxIF0gLSByZWN0Q29vcmRzWyAwIF07XFxuXFx0dmVjMyB2MiA9IHJlY3RDb29yZHNbIDMgXSAtIHJlY3RDb29yZHNbIDAgXTtcXG5cXHR2ZWMzIGxpZ2h0Tm9ybWFsID0gY3Jvc3MoIHYxLCB2MiApO1xcblxcdGlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVjdENvb3Jkc1sgMCBdICkgPCAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7XFxuXFx0dmVjMyBUMSwgVDI7XFxuXFx0VDEgPSBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTtcXG5cXHRUMiA9IC0gY3Jvc3MoIE4sIFQxICk7XFxuXFx0bWF0MyBtYXQgPSBtSW52ICogdHJhbnNwb3NlTWF0MyggbWF0MyggVDEsIFQyLCBOICkgKTtcXG5cXHR2ZWMzIGNvb3Jkc1sgNCBdO1xcblxcdGNvb3Jkc1sgMCBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAwIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAxIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDEgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDIgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApO1xcblxcdGNvb3Jkc1sgMyBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAwIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMCBdICk7XFxuXFx0Y29vcmRzWyAxIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7XFxuXFx0Y29vcmRzWyAyIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMiBdICk7XFxuXFx0Y29vcmRzWyAzIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMyBdICk7XFxuXFx0dmVjMyB2ZWN0b3JGb3JtRmFjdG9yID0gdmVjMyggMC4wICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSApO1xcblxcdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDEgXSwgY29vcmRzWyAyIF0gKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAgXSApO1xcblxcdGZsb2F0IHJlc3VsdCA9IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggdmVjdG9yRm9ybUZhY3RvciApO1xcblxcdHJldHVybiB2ZWMzKCByZXN1bHQgKTtcXG59XFxudmVjMyBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xcblxcdGNvbnN0IHZlYzQgYzAgPSB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xcblxcdGNvbnN0IHZlYzQgYzEgPSB2ZWM0KCAxLCAwLjA0MjUsIDEuMDQsIC0gMC4wNCApO1xcblxcdHZlYzQgciA9IHJvdWdobmVzcyAqIGMwICsgYzE7XFxuXFx0ZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XFxuXFx0dmVjMiBBQiA9IHZlYzIoIC0xLjA0LCAxLjA0ICkgKiBhMDA0ICsgci56dztcXG5cXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIEFCLnggKyBBQi55O1xcbn1cXG5mbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICkge1xcblxcdHJldHVybiAwLjI1O1xcbn1cXG5mbG9hdCBEX0JsaW5uUGhvbmcoIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XFxuXFx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiAoIHNoaW5pbmVzcyAqIDAuNSArIDEuMCApICogcG93KCBkb3ROSCwgc2hpbmluZXNzICk7XFxufVxcbnZlYzMgQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGluY2lkZW50TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzICkge1xcblxcdHZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyBnZW9tZXRyeS52aWV3RGlyICk7XFxuXFx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xcblxcdGZsb2F0IGRvdExIID0gc2F0dXJhdGUoIGRvdCggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24sIGhhbGZEaXIgKSApO1xcblxcdHZlYzMgRiA9IEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcXG5cXHRmbG9hdCBHID0gR19CbGlublBob25nX0ltcGxpY2l0KCApO1xcblxcdGZsb2F0IEQgPSBEX0JsaW5uUGhvbmcoIHNoaW5pbmVzcywgZG90TkggKTtcXG5cXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcXG59XFxuZmxvYXQgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBjb25zdCBpbiBmbG9hdCBnZ3hSb3VnaG5lc3MgKSB7XFxuXFx0cmV0dXJuICggMi4wIC8gcG93MiggZ2d4Um91Z2huZXNzICsgMC4wMDAxICkgLSAyLjAgKTtcXG59XFxuZmxvYXQgQmxpbm5FeHBvbmVudFRvR0dYUm91Z2huZXNzKCBjb25zdCBpbiBmbG9hdCBibGlubkV4cG9uZW50ICkge1xcblxcdHJldHVybiBzcXJ0KCAyLjAgLyAoIGJsaW5uRXhwb25lbnQgKyAyLjAgKSApO1xcbn1cXG5cIjtcblxudmFyIGJ1bXBtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9CVU1QTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgYnVtcE1hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGJ1bXBTY2FsZTtcXG5cXHR2ZWMyIGRIZHh5X2Z3ZCgpIHtcXG5cXHRcXHR2ZWMyIGRTVGR4ID0gZEZkeCggdlV2ICk7XFxuXFx0XFx0dmVjMiBkU1RkeSA9IGRGZHkoIHZVdiApO1xcblxcdFxcdGZsb2F0IEhsbCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICkueDtcXG5cXHRcXHRmbG9hdCBkQnggPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR4ICkueCAtIEhsbDtcXG5cXHRcXHRmbG9hdCBkQnkgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR5ICkueCAtIEhsbDtcXG5cXHRcXHRyZXR1cm4gdmVjMiggZEJ4LCBkQnkgKTtcXG5cXHR9XFxuXFx0dmVjMyBwZXJ0dXJiTm9ybWFsQXJiKCB2ZWMzIHN1cmZfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiBkSGR4eSApIHtcXG5cXHRcXHR2ZWMzIHZTaWdtYVggPSB2ZWMzKCBkRmR4KCBzdXJmX3Bvcy54ICksIGRGZHgoIHN1cmZfcG9zLnkgKSwgZEZkeCggc3VyZl9wb3MueiApICk7XFxuXFx0XFx0dmVjMyB2U2lnbWFZID0gdmVjMyggZEZkeSggc3VyZl9wb3MueCApLCBkRmR5KCBzdXJmX3Bvcy55ICksIGRGZHkoIHN1cmZfcG9zLnogKSApO1xcblxcdFxcdHZlYzMgdk4gPSBzdXJmX25vcm07XFxuXFx0XFx0dmVjMyBSMSA9IGNyb3NzKCB2U2lnbWFZLCB2TiApO1xcblxcdFxcdHZlYzMgUjIgPSBjcm9zcyggdk4sIHZTaWdtYVggKTtcXG5cXHRcXHRmbG9hdCBmRGV0ID0gZG90KCB2U2lnbWFYLCBSMSApO1xcblxcdFxcdHZlYzMgdkdyYWQgPSBzaWduKCBmRGV0ICkgKiAoIGRIZHh5LnggKiBSMSArIGRIZHh5LnkgKiBSMiApO1xcblxcdFxcdHJldHVybiBub3JtYWxpemUoIGFicyggZkRldCApICogc3VyZl9ub3JtIC0gdkdyYWQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQgPSBcIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxcblxcdHZlYzQgcGxhbmU7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcXG5cXHRcXHRwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07XFxuXFx0XFx0aWYgKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApIGRpc2NhcmQ7XFxuXFx0fVxcblxcdCNpZiBVTklPTl9DTElQUElOR19QTEFORVMgPCBOVU1fQ0xJUFBJTkdfUExBTkVTXFxuXFx0XFx0Ym9vbCBjbGlwcGVkID0gdHJ1ZTtcXG5cXHRcXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0XFx0Zm9yICggaW50IGkgPSBVTklPTl9DTElQUElOR19QTEFORVM7IGkgPCBOVU1fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xcblxcdFxcdFxcdHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcXG5cXHRcXHRcXHRjbGlwcGVkID0gKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApICYmIGNsaXBwZWQ7XFxuXFx0XFx0fVxcblxcdFxcdGlmICggY2xpcHBlZCApIGRpc2NhcmQ7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXFxuXFx0I2lmICEgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiAhIGRlZmluZWQoIFBIT05HIClcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG5cXHQjZW5kaWZcXG5cXHR1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwICYmICEgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiAhIGRlZmluZWQoIFBIT05HIClcXG5cXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXggPSBcIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMCAmJiAhIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgISBkZWZpbmVkKCBQSE9ORyApXFxuXFx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBjb2xvcl9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9DT0xPUlxcblxcdGRpZmZ1c2VDb2xvci5yZ2IgKj0gdkNvbG9yO1xcbiNlbmRpZlwiO1xuXG52YXIgY29sb3JfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9DT0xPUlxcblxcdHZhcnlpbmcgdmVjMyB2Q29sb3I7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBjb2xvcl9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9DT0xPUlxcblxcdHZhcnlpbmcgdmVjMyB2Q29sb3I7XFxuI2VuZGlmXCI7XG5cbnZhciBjb2xvcl92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfQ09MT1JcXG5cXHR2Q29sb3IueHl6ID0gY29sb3IueHl6O1xcbiNlbmRpZlwiO1xuXG52YXIgY29tbW9uID0gXCIjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTlcXG4jZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE4XFxuI2RlZmluZSBQSV9IQUxGIDEuNTcwNzk2MzI2Nzk0OVxcbiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4XFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0XFxuI2RlZmluZSBMT0cyIDEuNDQyNjk1XFxuI2RlZmluZSBFUFNJTE9OIDFlLTZcXG4jZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXFxuI2RlZmluZSB3aGl0ZUNvbXBsaW1lbnQoYSkgKCAxLjAgLSBzYXR1cmF0ZSggYSApIClcXG5mbG9hdCBwb3cyKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4OyB9XFxuZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9XFxuZmxvYXQgcG93NCggY29uc3QgaW4gZmxvYXQgeCApIHsgZmxvYXQgeDIgPSB4Kng7IHJldHVybiB4Mip4MjsgfVxcbmZsb2F0IGF2ZXJhZ2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7IHJldHVybiBkb3QoIGNvbG9yLCB2ZWMzKCAwLjMzMzMgKSApOyB9XFxuaGlnaHAgZmxvYXQgcmFuZCggY29uc3QgaW4gdmVjMiB1diApIHtcXG5cXHRjb25zdCBoaWdocCBmbG9hdCBhID0gMTIuOTg5OCwgYiA9IDc4LjIzMywgYyA9IDQzNzU4LjU0NTM7XFxuXFx0aGlnaHAgZmxvYXQgZHQgPSBkb3QoIHV2Lnh5LCB2ZWMyKCBhLGIgKSApLCBzbiA9IG1vZCggZHQsIFBJICk7XFxuXFx0cmV0dXJuIGZyYWN0KHNpbihzbikgKiBjKTtcXG59XFxuc3RydWN0IEluY2lkZW50TGlnaHQge1xcblxcdHZlYzMgY29sb3I7XFxuXFx0dmVjMyBkaXJlY3Rpb247XFxuXFx0Ym9vbCB2aXNpYmxlO1xcbn07XFxuc3RydWN0IFJlZmxlY3RlZExpZ2h0IHtcXG5cXHR2ZWMzIGRpcmVjdERpZmZ1c2U7XFxuXFx0dmVjMyBkaXJlY3RTcGVjdWxhcjtcXG5cXHR2ZWMzIGluZGlyZWN0RGlmZnVzZTtcXG5cXHR2ZWMzIGluZGlyZWN0U3BlY3VsYXI7XFxufTtcXG5zdHJ1Y3QgR2VvbWV0cmljQ29udGV4dCB7XFxuXFx0dmVjMyBwb3NpdGlvbjtcXG5cXHR2ZWMzIG5vcm1hbDtcXG5cXHR2ZWMzIHZpZXdEaXI7XFxufTtcXG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xcblxcdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xcbn1cXG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcXG5cXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIGRpciwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcXG59XFxudmVjMyBwcm9qZWN0T25QbGFuZShpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcXG5cXHRmbG9hdCBkaXN0YW5jZSA9IGRvdCggcGxhbmVOb3JtYWwsIHBvaW50IC0gcG9pbnRPblBsYW5lICk7XFxuXFx0cmV0dXJuIC0gZGlzdGFuY2UgKiBwbGFuZU5vcm1hbCArIHBvaW50O1xcbn1cXG5mbG9hdCBzaWRlT2ZQbGFuZSggaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XFxuXFx0cmV0dXJuIHNpZ24oIGRvdCggcG9pbnQgLSBwb2ludE9uUGxhbmUsIHBsYW5lTm9ybWFsICkgKTtcXG59XFxudmVjMyBsaW5lUGxhbmVJbnRlcnNlY3QoIGluIHZlYzMgcG9pbnRPbkxpbmUsIGluIHZlYzMgbGluZURpcmVjdGlvbiwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XFxuXFx0cmV0dXJuIGxpbmVEaXJlY3Rpb24gKiAoIGRvdCggcGxhbmVOb3JtYWwsIHBvaW50T25QbGFuZSAtIHBvaW50T25MaW5lICkgLyBkb3QoIHBsYW5lTm9ybWFsLCBsaW5lRGlyZWN0aW9uICkgKSArIHBvaW50T25MaW5lO1xcbn1cXG5tYXQzIHRyYW5zcG9zZU1hdDMoIGNvbnN0IGluIG1hdDMgbSApIHtcXG5cXHRtYXQzIHRtcDtcXG5cXHR0bXBbIDAgXSA9IHZlYzMoIG1bIDAgXS54LCBtWyAxIF0ueCwgbVsgMiBdLnggKTtcXG5cXHR0bXBbIDEgXSA9IHZlYzMoIG1bIDAgXS55LCBtWyAxIF0ueSwgbVsgMiBdLnkgKTtcXG5cXHR0bXBbIDIgXSA9IHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTtcXG5cXHRyZXR1cm4gdG1wO1xcbn1cXG5mbG9hdCBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkge1xcblxcdHZlYzMgd2VpZ2h0cyA9IHZlYzMoIDAuMjEyNiwgMC43MTUyLCAwLjA3MjIgKTtcXG5cXHRyZXR1cm4gZG90KCB3ZWlnaHRzLCBjb2xvci5yZ2IgKTtcXG59XFxuXCI7XG5cbnZhciBjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQgPSBcIiNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWXFxuI2RlZmluZSBjdWJlVVZfdGV4dHVyZVNpemUgKDEwMjQuMClcXG5pbnQgZ2V0RmFjZUZyb21EaXJlY3Rpb24odmVjMyBkaXJlY3Rpb24pIHtcXG5cXHR2ZWMzIGFic0RpcmVjdGlvbiA9IGFicyhkaXJlY3Rpb24pO1xcblxcdGludCBmYWNlID0gLTE7XFxuXFx0aWYoIGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0aW9uLnogKSB7XFxuXFx0XFx0aWYoYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueSApXFxuXFx0XFx0XFx0ZmFjZSA9IGRpcmVjdGlvbi54ID4gMC4wID8gMCA6IDM7XFxuXFx0XFx0ZWxzZVxcblxcdFxcdFxcdGZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEgOiA0O1xcblxcdH1cXG5cXHRlbHNlIHtcXG5cXHRcXHRpZihhYnNEaXJlY3Rpb24ueiA+IGFic0RpcmVjdGlvbi55IClcXG5cXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnogPiAwLjAgPyAyIDogNTtcXG5cXHRcXHRlbHNlXFxuXFx0XFx0XFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMSA6IDQ7XFxuXFx0fVxcblxcdHJldHVybiBmYWNlO1xcbn1cXG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMSAgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMS4wKVxcbiNkZWZpbmUgY3ViZVVWX3JhbmdlQ2xhbXAgKGV4cDIoKDYuMCAtIDEuMCkgKiAyLjApKVxcbnZlYzIgTWlwTGV2ZWxJbmZvKCB2ZWMzIHZlYywgZmxvYXQgcm91Z2huZXNzTGV2ZWwsIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCBzY2FsZSA9IGV4cDIoY3ViZVVWX21heExvZHMxIC0gcm91Z2huZXNzTGV2ZWwpO1xcblxcdGZsb2F0IGR4Um91Z2huZXNzID0gZEZkeChyb3VnaG5lc3MpO1xcblxcdGZsb2F0IGR5Um91Z2huZXNzID0gZEZkeShyb3VnaG5lc3MpO1xcblxcdHZlYzMgZHggPSBkRmR4KCB2ZWMgKiBzY2FsZSAqIGR4Um91Z2huZXNzICk7XFxuXFx0dmVjMyBkeSA9IGRGZHkoIHZlYyAqIHNjYWxlICogZHlSb3VnaG5lc3MgKTtcXG5cXHRmbG9hdCBkID0gbWF4KCBkb3QoIGR4LCBkeCApLCBkb3QoIGR5LCBkeSApICk7XFxuXFx0ZCA9IGNsYW1wKGQsIDEuMCwgY3ViZVVWX3JhbmdlQ2xhbXApO1xcblxcdGZsb2F0IG1pcExldmVsID0gMC41ICogbG9nMihkKTtcXG5cXHRyZXR1cm4gdmVjMihmbG9vcihtaXBMZXZlbCksIGZyYWN0KG1pcExldmVsKSk7XFxufVxcbiNkZWZpbmUgY3ViZVVWX21heExvZHMyIChsb2cyKGN1YmVVVl90ZXh0dXJlU2l6ZSowLjI1KSAtIDIuMClcXG4jZGVmaW5lIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZSAoMS4wIC8gY3ViZVVWX3RleHR1cmVTaXplKVxcbnZlYzIgZ2V0Q3ViZVVWKHZlYzMgZGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgbWlwTGV2ZWwpIHtcXG5cXHRtaXBMZXZlbCA9IHJvdWdobmVzc0xldmVsID4gY3ViZVVWX21heExvZHMyIC0gMy4wID8gMC4wIDogbWlwTGV2ZWw7XFxuXFx0ZmxvYXQgYSA9IDE2LjAgKiBjdWJlVVZfcmNwVGV4dHVyZVNpemU7XFxuXFx0dmVjMiBleHAyX3BhY2tlZCA9IGV4cDIoIHZlYzIoIHJvdWdobmVzc0xldmVsLCBtaXBMZXZlbCApICk7XFxuXFx0dmVjMiByY3BfZXhwMl9wYWNrZWQgPSB2ZWMyKCAxLjAgKSAvIGV4cDJfcGFja2VkO1xcblxcdGZsb2F0IHBvd1NjYWxlID0gZXhwMl9wYWNrZWQueCAqIGV4cDJfcGFja2VkLnk7XFxuXFx0ZmxvYXQgc2NhbGUgPSByY3BfZXhwMl9wYWNrZWQueCAqIHJjcF9leHAyX3BhY2tlZC55ICogMC4yNTtcXG5cXHRmbG9hdCBtaXBPZmZzZXQgPSAwLjc1KigxLjAgLSByY3BfZXhwMl9wYWNrZWQueSkgKiByY3BfZXhwMl9wYWNrZWQueDtcXG5cXHRib29sIGJSZXMgPSBtaXBMZXZlbCA9PSAwLjA7XFxuXFx0c2NhbGUgPSAgYlJlcyAmJiAoc2NhbGUgPCBhKSA/IGEgOiBzY2FsZTtcXG5cXHR2ZWMzIHI7XFxuXFx0dmVjMiBvZmZzZXQ7XFxuXFx0aW50IGZhY2UgPSBnZXRGYWNlRnJvbURpcmVjdGlvbihkaXJlY3Rpb24pO1xcblxcdGZsb2F0IHJjcFBvd1NjYWxlID0gMS4wIC8gcG93U2NhbGU7XFxuXFx0aWYoIGZhY2UgPT0gMCkge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi54LCAtZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcXG5cXHRcXHRvZmZzZXQgPSB2ZWMyKDAuMCttaXBPZmZzZXQsMC43NSAqIHJjcFBvd1NjYWxlKTtcXG5cXHRcXHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gYSA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIGlmKCBmYWNlID09IDEpIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56KTtcXG5cXHRcXHRvZmZzZXQgPSB2ZWMyKHNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcXG5cXHRcXHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gYSA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIGlmKCBmYWNlID09IDIpIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55KTtcXG5cXHRcXHRvZmZzZXQgPSB2ZWMyKDIuMCpzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IGEgOiBvZmZzZXQueTtcXG5cXHR9XFxuXFx0ZWxzZSBpZiggZmFjZSA9PSAzKSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSk7XFxuXFx0XFx0b2Zmc2V0ID0gdmVjMigwLjArbWlwT2Zmc2V0LDAuNSAqIHJjcFBvd1NjYWxlKTtcXG5cXHRcXHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gMC4wIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2UgaWYoIGZhY2UgPT0gNCkge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi55LCBkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56KTtcXG5cXHRcXHRvZmZzZXQgPSB2ZWMyKHNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcXG5cXHR9XFxuXFx0ZWxzZSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLnosIC1kaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcXG5cXHR9XFxuXFx0ciA9IG5vcm1hbGl6ZShyKTtcXG5cXHRmbG9hdCB0ZXhlbE9mZnNldCA9IDAuNSAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcXG5cXHR2ZWMyIHMgPSAoIHIueXogLyBhYnMoIHIueCApICsgdmVjMiggMS4wICkgKSAqIDAuNTtcXG5cXHR2ZWMyIGJhc2UgPSBvZmZzZXQgKyB2ZWMyKCB0ZXhlbE9mZnNldCApO1xcblxcdHJldHVybiBiYXNlICsgcyAqICggc2NhbGUgLSAyLjAgKiB0ZXhlbE9mZnNldCApO1xcbn1cXG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMyAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAzLjApXFxudmVjNCB0ZXh0dXJlQ3ViZVVWKHZlYzMgcmVmbGVjdGVkRGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgcm91Z2huZXNzVmFsID0gcm91Z2huZXNzKiBjdWJlVVZfbWF4TG9kczM7XFxuXFx0ZmxvYXQgcjEgPSBmbG9vcihyb3VnaG5lc3NWYWwpO1xcblxcdGZsb2F0IHIyID0gcjEgKyAxLjA7XFxuXFx0ZmxvYXQgdCA9IGZyYWN0KHJvdWdobmVzc1ZhbCk7XFxuXFx0dmVjMiBtaXBJbmZvID0gTWlwTGV2ZWxJbmZvKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIHJvdWdobmVzcyk7XFxuXFx0ZmxvYXQgcyA9IG1pcEluZm8ueTtcXG5cXHRmbG9hdCBsZXZlbDAgPSBtaXBJbmZvLng7XFxuXFx0ZmxvYXQgbGV2ZWwxID0gbGV2ZWwwICsgMS4wO1xcblxcdGxldmVsMSA9IGxldmVsMSA+IDUuMCA/IDUuMCA6IGxldmVsMTtcXG5cXHRsZXZlbDAgKz0gbWluKCBmbG9vciggcyArIDAuNSApLCA1LjAgKTtcXG5cXHR2ZWMyIHV2XzEwID0gZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIGxldmVsMCk7XFxuXFx0dmVjNCBjb2xvcjEwID0gZW52TWFwVGV4ZWxUb0xpbmVhcih0ZXh0dXJlMkQoZW52TWFwLCB1dl8xMCkpO1xcblxcdHZlYzIgdXZfMjAgPSBnZXRDdWJlVVYocmVmbGVjdGVkRGlyZWN0aW9uLCByMiwgbGV2ZWwwKTtcXG5cXHR2ZWM0IGNvbG9yMjAgPSBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2XzIwKSk7XFxuXFx0dmVjNCByZXN1bHQgPSBtaXgoY29sb3IxMCwgY29sb3IyMCwgdCk7XFxuXFx0cmV0dXJuIHZlYzQocmVzdWx0LnJnYiwgMS4wKTtcXG59XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBkZWZhdWx0bm9ybWFsX3ZlcnRleCA9IFwidmVjMyB0cmFuc2Zvcm1lZE5vcm1hbCA9IG5vcm1hbE1hdHJpeCAqIG9iamVjdE5vcm1hbDtcXG4jaWZkZWYgRkxJUF9TSURFRFxcblxcdHRyYW5zZm9ybWVkTm9ybWFsID0gLSB0cmFuc2Zvcm1lZE5vcm1hbDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBkaXNwbGFjZW1lbnRNYXA7XFxuXFx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRTY2FsZTtcXG5cXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBkaXNwbGFjZW1lbnRtYXBfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdHRyYW5zZm9ybWVkICs9IG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB1diApLnggKiBkaXNwbGFjZW1lbnRTY2FsZSArIGRpc3BsYWNlbWVudEJpYXMgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGVtaXNzaXZlbWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXFxuXFx0dmVjNCBlbWlzc2l2ZUNvbG9yID0gdGV4dHVyZTJEKCBlbWlzc2l2ZU1hcCwgdlV2ICk7XFxuXFx0ZW1pc3NpdmVDb2xvci5yZ2IgPSBlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIoIGVtaXNzaXZlQ29sb3IgKS5yZ2I7XFxuXFx0dG90YWxFbWlzc2l2ZVJhZGlhbmNlICo9IGVtaXNzaXZlQ29sb3IucmdiO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGVtaXNzaXZlTWFwO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZW5jb2RpbmdzX2ZyYWdtZW50ID0gXCIgIGdsX0ZyYWdDb2xvciA9IGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApO1xcblwiO1xuXG52YXIgZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQgPSBcIlxcbnZlYzQgTGluZWFyVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0cmV0dXJuIHZhbHVlO1xcbn1cXG52ZWM0IEdhbW1hVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IGdhbW1hRmFjdG9yICkge1xcblxcdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnh5eiwgdmVjMyggZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS53ICk7XFxufVxcbnZlYzQgTGluZWFyVG9HYW1tYSggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUueHl6LCB2ZWMzKCAxLjAgLyBnYW1tYUZhY3RvciApICksIHZhbHVlLncgKTtcXG59XFxudmVjNCBzUkdCVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdmFsdWUucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdmFsdWUudyApO1xcbn1cXG52ZWM0IExpbmVhclRvc1JHQiggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS53ICk7XFxufVxcbnZlYzQgUkdCRVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiBleHAyKCB2YWx1ZS5hICogMjU1LjAgLSAxMjguMCApLCAxLjAgKTtcXG59XFxudmVjNCBMaW5lYXJUb1JHQkUoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0ZmxvYXQgbWF4Q29tcG9uZW50ID0gbWF4KCBtYXgoIHZhbHVlLnIsIHZhbHVlLmcgKSwgdmFsdWUuYiApO1xcblxcdGZsb2F0IGZFeHAgPSBjbGFtcCggY2VpbCggbG9nMiggbWF4Q29tcG9uZW50ICkgKSwgLTEyOC4wLCAxMjcuMCApO1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyBleHAyKCBmRXhwICksICggZkV4cCArIDEyOC4wICkgLyAyNTUuMCApO1xcbn1cXG52ZWM0IFJHQk1Ub0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnh5eiAqIHZhbHVlLncgKiBtYXhSYW5nZSwgMS4wICk7XFxufVxcbnZlYzQgTGluZWFyVG9SR0JNKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRmbG9hdCBtYXhSR0IgPSBtYXgoIHZhbHVlLngsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XFxuXFx0ZmxvYXQgTSAgICAgID0gY2xhbXAoIG1heFJHQiAvIG1heFJhbmdlLCAwLjAsIDEuMCApO1xcblxcdE0gICAgICAgICAgICA9IGNlaWwoIE0gKiAyNTUuMCApIC8gMjU1LjA7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvICggTSAqIG1heFJhbmdlICksIE0gKTtcXG59XFxudmVjNCBSR0JEVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiAoICggbWF4UmFuZ2UgLyAyNTUuMCApIC8gdmFsdWUuYSApLCAxLjAgKTtcXG59XFxudmVjNCBMaW5lYXJUb1JHQkQoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xcblxcdGZsb2F0IG1heFJHQiA9IG1heCggdmFsdWUueCwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcXG5cXHRmbG9hdCBEICAgICAgPSBtYXgoIG1heFJhbmdlIC8gbWF4UkdCLCAxLjAgKTtcXG5cXHREICAgICAgICAgICAgPSBtaW4oIGZsb29yKCBEICkgLyAyNTUuMCwgMS4wICk7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqICggRCAqICggMjU1LjAgLyBtYXhSYW5nZSApICksIEQgKTtcXG59XFxuY29uc3QgbWF0MyBjTG9nTHV2TSA9IG1hdDMoIDAuMjIwOSwgMC4zMzkwLCAwLjQxODQsIDAuMTEzOCwgMC42NzgwLCAwLjczMTksIDAuMDEwMiwgMC4xMTMwLCAwLjI5NjkgKTtcXG52ZWM0IExpbmVhclRvTG9nTHV2KCBpbiB2ZWM0IHZhbHVlICkgIHtcXG5cXHR2ZWMzIFhwX1lfWFlacCA9IHZhbHVlLnJnYiAqIGNMb2dMdXZNO1xcblxcdFhwX1lfWFlacCA9IG1heChYcF9ZX1hZWnAsIHZlYzMoMWUtNiwgMWUtNiwgMWUtNikpO1xcblxcdHZlYzQgdlJlc3VsdDtcXG5cXHR2UmVzdWx0Lnh5ID0gWHBfWV9YWVpwLnh5IC8gWHBfWV9YWVpwLno7XFxuXFx0ZmxvYXQgTGUgPSAyLjAgKiBsb2cyKFhwX1lfWFlacC55KSArIDEyNy4wO1xcblxcdHZSZXN1bHQudyA9IGZyYWN0KExlKTtcXG5cXHR2UmVzdWx0LnogPSAoTGUgLSAoZmxvb3IodlJlc3VsdC53KjI1NS4wKSkvMjU1LjApLzI1NS4wO1xcblxcdHJldHVybiB2UmVzdWx0O1xcbn1cXG5jb25zdCBtYXQzIGNMb2dMdXZJbnZlcnNlTSA9IG1hdDMoIDYuMDAxNCwgLTIuNzAwOCwgLTEuNzk5NiwgLTEuMzMyMCwgMy4xMDI5LCAtNS43NzIxLCAwLjMwMDgsIC0xLjA4ODIsIDUuNjI2OCApO1xcbnZlYzQgTG9nTHV2VG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0ZmxvYXQgTGUgPSB2YWx1ZS56ICogMjU1LjAgKyB2YWx1ZS53O1xcblxcdHZlYzMgWHBfWV9YWVpwO1xcblxcdFhwX1lfWFlacC55ID0gZXhwMigoTGUgLSAxMjcuMCkgLyAyLjApO1xcblxcdFhwX1lfWFlacC56ID0gWHBfWV9YWVpwLnkgLyB2YWx1ZS55O1xcblxcdFhwX1lfWFlacC54ID0gdmFsdWUueCAqIFhwX1lfWFlacC56O1xcblxcdHZlYzMgdlJHQiA9IFhwX1lfWFlacC5yZ2IgKiBjTG9nTHV2SW52ZXJzZU07XFxuXFx0cmV0dXJuIHZlYzQoIG1heCh2UkdCLCAwLjApLCAxLjAgKTtcXG59XFxuXCI7XG5cbnZhciBlbnZtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HIClcXG5cXHRcXHR2ZWMzIGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uICk7XFxuXFx0XFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXFxuXFx0XFx0XFx0dmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xcblxcdFxcdCNlbmRpZlxcblxcdCNlbHNlXFxuXFx0XFx0dmVjMyByZWZsZWN0VmVjID0gdlJlZmxlY3Q7XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHR2ZWM0IGVudkNvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApICk7XFxuXFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfRVFVSVJFQyApXFxuXFx0XFx0dmVjMiBzYW1wbGVVVjtcXG5cXHRcXHRyZWZsZWN0VmVjID0gbm9ybWFsaXplKCByZWZsZWN0VmVjICk7XFxuXFx0XFx0c2FtcGxlVVYueSA9IGFzaW4oIGNsYW1wKCByZWZsZWN0VmVjLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTtcXG5cXHRcXHRzYW1wbGVVVi54ID0gYXRhbiggcmVmbGVjdFZlYy56LCByZWZsZWN0VmVjLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xcblxcdFxcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlMkQoIGVudk1hcCwgc2FtcGxlVVYgKTtcXG5cXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxcblxcdFxcdHJlZmxlY3RWZWMgPSBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcXG5cXHRcXHR2ZWMzIHJlZmxlY3RWaWV3ID0gbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwgMC4wLCAxLjAgKSApO1xcblxcdFxcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUgKTtcXG5cXHQjZWxzZVxcblxcdFxcdHZlYzQgZW52Q29sb3IgPSB2ZWM0KCAwLjAgKTtcXG5cXHQjZW5kaWZcXG5cXHRlbnZDb2xvciA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudkNvbG9yICk7XFxuXFx0I2lmZGVmIEVOVk1BUF9CTEVORElOR19NVUxUSVBMWVxcblxcdFxcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIG91dGdvaW5nTGlnaHQgKiBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTtcXG5cXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfTUlYIClcXG5cXHRcXHRvdXRnb2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTtcXG5cXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfQUREIClcXG5cXHRcXHRvdXRnb2luZ0xpZ2h0ICs9IGVudkNvbG9yLnh5eiAqIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbnZtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkKCBQSFlTSUNBTCApXFxuXFx0dW5pZm9ybSBmbG9hdCByZWZsZWN0aXZpdHk7XFxuXFx0dW5pZm9ybSBmbG9hdCBlbnZNYXBJbnRlbnNpdHk7XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaWYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICggZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKSApXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcblxcdCNlbmRpZlxcblxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7XFxuXFx0I2Vsc2VcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XFxuXFx0I2VuZGlmXFxuXFx0dW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwO1xcblxcdHVuaWZvcm0gaW50IG1heE1pcExldmVsO1xcblxcdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIHx8IGRlZmluZWQoIFBIWVNJQ0FMIClcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcXG5cXHQjZWxzZVxcblxcdFxcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGVudm1hcF9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKVxcblxcdFxcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG5cXHQjZWxzZVxcblxcdFxcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGVudm1hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HIClcXG5cXHRcXHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xcblxcdCNlbHNlXFxuXFx0XFx0dmVjMyBjYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggd29ybGRQb3NpdGlvbi54eXogLSBjYW1lcmFQb3NpdGlvbiApO1xcblxcdFxcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXFxuXFx0XFx0XFx0dlJlZmxlY3QgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHZSZWZsZWN0ID0gcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGZvZ192ZXJ0ZXggPSBcIlxcbiNpZmRlZiBVU0VfRk9HXFxuZm9nRGVwdGggPSAtbXZQb3NpdGlvbi56O1xcbiNlbmRpZlwiO1xuXG52YXIgZm9nX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0ZPR1xcbiAgdmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGZvZ19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9GT0dcXG5cXHQjaWZkZWYgRk9HX0VYUDJcXG5cXHRcXHRmbG9hdCBmb2dGYWN0b3IgPSB3aGl0ZUNvbXBsaW1lbnQoIGV4cDIoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiBmb2dEZXB0aCAqIGZvZ0RlcHRoICogTE9HMiApICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRmbG9hdCBmb2dGYWN0b3IgPSBzbW9vdGhzdGVwKCBmb2dOZWFyLCBmb2dGYXIsIGZvZ0RlcHRoICk7XFxuXFx0I2VuZGlmXFxuXFx0Z2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZm9nX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRk9HXFxuXFx0dW5pZm9ybSB2ZWMzIGZvZ0NvbG9yO1xcblxcdHZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7XFxuXFx0I2lmZGVmIEZPR19FWFAyXFxuXFx0XFx0dW5pZm9ybSBmbG9hdCBmb2dEZW5zaXR5O1xcblxcdCNlbHNlXFxuXFx0XFx0dW5pZm9ybSBmbG9hdCBmb2dOZWFyO1xcblxcdFxcdHVuaWZvcm0gZmxvYXQgZm9nRmFyO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFRPT05cXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDtcXG5cXHR2ZWMzIGdldEdyYWRpZW50SXJyYWRpYW5jZSggdmVjMyBub3JtYWwsIHZlYzMgbGlnaHREaXJlY3Rpb24gKSB7XFxuXFx0XFx0ZmxvYXQgZG90TkwgPSBkb3QoIG5vcm1hbCwgbGlnaHREaXJlY3Rpb24gKTtcXG5cXHRcXHR2ZWMyIGNvb3JkID0gdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApO1xcblxcdFxcdCNpZmRlZiBVU0VfR1JBRElFTlRNQVBcXG5cXHRcXHRcXHRyZXR1cm4gdGV4dHVyZTJEKCBncmFkaWVudE1hcCwgY29vcmQgKS5yZ2I7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRyZXR1cm4gKCBjb29yZC54IDwgMC43ICkgPyB2ZWMzKCAwLjcgKSA6IHZlYzMoIDEuMCApO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGxpZ2h0bWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IFBJICogdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9MSUdIVE1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0TWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgbGlnaHRNYXBJbnRlbnNpdHk7XFxuI2VuZGlmXCI7XG5cbnZhciBsaWdodHNfbGFtYmVydF92ZXJ0ZXggPSBcInZlYzMgZGlmZnVzZSA9IHZlYzMoIDEuMCApO1xcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XFxuZ2VvbWV0cnkucG9zaXRpb24gPSBtdlBvc2l0aW9uLnh5ejtcXG5nZW9tZXRyeS5ub3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuZ2VvbWV0cnkudmlld0RpciA9IG5vcm1hbGl6ZSggLW12UG9zaXRpb24ueHl6ICk7XFxuR2VvbWV0cmljQ29udGV4dCBiYWNrR2VvbWV0cnk7XFxuYmFja0dlb21ldHJ5LnBvc2l0aW9uID0gZ2VvbWV0cnkucG9zaXRpb247XFxuYmFja0dlb21ldHJ5Lm5vcm1hbCA9IC1nZW9tZXRyeS5ub3JtYWw7XFxuYmFja0dlb21ldHJ5LnZpZXdEaXIgPSBnZW9tZXRyeS52aWV3RGlyO1xcbnZMaWdodEZyb250ID0gdmVjMyggMC4wICk7XFxuI2lmZGVmIERPVUJMRV9TSURFRFxcblxcdHZMaWdodEJhY2sgPSB2ZWMzKCAwLjAgKTtcXG4jZW5kaWZcXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xcbmZsb2F0IGRvdE5MO1xcbnZlYzMgZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xcblxcdFxcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBwb2ludExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcXG5cXHRcXHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdFxcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRcXHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xcblxcdFxcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0Z2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGRpcmVjdGlvbmFsTGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0XFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0dkxpZ2h0RnJvbnQgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xcblxcdFxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRcXHR2TGlnaHRCYWNrICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgYmFja0dlb21ldHJ5ICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRzX3BhcnNfYmVnaW4gPSBcInVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjtcXG52ZWMzIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgYW1iaWVudExpZ2h0Q29sb3IgKSB7XFxuXFx0dmVjMyBpcnJhZGlhbmNlID0gYW1iaWVudExpZ2h0Q29sb3I7XFxuXFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0aXJyYWRpYW5jZSAqPSBQSTtcXG5cXHQjZW5kaWZcXG5cXHRyZXR1cm4gaXJyYWRpYW5jZTtcXG59XFxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHtcXG5cXHRcXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRcXHR2ZWMzIGNvbG9yO1xcblxcdFxcdGludCBzaGFkb3c7XFxuXFx0XFx0ZmxvYXQgc2hhZG93QmlhcztcXG5cXHRcXHRmbG9hdCBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0dmVjMiBzaGFkb3dNYXBTaXplO1xcblxcdH07XFxuXFx0dW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHRzWyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdHZvaWQgZ2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yO1xcblxcdFxcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uO1xcblxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSB0cnVlO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgUG9pbnRMaWdodCB7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGNvbG9yO1xcblxcdFxcdGZsb2F0IGRpc3RhbmNlO1xcblxcdFxcdGZsb2F0IGRlY2F5O1xcblxcdFxcdGludCBzaGFkb3c7XFxuXFx0XFx0ZmxvYXQgc2hhZG93QmlhcztcXG5cXHRcXHRmbG9hdCBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0dmVjMiBzaGFkb3dNYXBTaXplO1xcblxcdFxcdGZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7XFxuXFx0XFx0ZmxvYXQgc2hhZG93Q2FtZXJhRmFyO1xcblxcdH07XFxuXFx0dW5pZm9ybSBQb2ludExpZ2h0IHBvaW50TGlnaHRzWyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0dm9pZCBnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcXG5cXHRcXHR2ZWMzIGxWZWN0b3IgPSBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XFxuXFx0XFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XFxuXFx0XFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yID0gcG9pbnRMaWdodC5jb2xvcjtcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciAqPSBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9ICggZGlyZWN0TGlnaHQuY29sb3IgIT0gdmVjMyggMC4wICkgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgU3BvdExpZ2h0IHtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uO1xcblxcdFxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0ZmxvYXQgZGlzdGFuY2U7XFxuXFx0XFx0ZmxvYXQgZGVjYXk7XFxuXFx0XFx0ZmxvYXQgY29uZUNvcztcXG5cXHRcXHRmbG9hdCBwZW51bWJyYUNvcztcXG5cXHRcXHRpbnQgc2hhZG93O1xcblxcdFxcdGZsb2F0IHNoYWRvd0JpYXM7XFxuXFx0XFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xcblxcdFxcdHZlYzIgc2hhZG93TWFwU2l6ZTtcXG5cXHR9O1xcblxcdHVuaWZvcm0gU3BvdExpZ2h0IHNwb3RMaWdodHNbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdHZvaWQgZ2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gU3BvdExpZ2h0IHNwb3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgICkge1xcblxcdFxcdHZlYzMgbFZlY3RvciA9IHNwb3RMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApO1xcblxcdFxcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTtcXG5cXHRcXHRmbG9hdCBhbmdsZUNvcyA9IGRvdCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBzcG90TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0aWYgKCBhbmdsZUNvcyA+IHNwb3RMaWdodC5jb25lQ29zICkge1xcblxcdFxcdFxcdGZsb2F0IHNwb3RFZmZlY3QgPSBzbW9vdGhzdGVwKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yID0gc3BvdExpZ2h0LmNvbG9yO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IHNwb3RFZmZlY3QgKiBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBzcG90TGlnaHQuZGlzdGFuY2UsIHNwb3RMaWdodC5kZWNheSApO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSB0cnVlO1xcblxcdFxcdH0gZWxzZSB7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSB2ZWMzKCAwLjAgKTtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC52aXNpYmxlID0gZmFsc2U7XFxuXFx0XFx0fVxcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IFJlY3RBcmVhTGlnaHQge1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGhhbGZXaWR0aDtcXG5cXHRcXHR2ZWMzIGhhbGZIZWlnaHQ7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMTtcXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMjtcXG5cXHR1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07XFxuI2VuZGlmXFxuI2lmIE5VTV9IRU1JX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgSGVtaXNwaGVyZUxpZ2h0IHtcXG5cXHRcXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRcXHR2ZWMzIHNreUNvbG9yO1xcblxcdFxcdHZlYzMgZ3JvdW5kQ29sb3I7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIEhlbWlzcGhlcmVMaWdodCBoZW1pc3BoZXJlTGlnaHRzWyBOVU1fSEVNSV9MSUdIVFMgXTtcXG5cXHR2ZWMzIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIEhlbWlzcGhlcmVMaWdodCBoZW1pTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnkgKSB7XFxuXFx0XFx0ZmxvYXQgZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGVtaUxpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGZsb2F0IGhlbWlEaWZmdXNlV2VpZ2h0ID0gMC41ICogZG90TkwgKyAwLjU7XFxuXFx0XFx0dmVjMyBpcnJhZGlhbmNlID0gbWl4KCBoZW1pTGlnaHQuZ3JvdW5kQ29sb3IsIGhlbWlMaWdodC5za3lDb2xvciwgaGVtaURpZmZ1c2VXZWlnaHQgKTtcXG5cXHRcXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdHJldHVybiBpcnJhZGlhbmNlO1xcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGxpZ2h0c19wYXJzX21hcHMgPSBcIiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUEhZU0lDQUwgKVxcblxcdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xcblxcdFxcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBnZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcXG5cXHRcXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxcblxcdFxcdFxcdHZlYzMgcXVlcnlWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcXG5cXHRcXHRcXHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xcblxcdFxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xcblxcdFxcdFxcdCNlbmRpZlxcblxcdFxcdFxcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxcblxcdFxcdFxcdHZlYzMgcXVlcnlWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggcXVlcnlWZWMsIDEuMCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHZlYzQoIDAuMCApO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdHJldHVybiBQSSAqIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcXG5cXHR9XFxuXFx0ZmxvYXQgZ2V0U3BlY3VsYXJNSVBMZXZlbCggY29uc3QgaW4gZmxvYXQgYmxpbm5TaGluaW5lc3NFeHBvbmVudCwgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xcblxcdFxcdGZsb2F0IG1heE1JUExldmVsU2NhbGFyID0gZmxvYXQoIG1heE1JUExldmVsICk7XFxuXFx0XFx0ZmxvYXQgZGVzaXJlZE1JUExldmVsID0gbWF4TUlQTGV2ZWxTY2FsYXIgKyAwLjc5MjQ4IC0gMC41ICogbG9nMiggcG93MiggYmxpbm5TaGluaW5lc3NFeHBvbmVudCApICsgMS4wICk7XFxuXFx0XFx0cmV0dXJuIGNsYW1wKCBkZXNpcmVkTUlQTGV2ZWwsIDAuMCwgbWF4TUlQTGV2ZWxTY2FsYXIgKTtcXG5cXHR9XFxuXFx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gZmxvYXQgYmxpbm5TaGluaW5lc3NFeHBvbmVudCwgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXFxuXFx0XFx0XFx0dmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggLWdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0dmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggLWdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmVmbGVjdFZlYyA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTtcXG5cXHRcXHRmbG9hdCBzcGVjdWxhck1JUExldmVsID0gZ2V0U3BlY3VsYXJNSVBMZXZlbCggYmxpbm5TaGluaW5lc3NFeHBvbmVudCwgbWF4TUlQTGV2ZWwgKTtcXG5cXHRcXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxcblxcdFxcdFxcdHZlYzMgcXVlcnlSZWZsZWN0VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xcblxcdFxcdFxcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2VuZGlmXFxuXFx0XFx0XFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XFxuXFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYocXVlcnlSZWZsZWN0VmVjLCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoYmxpbm5TaGluaW5lc3NFeHBvbmVudCkpO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxcblxcdFxcdFxcdHZlYzIgc2FtcGxlVVY7XFxuXFx0XFx0XFx0c2FtcGxlVVYueSA9IGFzaW4oIGNsYW1wKCByZWZsZWN0VmVjLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTtcXG5cXHRcXHRcXHRzYW1wbGVVVi54ID0gYXRhbiggcmVmbGVjdFZlYy56LCByZWZsZWN0VmVjLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xcblxcdFxcdFxcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2VuZGlmXFxuXFx0XFx0XFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfU1BIRVJFIClcXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWaWV3ID0gbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwwLjAsMS4wICkgKTtcXG5cXHRcXHRcXHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmUyRExvZEVYVCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbmRpZlxcblxcdFxcdFxcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdHJldHVybiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRzX3Bob25nX2ZyYWdtZW50ID0gXCJCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7XFxubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjtcXG5tYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gc3BlY3VsYXI7XFxubWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgPSBzaGluaW5lc3M7XFxubWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aCA9IHNwZWN1bGFyU3RyZW5ndGg7XFxuXCI7XG5cbnZhciBsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudCA9IFwidmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbnN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwge1xcblxcdHZlYzNcXHRkaWZmdXNlQ29sb3I7XFxuXFx0dmVjM1xcdHNwZWN1bGFyQ29sb3I7XFxuXFx0ZmxvYXRcXHRzcGVjdWxhclNoaW5pbmVzcztcXG5cXHRmbG9hdFxcdHNwZWN1bGFyU3RyZW5ndGg7XFxufTtcXG52b2lkIFJFX0RpcmVjdF9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdCNpZmRlZiBUT09OXFxuXFx0XFx0dmVjMyBpcnJhZGlhbmNlID0gZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0I2Vsc2VcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcXG5cXHRcXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdCNlbmRpZlxcblxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0I2VuZGlmXFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGlycmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgKSAqIG1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGg7XFxufVxcbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG59XFxuI2RlZmluZSBSRV9EaXJlY3RcXHRcXHRcXHRcXHRSRV9EaXJlY3RfQmxpbm5QaG9uZ1xcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXFx0XFx0UkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmdcXG4jZGVmaW5lIE1hdGVyaWFsX0xpZ2h0UHJvYmVMT0QoIG1hdGVyaWFsIClcXHQoMClcXG5cIjtcblxudmFyIGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudCA9IFwiUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbDtcXG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiICogKCAxLjAgLSBtZXRhbG5lc3NGYWN0b3IgKTtcXG5tYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyA9IGNsYW1wKCByb3VnaG5lc3NGYWN0b3IsIDAuMDQsIDEuMCApO1xcbiNpZmRlZiBTVEFOREFSRFxcblxcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XFxuI2Vsc2VcXG5cXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCB2ZWMzKCBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UICogcG93MiggcmVmbGVjdGl2aXR5ICkgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XFxuXFx0bWF0ZXJpYWwuY2xlYXJDb2F0ID0gc2F0dXJhdGUoIGNsZWFyQ29hdCApO1xcdG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyA9IGNsYW1wKCBjbGVhckNvYXRSb3VnaG5lc3MsIDAuMDQsIDEuMCApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQgPSBcInN0cnVjdCBQaHlzaWNhbE1hdGVyaWFsIHtcXG5cXHR2ZWMzXFx0ZGlmZnVzZUNvbG9yO1xcblxcdGZsb2F0XFx0c3BlY3VsYXJSb3VnaG5lc3M7XFxuXFx0dmVjM1xcdHNwZWN1bGFyQ29sb3I7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGZsb2F0IGNsZWFyQ29hdDtcXG5cXHRcXHRmbG9hdCBjbGVhckNvYXRSb3VnaG5lc3M7XFxuXFx0I2VuZGlmXFxufTtcXG4jZGVmaW5lIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgMC4xNlxcbiNkZWZpbmUgREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjA0XFxuZmxvYXQgY2xlYXJDb2F0REhSQXBwcm94KCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGZsb2F0IGRvdE5MICkge1xcblxcdHJldHVybiBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICsgKCAxLjAgLSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICkgKiAoIHBvdyggMS4wIC0gZG90TkwsIDUuMCApICogcG93KCAxLjAgLSByb3VnaG5lc3MsIDIuMCApICk7XFxufVxcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcXG5cXHR2b2lkIFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbCggY29uc3QgaW4gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRcXHR2ZWMzIG5vcm1hbCA9IGdlb21ldHJ5Lm5vcm1hbDtcXG5cXHRcXHR2ZWMzIHZpZXdEaXIgPSBnZW9tZXRyeS52aWV3RGlyO1xcblxcdFxcdHZlYzMgcG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGxpZ2h0UG9zID0gcmVjdEFyZWFMaWdodC5wb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGhhbGZXaWR0aCA9IHJlY3RBcmVhTGlnaHQuaGFsZldpZHRoO1xcblxcdFxcdHZlYzMgaGFsZkhlaWdodCA9IHJlY3RBcmVhTGlnaHQuaGFsZkhlaWdodDtcXG5cXHRcXHR2ZWMzIGxpZ2h0Q29sb3IgPSByZWN0QXJlYUxpZ2h0LmNvbG9yO1xcblxcdFxcdGZsb2F0IHJvdWdobmVzcyA9IG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzO1xcblxcdFxcdHZlYzMgcmVjdENvb3Jkc1sgNCBdO1xcblxcdFxcdHJlY3RDb29yZHNbIDAgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcXHRcXHRyZWN0Q29vcmRzWyAxIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XFxuXFx0XFx0cmVjdENvb3Jkc1sgMiBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xcblxcdFxcdHJlY3RDb29yZHNbIDMgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoICsgaGFsZkhlaWdodDtcXG5cXHRcXHR2ZWMyIHV2ID0gTFRDX1V2KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApO1xcblxcdFxcdHZlYzQgdDEgPSB0ZXh0dXJlMkQoIGx0Y18xLCB1diApO1xcblxcdFxcdHZlYzQgdDIgPSB0ZXh0dXJlMkQoIGx0Y18yLCB1diApO1xcblxcdFxcdG1hdDMgbUludiA9IG1hdDMoXFxuXFx0XFx0XFx0dmVjMyggdDEueCwgMCwgdDEueSApLFxcblxcdFxcdFxcdHZlYzMoICAgIDAsIDEsICAgIDAgKSxcXG5cXHRcXHRcXHR2ZWMzKCB0MS56LCAwLCB0MS53IClcXG5cXHRcXHQpO1xcblxcdFxcdHZlYzMgZnJlc25lbCA9ICggbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciAqIHQyLnggKyAoIHZlYzMoIDEuMCApIC0gbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciApICogdDIueSApO1xcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGxpZ2h0Q29sb3IgKiBmcmVzbmVsICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtSW52LCByZWN0Q29vcmRzICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBsaWdodENvbG9yICogbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogTFRDX0V2YWx1YXRlKCBub3JtYWwsIHZpZXdEaXIsIHBvc2l0aW9uLCBtYXQzKCAxLjAgKSwgcmVjdENvb3JkcyApO1xcblxcdH1cXG4jZW5kaWZcXG52b2lkIFJFX0RpcmVjdF9QaHlzaWNhbCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0dmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdCNlbmRpZlxcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRmbG9hdCBjbGVhckNvYXRESFIgPSBtYXRlcmlhbC5jbGVhckNvYXQgKiBjbGVhckNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcywgZG90TkwgKTtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGNsZWFyQ29hdERIUiA9IDAuMDtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSAoIDEuMCAtIGNsZWFyQ29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSAoIDEuMCAtIGNsZWFyQ29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG5cXHQjaWZuZGVmIFNUQU5EQVJEXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyQ29hdCAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzICk7XFxuXFx0I2VuZGlmXFxufVxcbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xcbn1cXG52b2lkIFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgcmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgY2xlYXJDb2F0UmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0XFx0ZmxvYXQgZG90TkwgPSBkb3ROVjtcXG5cXHRcXHRmbG9hdCBjbGVhckNvYXRESFIgPSBtYXRlcmlhbC5jbGVhckNvYXQgKiBjbGVhckNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcywgZG90TkwgKTtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGNsZWFyQ29hdERIUiA9IDAuMDtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiByYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKTtcXG5cXHQjaWZuZGVmIFNUQU5EQVJEXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArPSBjbGVhckNvYXRSYWRpYW5jZSAqIG1hdGVyaWFsLmNsZWFyQ29hdCAqIEJSREZfU3BlY3VsYXJfR0dYX0Vudmlyb25tZW50KCBnZW9tZXRyeSwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgKTtcXG5cXHQjZW5kaWZcXG59XFxuI2RlZmluZSBSRV9EaXJlY3RcXHRcXHRcXHRcXHRSRV9EaXJlY3RfUGh5c2ljYWxcXG4jZGVmaW5lIFJFX0RpcmVjdF9SZWN0QXJlYVxcdFxcdFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbFxcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXFx0XFx0UkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsXFxuI2RlZmluZSBSRV9JbmRpcmVjdFNwZWN1bGFyXFx0XFx0UkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbFxcbiNkZWZpbmUgTWF0ZXJpYWxfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSAgIEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKVxcbiNkZWZpbmUgTWF0ZXJpYWxfQ2xlYXJDb2F0X0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICkgICBHR1hSb3VnaG5lc3NUb0JsaW5uRXhwb25lbnQoIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyApXFxuZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdHJldHVybiBzYXR1cmF0ZSggcG93KCBkb3ROViArIGFtYmllbnRPY2NsdXNpb24sIGV4cDIoIC0gMTYuMCAqIHJvdWdobmVzcyAtIDEuMCApICkgLSAxLjAgKyBhbWJpZW50T2NjbHVzaW9uICk7XFxufVxcblwiO1xuXG52YXIgbGlnaHRzX2ZyYWdtZW50X2JlZ2luID0gXCJcXG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xcbmdlb21ldHJ5LnBvc2l0aW9uID0gLSB2Vmlld1Bvc2l0aW9uO1xcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbDtcXG5nZW9tZXRyeS52aWV3RGlyID0gbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XFxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcXG4jaWYgKCBOVU1fUE9JTlRfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXFxuXFx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHBvaW50TGlnaHQgPSBwb2ludExpZ2h0c1sgaSBdO1xcblxcdFxcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBwb2ludExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcXG5cXHRcXHQjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIHBvaW50TGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93QmlhcywgcG9pbnRMaWdodC5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFGYXIgKSA6IDEuMDtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiAoIE5VTV9TUE9UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxcblxcdFNwb3RMaWdodCBzcG90TGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRzcG90TGlnaHQgPSBzcG90TGlnaHRzWyBpIF07XFxuXFx0XFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcXG5cXHRcXHQjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIHNwb3RMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgKCBOVU1fRElSX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxcblxcdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0ZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XFxuXFx0XFx0Z2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGRpcmVjdGlvbmFsTGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiAoIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdF9SZWN0QXJlYSApXFxuXFx0UmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUkVDVF9BUkVBX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRyZWN0QXJlYUxpZ2h0ID0gcmVjdEFyZWFMaWdodHNbIGkgXTtcXG5cXHRcXHRSRV9EaXJlY3RfUmVjdEFyZWEoIHJlY3RBcmVhTGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXFxuXFx0dmVjMyBpcnJhZGlhbmNlID0gZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcXG5cXHQjaWYgKCBOVU1fSEVNSV9MSUdIVFMgPiAwIClcXG5cXHRcXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0XFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xcblxcdFxcdFxcdGlycmFkaWFuY2UgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xcblxcdFxcdH1cXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXFxuXFx0dmVjMyByYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzMgY2xlYXJDb2F0UmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGxpZ2h0c19mcmFnbWVudF9tYXBzID0gXCIjaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcXG5cXHQjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0XFx0dmVjMyBsaWdodE1hcElycmFkaWFuY2UgPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XFxuXFx0XFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0XFx0bGlnaHRNYXBJcnJhZGlhbmNlICo9IFBJO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdGlycmFkaWFuY2UgKz0gbGlnaHRNYXBJcnJhZGlhbmNlO1xcblxcdCNlbmRpZlxcblxcdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcXG5cXHRcXHRpcnJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGdlb21ldHJ5LCBtYXhNaXBMZXZlbCApO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXFxuXFx0cmFkaWFuY2UgKz0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LCBNYXRlcmlhbF9CbGlublNoaW5pbmVzc0V4cG9uZW50KCBtYXRlcmlhbCApLCBtYXhNaXBMZXZlbCApO1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRjbGVhckNvYXRSYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnksIE1hdGVyaWFsX0NsZWFyQ29hdF9CbGlublNoaW5pbmVzc0V4cG9uZW50KCBtYXRlcmlhbCApLCBtYXhNaXBMZXZlbCApO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRzX2ZyYWdtZW50X2VuZCA9IFwiI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXFxuXFx0UkVfSW5kaXJlY3REaWZmdXNlKCBpcnJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuI2VuZGlmXFxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxcblxcdFJFX0luZGlyZWN0U3BlY3VsYXIoIHJhZGlhbmNlLCBjbGVhckNvYXRSYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbG9nZGVwdGhidWZfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKSAmJiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUZfRVhUIClcXG5cXHRnbF9GcmFnRGVwdGhFWFQgPSBsb2cyKCB2RnJhZ0RlcHRoICkgKiBsb2dEZXB0aEJ1ZkZDICogMC41O1xcbiNlbmRpZlwiO1xuXG52YXIgbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxcblxcdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxcblxcdFxcdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxuXFx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcXG5cXHRcXHR2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7XFxuXFx0I2VuZGlmXFxuXFx0dW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDO1xcbiNlbmRpZlwiO1xuXG52YXIgbG9nZGVwdGhidWZfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxuXFx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcXG5cXHRcXHR2RnJhZ0RlcHRoID0gMS4wICsgZ2xfUG9zaXRpb24udztcXG5cXHQjZWxzZVxcblxcdFxcdGdsX1Bvc2l0aW9uLnogPSBsb2cyKCBtYXgoIEVQU0lMT04sIGdsX1Bvc2l0aW9uLncgKyAxLjAgKSApICogbG9nRGVwdGhCdWZGQyAtIDEuMDtcXG5cXHRcXHRnbF9Qb3NpdGlvbi56ICo9IGdsX1Bvc2l0aW9uLnc7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUFQXFxuXFx0dmVjNCB0ZXhlbENvbG9yID0gdGV4dHVyZTJEKCBtYXAsIHZVdiApO1xcblxcdHRleGVsQ29sb3IgPSBtYXBUZXhlbFRvTGluZWFyKCB0ZXhlbENvbG9yICk7XFxuXFx0ZGlmZnVzZUNvbG9yICo9IHRleGVsQ29sb3I7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtYXBfcGFydGljbGVfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUFQXFxuXFx0dmVjMiB1diA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCBnbF9Qb2ludENvb3JkLngsIDEuMCAtIGdsX1BvaW50Q29vcmQueSwgMSApICkueHk7XFxuXFx0dmVjNCBtYXBUZXhlbCA9IHRleHR1cmUyRCggbWFwLCB1diApO1xcblxcdGRpZmZ1c2VDb2xvciAqPSBtYXBUZXhlbFRvTGluZWFyKCBtYXBUZXhlbCApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUFQXFxuXFx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xcblxcdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1ldGFsbmVzc21hcF9mcmFnbWVudCA9IFwiZmxvYXQgbWV0YWxuZXNzRmFjdG9yID0gbWV0YWxuZXNzO1xcbiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXFxuXFx0dmVjNCB0ZXhlbE1ldGFsbmVzcyA9IHRleHR1cmUyRCggbWV0YWxuZXNzTWFwLCB2VXYgKTtcXG5cXHRtZXRhbG5lc3NGYWN0b3IgKj0gdGV4ZWxNZXRhbG5lc3MuYjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX01FVEFMTkVTU01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIG1ldGFsbmVzc01hcDtcXG4jZW5kaWZcIjtcblxudmFyIG1vcnBobm9ybWFsX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9NT1JQSE5PUk1BTFNcXG5cXHRvYmplY3ROb3JtYWwgKz0gKCBtb3JwaE5vcm1hbDAgLSBub3JtYWwgKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xcblxcdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMSAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XFxuXFx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwyIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcXG5cXHRvYmplY3ROb3JtYWwgKz0gKCBtb3JwaE5vcm1hbDMgLSBub3JtYWwgKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXFxuXFx0I2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTXFxuXFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDggXTtcXG5cXHQjZWxzZVxcblxcdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBtb3JwaHRhcmdldF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDAgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDEgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDIgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDMgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XFxuXFx0I2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTXFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDQgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDUgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA1IF07XFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDYgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA2IF07XFxuXFx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDcgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA3IF07XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBub3JtYWxfZnJhZ21lbnRfYmVnaW4gPSBcIiNpZmRlZiBGTEFUX1NIQURFRFxcblxcdHZlYzMgZmR4ID0gdmVjMyggZEZkeCggdlZpZXdQb3NpdGlvbi54ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueSApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xcblxcdHZlYzMgZmR5ID0gdmVjMyggZEZkeSggdlZpZXdQb3NpdGlvbi54ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueSApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xcblxcdHZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCBjcm9zcyggZmR4LCBmZHkgKSApO1xcbiNlbHNlXFxuXFx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIHZOb3JtYWwgKTtcXG5cXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0bm9ybWFsID0gbm9ybWFsICogKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMCApO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgbm9ybWFsX2ZyYWdtZW50X21hcHMgPSBcIiNpZmRlZiBVU0VfTk9STUFMTUFQXFxuXFx0bm9ybWFsID0gcGVydHVyYk5vcm1hbDJBcmIoIC12Vmlld1Bvc2l0aW9uLCBub3JtYWwgKTtcXG4jZWxpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApXFxuXFx0bm9ybWFsID0gcGVydHVyYk5vcm1hbEFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCwgZEhkeHlfZndkKCkgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX05PUk1BTE1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbE1hcDtcXG5cXHR1bmlmb3JtIHZlYzIgbm9ybWFsU2NhbGU7XFxuXFx0dmVjMyBwZXJ0dXJiTm9ybWFsMkFyYiggdmVjMyBleWVfcG9zLCB2ZWMzIHN1cmZfbm9ybSApIHtcXG5cXHRcXHR2ZWMzIHEwID0gdmVjMyggZEZkeCggZXllX3Bvcy54ICksIGRGZHgoIGV5ZV9wb3MueSApLCBkRmR4KCBleWVfcG9zLnogKSApO1xcblxcdFxcdHZlYzMgcTEgPSB2ZWMzKCBkRmR5KCBleWVfcG9zLnggKSwgZEZkeSggZXllX3Bvcy55ICksIGRGZHkoIGV5ZV9wb3MueiApICk7XFxuXFx0XFx0dmVjMiBzdDAgPSBkRmR4KCB2VXYuc3QgKTtcXG5cXHRcXHR2ZWMyIHN0MSA9IGRGZHkoIHZVdi5zdCApO1xcblxcdFxcdGZsb2F0IHNjYWxlID0gc2lnbiggc3QxLnQgKiBzdDAucyAtIHN0MC50ICogc3QxLnMgKTtcXHRcXHRzY2FsZSAqPSBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMDtcXG5cXHRcXHR2ZWMzIFMgPSBub3JtYWxpemUoICggcTAgKiBzdDEudCAtIHExICogc3QwLnQgKSAqIHNjYWxlICk7XFxuXFx0XFx0dmVjMyBUID0gbm9ybWFsaXplKCAoIC0gcTAgKiBzdDEucyArIHExICogc3QwLnMgKSAqIHNjYWxlICk7XFxuXFx0XFx0dmVjMyBOID0gbm9ybWFsaXplKCBzdXJmX25vcm0gKTtcXG5cXHRcXHR2ZWMzIG1hcE4gPSB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xcblxcdFxcdG1hcE4ueHkgPSBub3JtYWxTY2FsZSAqIG1hcE4ueHk7XFxuXFx0XFx0bWF0MyB0c24gPSBtYXQzKCBTLCBULCBOICk7XFxuXFx0XFx0cmV0dXJuIG5vcm1hbGl6ZSggdHNuICogbWFwTiApO1xcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIHBhY2tpbmcgPSBcInZlYzMgcGFja05vcm1hbFRvUkdCKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHtcXG5cXHRyZXR1cm4gbm9ybWFsaXplKCBub3JtYWwgKSAqIDAuNSArIDAuNTtcXG59XFxudmVjMyB1bnBhY2tSR0JUb05vcm1hbCggY29uc3QgaW4gdmVjMyByZ2IgKSB7XFxuXFx0cmV0dXJuIDIuMCAqIHJnYi54eXogLSAxLjA7XFxufVxcbmNvbnN0IGZsb2F0IFBhY2tVcHNjYWxlID0gMjU2LiAvIDI1NS47Y29uc3QgZmxvYXQgVW5wYWNrRG93bnNjYWxlID0gMjU1LiAvIDI1Ni47XFxuY29uc3QgdmVjMyBQYWNrRmFjdG9ycyA9IHZlYzMoIDI1Ni4gKiAyNTYuICogMjU2LiwgMjU2LiAqIDI1Ni4sICAyNTYuICk7XFxuY29uc3QgdmVjNCBVbnBhY2tGYWN0b3JzID0gVW5wYWNrRG93bnNjYWxlIC8gdmVjNCggUGFja0ZhY3RvcnMsIDEuICk7XFxuY29uc3QgZmxvYXQgU2hpZnRSaWdodDggPSAxLiAvIDI1Ni47XFxudmVjNCBwYWNrRGVwdGhUb1JHQkEoIGNvbnN0IGluIGZsb2F0IHYgKSB7XFxuXFx0dmVjNCByID0gdmVjNCggZnJhY3QoIHYgKiBQYWNrRmFjdG9ycyApLCB2ICk7XFxuXFx0ci55encgLT0gci54eXogKiBTaGlmdFJpZ2h0ODtcXHRyZXR1cm4gciAqIFBhY2tVcHNjYWxlO1xcbn1cXG5mbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCggY29uc3QgaW4gdmVjNCB2ICkge1xcblxcdHJldHVybiBkb3QoIHYsIFVucGFja0ZhY3RvcnMgKTtcXG59XFxuZmxvYXQgdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xcblxcdHJldHVybiAoIHZpZXdaICsgbmVhciApIC8gKCBuZWFyIC0gZmFyICk7XFxufVxcbmZsb2F0IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgbGluZWFyQ2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gbGluZWFyQ2xpcFogKiAoIG5lYXIgLSBmYXIgKSAtIG5lYXI7XFxufVxcbmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xcblxcdHJldHVybiAoKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCggZmFyIC0gbmVhciApICogdmlld1ogKTtcXG59XFxuZmxvYXQgcGVyc3BlY3RpdmVEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGludkNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuICggbmVhciAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIGludkNsaXBaIC0gZmFyICk7XFxufVxcblwiO1xuXG52YXIgcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudCA9IFwiI2lmZGVmIFBSRU1VTFRJUExJRURfQUxQSEFcXG5cXHRnbF9GcmFnQ29sb3IucmdiICo9IGdsX0ZyYWdDb2xvci5hO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgcHJvamVjdF92ZXJ0ZXggPSBcInZlYzQgbXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcXG5nbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xcblwiO1xuXG52YXIgZGl0aGVyaW5nX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggRElUSEVSSU5HIClcXG4gIGdsX0ZyYWdDb2xvci5yZ2IgPSBkaXRoZXJpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggRElUSEVSSU5HIClcXG5cXHR2ZWMzIGRpdGhlcmluZyggdmVjMyBjb2xvciApIHtcXG5cXHRcXHRmbG9hdCBncmlkX3Bvc2l0aW9uID0gcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7XFxuXFx0XFx0dmVjMyBkaXRoZXJfc2hpZnRfUkdCID0gdmVjMyggMC4yNSAvIDI1NS4wLCAtMC4yNSAvIDI1NS4wLCAwLjI1IC8gMjU1LjAgKTtcXG5cXHRcXHRkaXRoZXJfc2hpZnRfUkdCID0gbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApO1xcblxcdFxcdHJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9SR0I7XFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgcm91Z2huZXNzbWFwX2ZyYWdtZW50ID0gXCJmbG9hdCByb3VnaG5lc3NGYWN0b3IgPSByb3VnaG5lc3M7XFxuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcXG5cXHR2ZWM0IHRleGVsUm91Z2huZXNzID0gdGV4dHVyZTJEKCByb3VnaG5lc3NNYXAsIHZVdiApO1xcblxcdHJvdWdobmVzc0ZhY3RvciAqPSB0ZXhlbFJvdWdobmVzcy5nO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgcm91Z2huZXNzTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIHNwb3RTaGFkb3dNYXBbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBwb2ludFNoYWRvd01hcFsgTlVNX1BPSU5UX0xJR0hUUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdGZsb2F0IHRleHR1cmUyRENvbXBhcmUoIHNhbXBsZXIyRCBkZXB0aHMsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XFxuXFx0XFx0cmV0dXJuIHN0ZXAoIGNvbXBhcmUsIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIGRlcHRocywgdXYgKSApICk7XFxuXFx0fVxcblxcdGZsb2F0IHRleHR1cmUyRFNoYWRvd0xlcnAoIHNhbXBsZXIyRCBkZXB0aHMsIHZlYzIgc2l6ZSwgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHtcXG5cXHRcXHRjb25zdCB2ZWMyIG9mZnNldCA9IHZlYzIoIDAuMCwgMS4wICk7XFxuXFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNpemU7XFxuXFx0XFx0dmVjMiBjZW50cm9pZFVWID0gZmxvb3IoIHV2ICogc2l6ZSArIDAuNSApIC8gc2l6ZTtcXG5cXHRcXHRmbG9hdCBsYiA9IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC54eCwgY29tcGFyZSApO1xcblxcdFxcdGZsb2F0IGx0ID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh5LCBjb21wYXJlICk7XFxuXFx0XFx0ZmxvYXQgcmIgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueXgsIGNvbXBhcmUgKTtcXG5cXHRcXHRmbG9hdCBydCA9IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC55eSwgY29tcGFyZSApO1xcblxcdFxcdHZlYzIgZiA9IGZyYWN0KCB1diAqIHNpemUgKyAwLjUgKTtcXG5cXHRcXHRmbG9hdCBhID0gbWl4KCBsYiwgbHQsIGYueSApO1xcblxcdFxcdGZsb2F0IGIgPSBtaXgoIHJiLCBydCwgZi55ICk7XFxuXFx0XFx0ZmxvYXQgYyA9IG1peCggYSwgYiwgZi54ICk7XFxuXFx0XFx0cmV0dXJuIGM7XFxuXFx0fVxcblxcdGZsb2F0IGdldFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XFxuXFx0XFx0ZmxvYXQgc2hhZG93ID0gMS4wO1xcblxcdFxcdHNoYWRvd0Nvb3JkLnh5eiAvPSBzaGFkb3dDb29yZC53O1xcblxcdFxcdHNoYWRvd0Nvb3JkLnogKz0gc2hhZG93QmlhcztcXG5cXHRcXHRidmVjNCBpbkZydXN0dW1WZWMgPSBidmVjNCAoIHNoYWRvd0Nvb3JkLnggPj0gMC4wLCBzaGFkb3dDb29yZC54IDw9IDEuMCwgc2hhZG93Q29vcmQueSA+PSAwLjAsIHNoYWRvd0Nvb3JkLnkgPD0gMS4wICk7XFxuXFx0XFx0Ym9vbCBpbkZydXN0dW0gPSBhbGwoIGluRnJ1c3R1bVZlYyApO1xcblxcdFxcdGJ2ZWMyIGZydXN0dW1UZXN0VmVjID0gYnZlYzIoIGluRnJ1c3R1bSwgc2hhZG93Q29vcmQueiA8PSAxLjAgKTtcXG5cXHRcXHRib29sIGZydXN0dW1UZXN0ID0gYWxsKCBmcnVzdHVtVGVzdFZlYyApO1xcblxcdFxcdGlmICggZnJ1c3R1bVRlc3QgKSB7XFxuXFx0XFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApXFxuXFx0XFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0XFx0ZmxvYXQgZHgwID0gLSB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRzaGFkb3cgPSAoXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXFxuXFx0XFx0XFx0KSAqICggMS4wIC8gOS4wICk7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxcblxcdFxcdFxcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplO1xcblxcdFxcdFxcdGZsb2F0IGR4MCA9IC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHkwID0gLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeDEgPSArIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR5MSA9ICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0c2hhZG93ID0gKFxcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nvb3JkLnogKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDkuMCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0c2hhZG93ID0gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdH1cXG5cXHRcXHRyZXR1cm4gc2hhZG93O1xcblxcdH1cXG5cXHR2ZWMyIGN1YmVUb1VWKCB2ZWMzIHYsIGZsb2F0IHRleGVsU2l6ZVkgKSB7XFxuXFx0XFx0dmVjMyBhYnNWID0gYWJzKCB2ICk7XFxuXFx0XFx0ZmxvYXQgc2NhbGVUb0N1YmUgPSAxLjAgLyBtYXgoIGFic1YueCwgbWF4KCBhYnNWLnksIGFic1YueiApICk7XFxuXFx0XFx0YWJzViAqPSBzY2FsZVRvQ3ViZTtcXG5cXHRcXHR2ICo9IHNjYWxlVG9DdWJlICogKCAxLjAgLSAyLjAgKiB0ZXhlbFNpemVZICk7XFxuXFx0XFx0dmVjMiBwbGFuYXIgPSB2Lnh5O1xcblxcdFxcdGZsb2F0IGFsbW9zdEFUZXhlbCA9IDEuNSAqIHRleGVsU2l6ZVk7XFxuXFx0XFx0ZmxvYXQgYWxtb3N0T25lID0gMS4wIC0gYWxtb3N0QVRleGVsO1xcblxcdFxcdGlmICggYWJzVi56ID49IGFsbW9zdE9uZSApIHtcXG5cXHRcXHRcXHRpZiAoIHYueiA+IDAuMCApXFxuXFx0XFx0XFx0XFx0cGxhbmFyLnggPSA0LjAgLSB2Lng7XFxuXFx0XFx0fSBlbHNlIGlmICggYWJzVi54ID49IGFsbW9zdE9uZSApIHtcXG5cXHRcXHRcXHRmbG9hdCBzaWduWCA9IHNpZ24oIHYueCApO1xcblxcdFxcdFxcdHBsYW5hci54ID0gdi56ICogc2lnblggKyAyLjAgKiBzaWduWDtcXG5cXHRcXHR9IGVsc2UgaWYgKCBhYnNWLnkgPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGZsb2F0IHNpZ25ZID0gc2lnbiggdi55ICk7XFxuXFx0XFx0XFx0cGxhbmFyLnggPSB2LnggKyAyLjAgKiBzaWduWSArIDIuMDtcXG5cXHRcXHRcXHRwbGFuYXIueSA9IHYueiAqIHNpZ25ZIC0gMi4wO1xcblxcdFxcdH1cXG5cXHRcXHRyZXR1cm4gdmVjMiggMC4xMjUsIDAuMjUgKSAqIHBsYW5hciArIHZlYzIoIDAuMzc1LCAwLjc1ICk7XFxuXFx0fVxcblxcdGZsb2F0IGdldFBvaW50U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCwgZmxvYXQgc2hhZG93Q2FtZXJhTmVhciwgZmxvYXQgc2hhZG93Q2FtZXJhRmFyICkge1xcblxcdFxcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyAoIHNoYWRvd01hcFNpemUgKiB2ZWMyKCA0LjAsIDIuMCApICk7XFxuXFx0XFx0dmVjMyBsaWdodFRvUG9zaXRpb24gPSBzaGFkb3dDb29yZC54eXo7XFxuXFx0XFx0ZmxvYXQgZHAgPSAoIGxlbmd0aCggbGlnaHRUb1Bvc2l0aW9uICkgLSBzaGFkb3dDYW1lcmFOZWFyICkgLyAoIHNoYWRvd0NhbWVyYUZhciAtIHNoYWRvd0NhbWVyYU5lYXIgKTtcXHRcXHRkcCArPSBzaGFkb3dCaWFzO1xcblxcdFxcdHZlYzMgYmQzRCA9IG5vcm1hbGl6ZSggbGlnaHRUb1Bvc2l0aW9uICk7XFxuXFx0XFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUIClcXG5cXHRcXHRcXHR2ZWMyIG9mZnNldCA9IHZlYzIoIC0gMSwgMSApICogc2hhZG93UmFkaXVzICogdGV4ZWxTaXplLnk7XFxuXFx0XFx0XFx0cmV0dXJuIChcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwIClcXG5cXHRcXHRcXHQpICogKCAxLjAgLyA5LjAgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHJldHVybiB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIHNoYWRvd21hcF9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHQjaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdFxcdHVuaWZvcm0gbWF0NCBzcG90U2hhZG93TWF0cml4WyBOVU1fU1BPVF9MSUdIVFMgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IHBvaW50U2hhZG93TWF0cml4WyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBzaGFkb3dtYXBfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0dkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSA9IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0dlNwb3RTaGFkb3dDb29yZFsgaSBdID0gc3BvdFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0dlBvaW50U2hhZG93Q29vcmRbIGkgXSA9IHBvaW50U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xcblxcdH1cXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNoYWRvd21hc2tfcGFyc19mcmFnbWVudCA9IFwiZmxvYXQgZ2V0U2hhZG93TWFzaygpIHtcXG5cXHRmbG9hdCBzaGFkb3cgPSAxLjA7XFxuXFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHQjaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcXG5cXHRcXHRzaGFkb3cgKj0gYm9vbCggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3cgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XFxuXFx0fVxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0U3BvdExpZ2h0IHNwb3RMaWdodDtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHNwb3RMaWdodCA9IHNwb3RMaWdodHNbIGkgXTtcXG5cXHRcXHRzaGFkb3cgKj0gYm9vbCggc3BvdExpZ2h0LnNoYWRvdyApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XFxuXFx0fVxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdFBvaW50TGlnaHQgcG9pbnRMaWdodDtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRwb2ludExpZ2h0ID0gcG9pbnRMaWdodHNbIGkgXTtcXG5cXHRcXHRzaGFkb3cgKj0gYm9vbCggcG9pbnRMaWdodC5zaGFkb3cgKSA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93QmlhcywgcG9pbnRMaWdodC5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFGYXIgKSA6IDEuMDtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2VuZGlmXFxuXFx0cmV0dXJuIHNoYWRvdztcXG59XFxuXCI7XG5cbnZhciBza2luYmFzZV92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHRtYXQ0IGJvbmVNYXRYID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTtcXG5cXHRtYXQ0IGJvbmVNYXRZID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnkgKTtcXG5cXHRtYXQ0IGJvbmVNYXRaID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnogKTtcXG5cXHRtYXQ0IGJvbmVNYXRXID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTtcXG4jZW5kaWZcIjtcblxudmFyIHNraW5uaW5nX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7XFxuXFx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXhJbnZlcnNlO1xcblxcdCNpZmRlZiBCT05FX1RFWFRVUkVcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBib25lVGV4dHVyZTtcXG5cXHRcXHR1bmlmb3JtIGludCBib25lVGV4dHVyZVNpemU7XFxuXFx0XFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xcblxcdFxcdFxcdGZsb2F0IGogPSBpICogNC4wO1xcblxcdFxcdFxcdGZsb2F0IHggPSBtb2QoIGosIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xcblxcdFxcdFxcdGZsb2F0IHkgPSBmbG9vciggaiAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xcblxcdFxcdFxcdGZsb2F0IGR4ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xcblxcdFxcdFxcdGZsb2F0IGR5ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xcblxcdFxcdFxcdHkgPSBkeSAqICggeSArIDAuNSApO1xcblxcdFxcdFxcdHZlYzQgdjEgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDAuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHR2ZWM0IHYyID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAxLjUgKSwgeSApICk7XFxuXFx0XFx0XFx0dmVjNCB2MyA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMi41ICksIHkgKSApO1xcblxcdFxcdFxcdHZlYzQgdjQgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDMuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHRtYXQ0IGJvbmUgPSBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApO1xcblxcdFxcdFxcdHJldHVybiBib25lO1xcblxcdFxcdH1cXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gbWF0NCBib25lTWF0cmljZXNbIE1BWF9CT05FUyBdO1xcblxcdFxcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcXG5cXHRcXHRcXHRtYXQ0IGJvbmUgPSBib25lTWF0cmljZXNbIGludChpKSBdO1xcblxcdFxcdFxcdHJldHVybiBib25lO1xcblxcdFxcdH1cXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNraW5uaW5nX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdHZlYzQgc2tpblZlcnRleCA9IGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XFxuXFx0dmVjNCBza2lubmVkID0gdmVjNCggMC4wICk7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0WCAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lng7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnk7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0WiAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lno7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0VyAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnc7XFxuXFx0dHJhbnNmb3JtZWQgPSAoIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbm5lZCApLnh5ejtcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNraW5ub3JtYWxfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0bWF0NCBza2luTWF0cml4ID0gbWF0NCggMC4wICk7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnggKiBib25lTWF0WDtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueSAqIGJvbmVNYXRZO1xcblxcdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC56ICogYm9uZU1hdFo7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LncgKiBib25lTWF0VztcXG5cXHRza2luTWF0cml4ICA9IGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbk1hdHJpeCAqIGJpbmRNYXRyaXg7XFxuXFx0b2JqZWN0Tm9ybWFsID0gdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdE5vcm1hbCwgMC4wICkgKS54eXo7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBzcGVjdWxhcm1hcF9mcmFnbWVudCA9IFwiZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDtcXG4jaWZkZWYgVVNFX1NQRUNVTEFSTUFQXFxuXFx0dmVjNCB0ZXhlbFNwZWN1bGFyID0gdGV4dHVyZTJEKCBzcGVjdWxhck1hcCwgdlV2ICk7XFxuXFx0c3BlY3VsYXJTdHJlbmd0aCA9IHRleGVsU3BlY3VsYXIucjtcXG4jZWxzZVxcblxcdHNwZWN1bGFyU3RyZW5ndGggPSAxLjA7XFxuI2VuZGlmXCI7XG5cbnZhciBzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX1NQRUNVTEFSTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJNYXA7XFxuI2VuZGlmXCI7XG5cbnZhciB0b25lbWFwcGluZ19mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFRPTkVfTUFQUElORyApXFxuICBnbF9GcmFnQ29sb3IucmdiID0gdG9uZU1hcHBpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQgPSBcIiNpZm5kZWYgc2F0dXJhdGVcXG5cXHQjZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXFxuI2VuZGlmXFxudW5pZm9ybSBmbG9hdCB0b25lTWFwcGluZ0V4cG9zdXJlO1xcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdXaGl0ZVBvaW50O1xcbnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0cmV0dXJuIHRvbmVNYXBwaW5nRXhwb3N1cmUgKiBjb2xvcjtcXG59XFxudmVjMyBSZWluaGFyZFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxuXFx0cmV0dXJuIHNhdHVyYXRlKCBjb2xvciAvICggdmVjMyggMS4wICkgKyBjb2xvciApICk7XFxufVxcbiNkZWZpbmUgVW5jaGFydGVkMkhlbHBlciggeCApIG1heCggKCAoIHggKiAoIDAuMTUgKiB4ICsgMC4xMCAqIDAuNTAgKSArIDAuMjAgKiAwLjAyICkgLyAoIHggKiAoIDAuMTUgKiB4ICsgMC41MCApICsgMC4yMCAqIDAuMzAgKSApIC0gMC4wMiAvIDAuMzAsIHZlYzMoIDAuMCApIClcXG52ZWMzIFVuY2hhcnRlZDJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xcblxcdHJldHVybiBzYXR1cmF0ZSggVW5jaGFydGVkMkhlbHBlciggY29sb3IgKSAvIFVuY2hhcnRlZDJIZWxwZXIoIHZlYzMoIHRvbmVNYXBwaW5nV2hpdGVQb2ludCApICkgKTtcXG59XFxudmVjMyBPcHRpbWl6ZWRDaW5lb25Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xcblxcdGNvbG9yID0gbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xcblxcdHJldHVybiBwb3coICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMC41ICkgKSAvICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMS43ICkgKyAwLjA2ICksIHZlYzMoIDIuMiApICk7XFxufVxcblwiO1xuXG52YXIgdXZfcGFyc19mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfU1BFQ1VMQVJNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKSB8fCBkZWZpbmVkKCBVU0VfRU1JU1NJVkVNQVAgKSB8fCBkZWZpbmVkKCBVU0VfUk9VR0hORVNTTUFQICkgfHwgZGVmaW5lZCggVVNFX01FVEFMTkVTU01BUCApXFxuXFx0dmFyeWluZyB2ZWMyIHZVdjtcXG4jZW5kaWZcIjtcblxudmFyIHV2X3BhcnNfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2O1xcblxcdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIHV2X3ZlcnRleCA9IFwiI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfU1BFQ1VMQVJNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKSB8fCBkZWZpbmVkKCBVU0VfRU1JU1NJVkVNQVAgKSB8fCBkZWZpbmVkKCBVU0VfUk9VR0hORVNTTUFQICkgfHwgZGVmaW5lZCggVVNFX01FVEFMTkVTU01BUCApXFxuXFx0dlV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcXG4jZW5kaWZcIjtcblxudmFyIHV2Ml9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2MjtcXG4jZW5kaWZcIjtcblxudmFyIHV2Ml9wYXJzX3ZlcnRleCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXFxuXFx0YXR0cmlidXRlIHZlYzIgdXYyO1xcblxcdHZhcnlpbmcgdmVjMiB2VXYyO1xcbiNlbmRpZlwiO1xuXG52YXIgdXYyX3ZlcnRleCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXFxuXFx0dlV2MiA9IHV2MjtcXG4jZW5kaWZcIjtcblxudmFyIHdvcmxkcG9zX3ZlcnRleCA9IFwiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkKCBESVNUQU5DRSApIHx8IGRlZmluZWQgKCBVU0VfU0hBRE9XTUFQIClcXG5cXHR2ZWM0IHdvcmxkUG9zaXRpb24gPSBtb2RlbE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGN1YmVfZnJhZyA9IFwidW5pZm9ybSBzYW1wbGVyQ3ViZSB0Q3ViZTtcXG51bmlmb3JtIGZsb2F0IHRGbGlwO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxudm9pZCBtYWluKCkge1xcblxcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmVDdWJlKCB0Q3ViZSwgdmVjMyggdEZsaXAgKiB2V29ybGRQb3NpdGlvbi54LCB2V29ybGRQb3NpdGlvbi55eiApICk7XFxuXFx0Z2xfRnJhZ0NvbG9yLmEgKj0gb3BhY2l0eTtcXG59XFxuXCI7XG5cbnZhciBjdWJlX3ZlcnQgPSBcInZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbnZvaWQgbWFpbigpIHtcXG5cXHR2V29ybGRQb3NpdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0Z2xfUG9zaXRpb24ueiA9IGdsX1Bvc2l0aW9uLnc7XFxufVxcblwiO1xuXG52YXIgZGVwdGhfZnJhZyA9IFwiI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxcblxcdHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAxLjAgKTtcXG5cXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXFxuXFx0XFx0ZGlmZnVzZUNvbG9yLmEgPSBvcGFjaXR5O1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcXG5cXHRcXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCB2ZWMzKCAxLjAgLSBnbF9GcmFnQ29vcmQueiApLCBvcGFjaXR5ICk7XFxuXFx0I2VsaWYgREVQVEhfUEFDS0lORyA9PSAzMjAxXFxuXFx0XFx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBnbF9GcmFnQ29vcmQueiApO1xcblxcdCNlbmRpZlxcbn1cXG5cIjtcblxudmFyIGRlcHRoX3ZlcnQgPSBcIiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXFxuXFx0XFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHRcXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdFxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBkaXN0YW5jZVJHQkFfZnJhZyA9IFwiI2RlZmluZSBESVNUQU5DRVxcbnVuaWZvcm0gdmVjMyByZWZlcmVuY2VQb3NpdGlvbjtcXG51bmlmb3JtIGZsb2F0IG5lYXJEaXN0YW5jZTtcXG51bmlmb3JtIGZsb2F0IGZhckRpc3RhbmNlO1xcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluICgpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMS4wICk7XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHRmbG9hdCBkaXN0ID0gbGVuZ3RoKCB2V29ybGRQb3NpdGlvbiAtIHJlZmVyZW5jZVBvc2l0aW9uICk7XFxuXFx0ZGlzdCA9ICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApO1xcblxcdGRpc3QgPSBzYXR1cmF0ZSggZGlzdCApO1xcblxcdGdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZGlzdCApO1xcbn1cXG5cIjtcblxudmFyIGRpc3RhbmNlUkdCQV92ZXJ0ID0gXCIjZGVmaW5lIERJU1RBTkNFXFxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHRcXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdFxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XFxufVxcblwiO1xuXG52YXIgZXF1aXJlY3RfZnJhZyA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbnZvaWQgbWFpbigpIHtcXG5cXHR2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkUG9zaXRpb24gKTtcXG5cXHR2ZWMyIHNhbXBsZVVWO1xcblxcdHNhbXBsZVVWLnkgPSBhc2luKCBjbGFtcCggZGlyZWN0aW9uLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTtcXG5cXHRzYW1wbGVVVi54ID0gYXRhbiggZGlyZWN0aW9uLnosIGRpcmVjdGlvbi54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcXG5cXHRnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcXG59XFxuXCI7XG5cbnZhciBlcXVpcmVjdF92ZXJ0ID0gXCJ2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG52b2lkIG1haW4oKSB7XFxuXFx0dldvcmxkUG9zaXRpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIGxpbmVkYXNoZWRfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7XFxudW5pZm9ybSBmbG9hdCB0b3RhbFNpemU7XFxudmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHRpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkgPiBkYXNoU2l6ZSApIHtcXG5cXHRcXHRkaXNjYXJkO1xcblxcdH1cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxcblxcdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBsaW5lZGFzaGVkX3ZlcnQgPSBcInVuaWZvcm0gZmxvYXQgc2NhbGU7XFxuYXR0cmlidXRlIGZsb2F0IGxpbmVEaXN0YW5jZTtcXG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHR2TGluZURpc3RhbmNlID0gc2NhbGUgKiBsaW5lRGlzdGFuY2U7XFxuXFx0dmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBtZXNoYmFzaWNfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cXG5cXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xcblxcdCNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xcblxcdCNlbHNlXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZlYzMoIDEuMCApO1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gZGlmZnVzZUNvbG9yLnJnYjtcXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxufVxcblwiO1xuXG52YXIgbWVzaGJhc2ljX3ZlcnQgPSBcIiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx1djJfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbWVzaGxhbWJlcnRfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XFxuI2lmZGVmIERPVUJMRV9TSURFRFxcblxcdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX21hcHM+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFza19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xcblxcdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlID0gZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcXG5cXHQjaW5jbHVkZSA8bGlnaHRtYXBfZnJhZ21lbnQ+XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICk7XFxuXFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgPSAoIGdsX0Zyb250RmFjaW5nICkgPyB2TGlnaHRGcm9udCA6IHZMaWdodEJhY2s7XFxuXFx0I2Vsc2VcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlID0gdkxpZ2h0RnJvbnQ7XFxuXFx0I2VuZGlmXFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSAqPSBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApICogZ2V0U2hhZG93TWFzaygpO1xcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xcblxcdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxufVxcblwiO1xuXG52YXIgbWVzaGxhbWJlcnRfdmVydCA9IFwiI2RlZmluZSBMQU1CRVJUXFxudmFyeWluZyB2ZWMzIHZMaWdodEZyb250O1xcbiNpZmRlZiBET1VCTEVfU0lERURcXG5cXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfbWFwcz5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19sYW1iZXJ0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBtZXNocGhvbmdfZnJhZyA9IFwiI2RlZmluZSBQSE9OR1xcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcXG51bmlmb3JtIHZlYzMgc3BlY3VsYXI7XFxudW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19tYXBzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX3Bob25nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xcblxcdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxufVxcblwiO1xuXG52YXIgbWVzaHBob25nX3ZlcnQgPSBcIiNkZWZpbmUgUEhPTkdcXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx1djJfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG4jZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG1lc2hwaHlzaWNhbF9mcmFnID0gXCIjZGVmaW5lIFBIWVNJQ0FMXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzO1xcbnVuaWZvcm0gZmxvYXQgbWV0YWxuZXNzO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaWZuZGVmIFNUQU5EQVJEXFxuXFx0dW5pZm9ybSBmbG9hdCBjbGVhckNvYXQ7XFxuXFx0dW5pZm9ybSBmbG9hdCBjbGVhckNvYXRSb3VnaG5lc3M7XFxuI2VuZGlmXFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX21hcHM+XFxuI2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8cm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xcblxcdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1ldGFsbmVzc21hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cXG5cXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfbWFwcz5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD5cXG5cXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNocGh5c2ljYWxfdmVydCA9IFwiI2RlZmluZSBQSFlTSUNBTFxcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx1djJfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG4jZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG5vcm1hbF9mcmFnID0gXCIjZGVmaW5lIE5PUk1BTFxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKVxcblxcdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNlbmRpZlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIHBhY2tOb3JtYWxUb1JHQiggbm9ybWFsICksIG9wYWNpdHkgKTtcXG59XFxuXCI7XG5cbnZhciBub3JtYWxfdmVydCA9IFwiI2RlZmluZSBOT1JNQUxcXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKVxcblxcdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNlbmRpZlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbiNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApXFxuXFx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XFxuI2VuZGlmXFxufVxcblwiO1xuXG52YXIgcG9pbnRzX2ZyYWcgPSBcInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxufVxcblwiO1xuXG52YXIgcG9pbnRzX3ZlcnQgPSBcInVuaWZvcm0gZmxvYXQgc2l6ZTtcXG51bmlmb3JtIGZsb2F0IHNjYWxlO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTlxcblxcdFxcdGdsX1BvaW50U2l6ZSA9IHNpemUgKiAoIHNjYWxlIC8gLSBtdlBvc2l0aW9uLnogKTtcXG5cXHQjZWxzZVxcblxcdFxcdGdsX1BvaW50U2l6ZSA9IHNpemU7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIHNoYWRvd19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgY29sb3I7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApO1xcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxufVxcblwiO1xuXG52YXIgc2hhZG93X3ZlcnQgPSBcIiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBTaGFkZXJDaHVuayA9IHtcblx0YWxwaGFtYXBfZnJhZ21lbnQ6IGFscGhhbWFwX2ZyYWdtZW50LFxuXHRhbHBoYW1hcF9wYXJzX2ZyYWdtZW50OiBhbHBoYW1hcF9wYXJzX2ZyYWdtZW50LFxuXHRhbHBoYXRlc3RfZnJhZ21lbnQ6IGFscGhhdGVzdF9mcmFnbWVudCxcblx0YW9tYXBfZnJhZ21lbnQ6IGFvbWFwX2ZyYWdtZW50LFxuXHRhb21hcF9wYXJzX2ZyYWdtZW50OiBhb21hcF9wYXJzX2ZyYWdtZW50LFxuXHRiZWdpbl92ZXJ0ZXg6IGJlZ2luX3ZlcnRleCxcblx0YmVnaW5ub3JtYWxfdmVydGV4OiBiZWdpbm5vcm1hbF92ZXJ0ZXgsXG5cdGJzZGZzOiBic2Rmcyxcblx0YnVtcG1hcF9wYXJzX2ZyYWdtZW50OiBidW1wbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudDogY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50LFxuXHRjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudDogY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQsXG5cdGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleDogY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4LFxuXHRjbGlwcGluZ19wbGFuZXNfdmVydGV4OiBjbGlwcGluZ19wbGFuZXNfdmVydGV4LFxuXHRjb2xvcl9mcmFnbWVudDogY29sb3JfZnJhZ21lbnQsXG5cdGNvbG9yX3BhcnNfZnJhZ21lbnQ6IGNvbG9yX3BhcnNfZnJhZ21lbnQsXG5cdGNvbG9yX3BhcnNfdmVydGV4OiBjb2xvcl9wYXJzX3ZlcnRleCxcblx0Y29sb3JfdmVydGV4OiBjb2xvcl92ZXJ0ZXgsXG5cdGNvbW1vbjogY29tbW9uLFxuXHRjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ6IGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCxcblx0ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg6IGRlZmF1bHRub3JtYWxfdmVydGV4LFxuXHRkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg6IGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleCxcblx0ZGlzcGxhY2VtZW50bWFwX3ZlcnRleDogZGlzcGxhY2VtZW50bWFwX3ZlcnRleCxcblx0ZW1pc3NpdmVtYXBfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX2ZyYWdtZW50LFxuXHRlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50OiBlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50LFxuXHRlbmNvZGluZ3NfZnJhZ21lbnQ6IGVuY29kaW5nc19mcmFnbWVudCxcblx0ZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IGVuY29kaW5nc19wYXJzX2ZyYWdtZW50LFxuXHRlbnZtYXBfZnJhZ21lbnQ6IGVudm1hcF9mcmFnbWVudCxcblx0ZW52bWFwX3BhcnNfZnJhZ21lbnQ6IGVudm1hcF9wYXJzX2ZyYWdtZW50LFxuXHRlbnZtYXBfcGFyc192ZXJ0ZXg6IGVudm1hcF9wYXJzX3ZlcnRleCxcblx0ZW52bWFwX3ZlcnRleDogZW52bWFwX3ZlcnRleCxcblx0Zm9nX3ZlcnRleDogZm9nX3ZlcnRleCxcblx0Zm9nX3BhcnNfdmVydGV4OiBmb2dfcGFyc192ZXJ0ZXgsXG5cdGZvZ19mcmFnbWVudDogZm9nX2ZyYWdtZW50LFxuXHRmb2dfcGFyc19mcmFnbWVudDogZm9nX3BhcnNfZnJhZ21lbnQsXG5cdGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ6IGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0bWFwX2ZyYWdtZW50OiBsaWdodG1hcF9mcmFnbWVudCxcblx0bGlnaHRtYXBfcGFyc19mcmFnbWVudDogbGlnaHRtYXBfcGFyc19mcmFnbWVudCxcblx0bGlnaHRzX2xhbWJlcnRfdmVydGV4OiBsaWdodHNfbGFtYmVydF92ZXJ0ZXgsXG5cdGxpZ2h0c19wYXJzX2JlZ2luOiBsaWdodHNfcGFyc19iZWdpbixcblx0bGlnaHRzX3BhcnNfbWFwczogbGlnaHRzX3BhcnNfbWFwcyxcblx0bGlnaHRzX3Bob25nX2ZyYWdtZW50OiBsaWdodHNfcGhvbmdfZnJhZ21lbnQsXG5cdGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50OiBsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudCxcblx0bGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50OiBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQsXG5cdGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiBsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudCxcblx0bGlnaHRzX2ZyYWdtZW50X2JlZ2luOiBsaWdodHNfZnJhZ21lbnRfYmVnaW4sXG5cdGxpZ2h0c19mcmFnbWVudF9tYXBzOiBsaWdodHNfZnJhZ21lbnRfbWFwcyxcblx0bGlnaHRzX2ZyYWdtZW50X2VuZDogbGlnaHRzX2ZyYWdtZW50X2VuZCxcblx0bG9nZGVwdGhidWZfZnJhZ21lbnQ6IGxvZ2RlcHRoYnVmX2ZyYWdtZW50LFxuXHRsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50OiBsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50LFxuXHRsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleDogbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXgsXG5cdGxvZ2RlcHRoYnVmX3ZlcnRleDogbG9nZGVwdGhidWZfdmVydGV4LFxuXHRtYXBfZnJhZ21lbnQ6IG1hcF9mcmFnbWVudCxcblx0bWFwX3BhcnNfZnJhZ21lbnQ6IG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRtYXBfcGFydGljbGVfZnJhZ21lbnQ6IG1hcF9wYXJ0aWNsZV9mcmFnbWVudCxcblx0bWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ6IG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50LFxuXHRtZXRhbG5lc3NtYXBfZnJhZ21lbnQ6IG1ldGFsbmVzc21hcF9mcmFnbWVudCxcblx0bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50LFxuXHRtb3JwaG5vcm1hbF92ZXJ0ZXg6IG1vcnBobm9ybWFsX3ZlcnRleCxcblx0bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg6IG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4LFxuXHRtb3JwaHRhcmdldF92ZXJ0ZXg6IG1vcnBodGFyZ2V0X3ZlcnRleCxcblx0bm9ybWFsX2ZyYWdtZW50X2JlZ2luOiBub3JtYWxfZnJhZ21lbnRfYmVnaW4sXG5cdG5vcm1hbF9mcmFnbWVudF9tYXBzOiBub3JtYWxfZnJhZ21lbnRfbWFwcyxcblx0bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRwYWNraW5nOiBwYWNraW5nLFxuXHRwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50OiBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50LFxuXHRwcm9qZWN0X3ZlcnRleDogcHJvamVjdF92ZXJ0ZXgsXG5cdGRpdGhlcmluZ19mcmFnbWVudDogZGl0aGVyaW5nX2ZyYWdtZW50LFxuXHRkaXRoZXJpbmdfcGFyc19mcmFnbWVudDogZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQsXG5cdHJvdWdobmVzc21hcF9mcmFnbWVudDogcm91Z2huZXNzbWFwX2ZyYWdtZW50LFxuXHRyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudDogcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQsXG5cdHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50OiBzaGFkb3dtYXBfcGFyc19mcmFnbWVudCxcblx0c2hhZG93bWFwX3BhcnNfdmVydGV4OiBzaGFkb3dtYXBfcGFyc192ZXJ0ZXgsXG5cdHNoYWRvd21hcF92ZXJ0ZXg6IHNoYWRvd21hcF92ZXJ0ZXgsXG5cdHNoYWRvd21hc2tfcGFyc19mcmFnbWVudDogc2hhZG93bWFza19wYXJzX2ZyYWdtZW50LFxuXHRza2luYmFzZV92ZXJ0ZXg6IHNraW5iYXNlX3ZlcnRleCxcblx0c2tpbm5pbmdfcGFyc192ZXJ0ZXg6IHNraW5uaW5nX3BhcnNfdmVydGV4LFxuXHRza2lubmluZ192ZXJ0ZXg6IHNraW5uaW5nX3ZlcnRleCxcblx0c2tpbm5vcm1hbF92ZXJ0ZXg6IHNraW5ub3JtYWxfdmVydGV4LFxuXHRzcGVjdWxhcm1hcF9mcmFnbWVudDogc3BlY3VsYXJtYXBfZnJhZ21lbnQsXG5cdHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ6IHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQsXG5cdHRvbmVtYXBwaW5nX2ZyYWdtZW50OiB0b25lbWFwcGluZ19mcmFnbWVudCxcblx0dG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDogdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCxcblx0dXZfcGFyc19mcmFnbWVudDogdXZfcGFyc19mcmFnbWVudCxcblx0dXZfcGFyc192ZXJ0ZXg6IHV2X3BhcnNfdmVydGV4LFxuXHR1dl92ZXJ0ZXg6IHV2X3ZlcnRleCxcblx0dXYyX3BhcnNfZnJhZ21lbnQ6IHV2Ml9wYXJzX2ZyYWdtZW50LFxuXHR1djJfcGFyc192ZXJ0ZXg6IHV2Ml9wYXJzX3ZlcnRleCxcblx0dXYyX3ZlcnRleDogdXYyX3ZlcnRleCxcblx0d29ybGRwb3NfdmVydGV4OiB3b3JsZHBvc192ZXJ0ZXgsXG5cblx0Y3ViZV9mcmFnOiBjdWJlX2ZyYWcsXG5cdGN1YmVfdmVydDogY3ViZV92ZXJ0LFxuXHRkZXB0aF9mcmFnOiBkZXB0aF9mcmFnLFxuXHRkZXB0aF92ZXJ0OiBkZXB0aF92ZXJ0LFxuXHRkaXN0YW5jZVJHQkFfZnJhZzogZGlzdGFuY2VSR0JBX2ZyYWcsXG5cdGRpc3RhbmNlUkdCQV92ZXJ0OiBkaXN0YW5jZVJHQkFfdmVydCxcblx0ZXF1aXJlY3RfZnJhZzogZXF1aXJlY3RfZnJhZyxcblx0ZXF1aXJlY3RfdmVydDogZXF1aXJlY3RfdmVydCxcblx0bGluZWRhc2hlZF9mcmFnOiBsaW5lZGFzaGVkX2ZyYWcsXG5cdGxpbmVkYXNoZWRfdmVydDogbGluZWRhc2hlZF92ZXJ0LFxuXHRtZXNoYmFzaWNfZnJhZzogbWVzaGJhc2ljX2ZyYWcsXG5cdG1lc2hiYXNpY192ZXJ0OiBtZXNoYmFzaWNfdmVydCxcblx0bWVzaGxhbWJlcnRfZnJhZzogbWVzaGxhbWJlcnRfZnJhZyxcblx0bWVzaGxhbWJlcnRfdmVydDogbWVzaGxhbWJlcnRfdmVydCxcblx0bWVzaHBob25nX2ZyYWc6IG1lc2hwaG9uZ19mcmFnLFxuXHRtZXNocGhvbmdfdmVydDogbWVzaHBob25nX3ZlcnQsXG5cdG1lc2hwaHlzaWNhbF9mcmFnOiBtZXNocGh5c2ljYWxfZnJhZyxcblx0bWVzaHBoeXNpY2FsX3ZlcnQ6IG1lc2hwaHlzaWNhbF92ZXJ0LFxuXHRub3JtYWxfZnJhZzogbm9ybWFsX2ZyYWcsXG5cdG5vcm1hbF92ZXJ0OiBub3JtYWxfdmVydCxcblx0cG9pbnRzX2ZyYWc6IHBvaW50c19mcmFnLFxuXHRwb2ludHNfdmVydDogcG9pbnRzX3ZlcnQsXG5cdHNoYWRvd19mcmFnOiBzaGFkb3dfZnJhZyxcblx0c2hhZG93X3ZlcnQ6IHNoYWRvd192ZXJ0XG59O1xuXG4vKipcbiAqIFVuaWZvcm0gVXRpbGl0aWVzXG4gKi9cblxudmFyIFVuaWZvcm1zVXRpbHMgPSB7XG5cblx0bWVyZ2U6IGZ1bmN0aW9uICggdW5pZm9ybXMgKSB7XG5cblx0XHR2YXIgbWVyZ2VkID0ge307XG5cblx0XHRmb3IgKCB2YXIgdSA9IDA7IHUgPCB1bmlmb3Jtcy5sZW5ndGg7IHUgKysgKSB7XG5cblx0XHRcdHZhciB0bXAgPSB0aGlzLmNsb25lKCB1bmlmb3Jtc1sgdSBdICk7XG5cblx0XHRcdGZvciAoIHZhciBwIGluIHRtcCApIHtcblxuXHRcdFx0XHRtZXJnZWRbIHAgXSA9IHRtcFsgcCBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWVyZ2VkO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICggdW5pZm9ybXNfc3JjICkge1xuXG5cdFx0dmFyIHVuaWZvcm1zX2RzdCA9IHt9O1xuXG5cdFx0Zm9yICggdmFyIHUgaW4gdW5pZm9ybXNfc3JjICkge1xuXG5cdFx0XHR1bmlmb3Jtc19kc3RbIHUgXSA9IHt9O1xuXG5cdFx0XHRmb3IgKCB2YXIgcCBpbiB1bmlmb3Jtc19zcmNbIHUgXSApIHtcblxuXHRcdFx0XHR2YXIgcGFyYW1ldGVyX3NyYyA9IHVuaWZvcm1zX3NyY1sgdSBdWyBwIF07XG5cblx0XHRcdFx0aWYgKCBwYXJhbWV0ZXJfc3JjICYmICggcGFyYW1ldGVyX3NyYy5pc0NvbG9yIHx8XG5cdFx0XHRcdFx0cGFyYW1ldGVyX3NyYy5pc01hdHJpeDMgfHwgcGFyYW1ldGVyX3NyYy5pc01hdHJpeDQgfHxcblx0XHRcdFx0XHRwYXJhbWV0ZXJfc3JjLmlzVmVjdG9yMiB8fCBwYXJhbWV0ZXJfc3JjLmlzVmVjdG9yMyB8fCBwYXJhbWV0ZXJfc3JjLmlzVmVjdG9yNCB8fFxuXHRcdFx0XHRcdHBhcmFtZXRlcl9zcmMuaXNUZXh0dXJlICkgKSB7XG5cblx0XHRcdFx0XHR1bmlmb3Jtc19kc3RbIHUgXVsgcCBdID0gcGFyYW1ldGVyX3NyYy5jbG9uZSgpO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIEFycmF5LmlzQXJyYXkoIHBhcmFtZXRlcl9zcmMgKSApIHtcblxuXHRcdFx0XHRcdHVuaWZvcm1zX2RzdFsgdSBdWyBwIF0gPSBwYXJhbWV0ZXJfc3JjLnNsaWNlKCk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHVuaWZvcm1zX2RzdFsgdSBdWyBwIF0gPSBwYXJhbWV0ZXJfc3JjO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuaWZvcm1zX2RzdDtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgQ29sb3JLZXl3b3JkcyA9IHsgJ2FsaWNlYmx1ZSc6IDB4RjBGOEZGLCAnYW50aXF1ZXdoaXRlJzogMHhGQUVCRDcsICdhcXVhJzogMHgwMEZGRkYsICdhcXVhbWFyaW5lJzogMHg3RkZGRDQsICdhenVyZSc6IDB4RjBGRkZGLFxuXHQnYmVpZ2UnOiAweEY1RjVEQywgJ2Jpc3F1ZSc6IDB4RkZFNEM0LCAnYmxhY2snOiAweDAwMDAwMCwgJ2JsYW5jaGVkYWxtb25kJzogMHhGRkVCQ0QsICdibHVlJzogMHgwMDAwRkYsICdibHVldmlvbGV0JzogMHg4QTJCRTIsXG5cdCdicm93bic6IDB4QTUyQTJBLCAnYnVybHl3b29kJzogMHhERUI4ODcsICdjYWRldGJsdWUnOiAweDVGOUVBMCwgJ2NoYXJ0cmV1c2UnOiAweDdGRkYwMCwgJ2Nob2NvbGF0ZSc6IDB4RDI2OTFFLCAnY29yYWwnOiAweEZGN0Y1MCxcblx0J2Nvcm5mbG93ZXJibHVlJzogMHg2NDk1RUQsICdjb3Juc2lsayc6IDB4RkZGOERDLCAnY3JpbXNvbic6IDB4REMxNDNDLCAnY3lhbic6IDB4MDBGRkZGLCAnZGFya2JsdWUnOiAweDAwMDA4QiwgJ2RhcmtjeWFuJzogMHgwMDhCOEIsXG5cdCdkYXJrZ29sZGVucm9kJzogMHhCODg2MEIsICdkYXJrZ3JheSc6IDB4QTlBOUE5LCAnZGFya2dyZWVuJzogMHgwMDY0MDAsICdkYXJrZ3JleSc6IDB4QTlBOUE5LCAnZGFya2toYWtpJzogMHhCREI3NkIsICdkYXJrbWFnZW50YSc6IDB4OEIwMDhCLFxuXHQnZGFya29saXZlZ3JlZW4nOiAweDU1NkIyRiwgJ2RhcmtvcmFuZ2UnOiAweEZGOEMwMCwgJ2RhcmtvcmNoaWQnOiAweDk5MzJDQywgJ2RhcmtyZWQnOiAweDhCMDAwMCwgJ2RhcmtzYWxtb24nOiAweEU5OTY3QSwgJ2RhcmtzZWFncmVlbic6IDB4OEZCQzhGLFxuXHQnZGFya3NsYXRlYmx1ZSc6IDB4NDgzRDhCLCAnZGFya3NsYXRlZ3JheSc6IDB4MkY0RjRGLCAnZGFya3NsYXRlZ3JleSc6IDB4MkY0RjRGLCAnZGFya3R1cnF1b2lzZSc6IDB4MDBDRUQxLCAnZGFya3Zpb2xldCc6IDB4OTQwMEQzLFxuXHQnZGVlcHBpbmsnOiAweEZGMTQ5MywgJ2RlZXBza3libHVlJzogMHgwMEJGRkYsICdkaW1ncmF5JzogMHg2OTY5NjksICdkaW1ncmV5JzogMHg2OTY5NjksICdkb2RnZXJibHVlJzogMHgxRTkwRkYsICdmaXJlYnJpY2snOiAweEIyMjIyMixcblx0J2Zsb3JhbHdoaXRlJzogMHhGRkZBRjAsICdmb3Jlc3RncmVlbic6IDB4MjI4QjIyLCAnZnVjaHNpYSc6IDB4RkYwMEZGLCAnZ2FpbnNib3JvJzogMHhEQ0RDREMsICdnaG9zdHdoaXRlJzogMHhGOEY4RkYsICdnb2xkJzogMHhGRkQ3MDAsXG5cdCdnb2xkZW5yb2QnOiAweERBQTUyMCwgJ2dyYXknOiAweDgwODA4MCwgJ2dyZWVuJzogMHgwMDgwMDAsICdncmVlbnllbGxvdyc6IDB4QURGRjJGLCAnZ3JleSc6IDB4ODA4MDgwLCAnaG9uZXlkZXcnOiAweEYwRkZGMCwgJ2hvdHBpbmsnOiAweEZGNjlCNCxcblx0J2luZGlhbnJlZCc6IDB4Q0Q1QzVDLCAnaW5kaWdvJzogMHg0QjAwODIsICdpdm9yeSc6IDB4RkZGRkYwLCAna2hha2knOiAweEYwRTY4QywgJ2xhdmVuZGVyJzogMHhFNkU2RkEsICdsYXZlbmRlcmJsdXNoJzogMHhGRkYwRjUsICdsYXduZ3JlZW4nOiAweDdDRkMwMCxcblx0J2xlbW9uY2hpZmZvbic6IDB4RkZGQUNELCAnbGlnaHRibHVlJzogMHhBREQ4RTYsICdsaWdodGNvcmFsJzogMHhGMDgwODAsICdsaWdodGN5YW4nOiAweEUwRkZGRiwgJ2xpZ2h0Z29sZGVucm9keWVsbG93JzogMHhGQUZBRDIsICdsaWdodGdyYXknOiAweEQzRDNEMyxcblx0J2xpZ2h0Z3JlZW4nOiAweDkwRUU5MCwgJ2xpZ2h0Z3JleSc6IDB4RDNEM0QzLCAnbGlnaHRwaW5rJzogMHhGRkI2QzEsICdsaWdodHNhbG1vbic6IDB4RkZBMDdBLCAnbGlnaHRzZWFncmVlbic6IDB4MjBCMkFBLCAnbGlnaHRza3libHVlJzogMHg4N0NFRkEsXG5cdCdsaWdodHNsYXRlZ3JheSc6IDB4Nzc4ODk5LCAnbGlnaHRzbGF0ZWdyZXknOiAweDc3ODg5OSwgJ2xpZ2h0c3RlZWxibHVlJzogMHhCMEM0REUsICdsaWdodHllbGxvdyc6IDB4RkZGRkUwLCAnbGltZSc6IDB4MDBGRjAwLCAnbGltZWdyZWVuJzogMHgzMkNEMzIsXG5cdCdsaW5lbic6IDB4RkFGMEU2LCAnbWFnZW50YSc6IDB4RkYwMEZGLCAnbWFyb29uJzogMHg4MDAwMDAsICdtZWRpdW1hcXVhbWFyaW5lJzogMHg2NkNEQUEsICdtZWRpdW1ibHVlJzogMHgwMDAwQ0QsICdtZWRpdW1vcmNoaWQnOiAweEJBNTVEMyxcblx0J21lZGl1bXB1cnBsZSc6IDB4OTM3MERCLCAnbWVkaXVtc2VhZ3JlZW4nOiAweDNDQjM3MSwgJ21lZGl1bXNsYXRlYmx1ZSc6IDB4N0I2OEVFLCAnbWVkaXVtc3ByaW5nZ3JlZW4nOiAweDAwRkE5QSwgJ21lZGl1bXR1cnF1b2lzZSc6IDB4NDhEMUNDLFxuXHQnbWVkaXVtdmlvbGV0cmVkJzogMHhDNzE1ODUsICdtaWRuaWdodGJsdWUnOiAweDE5MTk3MCwgJ21pbnRjcmVhbSc6IDB4RjVGRkZBLCAnbWlzdHlyb3NlJzogMHhGRkU0RTEsICdtb2NjYXNpbic6IDB4RkZFNEI1LCAnbmF2YWpvd2hpdGUnOiAweEZGREVBRCxcblx0J25hdnknOiAweDAwMDA4MCwgJ29sZGxhY2UnOiAweEZERjVFNiwgJ29saXZlJzogMHg4MDgwMDAsICdvbGl2ZWRyYWInOiAweDZCOEUyMywgJ29yYW5nZSc6IDB4RkZBNTAwLCAnb3JhbmdlcmVkJzogMHhGRjQ1MDAsICdvcmNoaWQnOiAweERBNzBENixcblx0J3BhbGVnb2xkZW5yb2QnOiAweEVFRThBQSwgJ3BhbGVncmVlbic6IDB4OThGQjk4LCAncGFsZXR1cnF1b2lzZSc6IDB4QUZFRUVFLCAncGFsZXZpb2xldHJlZCc6IDB4REI3MDkzLCAncGFwYXlhd2hpcCc6IDB4RkZFRkQ1LCAncGVhY2hwdWZmJzogMHhGRkRBQjksXG5cdCdwZXJ1JzogMHhDRDg1M0YsICdwaW5rJzogMHhGRkMwQ0IsICdwbHVtJzogMHhEREEwREQsICdwb3dkZXJibHVlJzogMHhCMEUwRTYsICdwdXJwbGUnOiAweDgwMDA4MCwgJ3JlYmVjY2FwdXJwbGUnOiAweDY2MzM5OSwgJ3JlZCc6IDB4RkYwMDAwLCAncm9zeWJyb3duJzogMHhCQzhGOEYsXG5cdCdyb3lhbGJsdWUnOiAweDQxNjlFMSwgJ3NhZGRsZWJyb3duJzogMHg4QjQ1MTMsICdzYWxtb24nOiAweEZBODA3MiwgJ3NhbmR5YnJvd24nOiAweEY0QTQ2MCwgJ3NlYWdyZWVuJzogMHgyRThCNTcsICdzZWFzaGVsbCc6IDB4RkZGNUVFLFxuXHQnc2llbm5hJzogMHhBMDUyMkQsICdzaWx2ZXInOiAweEMwQzBDMCwgJ3NreWJsdWUnOiAweDg3Q0VFQiwgJ3NsYXRlYmx1ZSc6IDB4NkE1QUNELCAnc2xhdGVncmF5JzogMHg3MDgwOTAsICdzbGF0ZWdyZXknOiAweDcwODA5MCwgJ3Nub3cnOiAweEZGRkFGQSxcblx0J3NwcmluZ2dyZWVuJzogMHgwMEZGN0YsICdzdGVlbGJsdWUnOiAweDQ2ODJCNCwgJ3Rhbic6IDB4RDJCNDhDLCAndGVhbCc6IDB4MDA4MDgwLCAndGhpc3RsZSc6IDB4RDhCRkQ4LCAndG9tYXRvJzogMHhGRjYzNDcsICd0dXJxdW9pc2UnOiAweDQwRTBEMCxcblx0J3Zpb2xldCc6IDB4RUU4MkVFLCAnd2hlYXQnOiAweEY1REVCMywgJ3doaXRlJzogMHhGRkZGRkYsICd3aGl0ZXNtb2tlJzogMHhGNUY1RjUsICd5ZWxsb3cnOiAweEZGRkYwMCwgJ3llbGxvd2dyZWVuJzogMHg5QUNEMzIgfTtcblxuZnVuY3Rpb24gQ29sb3IoIHIsIGcsIGIgKSB7XG5cblx0aWYgKCBnID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Ly8gciBpcyBUSFJFRS5Db2xvciwgaGV4IG9yIHN0cmluZ1xuXHRcdHJldHVybiB0aGlzLnNldCggciApO1xuXG5cdH1cblxuXHRyZXR1cm4gdGhpcy5zZXRSR0IoIHIsIGcsIGIgKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDb2xvci5wcm90b3R5cGUsIHtcblxuXHRpc0NvbG9yOiB0cnVlLFxuXG5cdHI6IDEsIGc6IDEsIGI6IDEsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc0NvbG9yICkge1xuXG5cdFx0XHR0aGlzLmNvcHkoIHZhbHVlICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICkge1xuXG5cdFx0XHR0aGlzLnNldEhleCggdmFsdWUgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgKSB7XG5cblx0XHRcdHRoaXMuc2V0U3R5bGUoIHZhbHVlICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnIgPSBzY2FsYXI7XG5cdFx0dGhpcy5nID0gc2NhbGFyO1xuXHRcdHRoaXMuYiA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0SGV4OiBmdW5jdGlvbiAoIGhleCApIHtcblxuXHRcdGhleCA9IE1hdGguZmxvb3IoIGhleCApO1xuXG5cdFx0dGhpcy5yID0gKCBoZXggPj4gMTYgJiAyNTUgKSAvIDI1NTtcblx0XHR0aGlzLmcgPSAoIGhleCA+PiA4ICYgMjU1ICkgLyAyNTU7XG5cdFx0dGhpcy5iID0gKCBoZXggJiAyNTUgKSAvIDI1NTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UkdCOiBmdW5jdGlvbiAoIHIsIGcsIGIgKSB7XG5cblx0XHR0aGlzLnIgPSByO1xuXHRcdHRoaXMuZyA9IGc7XG5cdFx0dGhpcy5iID0gYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0SFNMOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRmdW5jdGlvbiBodWUycmdiKCBwLCBxLCB0ICkge1xuXG5cdFx0XHRpZiAoIHQgPCAwICkgdCArPSAxO1xuXHRcdFx0aWYgKCB0ID4gMSApIHQgLT0gMTtcblx0XHRcdGlmICggdCA8IDEgLyA2ICkgcmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogdDtcblx0XHRcdGlmICggdCA8IDEgLyAyICkgcmV0dXJuIHE7XG5cdFx0XHRpZiAoIHQgPCAyIC8gMyApIHJldHVybiBwICsgKCBxIC0gcCApICogNiAqICggMiAvIDMgLSB0ICk7XG5cdFx0XHRyZXR1cm4gcDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRIU0woIGgsIHMsIGwgKSB7XG5cblx0XHRcdC8vIGgscyxsIHJhbmdlcyBhcmUgaW4gMC4wIC0gMS4wXG5cdFx0XHRoID0gX01hdGguZXVjbGlkZWFuTW9kdWxvKCBoLCAxICk7XG5cdFx0XHRzID0gX01hdGguY2xhbXAoIHMsIDAsIDEgKTtcblx0XHRcdGwgPSBfTWF0aC5jbGFtcCggbCwgMCwgMSApO1xuXG5cdFx0XHRpZiAoIHMgPT09IDAgKSB7XG5cblx0XHRcdFx0dGhpcy5yID0gdGhpcy5nID0gdGhpcy5iID0gbDtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2YXIgcCA9IGwgPD0gMC41ID8gbCAqICggMSArIHMgKSA6IGwgKyBzIC0gKCBsICogcyApO1xuXHRcdFx0XHR2YXIgcSA9ICggMiAqIGwgKSAtIHA7XG5cblx0XHRcdFx0dGhpcy5yID0gaHVlMnJnYiggcSwgcCwgaCArIDEgLyAzICk7XG5cdFx0XHRcdHRoaXMuZyA9IGh1ZTJyZ2IoIHEsIHAsIGggKTtcblx0XHRcdFx0dGhpcy5iID0gaHVlMnJnYiggcSwgcCwgaCAtIDEgLyAzICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzZXRTdHlsZTogZnVuY3Rpb24gKCBzdHlsZSApIHtcblxuXHRcdGZ1bmN0aW9uIGhhbmRsZUFscGhhKCBzdHJpbmcgKSB7XG5cblx0XHRcdGlmICggc3RyaW5nID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRcdGlmICggcGFyc2VGbG9hdCggc3RyaW5nICkgPCAxICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiBBbHBoYSBjb21wb25lbnQgb2YgJyArIHN0eWxlICsgJyB3aWxsIGJlIGlnbm9yZWQuJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblxuXHRcdHZhciBtO1xuXG5cdFx0aWYgKCBtID0gL14oKD86cmdifGhzbClhPylcXChcXHMqKFteXFwpXSopXFwpLy5leGVjKCBzdHlsZSApICkge1xuXG5cdFx0XHQvLyByZ2IgLyBoc2xcblxuXHRcdFx0dmFyIGNvbG9yO1xuXHRcdFx0dmFyIG5hbWUgPSBtWyAxIF07XG5cdFx0XHR2YXIgY29tcG9uZW50cyA9IG1bIDIgXTtcblxuXHRcdFx0c3dpdGNoICggbmFtZSApIHtcblxuXHRcdFx0XHRjYXNlICdyZ2InOlxuXHRcdFx0XHRjYXNlICdyZ2JhJzpcblxuXHRcdFx0XHRcdGlmICggY29sb3IgPSAvXihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyooLFxccyooWzAtOV0qXFwuP1swLTldKylcXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHJnYigyNTUsMCwwKSByZ2JhKDI1NSwwLDAsMC41KVxuXHRcdFx0XHRcdFx0dGhpcy5yID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAxIF0sIDEwICkgKSAvIDI1NTtcblx0XHRcdFx0XHRcdHRoaXMuZyA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApICkgLyAyNTU7XG5cdFx0XHRcdFx0XHR0aGlzLmIgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSApIC8gMjU1O1xuXG5cdFx0XHRcdFx0XHRoYW5kbGVBbHBoYSggY29sb3JbIDUgXSApO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggY29sb3IgPSAvXihcXGQrKVxcJVxccyosXFxzKihcXGQrKVxcJVxccyosXFxzKihcXGQrKVxcJVxccyooLFxccyooWzAtOV0qXFwuP1swLTldKylcXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHJnYigxMDAlLDAlLDAlKSByZ2JhKDEwMCUsMCUsMCUsMC41KVxuXHRcdFx0XHRcdFx0dGhpcy5yID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAxIF0sIDEwICkgKSAvIDEwMDtcblx0XHRcdFx0XHRcdHRoaXMuZyA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApICkgLyAxMDA7XG5cdFx0XHRcdFx0XHR0aGlzLmIgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSApIC8gMTAwO1xuXG5cdFx0XHRcdFx0XHRoYW5kbGVBbHBoYSggY29sb3JbIDUgXSApO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2hzbCc6XG5cdFx0XHRcdGNhc2UgJ2hzbGEnOlxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eKFswLTldKlxcLj9bMC05XSspXFxzKixcXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKigsXFxzKihbMC05XSpcXC4/WzAtOV0rKVxccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gaHNsKDEyMCw1MCUsNTAlKSBoc2xhKDEyMCw1MCUsNTAlLDAuNSlcblx0XHRcdFx0XHRcdHZhciBoID0gcGFyc2VGbG9hdCggY29sb3JbIDEgXSApIC8gMzYwO1xuXHRcdFx0XHRcdFx0dmFyIHMgPSBwYXJzZUludCggY29sb3JbIDIgXSwgMTAgKSAvIDEwMDtcblx0XHRcdFx0XHRcdHZhciBsID0gcGFyc2VJbnQoIGNvbG9yWyAzIF0sIDEwICkgLyAxMDA7XG5cblx0XHRcdFx0XHRcdGhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnNldEhTTCggaCwgcywgbCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG0gPSAvXlxcIyhbQS1GYS1mMC05XSspJC8uZXhlYyggc3R5bGUgKSApIHtcblxuXHRcdFx0Ly8gaGV4IGNvbG9yXG5cblx0XHRcdHZhciBoZXggPSBtWyAxIF07XG5cdFx0XHR2YXIgc2l6ZSA9IGhleC5sZW5ndGg7XG5cblx0XHRcdGlmICggc2l6ZSA9PT0gMyApIHtcblxuXHRcdFx0XHQvLyAjZmYwXG5cdFx0XHRcdHRoaXMuciA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAwICkgKyBoZXguY2hhckF0KCAwICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuZyA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAxICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuYiA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAyICkgKyBoZXguY2hhckF0KCAyICksIDE2ICkgLyAyNTU7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdH0gZWxzZSBpZiAoIHNpemUgPT09IDYgKSB7XG5cblx0XHRcdFx0Ly8gI2ZmMDAwMFxuXHRcdFx0XHR0aGlzLnIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggMCApICsgaGV4LmNoYXJBdCggMSApLCAxNiApIC8gMjU1O1xuXHRcdFx0XHR0aGlzLmcgPSBwYXJzZUludCggaGV4LmNoYXJBdCggMiApICsgaGV4LmNoYXJBdCggMyApLCAxNiApIC8gMjU1O1xuXHRcdFx0XHR0aGlzLmIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggNCApICsgaGV4LmNoYXJBdCggNSApLCAxNiApIC8gMjU1O1xuXG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHN0eWxlICYmIHN0eWxlLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdC8vIGNvbG9yIGtleXdvcmRzXG5cdFx0XHR2YXIgaGV4ID0gQ29sb3JLZXl3b3Jkc1sgc3R5bGUgXTtcblxuXHRcdFx0aWYgKCBoZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyByZWRcblx0XHRcdFx0dGhpcy5zZXRIZXgoIGhleCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIHVua25vd24gY29sb3Jcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgJyArIHN0eWxlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5yLCB0aGlzLmcsIHRoaXMuYiApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBjb2xvciApIHtcblxuXHRcdHRoaXMuciA9IGNvbG9yLnI7XG5cdFx0dGhpcy5nID0gY29sb3IuZztcblx0XHR0aGlzLmIgPSBjb2xvci5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5R2FtbWFUb0xpbmVhcjogZnVuY3Rpb24gKCBjb2xvciwgZ2FtbWFGYWN0b3IgKSB7XG5cblx0XHRpZiAoIGdhbW1hRmFjdG9yID09PSB1bmRlZmluZWQgKSBnYW1tYUZhY3RvciA9IDIuMDtcblxuXHRcdHRoaXMuciA9IE1hdGgucG93KCBjb2xvci5yLCBnYW1tYUZhY3RvciApO1xuXHRcdHRoaXMuZyA9IE1hdGgucG93KCBjb2xvci5nLCBnYW1tYUZhY3RvciApO1xuXHRcdHRoaXMuYiA9IE1hdGgucG93KCBjb2xvci5iLCBnYW1tYUZhY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5TGluZWFyVG9HYW1tYTogZnVuY3Rpb24gKCBjb2xvciwgZ2FtbWFGYWN0b3IgKSB7XG5cblx0XHRpZiAoIGdhbW1hRmFjdG9yID09PSB1bmRlZmluZWQgKSBnYW1tYUZhY3RvciA9IDIuMDtcblxuXHRcdHZhciBzYWZlSW52ZXJzZSA9ICggZ2FtbWFGYWN0b3IgPiAwICkgPyAoIDEuMCAvIGdhbW1hRmFjdG9yICkgOiAxLjA7XG5cblx0XHR0aGlzLnIgPSBNYXRoLnBvdyggY29sb3Iuciwgc2FmZUludmVyc2UgKTtcblx0XHR0aGlzLmcgPSBNYXRoLnBvdyggY29sb3IuZywgc2FmZUludmVyc2UgKTtcblx0XHR0aGlzLmIgPSBNYXRoLnBvdyggY29sb3IuYiwgc2FmZUludmVyc2UgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29udmVydEdhbW1hVG9MaW5lYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciByID0gdGhpcy5yLCBnID0gdGhpcy5nLCBiID0gdGhpcy5iO1xuXG5cdFx0dGhpcy5yID0gciAqIHI7XG5cdFx0dGhpcy5nID0gZyAqIGc7XG5cdFx0dGhpcy5iID0gYiAqIGI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbnZlcnRMaW5lYXJUb0dhbW1hOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnIgPSBNYXRoLnNxcnQoIHRoaXMuciApO1xuXHRcdHRoaXMuZyA9IE1hdGguc3FydCggdGhpcy5nICk7XG5cdFx0dGhpcy5iID0gTWF0aC5zcXJ0KCB0aGlzLmIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0SGV4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gKCB0aGlzLnIgKiAyNTUgKSA8PCAxNiBeICggdGhpcy5nICogMjU1ICkgPDwgOCBeICggdGhpcy5iICogMjU1ICkgPDwgMDtcblxuXHR9LFxuXG5cdGdldEhleFN0cmluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuICggJzAwMDAwMCcgKyB0aGlzLmdldEhleCgpLnRvU3RyaW5nKCAxNiApICkuc2xpY2UoIC0gNiApO1xuXG5cdH0sXG5cblx0Z2V0SFNMOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdC8vIGgscyxsIHJhbmdlcyBhcmUgaW4gMC4wIC0gMS4wXG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogLmdldEhTTCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSB7IGg6IDAsIHM6IDAsIGw6IDAgfTtcblxuXHRcdH1cblxuXHRcdHZhciByID0gdGhpcy5yLCBnID0gdGhpcy5nLCBiID0gdGhpcy5iO1xuXG5cdFx0dmFyIG1heCA9IE1hdGgubWF4KCByLCBnLCBiICk7XG5cdFx0dmFyIG1pbiA9IE1hdGgubWluKCByLCBnLCBiICk7XG5cblx0XHR2YXIgaHVlLCBzYXR1cmF0aW9uO1xuXHRcdHZhciBsaWdodG5lc3MgPSAoIG1pbiArIG1heCApIC8gMi4wO1xuXG5cdFx0aWYgKCBtaW4gPT09IG1heCApIHtcblxuXHRcdFx0aHVlID0gMDtcblx0XHRcdHNhdHVyYXRpb24gPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIGRlbHRhID0gbWF4IC0gbWluO1xuXG5cdFx0XHRzYXR1cmF0aW9uID0gbGlnaHRuZXNzIDw9IDAuNSA/IGRlbHRhIC8gKCBtYXggKyBtaW4gKSA6IGRlbHRhIC8gKCAyIC0gbWF4IC0gbWluICk7XG5cblx0XHRcdHN3aXRjaCAoIG1heCApIHtcblxuXHRcdFx0XHRjYXNlIHI6IGh1ZSA9ICggZyAtIGIgKSAvIGRlbHRhICsgKCBnIDwgYiA/IDYgOiAwICk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIGc6IGh1ZSA9ICggYiAtIHIgKSAvIGRlbHRhICsgMjsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgYjogaHVlID0gKCByIC0gZyApIC8gZGVsdGEgKyA0OyBicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0XHRodWUgLz0gNjtcblxuXHRcdH1cblxuXHRcdHRhcmdldC5oID0gaHVlO1xuXHRcdHRhcmdldC5zID0gc2F0dXJhdGlvbjtcblx0XHR0YXJnZXQubCA9IGxpZ2h0bmVzcztcblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cblx0fSxcblxuXHRnZXRTdHlsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuICdyZ2IoJyArICggKCB0aGlzLnIgKiAyNTUgKSB8IDAgKSArICcsJyArICggKCB0aGlzLmcgKiAyNTUgKSB8IDAgKSArICcsJyArICggKCB0aGlzLmIgKiAyNTUgKSB8IDAgKSArICcpJztcblxuXHR9LFxuXG5cdG9mZnNldEhTTDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGhzbCA9IHt9O1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uICggaCwgcywgbCApIHtcblxuXHRcdFx0dGhpcy5nZXRIU0woIGhzbCApO1xuXG5cdFx0XHRoc2wuaCArPSBoOyBoc2wucyArPSBzOyBoc2wubCArPSBsO1xuXG5cdFx0XHR0aGlzLnNldEhTTCggaHNsLmgsIGhzbC5zLCBoc2wubCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGFkZDogZnVuY3Rpb24gKCBjb2xvciApIHtcblxuXHRcdHRoaXMuciArPSBjb2xvci5yO1xuXHRcdHRoaXMuZyArPSBjb2xvci5nO1xuXHRcdHRoaXMuYiArPSBjb2xvci5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRDb2xvcnM6IGZ1bmN0aW9uICggY29sb3IxLCBjb2xvcjIgKSB7XG5cblx0XHR0aGlzLnIgPSBjb2xvcjEuciArIGNvbG9yMi5yO1xuXHRcdHRoaXMuZyA9IGNvbG9yMS5nICsgY29sb3IyLmc7XG5cdFx0dGhpcy5iID0gY29sb3IxLmIgKyBjb2xvcjIuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnIgKz0gcztcblx0XHR0aGlzLmcgKz0gcztcblx0XHR0aGlzLmIgKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViOiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yID0gTWF0aC5tYXgoIDAsIHRoaXMuciAtIGNvbG9yLnIgKTtcblx0XHR0aGlzLmcgPSBNYXRoLm1heCggMCwgdGhpcy5nIC0gY29sb3IuZyApO1xuXHRcdHRoaXMuYiA9IE1hdGgubWF4KCAwLCB0aGlzLmIgLSBjb2xvci5iICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yICo9IGNvbG9yLnI7XG5cdFx0dGhpcy5nICo9IGNvbG9yLmc7XG5cdFx0dGhpcy5iICo9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnIgKj0gcztcblx0XHR0aGlzLmcgKj0gcztcblx0XHR0aGlzLmIgKj0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bGVycDogZnVuY3Rpb24gKCBjb2xvciwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnIgKz0gKCBjb2xvci5yIC0gdGhpcy5yICkgKiBhbHBoYTtcblx0XHR0aGlzLmcgKz0gKCBjb2xvci5nIC0gdGhpcy5nICkgKiBhbHBoYTtcblx0XHR0aGlzLmIgKz0gKCBjb2xvci5iIC0gdGhpcy5iICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGMgKSB7XG5cblx0XHRyZXR1cm4gKCBjLnIgPT09IHRoaXMuciApICYmICggYy5nID09PSB0aGlzLmcgKSAmJiAoIGMuYiA9PT0gdGhpcy5iICk7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy5yID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMuZyA9IGFycmF5WyBvZmZzZXQgKyAxIF07XG5cdFx0dGhpcy5iID0gYXJyYXlbIG9mZnNldCArIDIgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMucjtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy5nO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLmI7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdldEhleCgpO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIFVuaWZvcm1zIGxpYnJhcnkgZm9yIHNoYXJlZCB3ZWJnbCBzaGFkZXJzXG4gKi9cblxudmFyIFVuaWZvcm1zTGliID0ge1xuXG5cdGNvbW1vbjoge1xuXG5cdFx0ZGlmZnVzZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweGVlZWVlZSApIH0sXG5cdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH0sXG5cblx0XHRtYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHR1dlRyYW5zZm9ybTogeyB2YWx1ZTogbmV3IE1hdHJpeDMoKSB9LFxuXG5cdFx0YWxwaGFNYXA6IHsgdmFsdWU6IG51bGwgfSxcblxuXHR9LFxuXG5cdHNwZWN1bGFybWFwOiB7XG5cblx0XHRzcGVjdWxhck1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXG5cdH0sXG5cblx0ZW52bWFwOiB7XG5cblx0XHRlbnZNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRmbGlwRW52TWFwOiB7IHZhbHVlOiAtIDEgfSxcblx0XHRyZWZsZWN0aXZpdHk6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdHJlZnJhY3Rpb25SYXRpbzogeyB2YWx1ZTogMC45OCB9LFxuXHRcdG1heE1pcExldmVsOiB7IHZhbHVlOiAwIH1cblxuXHR9LFxuXG5cdGFvbWFwOiB7XG5cblx0XHRhb01hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGFvTWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH1cblxuXHR9LFxuXG5cdGxpZ2h0bWFwOiB7XG5cblx0XHRsaWdodE1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGxpZ2h0TWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH1cblxuXHR9LFxuXG5cdGVtaXNzaXZlbWFwOiB7XG5cblx0XHRlbWlzc2l2ZU1hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRidW1wbWFwOiB7XG5cblx0XHRidW1wTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0YnVtcFNjYWxlOiB7IHZhbHVlOiAxIH1cblxuXHR9LFxuXG5cdG5vcm1hbG1hcDoge1xuXG5cdFx0bm9ybWFsTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0bm9ybWFsU2NhbGU6IHsgdmFsdWU6IG5ldyBWZWN0b3IyKCAxLCAxICkgfVxuXG5cdH0sXG5cblx0ZGlzcGxhY2VtZW50bWFwOiB7XG5cblx0XHRkaXNwbGFjZW1lbnRNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRkaXNwbGFjZW1lbnRTY2FsZTogeyB2YWx1ZTogMSB9LFxuXHRcdGRpc3BsYWNlbWVudEJpYXM6IHsgdmFsdWU6IDAgfVxuXG5cdH0sXG5cblx0cm91Z2huZXNzbWFwOiB7XG5cblx0XHRyb3VnaG5lc3NNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0bWV0YWxuZXNzbWFwOiB7XG5cblx0XHRtZXRhbG5lc3NNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0Z3JhZGllbnRtYXA6IHtcblxuXHRcdGdyYWRpZW50TWFwOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdGZvZzoge1xuXG5cdFx0Zm9nRGVuc2l0eTogeyB2YWx1ZTogMC4wMDAyNSB9LFxuXHRcdGZvZ05lYXI6IHsgdmFsdWU6IDEgfSxcblx0XHRmb2dGYXI6IHsgdmFsdWU6IDIwMDAgfSxcblx0XHRmb2dDb2xvcjogeyB2YWx1ZTogbmV3IENvbG9yKCAweGZmZmZmZiApIH1cblxuXHR9LFxuXG5cdGxpZ2h0czoge1xuXG5cdFx0YW1iaWVudExpZ2h0Q29sb3I6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRkaXJlY3Rpb25hbExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGRpcmVjdGlvbjoge30sXG5cdFx0XHRjb2xvcjoge30sXG5cblx0XHRcdHNoYWRvdzoge30sXG5cdFx0XHRzaGFkb3dCaWFzOiB7fSxcblx0XHRcdHNoYWRvd1JhZGl1czoge30sXG5cdFx0XHRzaGFkb3dNYXBTaXplOiB7fVxuXHRcdH0gfSxcblxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LFxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LFxuXG5cdFx0c3BvdExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdGRpcmVjdGlvbjoge30sXG5cdFx0XHRkaXN0YW5jZToge30sXG5cdFx0XHRjb25lQ29zOiB7fSxcblx0XHRcdHBlbnVtYnJhQ29zOiB7fSxcblx0XHRcdGRlY2F5OiB7fSxcblxuXHRcdFx0c2hhZG93OiB7fSxcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9XG5cdFx0fSB9LFxuXG5cdFx0c3BvdFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSxcblx0XHRzcG90U2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LFxuXG5cdFx0cG9pbnRMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRjb2xvcjoge30sXG5cdFx0XHRwb3NpdGlvbjoge30sXG5cdFx0XHRkZWNheToge30sXG5cdFx0XHRkaXN0YW5jZToge30sXG5cblx0XHRcdHNoYWRvdzoge30sXG5cdFx0XHRzaGFkb3dCaWFzOiB7fSxcblx0XHRcdHNoYWRvd1JhZGl1czoge30sXG5cdFx0XHRzaGFkb3dNYXBTaXplOiB7fSxcblx0XHRcdHNoYWRvd0NhbWVyYU5lYXI6IHt9LFxuXHRcdFx0c2hhZG93Q2FtZXJhRmFyOiB7fVxuXHRcdH0gfSxcblxuXHRcdHBvaW50U2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LFxuXHRcdHBvaW50U2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LFxuXG5cdFx0aGVtaXNwaGVyZUxpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGRpcmVjdGlvbjoge30sXG5cdFx0XHRza3lDb2xvcjoge30sXG5cdFx0XHRncm91bmRDb2xvcjoge31cblx0XHR9IH0sXG5cblx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogUmVjdEFyZWFMaWdodCBCUkRGIGRhdGEgbmVlZHMgdG8gYmUgbW92ZWQgZnJvbSBleGFtcGxlIHRvIG1haW4gc3JjXG5cdFx0cmVjdEFyZWFMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRjb2xvcjoge30sXG5cdFx0XHRwb3NpdGlvbjoge30sXG5cdFx0XHR3aWR0aDoge30sXG5cdFx0XHRoZWlnaHQ6IHt9XG5cdFx0fSB9XG5cblx0fSxcblxuXHRwb2ludHM6IHtcblxuXHRcdGRpZmZ1c2U6IHsgdmFsdWU6IG5ldyBDb2xvciggMHhlZWVlZWUgKSB9LFxuXHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdHNpemU6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdHNjYWxlOiB7IHZhbHVlOiAxLjAgfSxcblx0XHRtYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHR1dlRyYW5zZm9ybTogeyB2YWx1ZTogbmV3IE1hdHJpeDMoKSB9XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqL1xuXG52YXIgU2hhZGVyTGliID0ge1xuXG5cdGJhc2ljOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuc3BlY3VsYXJtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFzaWNfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGJhc2ljX2ZyYWdcblxuXHR9LFxuXG5cdGxhbWJlcnQ6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdHtcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobGFtYmVydF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobGFtYmVydF9mcmFnXG5cblx0fSxcblxuXHRwaG9uZzoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLnNwZWN1bGFybWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW52bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYnVtcG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmdyYWRpZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0e1xuXHRcdFx0XHRlbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH0sXG5cdFx0XHRcdHNwZWN1bGFyOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MTExMTExICkgfSxcblx0XHRcdFx0c2hpbmluZXNzOiB7IHZhbHVlOiAzMCB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGhvbmdfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBob25nX2ZyYWdcblxuXHR9LFxuXG5cdHN0YW5kYXJkOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW52bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYnVtcG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLnJvdWdobmVzc21hcCxcblx0XHRcdFVuaWZvcm1zTGliLm1ldGFsbmVzc21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdHtcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9LFxuXHRcdFx0XHRyb3VnaG5lc3M6IHsgdmFsdWU6IDAuNSB9LFxuXHRcdFx0XHRtZXRhbG5lc3M6IHsgdmFsdWU6IDAuNSB9LFxuXHRcdFx0XHRlbnZNYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfSAvLyB0ZW1wb3Jhcnlcblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfZnJhZ1xuXG5cdH0sXG5cblx0cG9pbnRzOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIucG9pbnRzLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsucG9pbnRzX2ZyYWdcblxuXHR9LFxuXG5cdGRhc2hlZDoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdHtcblx0XHRcdFx0c2NhbGU6IHsgdmFsdWU6IDEgfSxcblx0XHRcdFx0ZGFzaFNpemU6IHsgdmFsdWU6IDEgfSxcblx0XHRcdFx0dG90YWxTaXplOiB7IHZhbHVlOiAyIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmxpbmVkYXNoZWRfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF9mcmFnXG5cblx0fSxcblxuXHRkZXB0aDoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcFxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZGVwdGhfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZGVwdGhfZnJhZ1xuXG5cdH0sXG5cblx0bm9ybWFsOiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuYnVtcG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcblx0XHRcdHtcblx0XHRcdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm5vcm1hbF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5ub3JtYWxfZnJhZ1xuXG5cdH0sXG5cblx0LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvL1x0Q3ViZSBtYXAgc2hhZGVyXG5cdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Y3ViZToge1xuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdHRDdWJlOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHR0RmxpcDogeyB2YWx1ZTogLSAxIH0sXG5cdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdH0sXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmN1YmVfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuY3ViZV9mcmFnXG5cblx0fSxcblxuXHRlcXVpcmVjdDoge1xuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdHRFcXVpcmVjdDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdH0sXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmVxdWlyZWN0X3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmVxdWlyZWN0X2ZyYWdcblxuXHR9LFxuXG5cdGRpc3RhbmNlUkdCQToge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcblx0XHRcdHtcblx0XHRcdFx0cmVmZXJlbmNlUG9zaXRpb246IHsgdmFsdWU6IG5ldyBWZWN0b3IzKCkgfSxcblx0XHRcdFx0bmVhckRpc3RhbmNlOiB7IHZhbHVlOiAxIH0sXG5cdFx0XHRcdGZhckRpc3RhbmNlOiB7IHZhbHVlOiAxMDAwIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmRpc3RhbmNlUkdCQV92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5kaXN0YW5jZVJHQkFfZnJhZ1xuXG5cdH0sXG5cblx0c2hhZG93OiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRzLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0e1xuXHRcdFx0XHRjb2xvcjogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwICkgfSxcblx0XHRcdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH1cblx0XHRcdH0sXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5zaGFkb3dfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuc2hhZG93X2ZyYWdcblxuXHR9XG5cbn07XG5cblNoYWRlckxpYi5waHlzaWNhbCA9IHtcblxuXHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFNoYWRlckxpYi5zdGFuZGFyZC51bmlmb3Jtcyxcblx0XHR7XG5cdFx0XHRjbGVhckNvYXQ6IHsgdmFsdWU6IDAgfSxcblx0XHRcdGNsZWFyQ29hdFJvdWdobmVzczogeyB2YWx1ZTogMCB9XG5cdFx0fVxuXHRdICksXG5cblx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfdmVydCxcblx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF9mcmFnXG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEF0dHJpYnV0ZXMoIGdsICkge1xuXG5cdHZhciBidWZmZXJzID0gbmV3IFdlYWtNYXAoKTtcblxuXHRmdW5jdGlvbiBjcmVhdGVCdWZmZXIoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcblxuXHRcdHZhciBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTtcblx0XHR2YXIgdXNhZ2UgPSBhdHRyaWJ1dGUuZHluYW1pYyA/IGdsLkRZTkFNSUNfRFJBVyA6IGdsLlNUQVRJQ19EUkFXO1xuXG5cdFx0dmFyIGJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgYnVmZmVyICk7XG5cdFx0Z2wuYnVmZmVyRGF0YSggYnVmZmVyVHlwZSwgYXJyYXksIHVzYWdlICk7XG5cblx0XHRhdHRyaWJ1dGUub25VcGxvYWRDYWxsYmFjaygpO1xuXG5cdFx0dmFyIHR5cGUgPSBnbC5GTE9BVDtcblxuXHRcdGlmICggYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5GTE9BVDtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5ICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTEF0dHJpYnV0ZXM6IFVuc3VwcG9ydGVkIGRhdGEgYnVmZmVyIGZvcm1hdDogRmxvYXQ2NEFycmF5LicgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDE2QXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9TSE9SVDtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgSW50MTZBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLlNIT1JUO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50MzJBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLlVOU0lHTkVEX0lOVDtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgSW50MzJBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLklOVDtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgSW50OEFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuQllURTtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDhBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLlVOU0lHTkVEX0JZVEU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YnVmZmVyOiBidWZmZXIsXG5cdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0Ynl0ZXNQZXJFbGVtZW50OiBhcnJheS5CWVRFU19QRVJfRUxFTUVOVCxcblx0XHRcdHZlcnNpb246IGF0dHJpYnV0ZS52ZXJzaW9uXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlQnVmZmVyKCBidWZmZXIsIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcblxuXHRcdHZhciBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTtcblx0XHR2YXIgdXBkYXRlUmFuZ2UgPSBhdHRyaWJ1dGUudXBkYXRlUmFuZ2U7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXIgKTtcblxuXHRcdGlmICggYXR0cmlidXRlLmR5bmFtaWMgPT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC5idWZmZXJEYXRhKCBidWZmZXJUeXBlLCBhcnJheSwgZ2wuU1RBVElDX0RSQVcgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHVwZGF0ZVJhbmdlLmNvdW50ID09PSAtIDEgKSB7XG5cblx0XHRcdC8vIE5vdCB1c2luZyB1cGRhdGUgcmFuZ2VzXG5cblx0XHRcdGdsLmJ1ZmZlclN1YkRhdGEoIGJ1ZmZlclR5cGUsIDAsIGFycmF5ICk7XG5cblx0XHR9IGVsc2UgaWYgKCB1cGRhdGVSYW5nZS5jb3VudCA9PT0gMCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMT2JqZWN0cy51cGRhdGVCdWZmZXI6IGR5bmFtaWMgVEhSRUUuQnVmZmVyQXR0cmlidXRlIG1hcmtlZCBhcyBuZWVkc1VwZGF0ZSBidXQgdXBkYXRlUmFuZ2UuY291bnQgaXMgMCwgZW5zdXJlIHlvdSBhcmUgdXNpbmcgc2V0IG1ldGhvZHMgb3IgdXBkYXRpbmcgbWFudWFsbHkuJyApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Z2wuYnVmZmVyU3ViRGF0YSggYnVmZmVyVHlwZSwgdXBkYXRlUmFuZ2Uub2Zmc2V0ICogYXJyYXkuQllURVNfUEVSX0VMRU1FTlQsXG5cdFx0XHRcdGFycmF5LnN1YmFycmF5KCB1cGRhdGVSYW5nZS5vZmZzZXQsIHVwZGF0ZVJhbmdlLm9mZnNldCArIHVwZGF0ZVJhbmdlLmNvdW50ICkgKTtcblxuXHRcdFx0dXBkYXRlUmFuZ2UuY291bnQgPSAtIDE7IC8vIHJlc2V0IHJhbmdlXG5cblx0XHR9XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gZ2V0KCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7XG5cblx0XHRyZXR1cm4gYnVmZmVycy5nZXQoIGF0dHJpYnV0ZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW1vdmUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdGlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTtcblxuXHRcdHZhciBkYXRhID0gYnVmZmVycy5nZXQoIGF0dHJpYnV0ZSApO1xuXG5cdFx0aWYgKCBkYXRhICkge1xuXG5cdFx0XHRnbC5kZWxldGVCdWZmZXIoIGRhdGEuYnVmZmVyICk7XG5cblx0XHRcdGJ1ZmZlcnMuZGVsZXRlKCBhdHRyaWJ1dGUgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7XG5cblx0XHR2YXIgZGF0YSA9IGJ1ZmZlcnMuZ2V0KCBhdHRyaWJ1dGUgKTtcblxuXHRcdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRidWZmZXJzLnNldCggYXR0cmlidXRlLCBjcmVhdGVCdWZmZXIoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApICk7XG5cblx0XHR9IGVsc2UgaWYgKCBkYXRhLnZlcnNpb24gPCBhdHRyaWJ1dGUudmVyc2lvbiApIHtcblxuXHRcdFx0dXBkYXRlQnVmZmVyKCBkYXRhLmJ1ZmZlciwgYXR0cmlidXRlLCBidWZmZXJUeXBlICk7XG5cblx0XHRcdGRhdGEudmVyc2lvbiA9IGF0dHJpYnV0ZS52ZXJzaW9uO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0OiBnZXQsXG5cdFx0cmVtb3ZlOiByZW1vdmUsXG5cdFx0dXBkYXRlOiB1cGRhdGVcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIEV1bGVyKCB4LCB5LCB6LCBvcmRlciApIHtcblxuXHR0aGlzLl94ID0geCB8fCAwO1xuXHR0aGlzLl95ID0geSB8fCAwO1xuXHR0aGlzLl96ID0geiB8fCAwO1xuXHR0aGlzLl9vcmRlciA9IG9yZGVyIHx8IEV1bGVyLkRlZmF1bHRPcmRlcjtcblxufVxuXG5FdWxlci5Sb3RhdGlvbk9yZGVycyA9IFsgJ1hZWicsICdZWlgnLCAnWlhZJywgJ1haWScsICdZWFonLCAnWllYJyBdO1xuXG5FdWxlci5EZWZhdWx0T3JkZXIgPSAnWFlaJztcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEV1bGVyLnByb3RvdHlwZSwge1xuXG5cdHg6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feDtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0eToge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl95O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feSA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR6OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3o7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl96ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG9yZGVyOiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX29yZGVyO1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5fb3JkZXIgPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBFdWxlci5wcm90b3R5cGUsIHtcblxuXHRpc0V1bGVyOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCBvcmRlciApIHtcblxuXHRcdHRoaXMuX3ggPSB4O1xuXHRcdHRoaXMuX3kgPSB5O1xuXHRcdHRoaXMuX3ogPSB6O1xuXHRcdHRoaXMuX29yZGVyID0gb3JkZXIgfHwgdGhpcy5fb3JkZXI7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fb3JkZXIgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHR0aGlzLl94ID0gZXVsZXIuX3g7XG5cdFx0dGhpcy5feSA9IGV1bGVyLl95O1xuXHRcdHRoaXMuX3ogPSBldWxlci5fejtcblx0XHR0aGlzLl9vcmRlciA9IGV1bGVyLl9vcmRlcjtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSwgb3JkZXIsIHVwZGF0ZSApIHtcblxuXHRcdHZhciBjbGFtcCA9IF9NYXRoLmNsYW1wO1xuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciB0ZSA9IG0uZWxlbWVudHM7XG5cdFx0dmFyIG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF07XG5cdFx0dmFyIG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF07XG5cdFx0dmFyIG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdO1xuXG5cdFx0b3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjtcblxuXHRcdGlmICggb3JkZXIgPT09ICdYWVonICkge1xuXG5cdFx0XHR0aGlzLl95ID0gTWF0aC5hc2luKCBjbGFtcCggbTEzLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMTMgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMjIgKTtcblx0XHRcdFx0dGhpcy5feiA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVhaJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IE1hdGguYXNpbiggLSBjbGFtcCggbTIzLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMjMgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0yMiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTExICk7XG5cdFx0XHRcdHRoaXMuX3ogPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pYWScgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBNYXRoLmFzaW4oIGNsYW1wKCBtMzIsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0zMiApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0yMiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3kgPSAwO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMTEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWVgnICkge1xuXG5cdFx0XHR0aGlzLl95ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMzEsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0zMSApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IDA7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTIyICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVpYJyApIHtcblxuXHRcdFx0dGhpcy5feiA9IE1hdGguYXNpbiggY2xhbXAoIG0yMSwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTIxICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTIyICk7XG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTExICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IDA7XG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0zMyApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1haWScgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0xMiwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTEyICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApO1xuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl95ID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRXVsZXI6IC5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBnaXZlbiB1bnN1cHBvcnRlZCBvcmRlcjogJyArIG9yZGVyICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLl9vcmRlciA9IG9yZGVyO1xuXG5cdFx0aWYgKCB1cGRhdGUgIT09IGZhbHNlICkgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tUXVhdGVybmlvbiggcSwgb3JkZXIsIHVwZGF0ZSApIHtcblxuXHRcdFx0bWF0cml4Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICk7XG5cblx0XHRcdHJldHVybiB0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbWF0cml4LCBvcmRlciwgdXBkYXRlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzZXRGcm9tVmVjdG9yMzogZnVuY3Rpb24gKCB2LCBvcmRlciApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldCggdi54LCB2LnksIHYueiwgb3JkZXIgfHwgdGhpcy5fb3JkZXIgKTtcblxuXHR9LFxuXG5cdHJlb3JkZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIFdBUk5JTkc6IHRoaXMgZGlzY2FyZHMgcmV2b2x1dGlvbiBpbmZvcm1hdGlvbiAtYmhvdXN0b25cblxuXHRcdHZhciBxID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByZW9yZGVyKCBuZXdPcmRlciApIHtcblxuXHRcdFx0cS5zZXRGcm9tRXVsZXIoIHRoaXMgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0RnJvbVF1YXRlcm5pb24oIHEsIG5ld09yZGVyICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHRyZXR1cm4gKCBldWxlci5feCA9PT0gdGhpcy5feCApICYmICggZXVsZXIuX3kgPT09IHRoaXMuX3kgKSAmJiAoIGV1bGVyLl96ID09PSB0aGlzLl96ICkgJiYgKCBldWxlci5fb3JkZXIgPT09IHRoaXMuX29yZGVyICk7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHR0aGlzLl94ID0gYXJyYXlbIDAgXTtcblx0XHR0aGlzLl95ID0gYXJyYXlbIDEgXTtcblx0XHR0aGlzLl96ID0gYXJyYXlbIDIgXTtcblx0XHRpZiAoIGFycmF5WyAzIF0gIT09IHVuZGVmaW5lZCApIHRoaXMuX29yZGVyID0gYXJyYXlbIDMgXTtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5feDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy5feTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5fejtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy5fb3JkZXI7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHR0b1ZlY3RvcjM6IGZ1bmN0aW9uICggb3B0aW9uYWxSZXN1bHQgKSB7XG5cblx0XHRpZiAoIG9wdGlvbmFsUmVzdWx0ICkge1xuXG5cdFx0XHRyZXR1cm4gb3B0aW9uYWxSZXN1bHQuc2V0KCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFZlY3RvcjMoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3ogKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG9uQ2hhbmdlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG9uQ2hhbmdlQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHt9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExheWVycygpIHtcblxuXHR0aGlzLm1hc2sgPSAxIHwgMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBMYXllcnMucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7XG5cblx0XHR0aGlzLm1hc2sgPSAxIDw8IGNoYW5uZWwgfCAwO1xuXG5cdH0sXG5cblx0ZW5hYmxlOiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7XG5cblx0XHR0aGlzLm1hc2sgfD0gMSA8PCBjaGFubmVsIHwgMDtcblxuXHR9LFxuXG5cdHRvZ2dsZTogZnVuY3Rpb24gKCBjaGFubmVsICkge1xuXG5cdFx0dGhpcy5tYXNrIF49IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fSxcblxuXHRkaXNhYmxlOiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7XG5cblx0XHR0aGlzLm1hc2sgJj0gfiAoIDEgPDwgY2hhbm5lbCB8IDAgKTtcblxuXHR9LFxuXG5cdHRlc3Q6IGZ1bmN0aW9uICggbGF5ZXJzICkge1xuXG5cdFx0cmV0dXJuICggdGhpcy5tYXNrICYgbGF5ZXJzLm1hc2sgKSAhPT0gMDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgZWxlcGhhbnRhdHdvcmsgLyB3d3cuZWxlcGhhbnRhdHdvcmsuY2hcbiAqL1xuXG52YXIgb2JqZWN0M0RJZCA9IDA7XG5cbmZ1bmN0aW9uIE9iamVjdDNEKCkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogb2JqZWN0M0RJZCArKyB9ICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cdHRoaXMudHlwZSA9ICdPYmplY3QzRCc7XG5cblx0dGhpcy5wYXJlbnQgPSBudWxsO1xuXHR0aGlzLmNoaWxkcmVuID0gW107XG5cblx0dGhpcy51cCA9IE9iamVjdDNELkRlZmF1bHRVcC5jbG9uZSgpO1xuXG5cdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciByb3RhdGlvbiA9IG5ldyBFdWxlcigpO1xuXHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cdHZhciBzY2FsZSA9IG5ldyBWZWN0b3IzKCAxLCAxLCAxICk7XG5cblx0ZnVuY3Rpb24gb25Sb3RhdGlvbkNoYW5nZSgpIHtcblxuXHRcdHF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCByb3RhdGlvbiwgZmFsc2UgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25RdWF0ZXJuaW9uQ2hhbmdlKCkge1xuXG5cdFx0cm90YXRpb24uc2V0RnJvbVF1YXRlcm5pb24oIHF1YXRlcm5pb24sIHVuZGVmaW5lZCwgZmFsc2UgKTtcblxuXHR9XG5cblx0cm90YXRpb24ub25DaGFuZ2UoIG9uUm90YXRpb25DaGFuZ2UgKTtcblx0cXVhdGVybmlvbi5vbkNoYW5nZSggb25RdWF0ZXJuaW9uQ2hhbmdlICk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHtcblx0XHRwb3NpdGlvbjoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBwb3NpdGlvblxuXHRcdH0sXG5cdFx0cm90YXRpb246IHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogcm90YXRpb25cblx0XHR9LFxuXHRcdHF1YXRlcm5pb246IHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogcXVhdGVybmlvblxuXHRcdH0sXG5cdFx0c2NhbGU6IHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogc2NhbGVcblx0XHR9LFxuXHRcdG1vZGVsVmlld01hdHJpeDoge1xuXHRcdFx0dmFsdWU6IG5ldyBNYXRyaXg0KClcblx0XHR9LFxuXHRcdG5vcm1hbE1hdHJpeDoge1xuXHRcdFx0dmFsdWU6IG5ldyBNYXRyaXgzKClcblx0XHR9XG5cdH0gKTtcblxuXHR0aGlzLm1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHRoaXMubWF0cml4V29ybGQgPSBuZXcgTWF0cml4NCgpO1xuXG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IE9iamVjdDNELkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlO1xuXHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLmxheWVycyA9IG5ldyBMYXllcnMoKTtcblx0dGhpcy52aXNpYmxlID0gdHJ1ZTtcblxuXHR0aGlzLmNhc3RTaGFkb3cgPSBmYWxzZTtcblx0dGhpcy5yZWNlaXZlU2hhZG93ID0gZmFsc2U7XG5cblx0dGhpcy5mcnVzdHVtQ3VsbGVkID0gdHJ1ZTtcblx0dGhpcy5yZW5kZXJPcmRlciA9IDA7XG5cblx0dGhpcy51c2VyRGF0YSA9IHt9O1xuXG59XG5cbk9iamVjdDNELkRlZmF1bHRVcCA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XG5PYmplY3QzRC5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZSA9IHRydWU7XG5cbk9iamVjdDNELnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBPYmplY3QzRCxcblxuXHRpc09iamVjdDNEOiB0cnVlLFxuXG5cdG9uQmVmb3JlUmVuZGVyOiBmdW5jdGlvbiAoKSB7fSxcblx0b25BZnRlclJlbmRlcjogZnVuY3Rpb24gKCkge30sXG5cblx0YXBwbHlNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dGhpcy5tYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4LCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0dGhpcy5tYXRyaXguZGVjb21wb3NlKCB0aGlzLnBvc2l0aW9uLCB0aGlzLnF1YXRlcm5pb24sIHRoaXMuc2NhbGUgKTtcblxuXHR9LFxuXG5cdGFwcGx5UXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KCBxICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZTogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIGFzc3VtZXMgYXhpcyBpcyBub3JtYWxpemVkXG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKTtcblxuXHR9LFxuXG5cdHNldFJvdGF0aW9uRnJvbUV1bGVyOiBmdW5jdGlvbiAoIGV1bGVyICkge1xuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlciggZXVsZXIsIHRydWUgKTtcblxuXHR9LFxuXG5cdHNldFJvdGF0aW9uRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG0gKTtcblxuXHR9LFxuXG5cdHNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdC8vIGFzc3VtZXMgcSBpcyBub3JtYWxpemVkXG5cblx0XHR0aGlzLnF1YXRlcm5pb24uY29weSggcSApO1xuXG5cdH0sXG5cblx0cm90YXRlT25BeGlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgb2JqZWN0IG9uIGF4aXMgaW4gb2JqZWN0IHNwYWNlXG5cdFx0Ly8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHZhciBxMSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlT25BeGlzKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdFx0cTEuc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KCBxMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZU9uV29ybGRBeGlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgb2JqZWN0IG9uIGF4aXMgaW4gd29ybGQgc3BhY2Vcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXHRcdC8vIG1ldGhvZCBhc3N1bWVzIG5vIHJvdGF0ZWQgcGFyZW50XG5cblx0XHR2YXIgcTEgPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZU9uV29ybGRBeGlzKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdFx0cTEuc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KCBxMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWCggYW5nbGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggdjEsIGFuZ2xlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVkoIGFuZ2xlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIHYxLCBhbmdsZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVaKCBhbmdsZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCB2MSwgYW5nbGUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZU9uQXhpczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdHJhbnNsYXRlIG9iamVjdCBieSBkaXN0YW5jZSBhbG9uZyBheGlzIGluIG9iamVjdCBzcGFjZVxuXHRcdC8vIGF4aXMgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSB7XG5cblx0XHRcdHYxLmNvcHkoIGF4aXMgKS5hcHBseVF1YXRlcm5pb24oIHRoaXMucXVhdGVybmlvbiApO1xuXG5cdFx0XHR0aGlzLnBvc2l0aW9uLmFkZCggdjEubXVsdGlwbHlTY2FsYXIoIGRpc3RhbmNlICkgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGVYOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMSwgMCwgMCApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZVgoIGRpc3RhbmNlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIHYxLCBkaXN0YW5jZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlWTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDAsIDEsIDAgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVZKCBkaXN0YW5jZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCB2MSwgZGlzdGFuY2UgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAwLCAxICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlWiggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggdjEsIGRpc3RhbmNlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRsb2NhbFRvV29ybGQ6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHR9LFxuXG5cdHdvcmxkVG9Mb2NhbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB3b3JsZFRvTG9jYWwoIHZlY3RvciApIHtcblxuXHRcdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIG0xLmdldEludmVyc2UoIHRoaXMubWF0cml4V29ybGQgKSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bG9va0F0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IG9iamVjdHMgd2l0aCByb3RhdGVkIGFuZC9vciB0cmFuc2xhdGVkIHBhcmVudChzKVxuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBsb29rQXQoIHgsIHksIHogKSB7XG5cblx0XHRcdGlmICggeC5pc1ZlY3RvcjMgKSB7XG5cblx0XHRcdFx0dmVjdG9yLmNvcHkoIHggKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2ZWN0b3Iuc2V0KCB4LCB5LCB6ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aGlzLmlzQ2FtZXJhICkge1xuXG5cdFx0XHRcdG0xLmxvb2tBdCggdGhpcy5wb3NpdGlvbiwgdmVjdG9yLCB0aGlzLnVwICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0bTEubG9va0F0KCB2ZWN0b3IsIHRoaXMucG9zaXRpb24sIHRoaXMudXAgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtMSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YWRkOiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5hZGQoIGFyZ3VtZW50c1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdCA9PT0gdGhpcyApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggXCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi5cIiwgb2JqZWN0ICk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdGlmICggKCBvYmplY3QgJiYgb2JqZWN0LmlzT2JqZWN0M0QgKSApIHtcblxuXHRcdFx0aWYgKCBvYmplY3QucGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdG9iamVjdC5wYXJlbnQucmVtb3ZlKCBvYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRvYmplY3QucGFyZW50ID0gdGhpcztcblx0XHRcdG9iamVjdC5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdhZGRlZCcgfSApO1xuXG5cdFx0XHR0aGlzLmNoaWxkcmVuLnB1c2goIG9iamVjdCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggXCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuXCIsIG9iamVjdCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLnJlbW92ZSggYXJndW1lbnRzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdHZhciBpbmRleCA9IHRoaXMuY2hpbGRyZW4uaW5kZXhPZiggb2JqZWN0ICk7XG5cblx0XHRpZiAoIGluZGV4ICE9PSAtIDEgKSB7XG5cblx0XHRcdG9iamVjdC5wYXJlbnQgPSBudWxsO1xuXG5cdFx0XHRvYmplY3QuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAncmVtb3ZlZCcgfSApO1xuXG5cdFx0XHR0aGlzLmNoaWxkcmVuLnNwbGljZSggaW5kZXgsIDEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0T2JqZWN0QnlJZDogZnVuY3Rpb24gKCBpZCApIHtcblxuXHRcdHJldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoICdpZCcsIGlkICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdHJldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoICduYW1lJywgbmFtZSApO1xuXG5cdH0sXG5cblx0Z2V0T2JqZWN0QnlQcm9wZXJ0eTogZnVuY3Rpb24gKCBuYW1lLCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpc1sgbmFtZSBdID09PSB2YWx1ZSApIHJldHVybiB0aGlzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuWyBpIF07XG5cdFx0XHR2YXIgb2JqZWN0ID0gY2hpbGQuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTtcblxuXHRcdFx0aWYgKCBvYmplY3QgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gb2JqZWN0O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdH0sXG5cblx0Z2V0V29ybGRQb3NpdGlvbjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUG9zaXRpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdHJldHVybiB0YXJnZXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0fSxcblxuXHRnZXRXb3JsZFF1YXRlcm5pb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHNjYWxlID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZFF1YXRlcm5pb24oIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUXVhdGVybmlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggcG9zaXRpb24sIHRhcmdldCwgc2NhbGUgKTtcblxuXHRcdFx0cmV0dXJuIHRhcmdldDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGdldFdvcmxkU2NhbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkU2NhbGUoIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkU2NhbGUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCB0YXJnZXQgKTtcblxuXHRcdFx0cmV0dXJuIHRhcmdldDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGdldFdvcmxkRGlyZWN0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGREaXJlY3Rpb24oIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmdldFdvcmxkUXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMCwgMCwgMSApLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cmF5Y2FzdDogZnVuY3Rpb24gKCkge30sXG5cblx0dHJhdmVyc2U6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHRjYWxsYmFjayggdGhpcyApO1xuXG5cdFx0dmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNoaWxkcmVuWyBpIF0udHJhdmVyc2UoIGNhbGxiYWNrICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0cmF2ZXJzZVZpc2libGU6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHRpZiAoIHRoaXMudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRjYWxsYmFjayggdGhpcyApO1xuXG5cdFx0dmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNoaWxkcmVuWyBpIF0udHJhdmVyc2VWaXNpYmxlKCBjYWxsYmFjayApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dHJhdmVyc2VBbmNlc3RvcnM6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cblx0XHRpZiAoIHBhcmVudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0Y2FsbGJhY2soIHBhcmVudCApO1xuXG5cdFx0XHRwYXJlbnQudHJhdmVyc2VBbmNlc3RvcnMoIGNhbGxiYWNrICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR1cGRhdGVNYXRyaXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubWF0cml4LmNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiBmdW5jdGlvbiAoIGZvcmNlICkge1xuXG5cdFx0aWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgKSB0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0aWYgKCB0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgfHwgZm9yY2UgKSB7XG5cblx0XHRcdGlmICggdGhpcy5wYXJlbnQgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyggdGhpcy5wYXJlbnQubWF0cml4V29ybGQsIHRoaXMubWF0cml4ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0XHRcdGZvcmNlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBjaGlsZHJlblxuXG5cdFx0dmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNoaWxkcmVuWyBpIF0udXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdC8vIG1ldGEgaXMgYSBzdHJpbmcgd2hlbiBjYWxsZWQgZnJvbSBKU09OLnN0cmluZ2lmeVxuXHRcdHZhciBpc1Jvb3RPYmplY3QgPSAoIG1ldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWV0YSA9PT0gJ3N0cmluZycgKTtcblxuXHRcdHZhciBvdXRwdXQgPSB7fTtcblxuXHRcdC8vIG1ldGEgaXMgYSBoYXNoIHVzZWQgdG8gY29sbGVjdCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMuXG5cdFx0Ly8gbm90IHByb3ZpZGluZyBpdCBpbXBsaWVzIHRoYXQgdGhpcyBpcyB0aGUgcm9vdCBvYmplY3Rcblx0XHQvLyBiZWluZyBzZXJpYWxpemVkLlxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHQvLyBpbml0aWFsaXplIG1ldGEgb2JqXG5cdFx0XHRtZXRhID0ge1xuXHRcdFx0XHRnZW9tZXRyaWVzOiB7fSxcblx0XHRcdFx0bWF0ZXJpYWxzOiB7fSxcblx0XHRcdFx0dGV4dHVyZXM6IHt9LFxuXHRcdFx0XHRpbWFnZXM6IHt9LFxuXHRcdFx0XHRzaGFwZXM6IHt9XG5cdFx0XHR9O1xuXG5cdFx0XHRvdXRwdXQubWV0YWRhdGEgPSB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ09iamVjdCcsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ09iamVjdDNELnRvSlNPTidcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHQvLyBzdGFuZGFyZCBPYmplY3QzRCBzZXJpYWxpemF0aW9uXG5cblx0XHR2YXIgb2JqZWN0ID0ge307XG5cblx0XHRvYmplY3QudXVpZCA9IHRoaXMudXVpZDtcblx0XHRvYmplY3QudHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIG9iamVjdC5uYW1lID0gdGhpcy5uYW1lO1xuXHRcdGlmICggdGhpcy5jYXN0U2hhZG93ID09PSB0cnVlICkgb2JqZWN0LmNhc3RTaGFkb3cgPSB0cnVlO1xuXHRcdGlmICggdGhpcy5yZWNlaXZlU2hhZG93ID09PSB0cnVlICkgb2JqZWN0LnJlY2VpdmVTaGFkb3cgPSB0cnVlO1xuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIG9iamVjdC52aXNpYmxlID0gZmFsc2U7XG5cdFx0aWYgKCB0aGlzLmZydXN0dW1DdWxsZWQgPT09IGZhbHNlICkgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBmYWxzZTtcblx0XHRpZiAoIHRoaXMucmVuZGVyT3JkZXIgIT09IDAgKSBvYmplY3QucmVuZGVyT3JkZXIgPSB0aGlzLnJlbmRlck9yZGVyO1xuXHRcdGlmICggSlNPTi5zdHJpbmdpZnkoIHRoaXMudXNlckRhdGEgKSAhPT0gJ3t9JyApIG9iamVjdC51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7XG5cblx0XHRvYmplY3QubWF0cml4ID0gdGhpcy5tYXRyaXgudG9BcnJheSgpO1xuXG5cdFx0aWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPT09IGZhbHNlICkgb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHRcdC8vXG5cblx0XHRmdW5jdGlvbiBzZXJpYWxpemUoIGxpYnJhcnksIGVsZW1lbnQgKSB7XG5cblx0XHRcdGlmICggbGlicmFyeVsgZWxlbWVudC51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9IGVsZW1lbnQudG9KU09OKCBtZXRhICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW1lbnQudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5nZW9tZXRyeSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRvYmplY3QuZ2VvbWV0cnkgPSBzZXJpYWxpemUoIG1ldGEuZ2VvbWV0cmllcywgdGhpcy5nZW9tZXRyeSApO1xuXG5cdFx0XHR2YXIgcGFyYW1ldGVycyA9IHRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztcblxuXHRcdFx0aWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgJiYgcGFyYW1ldGVycy5zaGFwZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR2YXIgc2hhcGVzID0gcGFyYW1ldGVycy5zaGFwZXM7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSApIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgc2hhcGUgPSBzaGFwZXNbIGkgXTtcblxuXHRcdFx0XHRcdFx0c2VyaWFsaXplKCBtZXRhLnNoYXBlcywgc2hhcGUgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0c2VyaWFsaXplKCBtZXRhLnNoYXBlcywgc2hhcGVzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubWF0ZXJpYWwgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB0aGlzLm1hdGVyaWFsICkgKSB7XG5cblx0XHRcdFx0dmFyIHV1aWRzID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5tYXRlcmlhbC5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dXVpZHMucHVzaCggc2VyaWFsaXplKCBtZXRhLm1hdGVyaWFscywgdGhpcy5tYXRlcmlhbFsgaSBdICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0b2JqZWN0Lm1hdGVyaWFsID0gdXVpZHM7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0b2JqZWN0Lm1hdGVyaWFsID0gc2VyaWFsaXplKCBtZXRhLm1hdGVyaWFscywgdGhpcy5tYXRlcmlhbCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aWYgKCB0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdG9iamVjdC5jaGlsZHJlbiA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRvYmplY3QuY2hpbGRyZW4ucHVzaCggdGhpcy5jaGlsZHJlblsgaSBdLnRvSlNPTiggbWV0YSApLm9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGlzUm9vdE9iamVjdCApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJpZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmdlb21ldHJpZXMgKTtcblx0XHRcdHZhciBtYXRlcmlhbHMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLm1hdGVyaWFscyApO1xuXHRcdFx0dmFyIHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApO1xuXHRcdFx0dmFyIGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XG5cdFx0XHR2YXIgc2hhcGVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5zaGFwZXMgKTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyaWVzLmxlbmd0aCA+IDAgKSBvdXRwdXQuZ2VvbWV0cmllcyA9IGdlb21ldHJpZXM7XG5cdFx0XHRpZiAoIG1hdGVyaWFscy5sZW5ndGggPiAwICkgb3V0cHV0Lm1hdGVyaWFscyA9IG1hdGVyaWFscztcblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIG91dHB1dC50ZXh0dXJlcyA9IHRleHR1cmVzO1xuXHRcdFx0aWYgKCBpbWFnZXMubGVuZ3RoID4gMCApIG91dHB1dC5pbWFnZXMgPSBpbWFnZXM7XG5cdFx0XHRpZiAoIHNoYXBlcy5sZW5ndGggPiAwICkgb3V0cHV0LnNoYXBlcyA9IHNoYXBlcztcblxuXHRcdH1cblxuXHRcdG91dHB1dC5vYmplY3QgPSBvYmplY3Q7XG5cblx0XHRyZXR1cm4gb3V0cHV0O1xuXG5cdFx0Ly8gZXh0cmFjdCBkYXRhIGZyb20gdGhlIGNhY2hlIGhhc2hcblx0XHQvLyByZW1vdmUgbWV0YWRhdGEgb24gZWFjaCBpdGVtXG5cdFx0Ly8gYW5kIHJldHVybiBhcyBhcnJheVxuXHRcdGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkge1xuXG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIGNhY2hlICkge1xuXG5cdFx0XHRcdHZhciBkYXRhID0gY2FjaGVbIGtleSBdO1xuXHRcdFx0XHRkZWxldGUgZGF0YS5tZXRhZGF0YTtcblx0XHRcdFx0dmFsdWVzLnB1c2goIGRhdGEgKTtcblxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHZhbHVlcztcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoIHJlY3Vyc2l2ZSApIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMsIHJlY3Vyc2l2ZSApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcblxuXHRcdGlmICggcmVjdXJzaXZlID09PSB1bmRlZmluZWQgKSByZWN1cnNpdmUgPSB0cnVlO1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLnVwLmNvcHkoIHNvdXJjZS51cCApO1xuXG5cdFx0dGhpcy5wb3NpdGlvbi5jb3B5KCBzb3VyY2UucG9zaXRpb24gKTtcblx0XHR0aGlzLnF1YXRlcm5pb24uY29weSggc291cmNlLnF1YXRlcm5pb24gKTtcblx0XHR0aGlzLnNjYWxlLmNvcHkoIHNvdXJjZS5zY2FsZSApO1xuXG5cdFx0dGhpcy5tYXRyaXguY29weSggc291cmNlLm1hdHJpeCApO1xuXHRcdHRoaXMubWF0cml4V29ybGQuY29weSggc291cmNlLm1hdHJpeFdvcmxkICk7XG5cblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTtcblx0XHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBzb3VyY2UubWF0cml4V29ybGROZWVkc1VwZGF0ZTtcblxuXHRcdHRoaXMubGF5ZXJzLm1hc2sgPSBzb3VyY2UubGF5ZXJzLm1hc2s7XG5cdFx0dGhpcy52aXNpYmxlID0gc291cmNlLnZpc2libGU7XG5cblx0XHR0aGlzLmNhc3RTaGFkb3cgPSBzb3VyY2UuY2FzdFNoYWRvdztcblx0XHR0aGlzLnJlY2VpdmVTaGFkb3cgPSBzb3VyY2UucmVjZWl2ZVNoYWRvdztcblxuXHRcdHRoaXMuZnJ1c3R1bUN1bGxlZCA9IHNvdXJjZS5mcnVzdHVtQ3VsbGVkO1xuXHRcdHRoaXMucmVuZGVyT3JkZXIgPSBzb3VyY2UucmVuZGVyT3JkZXI7XG5cblx0XHR0aGlzLnVzZXJEYXRhID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIHNvdXJjZS51c2VyRGF0YSApICk7XG5cblx0XHRpZiAoIHJlY3Vyc2l2ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgc291cmNlLmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgY2hpbGQgPSBzb3VyY2UuY2hpbGRyZW5bIGkgXTtcblx0XHRcdFx0dGhpcy5hZGQoIGNoaWxkLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiovXG5cbmZ1bmN0aW9uIENhbWVyYSgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0NhbWVyYSc7XG5cblx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXHR0aGlzLnByb2plY3Rpb25NYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG59XG5cbkNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDYW1lcmEsXG5cblx0aXNDYW1lcmE6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgcmVjdXJzaXZlICk7XG5cblx0XHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KCBzb3VyY2UubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHNvdXJjZS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFdvcmxkRGlyZWN0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGREaXJlY3Rpb24oIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DYW1lcmE6IC5nZXRXb3JsZERpcmVjdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5nZXRXb3JsZFF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdFx0cmV0dXJuIHRhcmdldC5zZXQoIDAsIDAsIC0gMSApLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UoIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgYXJvc2UgLyBodHRwOi8vZ2l0aHViLmNvbS9hcm9zZVxuICovXG5cbmZ1bmN0aW9uIE9ydGhvZ3JhcGhpY0NhbWVyYSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSB7XG5cblx0Q2FtZXJhLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnT3J0aG9ncmFwaGljQ2FtZXJhJztcblxuXHR0aGlzLnpvb20gPSAxO1xuXHR0aGlzLnZpZXcgPSBudWxsO1xuXG5cdHRoaXMubGVmdCA9IGxlZnQ7XG5cdHRoaXMucmlnaHQgPSByaWdodDtcblx0dGhpcy50b3AgPSB0b3A7XG5cdHRoaXMuYm90dG9tID0gYm90dG9tO1xuXG5cdHRoaXMubmVhciA9ICggbmVhciAhPT0gdW5kZWZpbmVkICkgPyBuZWFyIDogMC4xO1xuXHR0aGlzLmZhciA9ICggZmFyICE9PSB1bmRlZmluZWQgKSA/IGZhciA6IDIwMDA7XG5cblx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cbn1cblxuT3J0aG9ncmFwaGljQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIENhbWVyYS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBPcnRob2dyYXBoaWNDYW1lcmEsXG5cblx0aXNPcnRob2dyYXBoaWNDYW1lcmE6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcblxuXHRcdENhbWVyYS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0dGhpcy5sZWZ0ID0gc291cmNlLmxlZnQ7XG5cdFx0dGhpcy5yaWdodCA9IHNvdXJjZS5yaWdodDtcblx0XHR0aGlzLnRvcCA9IHNvdXJjZS50b3A7XG5cdFx0dGhpcy5ib3R0b20gPSBzb3VyY2UuYm90dG9tO1xuXHRcdHRoaXMubmVhciA9IHNvdXJjZS5uZWFyO1xuXHRcdHRoaXMuZmFyID0gc291cmNlLmZhcjtcblxuXHRcdHRoaXMuem9vbSA9IHNvdXJjZS56b29tO1xuXHRcdHRoaXMudmlldyA9IHNvdXJjZS52aWV3ID09PSBudWxsID8gbnVsbCA6IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UudmlldyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRWaWV3T2Zmc2V0OiBmdW5jdGlvbiAoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdGlmICggdGhpcy52aWV3ID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnZpZXcgPSB7XG5cdFx0XHRcdGVuYWJsZWQ6IHRydWUsXG5cdFx0XHRcdGZ1bGxXaWR0aDogMSxcblx0XHRcdFx0ZnVsbEhlaWdodDogMSxcblx0XHRcdFx0b2Zmc2V0WDogMCxcblx0XHRcdFx0b2Zmc2V0WTogMCxcblx0XHRcdFx0d2lkdGg6IDEsXG5cdFx0XHRcdGhlaWdodDogMVxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHRoaXMudmlldy5lbmFibGVkID0gdHJ1ZTtcblx0XHR0aGlzLnZpZXcuZnVsbFdpZHRoID0gZnVsbFdpZHRoO1xuXHRcdHRoaXMudmlldy5mdWxsSGVpZ2h0ID0gZnVsbEhlaWdodDtcblx0XHR0aGlzLnZpZXcub2Zmc2V0WCA9IHg7XG5cdFx0dGhpcy52aWV3Lm9mZnNldFkgPSB5O1xuXHRcdHRoaXMudmlldy53aWR0aCA9IHdpZHRoO1xuXHRcdHRoaXMudmlldy5oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR9LFxuXG5cdGNsZWFyVmlld09mZnNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMudmlldy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR9LFxuXG5cdHVwZGF0ZVByb2plY3Rpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkeCA9ICggdGhpcy5yaWdodCAtIHRoaXMubGVmdCApIC8gKCAyICogdGhpcy56b29tICk7XG5cdFx0dmFyIGR5ID0gKCB0aGlzLnRvcCAtIHRoaXMuYm90dG9tICkgLyAoIDIgKiB0aGlzLnpvb20gKTtcblx0XHR2YXIgY3ggPSAoIHRoaXMucmlnaHQgKyB0aGlzLmxlZnQgKSAvIDI7XG5cdFx0dmFyIGN5ID0gKCB0aGlzLnRvcCArIHRoaXMuYm90dG9tICkgLyAyO1xuXG5cdFx0dmFyIGxlZnQgPSBjeCAtIGR4O1xuXHRcdHZhciByaWdodCA9IGN4ICsgZHg7XG5cdFx0dmFyIHRvcCA9IGN5ICsgZHk7XG5cdFx0dmFyIGJvdHRvbSA9IGN5IC0gZHk7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCAmJiB0aGlzLnZpZXcuZW5hYmxlZCApIHtcblxuXHRcdFx0dmFyIHpvb21XID0gdGhpcy56b29tIC8gKCB0aGlzLnZpZXcud2lkdGggLyB0aGlzLnZpZXcuZnVsbFdpZHRoICk7XG5cdFx0XHR2YXIgem9vbUggPSB0aGlzLnpvb20gLyAoIHRoaXMudmlldy5oZWlnaHQgLyB0aGlzLnZpZXcuZnVsbEhlaWdodCApO1xuXHRcdFx0dmFyIHNjYWxlVyA9ICggdGhpcy5yaWdodCAtIHRoaXMubGVmdCApIC8gdGhpcy52aWV3LndpZHRoO1xuXHRcdFx0dmFyIHNjYWxlSCA9ICggdGhpcy50b3AgLSB0aGlzLmJvdHRvbSApIC8gdGhpcy52aWV3LmhlaWdodDtcblxuXHRcdFx0bGVmdCArPSBzY2FsZVcgKiAoIHRoaXMudmlldy5vZmZzZXRYIC8gem9vbVcgKTtcblx0XHRcdHJpZ2h0ID0gbGVmdCArIHNjYWxlVyAqICggdGhpcy52aWV3LndpZHRoIC8gem9vbVcgKTtcblx0XHRcdHRvcCAtPSBzY2FsZUggKiAoIHRoaXMudmlldy5vZmZzZXRZIC8gem9vbUggKTtcblx0XHRcdGJvdHRvbSA9IHRvcCAtIHNjYWxlSCAqICggdGhpcy52aWV3LmhlaWdodCAvIHpvb21IICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB0aGlzLm5lYXIsIHRoaXMuZmFyICk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC56b29tID0gdGhpcy56b29tO1xuXHRcdGRhdGEub2JqZWN0LmxlZnQgPSB0aGlzLmxlZnQ7XG5cdFx0ZGF0YS5vYmplY3QucmlnaHQgPSB0aGlzLnJpZ2h0O1xuXHRcdGRhdGEub2JqZWN0LnRvcCA9IHRoaXMudG9wO1xuXHRcdGRhdGEub2JqZWN0LmJvdHRvbSA9IHRoaXMuYm90dG9tO1xuXHRcdGRhdGEub2JqZWN0Lm5lYXIgPSB0aGlzLm5lYXI7XG5cdFx0ZGF0YS5vYmplY3QuZmFyID0gdGhpcy5mYXI7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIGRhdGEub2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgdGhpcy52aWV3ICk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGYWNlMyggYSwgYiwgYywgbm9ybWFsLCBjb2xvciwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHR0aGlzLmEgPSBhO1xuXHR0aGlzLmIgPSBiO1xuXHR0aGlzLmMgPSBjO1xuXG5cdHRoaXMubm9ybWFsID0gKCBub3JtYWwgJiYgbm9ybWFsLmlzVmVjdG9yMyApID8gbm9ybWFsIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52ZXJ0ZXhOb3JtYWxzID0gQXJyYXkuaXNBcnJheSggbm9ybWFsICkgPyBub3JtYWwgOiBbXTtcblxuXHR0aGlzLmNvbG9yID0gKCBjb2xvciAmJiBjb2xvci5pc0NvbG9yICkgPyBjb2xvciA6IG5ldyBDb2xvcigpO1xuXHR0aGlzLnZlcnRleENvbG9ycyA9IEFycmF5LmlzQXJyYXkoIGNvbG9yICkgPyBjb2xvciA6IFtdO1xuXG5cdHRoaXMubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXggIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsSW5kZXggOiAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZhY2UzLnByb3RvdHlwZSwge1xuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMuYSA9IHNvdXJjZS5hO1xuXHRcdHRoaXMuYiA9IHNvdXJjZS5iO1xuXHRcdHRoaXMuYyA9IHNvdXJjZS5jO1xuXG5cdFx0dGhpcy5ub3JtYWwuY29weSggc291cmNlLm5vcm1hbCApO1xuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0XHR0aGlzLm1hdGVyaWFsSW5kZXggPSBzb3VyY2UubWF0ZXJpYWxJbmRleDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBzb3VyY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy52ZXJ0ZXhOb3JtYWxzWyBpIF0gPSBzb3VyY2UudmVydGV4Tm9ybWFsc1sgaSBdLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gc291cmNlLnZlcnRleENvbG9ycy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy52ZXJ0ZXhDb2xvcnNbIGkgXSA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnNbIGkgXS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3Iga2lsZSAvIGh0dHA6Ly9raWxlLnN0cmF2YWdhbnphLm9yZy9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbnZhciBnZW9tZXRyeUlkID0gMDsgLy8gR2VvbWV0cnkgdXNlcyBldmVuIG51bWJlcnMgYXMgSWRcblxuZnVuY3Rpb24gR2VvbWV0cnkoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBnZW9tZXRyeUlkICs9IDIgfSApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnR2VvbWV0cnknO1xuXG5cdHRoaXMudmVydGljZXMgPSBbXTtcblx0dGhpcy5jb2xvcnMgPSBbXTtcblx0dGhpcy5mYWNlcyA9IFtdO1xuXHR0aGlzLmZhY2VWZXJ0ZXhVdnMgPSBbW11dO1xuXG5cdHRoaXMubW9ycGhUYXJnZXRzID0gW107XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gW107XG5cblx0dGhpcy5za2luV2VpZ2h0cyA9IFtdO1xuXHR0aGlzLnNraW5JbmRpY2VzID0gW107XG5cblx0dGhpcy5saW5lRGlzdGFuY2VzID0gW107XG5cblx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdC8vIHVwZGF0ZSBmbGFnc1xuXG5cdHRoaXMuZWxlbWVudHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMudXZzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG59XG5cbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBHZW9tZXRyeSxcblxuXHRpc0dlb21ldHJ5OiB0cnVlLFxuXG5cdGFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHRoaXMudmVydGljZXNbIGkgXTtcblx0XHRcdHZlcnRleC5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gdGhpcy5mYWNlc1sgaSBdO1xuXHRcdFx0ZmFjZS5ub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRmYWNlLnZlcnRleE5vcm1hbHNbIGogXS5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IHRydWU7XG5cdFx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHRydWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeC1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVgoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25YKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeS1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVkoIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25ZKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgei1heGlzXG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkge1xuXG5cdFx0XHRtMS5tYWtlUm90YXRpb25aKCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gdHJhbnNsYXRlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZSggeCwgeSwgeiApIHtcblxuXHRcdFx0bTEubWFrZVRyYW5zbGF0aW9uKCB4LCB5LCB6ICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2NhbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHNjYWxlIGdlb21ldHJ5XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNjYWxlKCB4LCB5LCB6ICkge1xuXG5cdFx0XHRtMS5tYWtlU2NhbGUoIHgsIHksIHogKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmogPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBsb29rQXQoIHZlY3RvciApIHtcblxuXHRcdFx0b2JqLmxvb2tBdCggdmVjdG9yICk7XG5cblx0XHRcdG9iai51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggb2JqLm1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZnJvbUJ1ZmZlckdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBpbmRpY2VzID0gZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgPyBnZW9tZXRyeS5pbmRleC5hcnJheSA6IHVuZGVmaW5lZDtcblx0XHR2YXIgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cblx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblx0XHR2YXIgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheSA6IHVuZGVmaW5lZDtcblx0XHR2YXIgY29sb3JzID0gYXR0cmlidXRlcy5jb2xvciAhPT0gdW5kZWZpbmVkID8gYXR0cmlidXRlcy5jb2xvci5hcnJheSA6IHVuZGVmaW5lZDtcblx0XHR2YXIgdXZzID0gYXR0cmlidXRlcy51diAhPT0gdW5kZWZpbmVkID8gYXR0cmlidXRlcy51di5hcnJheSA6IHVuZGVmaW5lZDtcblx0XHR2YXIgdXZzMiA9IGF0dHJpYnV0ZXMudXYyICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLnV2Mi5hcnJheSA6IHVuZGVmaW5lZDtcblxuXHRcdGlmICggdXZzMiAhPT0gdW5kZWZpbmVkICkgdGhpcy5mYWNlVmVydGV4VXZzWyAxIF0gPSBbXTtcblxuXHRcdHZhciB0ZW1wTm9ybWFscyA9IFtdO1xuXHRcdHZhciB0ZW1wVVZzID0gW107XG5cdFx0dmFyIHRlbXBVVnMyID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGogPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSArPSAzLCBqICs9IDIgKSB7XG5cblx0XHRcdHNjb3BlLnZlcnRpY2VzLnB1c2goIG5ldyBWZWN0b3IzKCBwb3NpdGlvbnNbIGkgXSwgcG9zaXRpb25zWyBpICsgMSBdLCBwb3NpdGlvbnNbIGkgKyAyIF0gKSApO1xuXG5cdFx0XHRpZiAoIG5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0ZW1wTm9ybWFscy5wdXNoKCBuZXcgVmVjdG9yMyggbm9ybWFsc1sgaSBdLCBub3JtYWxzWyBpICsgMSBdLCBub3JtYWxzWyBpICsgMiBdICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGNvbG9ycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLmNvbG9ycy5wdXNoKCBuZXcgQ29sb3IoIGNvbG9yc1sgaSBdLCBjb2xvcnNbIGkgKyAxIF0sIGNvbG9yc1sgaSArIDIgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1dnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0ZW1wVVZzLnB1c2goIG5ldyBWZWN0b3IyKCB1dnNbIGogXSwgdXZzWyBqICsgMSBdICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHV2czIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0ZW1wVVZzMi5wdXNoKCBuZXcgVmVjdG9yMiggdXZzMlsgaiBdLCB1dnMyWyBqICsgMSBdICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gYWRkRmFjZSggYSwgYiwgYywgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdFx0dmFyIHZlcnRleE5vcm1hbHMgPSBub3JtYWxzICE9PSB1bmRlZmluZWQgPyBbIHRlbXBOb3JtYWxzWyBhIF0uY2xvbmUoKSwgdGVtcE5vcm1hbHNbIGIgXS5jbG9uZSgpLCB0ZW1wTm9ybWFsc1sgYyBdLmNsb25lKCkgXSA6IFtdO1xuXHRcdFx0dmFyIHZlcnRleENvbG9ycyA9IGNvbG9ycyAhPT0gdW5kZWZpbmVkID8gWyBzY29wZS5jb2xvcnNbIGEgXS5jbG9uZSgpLCBzY29wZS5jb2xvcnNbIGIgXS5jbG9uZSgpLCBzY29wZS5jb2xvcnNbIGMgXS5jbG9uZSgpIF0gOiBbXTtcblxuXHRcdFx0dmFyIGZhY2UgPSBuZXcgRmFjZTMoIGEsIGIsIGMsIHZlcnRleE5vcm1hbHMsIHZlcnRleENvbG9ycywgbWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHRzY29wZS5mYWNlcy5wdXNoKCBmYWNlICk7XG5cblx0XHRcdGlmICggdXZzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUuZmFjZVZlcnRleFV2c1sgMCBdLnB1c2goIFsgdGVtcFVWc1sgYSBdLmNsb25lKCksIHRlbXBVVnNbIGIgXS5jbG9uZSgpLCB0ZW1wVVZzWyBjIF0uY2xvbmUoKSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1dnMyICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUuZmFjZVZlcnRleFV2c1sgMSBdLnB1c2goIFsgdGVtcFVWczJbIGEgXS5jbG9uZSgpLCB0ZW1wVVZzMlsgYiBdLmNsb25lKCksIHRlbXBVVnMyWyBjIF0uY2xvbmUoKSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBncm91cHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXG5cdFx0XHRcdHZhciBzdGFydCA9IGdyb3VwLnN0YXJ0O1xuXHRcdFx0XHR2YXIgY291bnQgPSBncm91cC5jb3VudDtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IHN0YXJ0LCBqbCA9IHN0YXJ0ICsgY291bnQ7IGogPCBqbDsgaiArPSAzICkge1xuXG5cdFx0XHRcdFx0aWYgKCBpbmRpY2VzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGFkZEZhY2UoIGluZGljZXNbIGogXSwgaW5kaWNlc1sgaiArIDEgXSwgaW5kaWNlc1sgaiArIDIgXSwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0YWRkRmFjZSggaiwgaiArIDEsIGogKyAyLCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIGluZGljZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0YWRkRmFjZSggaW5kaWNlc1sgaSBdLCBpbmRpY2VzWyBpICsgMSBdLCBpbmRpY2VzWyBpICsgMiBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLyAzOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRhZGRGYWNlKCBpLCBpICsgMSwgaSArIDIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZW50ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvZmZzZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNlbnRlcigpIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoIG9mZnNldCApLm5lZ2F0ZSgpO1xuXG5cdFx0XHR0aGlzLnRyYW5zbGF0ZSggb2Zmc2V0LngsIG9mZnNldC55LCBvZmZzZXQueiApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdHZhciBjZW50ZXIgPSB0aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtcblx0XHR2YXIgcmFkaXVzID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXM7XG5cblx0XHR2YXIgcyA9IHJhZGl1cyA9PT0gMCA/IDEgOiAxLjAgLyByYWRpdXM7XG5cblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0XHRtYXRyaXguc2V0KFxuXHRcdFx0cywgMCwgMCwgLSBzICogY2VudGVyLngsXG5cdFx0XHQwLCBzLCAwLCAtIHMgKiBjZW50ZXIueSxcblx0XHRcdDAsIDAsIHMsIC0gcyAqIGNlbnRlci56LFxuXHRcdFx0MCwgMCwgMCwgMVxuXHRcdCk7XG5cblx0XHR0aGlzLmFwcGx5TWF0cml4KCBtYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUZhY2VOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgY2IgPSBuZXcgVmVjdG9yMygpLCBhYiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmb3IgKCB2YXIgZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdHZhciB2QSA9IHRoaXMudmVydGljZXNbIGZhY2UuYSBdO1xuXHRcdFx0dmFyIHZCID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5iIF07XG5cdFx0XHR2YXIgdkMgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmMgXTtcblxuXHRcdFx0Y2Iuc3ViVmVjdG9ycyggdkMsIHZCICk7XG5cdFx0XHRhYi5zdWJWZWN0b3JzKCB2QSwgdkIgKTtcblx0XHRcdGNiLmNyb3NzKCBhYiApO1xuXG5cdFx0XHRjYi5ub3JtYWxpemUoKTtcblxuXHRcdFx0ZmFjZS5ub3JtYWwuY29weSggY2IgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVWZXJ0ZXhOb3JtYWxzOiBmdW5jdGlvbiAoIGFyZWFXZWlnaHRlZCApIHtcblxuXHRcdGlmICggYXJlYVdlaWdodGVkID09PSB1bmRlZmluZWQgKSBhcmVhV2VpZ2h0ZWQgPSB0cnVlO1xuXG5cdFx0dmFyIHYsIHZsLCBmLCBmbCwgZmFjZSwgdmVydGljZXM7XG5cblx0XHR2ZXJ0aWNlcyA9IG5ldyBBcnJheSggdGhpcy52ZXJ0aWNlcy5sZW5ndGggKTtcblxuXHRcdGZvciAoIHYgPSAwLCB2bCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyB2IDwgdmw7IHYgKysgKSB7XG5cblx0XHRcdHZlcnRpY2VzWyB2IF0gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBhcmVhV2VpZ2h0ZWQgKSB7XG5cblx0XHRcdC8vIHZlcnRleCBub3JtYWxzIHdlaWdodGVkIGJ5IHRyaWFuZ2xlIGFyZWFzXG5cdFx0XHQvLyBodHRwOi8vd3d3LmlxdWlsZXpsZXMub3JnL3d3dy9hcnRpY2xlcy9ub3JtYWxzL25vcm1hbHMuaHRtXG5cblx0XHRcdHZhciB2QSwgdkIsIHZDO1xuXHRcdFx0dmFyIGNiID0gbmV3IFZlY3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdFx0dkEgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmEgXTtcblx0XHRcdFx0dkIgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmIgXTtcblx0XHRcdFx0dkMgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmMgXTtcblxuXHRcdFx0XHRjYi5zdWJWZWN0b3JzKCB2QywgdkIgKTtcblx0XHRcdFx0YWIuc3ViVmVjdG9ycyggdkEsIHZCICk7XG5cdFx0XHRcdGNiLmNyb3NzKCBhYiApO1xuXG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmEgXS5hZGQoIGNiICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmIgXS5hZGQoIGNiICk7XG5cdFx0XHRcdHZlcnRpY2VzWyBmYWNlLmMgXS5hZGQoIGNiICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cblx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0XHR2ZXJ0aWNlc1sgZmFjZS5hIF0uYWRkKCBmYWNlLm5vcm1hbCApO1xuXHRcdFx0XHR2ZXJ0aWNlc1sgZmFjZS5iIF0uYWRkKCBmYWNlLm5vcm1hbCApO1xuXHRcdFx0XHR2ZXJ0aWNlc1sgZmFjZS5jIF0uYWRkKCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2ID0gMCwgdmwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgdiA8IHZsOyB2ICsrICkge1xuXG5cdFx0XHR2ZXJ0aWNlc1sgdiBdLm5vcm1hbGl6ZSgpO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0dmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7XG5cblx0XHRcdGlmICggdmVydGV4Tm9ybWFscy5sZW5ndGggPT09IDMgKSB7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMCBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmEgXSApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0uY29weSggdmVydGljZXNbIGZhY2UuYiBdICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDIgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5jIF0gKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAwIF0gPSB2ZXJ0aWNlc1sgZmFjZS5hIF0uY2xvbmUoKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMSBdID0gdmVydGljZXNbIGZhY2UuYiBdLmNsb25lKCk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDIgXSA9IHZlcnRpY2VzWyBmYWNlLmMgXS5jbG9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZmFjZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlRmxhdFZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBmLCBmbCwgZmFjZTtcblxuXHRcdHRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cblx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscztcblxuXHRcdFx0aWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHtcblxuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAwIF0uY29weSggZmFjZS5ub3JtYWwgKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMSBdLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDIgXS5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXSA9IGZhY2Uubm9ybWFsLmNsb25lKCk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDEgXSA9IGZhY2Uubm9ybWFsLmNsb25lKCk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDIgXSA9IGZhY2Uubm9ybWFsLmNsb25lKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5mYWNlcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVNb3JwaE5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpLCBpbCwgZiwgZmwsIGZhY2U7XG5cblx0XHQvLyBzYXZlIG9yaWdpbmFsIG5vcm1hbHNcblx0XHQvLyAtIGNyZWF0ZSB0ZW1wIHZhcmlhYmxlcyBvbiBmaXJzdCBhY2Nlc3Ncblx0XHQvLyAgIG90aGVyd2lzZSBqdXN0IGNvcHkgKGZvciBmYXN0ZXIgcmVwZWF0ZWQgY2FsbHMpXG5cblx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRpZiAoICEgZmFjZS5fX29yaWdpbmFsRmFjZU5vcm1hbCApIHtcblxuXHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsID0gZmFjZS5ub3JtYWwuY2xvbmUoKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmYWNlLl9fb3JpZ2luYWxGYWNlTm9ybWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCAhIGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHMgKSBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzID0gW107XG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoICEgZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1sgaSBdICkge1xuXG5cdFx0XHRcdFx0ZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1sgaSBdID0gZmFjZS52ZXJ0ZXhOb3JtYWxzWyBpIF0uY2xvbmUoKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1sgaSBdLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgaSBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyB1c2UgdGVtcCBnZW9tZXRyeSB0byBjb21wdXRlIGZhY2UgYW5kIHZlcnRleCBub3JtYWxzIGZvciBlYWNoIG1vcnBoXG5cblx0XHR2YXIgdG1wR2VvID0gbmV3IEdlb21ldHJ5KCk7XG5cdFx0dG1wR2VvLmZhY2VzID0gdGhpcy5mYWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMubW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHQvLyBjcmVhdGUgb24gZmlyc3QgYWNjZXNzXG5cblx0XHRcdGlmICggISB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdICkge1xuXG5cdFx0XHRcdHRoaXMubW9ycGhOb3JtYWxzWyBpIF0gPSB7fTtcblx0XHRcdFx0dGhpcy5tb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFscyA9IFtdO1xuXHRcdFx0XHR0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHMgPSBbXTtcblxuXHRcdFx0XHR2YXIgZHN0Tm9ybWFsc0ZhY2UgPSB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzO1xuXHRcdFx0XHR2YXIgZHN0Tm9ybWFsc1ZlcnRleCA9IHRoaXMubW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscztcblxuXHRcdFx0XHR2YXIgZmFjZU5vcm1hbCwgdmVydGV4Tm9ybWFscztcblxuXHRcdFx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRcdFx0ZmFjZU5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRcdFx0dmVydGV4Tm9ybWFscyA9IHsgYTogbmV3IFZlY3RvcjMoKSwgYjogbmV3IFZlY3RvcjMoKSwgYzogbmV3IFZlY3RvcjMoKSB9O1xuXG5cdFx0XHRcdFx0ZHN0Tm9ybWFsc0ZhY2UucHVzaCggZmFjZU5vcm1hbCApO1xuXHRcdFx0XHRcdGRzdE5vcm1hbHNWZXJ0ZXgucHVzaCggdmVydGV4Tm9ybWFscyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbW9ycGhOb3JtYWxzID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXTtcblxuXHRcdFx0Ly8gc2V0IHZlcnRpY2VzIHRvIG1vcnBoIHRhcmdldFxuXG5cdFx0XHR0bXBHZW8udmVydGljZXMgPSB0aGlzLm1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzO1xuXG5cdFx0XHQvLyBjb21wdXRlIG1vcnBoIG5vcm1hbHNcblxuXHRcdFx0dG1wR2VvLmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXHRcdFx0dG1wR2VvLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XG5cblx0XHRcdC8vIHN0b3JlIG1vcnBoIG5vcm1hbHNcblxuXHRcdFx0dmFyIGZhY2VOb3JtYWwsIHZlcnRleE5vcm1hbHM7XG5cblx0XHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0XHRmYWNlTm9ybWFsID0gbW9ycGhOb3JtYWxzLmZhY2VOb3JtYWxzWyBmIF07XG5cdFx0XHRcdHZlcnRleE5vcm1hbHMgPSBtb3JwaE5vcm1hbHMudmVydGV4Tm9ybWFsc1sgZiBdO1xuXG5cdFx0XHRcdGZhY2VOb3JtYWwuY29weSggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzLmEuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAwIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFscy5iLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgMSBdICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHMuYy5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDIgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyByZXN0b3JlIG9yaWdpbmFsIG5vcm1hbHNcblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdGZhY2Uubm9ybWFsID0gZmFjZS5fX29yaWdpbmFsRmFjZU5vcm1hbDtcblx0XHRcdGZhY2UudmVydGV4Tm9ybWFscyA9IGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHM7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlQm91bmRpbmdCb3g6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IG5ldyBCb3gzKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmJvdW5kaW5nQm94LnNldEZyb21Qb2ludHMoIHRoaXMudmVydGljZXMgKTtcblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZS5zZXRGcm9tUG9pbnRzKCB0aGlzLnZlcnRpY2VzICk7XG5cblx0fSxcblxuXHRtZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeSwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkge1xuXG5cdFx0aWYgKCAhICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkdlb21ldHJ5LicsIGdlb21ldHJ5ICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR2YXIgbm9ybWFsTWF0cml4LFxuXHRcdFx0dmVydGV4T2Zmc2V0ID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGgsXG5cdFx0XHR2ZXJ0aWNlczEgPSB0aGlzLnZlcnRpY2VzLFxuXHRcdFx0dmVydGljZXMyID0gZ2VvbWV0cnkudmVydGljZXMsXG5cdFx0XHRmYWNlczEgPSB0aGlzLmZhY2VzLFxuXHRcdFx0ZmFjZXMyID0gZ2VvbWV0cnkuZmFjZXMsXG5cdFx0XHR1dnMxID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF0sXG5cdFx0XHR1dnMyID0gZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgMCBdLFxuXHRcdFx0Y29sb3JzMSA9IHRoaXMuY29sb3JzLFxuXHRcdFx0Y29sb3JzMiA9IGdlb21ldHJ5LmNvbG9ycztcblxuXHRcdGlmICggbWF0ZXJpYWxJbmRleE9mZnNldCA9PT0gdW5kZWZpbmVkICkgbWF0ZXJpYWxJbmRleE9mZnNldCA9IDA7XG5cblx0XHRpZiAoIG1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cblx0XHR9XG5cblx0XHQvLyB2ZXJ0aWNlc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHZlcnRpY2VzMi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHZlcnRpY2VzMlsgaSBdO1xuXG5cdFx0XHR2YXIgdmVydGV4Q29weSA9IHZlcnRleC5jbG9uZSgpO1xuXG5cdFx0XHRpZiAoIG1hdHJpeCAhPT0gdW5kZWZpbmVkICkgdmVydGV4Q29weS5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0XHR2ZXJ0aWNlczEucHVzaCggdmVydGV4Q29weSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gY29sb3JzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY29sb3JzMi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0Y29sb3JzMS5wdXNoKCBjb2xvcnMyWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZmFjZXNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IGZhY2VzMi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlczJbIGkgXSwgZmFjZUNvcHksIG5vcm1hbCwgY29sb3IsXG5cdFx0XHRcdGZhY2VWZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLFxuXHRcdFx0XHRmYWNlVmVydGV4Q29sb3JzID0gZmFjZS52ZXJ0ZXhDb2xvcnM7XG5cblx0XHRcdGZhY2VDb3B5ID0gbmV3IEZhY2UzKCBmYWNlLmEgKyB2ZXJ0ZXhPZmZzZXQsIGZhY2UuYiArIHZlcnRleE9mZnNldCwgZmFjZS5jICsgdmVydGV4T2Zmc2V0ICk7XG5cdFx0XHRmYWNlQ29weS5ub3JtYWwuY29weSggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0aWYgKCBub3JtYWxNYXRyaXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRmYWNlQ29weS5ub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZVZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0bm9ybWFsID0gZmFjZVZlcnRleE5vcm1hbHNbIGogXS5jbG9uZSgpO1xuXG5cdFx0XHRcdGlmICggbm9ybWFsTWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZmFjZUNvcHkudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmYWNlQ29weS5jb2xvci5jb3B5KCBmYWNlLmNvbG9yICk7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlVmVydGV4Q29sb3JzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdGNvbG9yID0gZmFjZVZlcnRleENvbG9yc1sgaiBdO1xuXHRcdFx0XHRmYWNlQ29weS52ZXJ0ZXhDb2xvcnMucHVzaCggY29sb3IuY2xvbmUoKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZhY2VDb3B5Lm1hdGVyaWFsSW5kZXggPSBmYWNlLm1hdGVyaWFsSW5kZXggKyBtYXRlcmlhbEluZGV4T2Zmc2V0O1xuXG5cdFx0XHRmYWNlczEucHVzaCggZmFjZUNvcHkgKTtcblxuXHRcdH1cblxuXHRcdC8vIHV2c1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdXZzMi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHV2ID0gdXZzMlsgaSBdLCB1dkNvcHkgPSBbXTtcblxuXHRcdFx0aWYgKCB1diA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSB1di5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR1dkNvcHkucHVzaCggdXZbIGogXS5jbG9uZSgpICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dXZzMS5wdXNoKCB1dkNvcHkgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG1lcmdlTWVzaDogZnVuY3Rpb24gKCBtZXNoICkge1xuXG5cdFx0aWYgKCAhICggbWVzaCAmJiBtZXNoLmlzTWVzaCApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuR2VvbWV0cnkubWVyZ2VNZXNoKCk6IG1lc2ggbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk1lc2guJywgbWVzaCApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtZXNoLm1hdHJpeEF1dG9VcGRhdGUgKSBtZXNoLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0dGhpcy5tZXJnZSggbWVzaC5nZW9tZXRyeSwgbWVzaC5tYXRyaXggKTtcblxuXHR9LFxuXG5cdC8qXG5cdCAqIENoZWNrcyBmb3IgZHVwbGljYXRlIHZlcnRpY2VzIHdpdGggaGFzaG1hcC5cblx0ICogRHVwbGljYXRlZCB2ZXJ0aWNlcyBhcmUgcmVtb3ZlZFxuXHQgKiBhbmQgZmFjZXMnIHZlcnRpY2VzIGFyZSB1cGRhdGVkLlxuXHQgKi9cblxuXHRtZXJnZVZlcnRpY2VzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmVydGljZXNNYXAgPSB7fTsgLy8gSGFzaG1hcCBmb3IgbG9va2luZyB1cCB2ZXJ0aWNlcyBieSBwb3NpdGlvbiBjb29yZGluYXRlcyAoYW5kIG1ha2luZyBzdXJlIHRoZXkgYXJlIHVuaXF1ZSlcblx0XHR2YXIgdW5pcXVlID0gW10sIGNoYW5nZXMgPSBbXTtcblxuXHRcdHZhciB2LCBrZXk7XG5cdFx0dmFyIHByZWNpc2lvblBvaW50cyA9IDQ7IC8vIG51bWJlciBvZiBkZWNpbWFsIHBvaW50cywgZS5nLiA0IGZvciBlcHNpbG9uIG9mIDAuMDAwMVxuXHRcdHZhciBwcmVjaXNpb24gPSBNYXRoLnBvdyggMTAsIHByZWNpc2lvblBvaW50cyApO1xuXHRcdHZhciBpLCBpbCwgZmFjZTtcblx0XHR2YXIgaW5kaWNlcywgaiwgamw7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2ID0gdGhpcy52ZXJ0aWNlc1sgaSBdO1xuXHRcdFx0a2V5ID0gTWF0aC5yb3VuZCggdi54ICogcHJlY2lzaW9uICkgKyAnXycgKyBNYXRoLnJvdW5kKCB2LnkgKiBwcmVjaXNpb24gKSArICdfJyArIE1hdGgucm91bmQoIHYueiAqIHByZWNpc2lvbiApO1xuXG5cdFx0XHRpZiAoIHZlcnRpY2VzTWFwWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHZlcnRpY2VzTWFwWyBrZXkgXSA9IGk7XG5cdFx0XHRcdHVuaXF1ZS5wdXNoKCB0aGlzLnZlcnRpY2VzWyBpIF0gKTtcblx0XHRcdFx0Y2hhbmdlc1sgaSBdID0gdW5pcXVlLmxlbmd0aCAtIDE7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnRHVwbGljYXRlIHZlcnRleCBmb3VuZC4gJywgaSwgJyBjb3VsZCBiZSB1c2luZyAnLCB2ZXJ0aWNlc01hcFtrZXldKTtcblx0XHRcdFx0Y2hhbmdlc1sgaSBdID0gY2hhbmdlc1sgdmVydGljZXNNYXBbIGtleSBdIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0Ly8gaWYgZmFjZXMgYXJlIGNvbXBsZXRlbHkgZGVnZW5lcmF0ZSBhZnRlciBtZXJnaW5nIHZlcnRpY2VzLCB3ZVxuXHRcdC8vIGhhdmUgdG8gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgZ2VvbWV0cnkuXG5cdFx0dmFyIGZhY2VJbmRpY2VzVG9SZW1vdmUgPSBbXTtcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBpIF07XG5cblx0XHRcdGZhY2UuYSA9IGNoYW5nZXNbIGZhY2UuYSBdO1xuXHRcdFx0ZmFjZS5iID0gY2hhbmdlc1sgZmFjZS5iIF07XG5cdFx0XHRmYWNlLmMgPSBjaGFuZ2VzWyBmYWNlLmMgXTtcblxuXHRcdFx0aW5kaWNlcyA9IFsgZmFjZS5hLCBmYWNlLmIsIGZhY2UuYyBdO1xuXG5cdFx0XHQvLyBpZiBhbnkgZHVwbGljYXRlIHZlcnRpY2VzIGFyZSBmb3VuZCBpbiBhIEZhY2UzXG5cdFx0XHQvLyB3ZSBoYXZlIHRvIHJlbW92ZSB0aGUgZmFjZSBhcyBub3RoaW5nIGNhbiBiZSBzYXZlZFxuXHRcdFx0Zm9yICggdmFyIG4gPSAwOyBuIDwgMzsgbiArKyApIHtcblxuXHRcdFx0XHRpZiAoIGluZGljZXNbIG4gXSA9PT0gaW5kaWNlc1sgKCBuICsgMSApICUgMyBdICkge1xuXG5cdFx0XHRcdFx0ZmFjZUluZGljZXNUb1JlbW92ZS5wdXNoKCBpICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmb3IgKCBpID0gZmFjZUluZGljZXNUb1JlbW92ZS5sZW5ndGggLSAxOyBpID49IDA7IGkgLS0gKSB7XG5cblx0XHRcdHZhciBpZHggPSBmYWNlSW5kaWNlc1RvUmVtb3ZlWyBpIF07XG5cblx0XHRcdHRoaXMuZmFjZXMuc3BsaWNlKCBpZHgsIDEgKTtcblxuXHRcdFx0Zm9yICggaiA9IDAsIGpsID0gdGhpcy5mYWNlVmVydGV4VXZzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdHRoaXMuZmFjZVZlcnRleFV2c1sgaiBdLnNwbGljZSggaWR4LCAxICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIFVzZSB1bmlxdWUgc2V0IG9mIHZlcnRpY2VzXG5cblx0XHR2YXIgZGlmZiA9IHRoaXMudmVydGljZXMubGVuZ3RoIC0gdW5pcXVlLmxlbmd0aDtcblx0XHR0aGlzLnZlcnRpY2VzID0gdW5pcXVlO1xuXHRcdHJldHVybiBkaWZmO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLnZlcnRpY2VzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHBvaW50ID0gcG9pbnRzWyBpIF07XG5cdFx0XHR0aGlzLnZlcnRpY2VzLnB1c2goIG5ldyBWZWN0b3IzKCBwb2ludC54LCBwb2ludC55LCBwb2ludC56IHx8IDAgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzb3J0RmFjZXNCeU1hdGVyaWFsSW5kZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBmYWNlcyA9IHRoaXMuZmFjZXM7XG5cdFx0dmFyIGxlbmd0aCA9IGZhY2VzLmxlbmd0aDtcblxuXHRcdC8vIHRhZyBmYWNlc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRmYWNlc1sgaSBdLl9pZCA9IGk7XG5cblx0XHR9XG5cblx0XHQvLyBzb3J0IGZhY2VzXG5cblx0XHRmdW5jdGlvbiBtYXRlcmlhbEluZGV4U29ydCggYSwgYiApIHtcblxuXHRcdFx0cmV0dXJuIGEubWF0ZXJpYWxJbmRleCAtIGIubWF0ZXJpYWxJbmRleDtcblxuXHRcdH1cblxuXHRcdGZhY2VzLnNvcnQoIG1hdGVyaWFsSW5kZXhTb3J0ICk7XG5cblx0XHQvLyBzb3J0IHV2c1xuXG5cdFx0dmFyIHV2czEgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXTtcblx0XHR2YXIgdXZzMiA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMSBdO1xuXG5cdFx0dmFyIG5ld1V2czEsIG5ld1V2czI7XG5cblx0XHRpZiAoIHV2czEgJiYgdXZzMS5sZW5ndGggPT09IGxlbmd0aCApIG5ld1V2czEgPSBbXTtcblx0XHRpZiAoIHV2czIgJiYgdXZzMi5sZW5ndGggPT09IGxlbmd0aCApIG5ld1V2czIgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGlkID0gZmFjZXNbIGkgXS5faWQ7XG5cblx0XHRcdGlmICggbmV3VXZzMSApIG5ld1V2czEucHVzaCggdXZzMVsgaWQgXSApO1xuXHRcdFx0aWYgKCBuZXdVdnMyICkgbmV3VXZzMi5wdXNoKCB1dnMyWyBpZCBdICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG5ld1V2czEgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXSA9IG5ld1V2czE7XG5cdFx0aWYgKCBuZXdVdnMyICkgdGhpcy5mYWNlVmVydGV4VXZzWyAxIF0gPSBuZXdVdnMyO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ0dlb21ldHJ5Jyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnR2VvbWV0cnkudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzdGFuZGFyZCBHZW9tZXRyeSBzZXJpYWxpemF0aW9uXG5cblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblxuXHRcdGlmICggdGhpcy5wYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xuXG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRcdFx0aWYgKCBwYXJhbWV0ZXJzWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblxuXHRcdH1cblxuXHRcdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXggPSB0aGlzLnZlcnRpY2VzWyBpIF07XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHR9XG5cblx0XHR2YXIgZmFjZXMgPSBbXTtcblx0XHR2YXIgbm9ybWFscyA9IFtdO1xuXHRcdHZhciBub3JtYWxzSGFzaCA9IHt9O1xuXHRcdHZhciBjb2xvcnMgPSBbXTtcblx0XHR2YXIgY29sb3JzSGFzaCA9IHt9O1xuXHRcdHZhciB1dnMgPSBbXTtcblx0XHR2YXIgdXZzSGFzaCA9IHt9O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5mYWNlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gdGhpcy5mYWNlc1sgaSBdO1xuXG5cdFx0XHR2YXIgaGFzTWF0ZXJpYWwgPSB0cnVlO1xuXHRcdFx0dmFyIGhhc0ZhY2VVdiA9IGZhbHNlOyAvLyBkZXByZWNhdGVkXG5cdFx0XHR2YXIgaGFzRmFjZVZlcnRleFV2ID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF1bIGkgXSAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0dmFyIGhhc0ZhY2VOb3JtYWwgPSBmYWNlLm5vcm1hbC5sZW5ndGgoKSA+IDA7XG5cdFx0XHR2YXIgaGFzRmFjZVZlcnRleE5vcm1hbCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGggPiAwO1xuXHRcdFx0dmFyIGhhc0ZhY2VDb2xvciA9IGZhY2UuY29sb3IuciAhPT0gMSB8fCBmYWNlLmNvbG9yLmcgIT09IDEgfHwgZmFjZS5jb2xvci5iICE9PSAxO1xuXHRcdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhDb2xvciA9IGZhY2UudmVydGV4Q29sb3JzLmxlbmd0aCA+IDA7XG5cblx0XHRcdHZhciBmYWNlVHlwZSA9IDA7XG5cblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgMCwgMCApOyAvLyBpc1F1YWRcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgMSwgaGFzTWF0ZXJpYWwgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgMiwgaGFzRmFjZVV2ICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDMsIGhhc0ZhY2VWZXJ0ZXhVdiApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA0LCBoYXNGYWNlTm9ybWFsICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDUsIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNiwgaGFzRmFjZUNvbG9yICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDcsIGhhc0ZhY2VWZXJ0ZXhDb2xvciApO1xuXG5cdFx0XHRmYWNlcy5wdXNoKCBmYWNlVHlwZSApO1xuXHRcdFx0ZmFjZXMucHVzaCggZmFjZS5hLCBmYWNlLmIsIGZhY2UuYyApO1xuXHRcdFx0ZmFjZXMucHVzaCggZmFjZS5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2ICkge1xuXG5cdFx0XHRcdHZhciBmYWNlVmVydGV4VXZzID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF1bIGkgXTtcblxuXHRcdFx0XHRmYWNlcy5wdXNoKFxuXHRcdFx0XHRcdGdldFV2SW5kZXgoIGZhY2VWZXJ0ZXhVdnNbIDAgXSApLFxuXHRcdFx0XHRcdGdldFV2SW5kZXgoIGZhY2VWZXJ0ZXhVdnNbIDEgXSApLFxuXHRcdFx0XHRcdGdldFV2SW5kZXgoIGZhY2VWZXJ0ZXhVdnNbIDIgXSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlTm9ybWFsICkge1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goIGdldE5vcm1hbEluZGV4KCBmYWNlLm5vcm1hbCApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Tm9ybWFsICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goXG5cdFx0XHRcdFx0Z2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDAgXSApLFxuXHRcdFx0XHRcdGdldE5vcm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAxIF0gKSxcblx0XHRcdFx0XHRnZXROb3JtYWxJbmRleCggdmVydGV4Tm9ybWFsc1sgMiBdIClcblx0XHRcdFx0KTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VDb2xvciApIHtcblxuXHRcdFx0XHRmYWNlcy5wdXNoKCBnZXRDb2xvckluZGV4KCBmYWNlLmNvbG9yICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhDb2xvciApIHtcblxuXHRcdFx0XHR2YXIgdmVydGV4Q29sb3JzID0gZmFjZS52ZXJ0ZXhDb2xvcnM7XG5cblx0XHRcdFx0ZmFjZXMucHVzaChcblx0XHRcdFx0XHRnZXRDb2xvckluZGV4KCB2ZXJ0ZXhDb2xvcnNbIDAgXSApLFxuXHRcdFx0XHRcdGdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMSBdICksXG5cdFx0XHRcdFx0Z2V0Q29sb3JJbmRleCggdmVydGV4Q29sb3JzWyAyIF0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzZXRCaXQoIHZhbHVlLCBwb3NpdGlvbiwgZW5hYmxlZCApIHtcblxuXHRcdFx0cmV0dXJuIGVuYWJsZWQgPyB2YWx1ZSB8ICggMSA8PCBwb3NpdGlvbiApIDogdmFsdWUgJiAoIH4gKCAxIDw8IHBvc2l0aW9uICkgKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldE5vcm1hbEluZGV4KCBub3JtYWwgKSB7XG5cblx0XHRcdHZhciBoYXNoID0gbm9ybWFsLngudG9TdHJpbmcoKSArIG5vcm1hbC55LnRvU3RyaW5nKCkgKyBub3JtYWwuei50b1N0cmluZygpO1xuXG5cdFx0XHRpZiAoIG5vcm1hbHNIYXNoWyBoYXNoIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbm9ybWFsc0hhc2hbIGhhc2ggXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRub3JtYWxzSGFzaFsgaGFzaCBdID0gbm9ybWFscy5sZW5ndGggLyAzO1xuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdHJldHVybiBub3JtYWxzSGFzaFsgaGFzaCBdO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0Q29sb3JJbmRleCggY29sb3IgKSB7XG5cblx0XHRcdHZhciBoYXNoID0gY29sb3Iuci50b1N0cmluZygpICsgY29sb3IuZy50b1N0cmluZygpICsgY29sb3IuYi50b1N0cmluZygpO1xuXG5cdFx0XHRpZiAoIGNvbG9yc0hhc2hbIGhhc2ggXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBjb2xvcnNIYXNoWyBoYXNoIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Y29sb3JzSGFzaFsgaGFzaCBdID0gY29sb3JzLmxlbmd0aDtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5nZXRIZXgoKSApO1xuXG5cdFx0XHRyZXR1cm4gY29sb3JzSGFzaFsgaGFzaCBdO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0VXZJbmRleCggdXYgKSB7XG5cblx0XHRcdHZhciBoYXNoID0gdXYueC50b1N0cmluZygpICsgdXYueS50b1N0cmluZygpO1xuXG5cdFx0XHRpZiAoIHV2c0hhc2hbIGhhc2ggXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiB1dnNIYXNoWyBoYXNoIF07XG5cblx0XHRcdH1cblxuXHRcdFx0dXZzSGFzaFsgaGFzaCBdID0gdXZzLmxlbmd0aCAvIDI7XG5cdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdFx0XHRyZXR1cm4gdXZzSGFzaFsgaGFzaCBdO1xuXG5cdFx0fVxuXG5cdFx0ZGF0YS5kYXRhID0ge307XG5cblx0XHRkYXRhLmRhdGEudmVydGljZXMgPSB2ZXJ0aWNlcztcblx0XHRkYXRhLmRhdGEubm9ybWFscyA9IG5vcm1hbHM7XG5cdFx0aWYgKCBjb2xvcnMubGVuZ3RoID4gMCApIGRhdGEuZGF0YS5jb2xvcnMgPSBjb2xvcnM7XG5cdFx0aWYgKCB1dnMubGVuZ3RoID4gMCApIGRhdGEuZGF0YS51dnMgPSBbIHV2cyBdOyAvLyB0ZW1wb3JhbCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5cdFx0ZGF0YS5kYXRhLmZhY2VzID0gZmFjZXM7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvKlxuXHRcdCAvLyBIYW5kbGUgcHJpbWl0aXZlc1xuXG5cdFx0IHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xuXG5cdFx0IGlmICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0IHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdCBmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHQgdmFsdWVzLnB1c2goIHBhcmFtZXRlcnNbIGtleSBdICk7XG5cblx0XHQgfVxuXG5cdFx0IHZhciBnZW9tZXRyeSA9IE9iamVjdC5jcmVhdGUoIHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlICk7XG5cdFx0IHRoaXMuY29uc3RydWN0b3IuYXBwbHkoIGdlb21ldHJ5LCB2YWx1ZXMgKTtcblx0XHQgcmV0dXJuIGdlb21ldHJ5O1xuXG5cdFx0IH1cblxuXHRcdCByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cdFx0ICovXG5cblx0XHRyZXR1cm4gbmV3IEdlb21ldHJ5KCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR2YXIgaSwgaWwsIGosIGpsLCBrLCBrbDtcblxuXHRcdC8vIHJlc2V0XG5cblx0XHR0aGlzLnZlcnRpY2VzID0gW107XG5cdFx0dGhpcy5jb2xvcnMgPSBbXTtcblx0XHR0aGlzLmZhY2VzID0gW107XG5cdFx0dGhpcy5mYWNlVmVydGV4VXZzID0gW1tdXTtcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IFtdO1xuXHRcdHRoaXMubW9ycGhOb3JtYWxzID0gW107XG5cdFx0dGhpcy5za2luV2VpZ2h0cyA9IFtdO1xuXHRcdHRoaXMuc2tpbkluZGljZXMgPSBbXTtcblx0XHR0aGlzLmxpbmVEaXN0YW5jZXMgPSBbXTtcblx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHRcdC8vIG5hbWVcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXG5cdFx0Ly8gdmVydGljZXNcblxuXHRcdHZhciB2ZXJ0aWNlcyA9IHNvdXJjZS52ZXJ0aWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnZlcnRpY2VzLnB1c2goIHZlcnRpY2VzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gY29sb3JzXG5cblx0XHR2YXIgY29sb3JzID0gc291cmNlLmNvbG9ycztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IGNvbG9ycy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5jb2xvcnMucHVzaCggY29sb3JzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZmFjZXNcblxuXHRcdHZhciBmYWNlcyA9IHNvdXJjZS5mYWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmZhY2VzLnB1c2goIGZhY2VzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZmFjZSB2ZXJ0ZXggdXZzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBzb3VyY2UuZmFjZVZlcnRleFV2cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSBzb3VyY2UuZmFjZVZlcnRleFV2c1sgaSBdO1xuXG5cdFx0XHRpZiAoIHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGhpcy5mYWNlVmVydGV4VXZzWyBpIF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBqID0gMCwgamwgPSBmYWNlVmVydGV4VXZzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdHZhciB1dnMgPSBmYWNlVmVydGV4VXZzWyBqIF0sIHV2c0NvcHkgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBrID0gMCwga2wgPSB1dnMubGVuZ3RoOyBrIDwga2w7IGsgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgdXYgPSB1dnNbIGsgXTtcblxuXHRcdFx0XHRcdHV2c0NvcHkucHVzaCggdXYuY2xvbmUoKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXS5wdXNoKCB1dnNDb3B5ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIG1vcnBoIHRhcmdldHNcblxuXHRcdHZhciBtb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbW9ycGhUYXJnZXQgPSB7fTtcblx0XHRcdG1vcnBoVGFyZ2V0Lm5hbWUgPSBtb3JwaFRhcmdldHNbIGkgXS5uYW1lO1xuXG5cdFx0XHQvLyB2ZXJ0aWNlc1xuXG5cdFx0XHRpZiAoIG1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXQudmVydGljZXMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBqID0gMCwgamwgPSBtb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdG1vcnBoVGFyZ2V0LnZlcnRpY2VzLnB1c2goIG1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzWyBqIF0uY2xvbmUoKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBub3JtYWxzXG5cblx0XHRcdGlmICggbW9ycGhUYXJnZXRzWyBpIF0ubm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0Lm5vcm1hbHMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBqID0gMCwgamwgPSBtb3JwaFRhcmdldHNbIGkgXS5ub3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0bW9ycGhUYXJnZXQubm9ybWFscy5wdXNoKCBtb3JwaFRhcmdldHNbIGkgXS5ub3JtYWxzWyBqIF0uY2xvbmUoKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0cy5wdXNoKCBtb3JwaFRhcmdldCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggbm9ybWFsc1xuXG5cdFx0dmFyIG1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBtb3JwaE5vcm1hbHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBtb3JwaE5vcm1hbCA9IHt9O1xuXG5cdFx0XHQvLyB2ZXJ0ZXggbm9ybWFsc1xuXG5cdFx0XHRpZiAoIG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaE5vcm1hbC52ZXJ0ZXhOb3JtYWxzID0gW107XG5cblx0XHRcdFx0Zm9yICggaiA9IDAsIGpsID0gbW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdHZhciBzcmNWZXJ0ZXhOb3JtYWwgPSBtb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzWyBqIF07XG5cdFx0XHRcdFx0dmFyIGRlc3RWZXJ0ZXhOb3JtYWwgPSB7fTtcblxuXHRcdFx0XHRcdGRlc3RWZXJ0ZXhOb3JtYWwuYSA9IHNyY1ZlcnRleE5vcm1hbC5hLmNsb25lKCk7XG5cdFx0XHRcdFx0ZGVzdFZlcnRleE5vcm1hbC5iID0gc3JjVmVydGV4Tm9ybWFsLmIuY2xvbmUoKTtcblx0XHRcdFx0XHRkZXN0VmVydGV4Tm9ybWFsLmMgPSBzcmNWZXJ0ZXhOb3JtYWwuYy5jbG9uZSgpO1xuXG5cdFx0XHRcdFx0bW9ycGhOb3JtYWwudmVydGV4Tm9ybWFscy5wdXNoKCBkZXN0VmVydGV4Tm9ybWFsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGZhY2Ugbm9ybWFsc1xuXG5cdFx0XHRpZiAoIG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bW9ycGhOb3JtYWwuZmFjZU5vcm1hbHMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBqID0gMCwgamwgPSBtb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdG1vcnBoTm9ybWFsLmZhY2VOb3JtYWxzLnB1c2goIG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzWyBqIF0uY2xvbmUoKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoTm9ybWFscy5wdXNoKCBtb3JwaE5vcm1hbCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbiB3ZWlnaHRzXG5cblx0XHR2YXIgc2tpbldlaWdodHMgPSBzb3VyY2Uuc2tpbldlaWdodHM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBza2luV2VpZ2h0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5za2luV2VpZ2h0cy5wdXNoKCBza2luV2VpZ2h0c1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIHNraW4gaW5kaWNlc1xuXG5cdFx0dmFyIHNraW5JbmRpY2VzID0gc291cmNlLnNraW5JbmRpY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gc2tpbkluZGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuc2tpbkluZGljZXMucHVzaCggc2tpbkluZGljZXNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBsaW5lIGRpc3RhbmNlc1xuXG5cdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBzb3VyY2UubGluZURpc3RhbmNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IGxpbmVEaXN0YW5jZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMubGluZURpc3RhbmNlcy5wdXNoKCBsaW5lRGlzdGFuY2VzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIGJveFxuXG5cdFx0dmFyIGJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94O1xuXG5cdFx0aWYgKCBib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBzcGhlcmVcblxuXHRcdHZhciBib3VuZGluZ1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZTtcblxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIGZsYWdzXG5cblx0XHR0aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZSA9IHNvdXJjZS5lbGVtZW50c05lZWRVcGRhdGU7XG5cdFx0dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBzb3VyY2UudmVydGljZXNOZWVkVXBkYXRlO1xuXHRcdHRoaXMudXZzTmVlZFVwZGF0ZSA9IHNvdXJjZS51dnNOZWVkVXBkYXRlO1xuXHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBzb3VyY2Uubm9ybWFsc05lZWRVcGRhdGU7XG5cdFx0dGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gc291cmNlLmNvbG9yc05lZWRVcGRhdGU7XG5cdFx0dGhpcy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZSA9IHNvdXJjZS5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmdyb3Vwc05lZWRVcGRhdGUgPSBzb3VyY2UuZ3JvdXBzTmVlZFVwZGF0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIGFycmF5ICkgKSB7XG5cblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7XG5cblx0fVxuXG5cdHRoaXMubmFtZSA9ICcnO1xuXG5cdHRoaXMuYXJyYXkgPSBhcnJheTtcblx0dGhpcy5pdGVtU2l6ZSA9IGl0ZW1TaXplO1xuXHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIGl0ZW1TaXplIDogMDtcblx0dGhpcy5ub3JtYWxpemVkID0gbm9ybWFsaXplZCA9PT0gdHJ1ZTtcblxuXHR0aGlzLmR5bmFtaWMgPSBmYWxzZTtcblx0dGhpcy51cGRhdGVSYW5nZSA9IHsgb2Zmc2V0OiAwLCBjb3VudDogLSAxIH07XG5cblx0dGhpcy52ZXJzaW9uID0gMDtcblxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsICduZWVkc1VwZGF0ZScsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7XG5cblx0aXNCdWZmZXJBdHRyaWJ1dGU6IHRydWUsXG5cblx0b25VcGxvYWRDYWxsYmFjazogZnVuY3Rpb24gKCkge30sXG5cblx0c2V0QXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGFycmF5ICkgKSB7XG5cblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gdGhpcy5pdGVtU2l6ZSA6IDA7XG5cdFx0dGhpcy5hcnJheSA9IGFycmF5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXREeW5hbWljOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5keW5hbWljID0gdmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cdFx0dGhpcy5hcnJheSA9IG5ldyBzb3VyY2UuYXJyYXkuY29uc3RydWN0b3IoIHNvdXJjZS5hcnJheSApO1xuXHRcdHRoaXMuaXRlbVNpemUgPSBzb3VyY2UuaXRlbVNpemU7XG5cdFx0dGhpcy5jb3VudCA9IHNvdXJjZS5jb3VudDtcblx0XHR0aGlzLm5vcm1hbGl6ZWQgPSBzb3VyY2Uubm9ybWFsaXplZDtcblxuXHRcdHRoaXMuZHluYW1pYyA9IHNvdXJjZS5keW5hbWljO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5QXQ6IGZ1bmN0aW9uICggaW5kZXgxLCBhdHRyaWJ1dGUsIGluZGV4MiApIHtcblxuXHRcdGluZGV4MSAqPSB0aGlzLml0ZW1TaXplO1xuXHRcdGluZGV4MiAqPSBhdHRyaWJ1dGUuaXRlbVNpemU7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLml0ZW1TaXplOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5hcnJheVsgaW5kZXgxICsgaSBdID0gYXR0cmlidXRlLmFycmF5WyBpbmRleDIgKyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdHRoaXMuYXJyYXkuc2V0KCBhcnJheSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5Q29sb3JzQXJyYXk6IGZ1bmN0aW9uICggY29sb3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNvbG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY29sb3IgPSBjb2xvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5Q29sb3JzQXJyYXkoKTogY29sb3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHRjb2xvciA9IG5ldyBDb2xvcigpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLnI7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5nO1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gY29sb3IuYjtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVZlY3RvcjJzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyApIHtcblxuXHRcdHZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07XG5cblx0XHRcdGlmICggdmVjdG9yID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Iyc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBpICk7XG5cdFx0XHRcdHZlY3RvciA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLng7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVZlY3RvcjNzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyApIHtcblxuXHRcdHZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07XG5cblx0XHRcdGlmICggdmVjdG9yID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBpICk7XG5cdFx0XHRcdHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLng7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci56O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5VmVjdG9yNHNBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjRzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjQoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLno7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IudztcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlLCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMuYXJyYXkuc2V0KCB2YWx1ZSwgb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplIF07XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIGluZGV4LCB4ICkge1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplIF0gPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRZOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXTtcblxuXHR9LFxuXG5cdHNldFk6IGZ1bmN0aW9uICggaW5kZXgsIHkgKSB7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAxIF0gPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRaOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDIgXTtcblxuXHR9LFxuXG5cdHNldFo6IGZ1bmN0aW9uICggaW5kZXgsIHogKSB7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAyIF0gPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRXOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMgXTtcblxuXHR9LFxuXG5cdHNldFc6IGZ1bmN0aW9uICggaW5kZXgsIHcgKSB7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAzIF0gPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWTogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWVo6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHogKSB7XG5cblx0XHRpbmRleCAqPSB0aGlzLml0ZW1TaXplO1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWlc6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHosIHcgKSB7XG5cblx0XHRpbmRleCAqPSB0aGlzLml0ZW1TaXplO1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAzIF0gPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRvblVwbG9hZDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHRoaXMub25VcGxvYWRDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmFycmF5LCB0aGlzLml0ZW1TaXplICkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5mdW5jdGlvbiBJbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBJbnQ4QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuSW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5JbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludDhCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gVWludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQ4QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuVWludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuVWludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDhCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50OENsYW1wZWRBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBJbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5JbnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5JbnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQxNkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQxNkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cblVpbnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDE2QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIEludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBJbnQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cbkludDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkludDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludDMyQnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuVWludDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50MzJCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgRmxvYXQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cbkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGbG9hdDMyQnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEZsb2F0NjRBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5GbG9hdDY0QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIERpcmVjdEdlb21ldHJ5KCkge1xuXG5cdHRoaXMudmVydGljZXMgPSBbXTtcblx0dGhpcy5ub3JtYWxzID0gW107XG5cdHRoaXMuY29sb3JzID0gW107XG5cdHRoaXMudXZzID0gW107XG5cdHRoaXMudXZzMiA9IFtdO1xuXG5cdHRoaXMuZ3JvdXBzID0gW107XG5cblx0dGhpcy5tb3JwaFRhcmdldHMgPSB7fTtcblxuXHR0aGlzLnNraW5XZWlnaHRzID0gW107XG5cdHRoaXMuc2tpbkluZGljZXMgPSBbXTtcblxuXHQvLyB0aGlzLmxpbmVEaXN0YW5jZXMgPSBbXTtcblxuXHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0Ly8gdXBkYXRlIGZsYWdzXG5cblx0dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy51dnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIERpcmVjdEdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGNvbXB1dGVHcm91cHM6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgZ3JvdXA7XG5cdFx0dmFyIGdyb3VwcyA9IFtdO1xuXHRcdHZhciBtYXRlcmlhbEluZGV4ID0gdW5kZWZpbmVkO1xuXG5cdFx0dmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBmYWNlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0Ly8gbWF0ZXJpYWxzXG5cblx0XHRcdGlmICggZmFjZS5tYXRlcmlhbEluZGV4ICE9PSBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsSW5kZXggPSBmYWNlLm1hdGVyaWFsSW5kZXg7XG5cblx0XHRcdFx0aWYgKCBncm91cCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Z3JvdXAuY291bnQgPSAoIGkgKiAzICkgLSBncm91cC5zdGFydDtcblx0XHRcdFx0XHRncm91cHMucHVzaCggZ3JvdXAgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z3JvdXAgPSB7XG5cdFx0XHRcdFx0c3RhcnQ6IGkgKiAzLFxuXHRcdFx0XHRcdG1hdGVyaWFsSW5kZXg6IG1hdGVyaWFsSW5kZXhcblx0XHRcdFx0fTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBncm91cCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRncm91cC5jb3VudCA9ICggaSAqIDMgKSAtIGdyb3VwLnN0YXJ0O1xuXHRcdFx0Z3JvdXBzLnB1c2goIGdyb3VwICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmdyb3VwcyA9IGdyb3VwcztcblxuXHR9LFxuXG5cdGZyb21HZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzO1xuXHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXHRcdHZhciBmYWNlVmVydGV4VXZzID0gZ2VvbWV0cnkuZmFjZVZlcnRleFV2cztcblxuXHRcdHZhciBoYXNGYWNlVmVydGV4VXYgPSBmYWNlVmVydGV4VXZzWyAwIF0gJiYgZmFjZVZlcnRleFV2c1sgMCBdLmxlbmd0aCA+IDA7XG5cdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhVdjIgPSBmYWNlVmVydGV4VXZzWyAxIF0gJiYgZmFjZVZlcnRleFV2c1sgMSBdLmxlbmd0aCA+IDA7XG5cblx0XHQvLyBtb3JwaHNcblxuXHRcdHZhciBtb3JwaFRhcmdldHMgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHM7XG5cdFx0dmFyIG1vcnBoVGFyZ2V0c0xlbmd0aCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7XG5cblx0XHR2YXIgbW9ycGhUYXJnZXRzUG9zaXRpb247XG5cblx0XHRpZiAoIG1vcnBoVGFyZ2V0c0xlbmd0aCA+IDAgKSB7XG5cblx0XHRcdG1vcnBoVGFyZ2V0c1Bvc2l0aW9uID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG1vcnBoVGFyZ2V0c0xlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRtb3JwaFRhcmdldHNQb3NpdGlvblsgaSBdID0gW107XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldHMucG9zaXRpb24gPSBtb3JwaFRhcmdldHNQb3NpdGlvbjtcblxuXHRcdH1cblxuXHRcdHZhciBtb3JwaE5vcm1hbHMgPSBnZW9tZXRyeS5tb3JwaE5vcm1hbHM7XG5cdFx0dmFyIG1vcnBoTm9ybWFsc0xlbmd0aCA9IG1vcnBoTm9ybWFscy5sZW5ndGg7XG5cblx0XHR2YXIgbW9ycGhUYXJnZXRzTm9ybWFsO1xuXG5cdFx0aWYgKCBtb3JwaE5vcm1hbHNMZW5ndGggPiAwICkge1xuXG5cdFx0XHRtb3JwaFRhcmdldHNOb3JtYWwgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbW9ycGhOb3JtYWxzTGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0c05vcm1hbFsgaSBdID0gW107XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldHMubm9ybWFsID0gbW9ycGhUYXJnZXRzTm9ybWFsO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbnNcblxuXHRcdHZhciBza2luSW5kaWNlcyA9IGdlb21ldHJ5LnNraW5JbmRpY2VzO1xuXHRcdHZhciBza2luV2VpZ2h0cyA9IGdlb21ldHJ5LnNraW5XZWlnaHRzO1xuXG5cdFx0dmFyIGhhc1NraW5JbmRpY2VzID0gc2tpbkluZGljZXMubGVuZ3RoID09PSB2ZXJ0aWNlcy5sZW5ndGg7XG5cdFx0dmFyIGhhc1NraW5XZWlnaHRzID0gc2tpbldlaWdodHMubGVuZ3RoID09PSB2ZXJ0aWNlcy5sZW5ndGg7XG5cblx0XHQvL1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZmFjZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdHRoaXMudmVydGljZXMucHVzaCggdmVydGljZXNbIGZhY2UuYSBdLCB2ZXJ0aWNlc1sgZmFjZS5iIF0sIHZlcnRpY2VzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscztcblxuXHRcdFx0aWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHtcblxuXHRcdFx0XHR0aGlzLm5vcm1hbHMucHVzaCggdmVydGV4Tm9ybWFsc1sgMCBdLCB2ZXJ0ZXhOb3JtYWxzWyAxIF0sIHZlcnRleE5vcm1hbHNbIDIgXSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBub3JtYWwgPSBmYWNlLm5vcm1hbDtcblxuXHRcdFx0XHR0aGlzLm5vcm1hbHMucHVzaCggbm9ybWFsLCBub3JtYWwsIG5vcm1hbCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB2ZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9ycztcblxuXHRcdFx0aWYgKCB2ZXJ0ZXhDb2xvcnMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHRoaXMuY29sb3JzLnB1c2goIHZlcnRleENvbG9yc1sgMCBdLCB2ZXJ0ZXhDb2xvcnNbIDEgXSwgdmVydGV4Q29sb3JzWyAyIF0gKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2YXIgY29sb3IgPSBmYWNlLmNvbG9yO1xuXG5cdFx0XHRcdHRoaXMuY29sb3JzLnB1c2goIGNvbG9yLCBjb2xvciwgY29sb3IgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGV4VXZzID0gZmFjZVZlcnRleFV2c1sgMCBdWyBpIF07XG5cblx0XHRcdFx0aWYgKCB2ZXJ0ZXhVdnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRoaXMudXZzLnB1c2goIHZlcnRleFV2c1sgMCBdLCB2ZXJ0ZXhVdnNbIDEgXSwgdmVydGV4VXZzWyAyIF0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRGlyZWN0R2VvbWV0cnkuZnJvbUdlb21ldHJ5KCk6IFVuZGVmaW5lZCB2ZXJ0ZXhVdiAnLCBpICk7XG5cblx0XHRcdFx0XHR0aGlzLnV2cy5wdXNoKCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2MiA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGV4VXZzID0gZmFjZVZlcnRleFV2c1sgMSBdWyBpIF07XG5cblx0XHRcdFx0aWYgKCB2ZXJ0ZXhVdnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRoaXMudXZzMi5wdXNoKCB2ZXJ0ZXhVdnNbIDAgXSwgdmVydGV4VXZzWyAxIF0sIHZlcnRleFV2c1sgMiBdICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkRpcmVjdEdlb21ldHJ5LmZyb21HZW9tZXRyeSgpOiBVbmRlZmluZWQgdmVydGV4VXYyICcsIGkgKTtcblxuXHRcdFx0XHRcdHRoaXMudXZzMi5wdXNoKCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpLCBuZXcgVmVjdG9yMigpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG1vcnBoc1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBtb3JwaFRhcmdldHNMZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIG1vcnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzWyBqIF0udmVydGljZXM7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzUG9zaXRpb25bIGogXS5wdXNoKCBtb3JwaFRhcmdldFsgZmFjZS5hIF0sIG1vcnBoVGFyZ2V0WyBmYWNlLmIgXSwgbW9ycGhUYXJnZXRbIGZhY2UuYyBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgbW9ycGhOb3JtYWxzTGVuZ3RoOyBqICsrICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaE5vcm1hbCA9IG1vcnBoTm9ybWFsc1sgaiBdLnZlcnRleE5vcm1hbHNbIGkgXTtcblxuXHRcdFx0XHRtb3JwaFRhcmdldHNOb3JtYWxbIGogXS5wdXNoKCBtb3JwaE5vcm1hbC5hLCBtb3JwaE5vcm1hbC5iLCBtb3JwaE5vcm1hbC5jICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc2tpbnNcblxuXHRcdFx0aWYgKCBoYXNTa2luSW5kaWNlcyApIHtcblxuXHRcdFx0XHR0aGlzLnNraW5JbmRpY2VzLnB1c2goIHNraW5JbmRpY2VzWyBmYWNlLmEgXSwgc2tpbkluZGljZXNbIGZhY2UuYiBdLCBza2luSW5kaWNlc1sgZmFjZS5jIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc1NraW5XZWlnaHRzICkge1xuXG5cdFx0XHRcdHRoaXMuc2tpbldlaWdodHMucHVzaCggc2tpbldlaWdodHNbIGZhY2UuYSBdLCBza2luV2VpZ2h0c1sgZmFjZS5iIF0sIHNraW5XZWlnaHRzWyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLmNvbXB1dGVHcm91cHMoIGdlb21ldHJ5ICk7XG5cblx0XHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGU7XG5cdFx0dGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLnV2c05lZWRVcGRhdGUgPSBnZW9tZXRyeS51dnNOZWVkVXBkYXRlO1xuXHRcdHRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIGFycmF5TWF4KCBhcnJheSApIHtcblxuXHRpZiAoIGFycmF5Lmxlbmd0aCA9PT0gMCApIHJldHVybiAtIEluZmluaXR5O1xuXG5cdHZhciBtYXggPSBhcnJheVsgMCBdO1xuXG5cdGZvciAoIHZhciBpID0gMSwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7ICsrIGkgKSB7XG5cblx0XHRpZiAoIGFycmF5WyBpIF0gPiBtYXggKSBtYXggPSBhcnJheVsgaSBdO1xuXG5cdH1cblxuXHRyZXR1cm4gbWF4O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIGJ1ZmZlckdlb21ldHJ5SWQgPSAxOyAvLyBCdWZmZXJHZW9tZXRyeSB1c2VzIG9kZCBudW1iZXJzIGFzIElkXG5cbmZ1bmN0aW9uIEJ1ZmZlckdlb21ldHJ5KCkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogYnVmZmVyR2VvbWV0cnlJZCArPSAyIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ0J1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLmluZGV4ID0gbnVsbDtcblx0dGhpcy5hdHRyaWJ1dGVzID0ge307XG5cblx0dGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fTtcblxuXHR0aGlzLmdyb3VwcyA9IFtdO1xuXG5cdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHR0aGlzLmRyYXdSYW5nZSA9IHsgc3RhcnQ6IDAsIGNvdW50OiBJbmZpbml0eSB9O1xuXG59XG5cbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBCdWZmZXJHZW9tZXRyeSxcblxuXHRpc0J1ZmZlckdlb21ldHJ5OiB0cnVlLFxuXG5cdGdldEluZGV4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5pbmRleDtcblxuXHR9LFxuXG5cdHNldEluZGV4OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBpbmRleCApICkge1xuXG5cdFx0XHR0aGlzLmluZGV4ID0gbmV3ICggYXJyYXlNYXgoIGluZGV4ICkgPiA2NTUzNSA/IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSA6IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSApKCBpbmRleCwgMSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5pbmRleCA9IGluZGV4O1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0YWRkQXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUsIGF0dHJpYnV0ZSApIHtcblxuXHRcdGlmICggISAoIGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUuaXNCdWZmZXJBdHRyaWJ1dGUgKSAmJiAhICggYXR0cmlidXRlICYmIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkQXR0cmlidXRlKCkgbm93IGV4cGVjdHMgKCBuYW1lLCBhdHRyaWJ1dGUgKS4nICk7XG5cblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCBuYW1lLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcmd1bWVudHNbIDEgXSwgYXJndW1lbnRzWyAyIF0gKSApO1xuXG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIG5hbWUgPT09ICdpbmRleCcgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmFkZEF0dHJpYnV0ZTogVXNlIC5zZXRJbmRleCgpIGZvciBpbmRleCBhdHRyaWJ1dGUuJyApO1xuXHRcdFx0dGhpcy5zZXRJbmRleCggYXR0cmlidXRlICk7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdID0gYXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRBdHRyaWJ1dGU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdHJldHVybiB0aGlzLmF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHR9LFxuXG5cdHJlbW92ZUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0ZGVsZXRlIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRHcm91cDogZnVuY3Rpb24gKCBzdGFydCwgY291bnQsIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHR0aGlzLmdyb3Vwcy5wdXNoKCB7XG5cblx0XHRcdHN0YXJ0OiBzdGFydCxcblx0XHRcdGNvdW50OiBjb3VudCxcblx0XHRcdG1hdGVyaWFsSW5kZXg6IG1hdGVyaWFsSW5kZXggIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsSW5kZXggOiAwXG5cblx0XHR9ICk7XG5cblx0fSxcblxuXHRjbGVhckdyb3VwczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5ncm91cHMgPSBbXTtcblxuXHR9LFxuXG5cdHNldERyYXdSYW5nZTogZnVuY3Rpb24gKCBzdGFydCwgY291bnQgKSB7XG5cblx0XHR0aGlzLmRyYXdSYW5nZS5zdGFydCA9IHN0YXJ0O1xuXHRcdHRoaXMuZHJhd1JhbmdlLmNvdW50ID0gY291bnQ7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXHRcdFx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG5vcm1hbCA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRpZiAoIG5vcm1hbCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0XHRub3JtYWxNYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggbm9ybWFsICk7XG5cdFx0XHRub3JtYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVYOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHgtYXhpc1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVYKCBhbmdsZSApIHtcblxuXHRcdFx0bTEubWFrZVJvdGF0aW9uWCggYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHktYXhpc1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVZKCBhbmdsZSApIHtcblxuXHRcdFx0bTEubWFrZVJvdGF0aW9uWSggYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHotYXhpc1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVaKCBhbmdsZSApIHtcblxuXHRcdFx0bTEubWFrZVJvdGF0aW9uWiggYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRyYW5zbGF0ZSBnZW9tZXRyeVxuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGUoIHgsIHksIHogKSB7XG5cblx0XHRcdG0xLm1ha2VUcmFuc2xhdGlvbiggeCwgeSwgeiApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBzY2FsZSBnZW9tZXRyeVxuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzY2FsZSggeCwgeSwgeiApIHtcblxuXHRcdFx0bTEubWFrZVNjYWxlKCB4LCB5LCB6ICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bG9va0F0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2JqID0gbmV3IE9iamVjdDNEKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCB2ZWN0b3IgKSB7XG5cblx0XHRcdG9iai5sb29rQXQoIHZlY3RvciApO1xuXG5cdFx0XHRvYmoudXBkYXRlTWF0cml4KCk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG9iai5tYXRyaXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9mZnNldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2VudGVyKCkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlciggb2Zmc2V0ICkubmVnYXRlKCk7XG5cblx0XHRcdHRoaXMudHJhbnNsYXRlKCBvZmZzZXQueCwgb2Zmc2V0LnksIG9mZnNldC56ICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2V0RnJvbU9iamVjdDogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LnNldEZyb21PYmplY3QoKS4gQ29udmVydGluZycsIG9iamVjdCwgdGhpcyApO1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBvYmplY3QuaXNQb2ludHMgfHwgb2JqZWN0LmlzTGluZSApIHtcblxuXHRcdFx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKiAzLCAzICk7XG5cdFx0XHR2YXIgY29sb3JzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGggKiAzLCAzICk7XG5cblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBwb3NpdGlvbnMuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICkgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnY29sb3InLCBjb2xvcnMuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKSApO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMgJiYgZ2VvbWV0cnkubGluZURpc3RhbmNlcy5sZW5ndGggPT09IGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCApIHtcblxuXHRcdFx0XHR2YXIgbGluZURpc3RhbmNlcyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5saW5lRGlzdGFuY2VzLmxlbmd0aCwgMSApO1xuXG5cdFx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnbGluZURpc3RhbmNlJywgbGluZURpc3RhbmNlcy5jb3B5QXJyYXkoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTWVzaCApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHRoaXMuZnJvbUdlb21ldHJ5KCBnZW9tZXRyeSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHBvaW50ID0gcG9pbnRzWyBpIF07XG5cdFx0XHRwb3NpdGlvbi5wdXNoKCBwb2ludC54LCBwb2ludC55LCBwb2ludC56IHx8IDAgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIDMgKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1cGRhdGVGcm9tT2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdGlmICggb2JqZWN0LmlzTWVzaCApIHtcblxuXHRcdFx0dmFyIGRpcmVjdCA9IGdlb21ldHJ5Ll9fZGlyZWN0R2VvbWV0cnk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuZWxlbWVudHNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdGRpcmVjdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0Z2VvbWV0cnkuZWxlbWVudHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBkaXJlY3QgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mcm9tR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZGlyZWN0LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZTtcblx0XHRcdGRpcmVjdC5ub3JtYWxzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlO1xuXHRcdFx0ZGlyZWN0LmNvbG9yc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlO1xuXHRcdFx0ZGlyZWN0LnV2c05lZWRVcGRhdGUgPSBnZW9tZXRyeS51dnNOZWVkVXBkYXRlO1xuXHRcdFx0ZGlyZWN0Lmdyb3Vwc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5ncm91cHNOZWVkVXBkYXRlO1xuXG5cdFx0XHRnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdFx0XHRnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdFx0XHRnZW9tZXRyeS51dnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdFx0XHRnZW9tZXRyeS5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHRcdGdlb21ldHJ5ID0gZGlyZWN0O1xuXG5cdFx0fVxuXG5cdFx0dmFyIGF0dHJpYnV0ZTtcblxuXHRcdGlmICggZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS52ZXJ0aWNlcyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMgKTtcblx0XHRcdFx0YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMuY29sb3I7XG5cblx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSggZ2VvbWV0cnkuY29sb3JzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS51dnNOZWVkVXBkYXRlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMudXY7XG5cblx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlLmNvcHlWZWN0b3Iyc0FycmF5KCBnZW9tZXRyeS51dnMgKTtcblx0XHRcdFx0YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS51dnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMubGluZURpc3RhbmNlO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5jb3B5QXJyYXkoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMgKTtcblx0XHRcdFx0YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ncm91cHNOZWVkVXBkYXRlICkge1xuXG5cdFx0XHRnZW9tZXRyeS5jb21wdXRlR3JvdXBzKCBvYmplY3QuZ2VvbWV0cnkgKTtcblx0XHRcdHRoaXMuZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRnZW9tZXRyeS5ncm91cHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGZyb21HZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdGdlb21ldHJ5Ll9fZGlyZWN0R2VvbWV0cnkgPSBuZXcgRGlyZWN0R2VvbWV0cnkoKS5mcm9tR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0XHRyZXR1cm4gdGhpcy5mcm9tRGlyZWN0R2VvbWV0cnkoIGdlb21ldHJ5Ll9fZGlyZWN0R2VvbWV0cnkgKTtcblxuXHR9LFxuXG5cdGZyb21EaXJlY3RHZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKiAzICk7XG5cdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS52ZXJ0aWNlcyApICk7XG5cblx0XHRpZiAoIGdlb21ldHJ5Lm5vcm1hbHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIG5vcm1hbHMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS5ub3JtYWxzLmxlbmd0aCAqIDMgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS5ub3JtYWxzICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS5jb2xvcnMubGVuZ3RoICogMyApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApLmNvcHlDb2xvcnNBcnJheSggZ2VvbWV0cnkuY29sb3JzICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkudXZzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciB1dnMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS51dnMubGVuZ3RoICogMiApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApLmNvcHlWZWN0b3Iyc0FycmF5KCBnZW9tZXRyeS51dnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS51dnMyLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciB1dnMyID0gbmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0cnkudXZzMi5sZW5ndGggKiAyICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2MicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHV2czIsIDIgKS5jb3B5VmVjdG9yMnNBcnJheSggZ2VvbWV0cnkudXZzMiApICk7XG5cblx0XHR9XG5cblx0XHQvLyBncm91cHNcblxuXHRcdHRoaXMuZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0Ly8gbW9ycGhzXG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBnZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdHZhciBhcnJheSA9IFtdO1xuXHRcdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgbmFtZSBdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGkgXTtcblxuXHRcdFx0XHR2YXIgYXR0cmlidXRlID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG1vcnBoVGFyZ2V0Lmxlbmd0aCAqIDMsIDMgKTtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIG1vcnBoVGFyZ2V0ICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoQXR0cmlidXRlc1sgbmFtZSBdID0gYXJyYXk7XG5cblx0XHR9XG5cblx0XHQvLyBza2lubmluZ1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgc2tpbkluZGljZXMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoICogNCwgNCApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdza2luSW5kZXgnLCBza2luSW5kaWNlcy5jb3B5VmVjdG9yNHNBcnJheSggZ2VvbWV0cnkuc2tpbkluZGljZXMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgc2tpbldlaWdodHMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoICogNCwgNCApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdza2luV2VpZ2h0Jywgc2tpbldlaWdodHMuY29weVZlY3RvcjRzQXJyYXkoIGdlb21ldHJ5LnNraW5XZWlnaHRzICkgKTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb21wdXRlQm91bmRpbmdCb3g6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IG5ldyBCb3gzKCk7XG5cblx0XHR9XG5cblx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24gKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi54ICkgfHwgaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnkgKSB8fCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueiApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94OiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlIFwicG9zaXRpb25cIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlQm91bmRpbmdTcGhlcmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBib3ggPSBuZXcgQm94MygpO1xuXHRcdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpIHtcblxuXHRcdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHRpZiAoIHBvc2l0aW9uICkge1xuXG5cdFx0XHRcdHZhciBjZW50ZXIgPSB0aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtcblxuXHRcdFx0XHRib3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24gKTtcblx0XHRcdFx0Ym94LmdldENlbnRlciggY2VudGVyICk7XG5cblx0XHRcdFx0Ly8gaG9waW5nIHRvIGZpbmQgYSBib3VuZGluZ1NwaGVyZSB3aXRoIGEgcmFkaXVzIHNtYWxsZXIgdGhhbiB0aGVcblx0XHRcdFx0Ly8gYm91bmRpbmdTcGhlcmUgb2YgdGhlIGJvdW5kaW5nQm94OiBzcXJ0KDMpIHNtYWxsZXIgaW4gdGhlIGJlc3QgY2FzZVxuXG5cdFx0XHRcdHZhciBtYXhSYWRpdXNTcSA9IDA7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHBvc2l0aW9uLmNvdW50OyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2ZWN0b3IueCA9IHBvc2l0aW9uLmdldFgoIGkgKTtcblx0XHRcdFx0XHR2ZWN0b3IueSA9IHBvc2l0aW9uLmdldFkoIGkgKTtcblx0XHRcdFx0XHR2ZWN0b3IueiA9IHBvc2l0aW9uLmdldFooIGkgKTtcblx0XHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCB2ZWN0b3IgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cyA9IE1hdGguc3FydCggbWF4UmFkaXVzU3EgKTtcblxuXHRcdFx0XHRpZiAoIGlzTmFOKCB0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cyApICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgXCJwb3NpdGlvblwiIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsIHRoaXMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNvbXB1dGVGYWNlTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuXHR9LFxuXG5cdGNvbXB1dGVWZXJ0ZXhOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW5kZXggPSB0aGlzLmluZGV4O1xuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXHRcdHZhciBncm91cHMgPSB0aGlzLmdyb3VwcztcblxuXHRcdGlmICggYXR0cmlidXRlcy5wb3NpdGlvbiApIHtcblxuXHRcdFx0dmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XG5cblx0XHRcdGlmICggYXR0cmlidXRlcy5ub3JtYWwgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIHBvc2l0aW9ucy5sZW5ndGggKSwgMyApICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gcmVzZXQgZXhpc3Rpbmcgbm9ybWFscyB0byB6ZXJvXG5cblx0XHRcdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlcy5ub3JtYWwuYXJyYXk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0YXJyYXlbIGkgXSA9IDA7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBub3JtYWxzID0gYXR0cmlidXRlcy5ub3JtYWwuYXJyYXk7XG5cblx0XHRcdHZhciB2QSwgdkIsIHZDO1xuXHRcdFx0dmFyIHBBID0gbmV3IFZlY3RvcjMoKSwgcEIgPSBuZXcgVmVjdG9yMygpLCBwQyA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgY2IgPSBuZXcgVmVjdG9yMygpLCBhYiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdC8vIGluZGV4ZWQgZWxlbWVudHNcblxuXHRcdFx0aWYgKCBpbmRleCApIHtcblxuXHRcdFx0XHR2YXIgaW5kaWNlcyA9IGluZGV4LmFycmF5O1xuXG5cdFx0XHRcdGlmICggZ3JvdXBzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0XHRcdHRoaXMuYWRkR3JvdXAoIDAsIGluZGljZXMubGVuZ3RoICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBncm91cHMubGVuZ3RoOyBqIDwgamw7ICsrIGogKSB7XG5cblx0XHRcdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGogXTtcblxuXHRcdFx0XHRcdHZhciBzdGFydCA9IGdyb3VwLnN0YXJ0O1xuXHRcdFx0XHRcdHZhciBjb3VudCA9IGdyb3VwLmNvdW50O1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSBzdGFydCwgaWwgPSBzdGFydCArIGNvdW50OyBpIDwgaWw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdFx0dkEgPSBpbmRpY2VzWyBpICsgMCBdICogMztcblx0XHRcdFx0XHRcdHZCID0gaW5kaWNlc1sgaSArIDEgXSAqIDM7XG5cdFx0XHRcdFx0XHR2QyA9IGluZGljZXNbIGkgKyAyIF0gKiAzO1xuXG5cdFx0XHRcdFx0XHRwQS5mcm9tQXJyYXkoIHBvc2l0aW9ucywgdkEgKTtcblx0XHRcdFx0XHRcdHBCLmZyb21BcnJheSggcG9zaXRpb25zLCB2QiApO1xuXHRcdFx0XHRcdFx0cEMuZnJvbUFycmF5KCBwb3NpdGlvbnMsIHZDICk7XG5cblx0XHRcdFx0XHRcdGNiLnN1YlZlY3RvcnMoIHBDLCBwQiApO1xuXHRcdFx0XHRcdFx0YWIuc3ViVmVjdG9ycyggcEEsIHBCICk7XG5cdFx0XHRcdFx0XHRjYi5jcm9zcyggYWIgKTtcblxuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkEgXSArPSBjYi54O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkEgKyAxIF0gKz0gY2IueTtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZBICsgMiBdICs9IGNiLno7XG5cblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZCIF0gKz0gY2IueDtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZCICsgMSBdICs9IGNiLnk7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QiArIDIgXSArPSBjYi56O1xuXG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QyBdICs9IGNiLng7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QyArIDEgXSArPSBjYi55O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkMgKyAyIF0gKz0gY2IuejtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gbm9uLWluZGV4ZWQgZWxlbWVudHMgKHVuY29ubmVjdGVkIHRyaWFuZ2xlIHNvdXApXG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBpbDsgaSArPSA5ICkge1xuXG5cdFx0XHRcdFx0cEEuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKTtcblx0XHRcdFx0XHRwQi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSArIDMgKTtcblx0XHRcdFx0XHRwQy5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSArIDYgKTtcblxuXHRcdFx0XHRcdGNiLnN1YlZlY3RvcnMoIHBDLCBwQiApO1xuXHRcdFx0XHRcdGFiLnN1YlZlY3RvcnMoIHBBLCBwQiApO1xuXHRcdFx0XHRcdGNiLmNyb3NzKCBhYiApO1xuXG5cdFx0XHRcdFx0bm9ybWFsc1sgaSBdID0gY2IueDtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgMSBdID0gY2IueTtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgMiBdID0gY2IuejtcblxuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyAzIF0gPSBjYi54O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyA0IF0gPSBjYi55O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyA1IF0gPSBjYi56O1xuXG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDYgXSA9IGNiLng7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDcgXSA9IGNiLnk7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDggXSA9IGNiLno7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubm9ybWFsaXplTm9ybWFscygpO1xuXG5cdFx0XHRhdHRyaWJ1dGVzLm5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fSxcblxuXHRtZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCAhICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkJ1ZmZlckdlb21ldHJ5LicsIGdlb21ldHJ5ICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRvZmZzZXQgPSAwO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBPdmVyd3JpdGluZyBvcmlnaW5hbCBnZW9tZXRyeSwgc3RhcnRpbmcgYXQgb2Zmc2V0PTAuICdcblx0XHRcdFx0KyAnVXNlIEJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VCdWZmZXJHZW9tZXRyaWVzKCkgZm9yIGxvc3NsZXNzIG1lcmdlLidcblx0XHRcdCk7XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5hdHRyaWJ1dGVzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUxID0gYXR0cmlidXRlc1sga2V5IF07XG5cdFx0XHR2YXIgYXR0cmlidXRlQXJyYXkxID0gYXR0cmlidXRlMS5hcnJheTtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZTIgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdHZhciBhdHRyaWJ1dGVBcnJheTIgPSBhdHRyaWJ1dGUyLmFycmF5O1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlU2l6ZSA9IGF0dHJpYnV0ZTIuaXRlbVNpemU7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaiA9IGF0dHJpYnV0ZVNpemUgKiBvZmZzZXQ7IGkgPCBhdHRyaWJ1dGVBcnJheTIubGVuZ3RoOyBpICsrLCBqICsrICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZUFycmF5MVsgaiBdID0gYXR0cmlidXRlQXJyYXkyWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbm9ybWFsaXplTm9ybWFscygpIHtcblxuXHRcdFx0dmFyIG5vcm1hbHMgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbm9ybWFscy5jb3VudDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHZlY3Rvci54ID0gbm9ybWFscy5nZXRYKCBpICk7XG5cdFx0XHRcdHZlY3Rvci55ID0gbm9ybWFscy5nZXRZKCBpICk7XG5cdFx0XHRcdHZlY3Rvci56ID0gbm9ybWFscy5nZXRaKCBpICk7XG5cblx0XHRcdFx0dmVjdG9yLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdG5vcm1hbHMuc2V0WFlaKCBpLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRvTm9uSW5kZXhlZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdHZhciBnZW9tZXRyeTIgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRcdHZhciBpbmRpY2VzID0gdGhpcy5pbmRleC5hcnJheTtcblx0XHR2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRcdHZhciBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTtcblx0XHRcdHZhciBpdGVtU2l6ZSA9IGF0dHJpYnV0ZS5pdGVtU2l6ZTtcblxuXHRcdFx0dmFyIGFycmF5MiA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvciggaW5kaWNlcy5sZW5ndGggKiBpdGVtU2l6ZSApO1xuXG5cdFx0XHR2YXIgaW5kZXggPSAwLCBpbmRleDIgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbmRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzWyBpIF0gKiBpdGVtU2l6ZTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBpdGVtU2l6ZTsgaiArKyApIHtcblxuXHRcdFx0XHRcdGFycmF5MlsgaW5kZXgyICsrIF0gPSBhcnJheVsgaW5kZXggKysgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkyLmFkZEF0dHJpYnV0ZSggbmFtZSwgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXkyLCBpdGVtU2l6ZSApICk7XG5cblx0XHR9XG5cblx0XHR2YXIgZ3JvdXBzID0gdGhpcy5ncm91cHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHRnZW9tZXRyeTIuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdlb21ldHJ5MjtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdCdWZmZXJHZW9tZXRyeScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ0J1ZmZlckdlb21ldHJ5LnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gc3RhbmRhcmQgQnVmZmVyR2VvbWV0cnkgc2VyaWFsaXphdGlvblxuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XG5cblx0XHRpZiAoIHRoaXMucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdFx0Zm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkge1xuXG5cdFx0XHRcdGlmICggcGFyYW1ldGVyc1sga2V5IF0gIT09IHVuZGVmaW5lZCApIGRhdGFbIGtleSBdID0gcGFyYW1ldGVyc1sga2V5IF07XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cblx0XHR9XG5cblx0XHRkYXRhLmRhdGEgPSB7IGF0dHJpYnV0ZXM6IHt9IH07XG5cblx0XHR2YXIgaW5kZXggPSB0aGlzLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGluZGV4LmFycmF5ICk7XG5cblx0XHRcdGRhdGEuZGF0YS5pbmRleCA9IHtcblx0XHRcdFx0dHlwZTogaW5kZXguYXJyYXkuY29uc3RydWN0b3IubmFtZSxcblx0XHRcdFx0YXJyYXk6IGFycmF5XG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcblxuXHRcdFx0dmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGF0dHJpYnV0ZS5hcnJheSApO1xuXG5cdFx0XHRkYXRhLmRhdGEuYXR0cmlidXRlc1sga2V5IF0gPSB7XG5cdFx0XHRcdGl0ZW1TaXplOiBhdHRyaWJ1dGUuaXRlbVNpemUsXG5cdFx0XHRcdHR5cGU6IGF0dHJpYnV0ZS5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLFxuXHRcdFx0XHRhcnJheTogYXJyYXksXG5cdFx0XHRcdG5vcm1hbGl6ZWQ6IGF0dHJpYnV0ZS5ub3JtYWxpemVkXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0dmFyIGdyb3VwcyA9IHRoaXMuZ3JvdXBzO1xuXG5cdFx0aWYgKCBncm91cHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0ZGF0YS5kYXRhLmdyb3VwcyA9IEpTT04ucGFyc2UoIEpTT04uc3RyaW5naWZ5KCBncm91cHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGJvdW5kaW5nU3BoZXJlID0gdGhpcy5ib3VuZGluZ1NwaGVyZTtcblxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdGRhdGEuZGF0YS5ib3VuZGluZ1NwaGVyZSA9IHtcblx0XHRcdFx0Y2VudGVyOiBib3VuZGluZ1NwaGVyZS5jZW50ZXIudG9BcnJheSgpLFxuXHRcdFx0XHRyYWRpdXM6IGJvdW5kaW5nU3BoZXJlLnJhZGl1c1xuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8qXG5cdFx0IC8vIEhhbmRsZSBwcmltaXRpdmVzXG5cblx0XHQgdmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XG5cblx0XHQgaWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHQgdmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0IGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdCB2YWx1ZXMucHVzaCggcGFyYW1ldGVyc1sga2V5IF0gKTtcblxuXHRcdCB9XG5cblx0XHQgdmFyIGdlb21ldHJ5ID0gT2JqZWN0LmNyZWF0ZSggdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgKTtcblx0XHQgdGhpcy5jb25zdHJ1Y3Rvci5hcHBseSggZ2VvbWV0cnksIHZhbHVlcyApO1xuXHRcdCByZXR1cm4gZ2VvbWV0cnk7XG5cblx0XHQgfVxuXG5cdFx0IHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblx0XHQgKi9cblxuXHRcdHJldHVybiBuZXcgQnVmZmVyR2VvbWV0cnkoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHZhciBuYW1lLCBpLCBsO1xuXG5cdFx0Ly8gcmVzZXRcblxuXHRcdHRoaXMuaW5kZXggPSBudWxsO1xuXHRcdHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuXHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzID0ge307XG5cdFx0dGhpcy5ncm91cHMgPSBbXTtcblx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHRcdC8vIG5hbWVcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXG5cdFx0Ly8gaW5kZXhcblxuXHRcdHZhciBpbmRleCA9IHNvdXJjZS5pbmRleDtcblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuc2V0SW5kZXgoIGluZGV4LmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGF0dHJpYnV0ZXNcblxuXHRcdHZhciBhdHRyaWJ1dGVzID0gc291cmNlLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBuYW1lIGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBuYW1lIF07XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggbmFtZSwgYXR0cmlidXRlLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIG1vcnBoIGF0dHJpYnV0ZXNcblxuXHRcdHZhciBtb3JwaEF0dHJpYnV0ZXMgPSBzb3VyY2UubW9ycGhBdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggbmFtZSBpbiBtb3JwaEF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhcnJheSA9IFtdO1xuXHRcdFx0dmFyIG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF07IC8vIG1vcnBoQXR0cmlidXRlOiBhcnJheSBvZiBGbG9hdDMyQnVmZmVyQXR0cmlidXRlc1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0YXJyYXkucHVzaCggbW9ycGhBdHRyaWJ1dGVbIGkgXS5jbG9uZSgpICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXSA9IGFycmF5O1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ3JvdXBzXG5cblx0XHR2YXIgZ3JvdXBzID0gc291cmNlLmdyb3VwcztcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXHRcdFx0dGhpcy5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBib3hcblxuXHRcdHZhciBib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveDtcblxuXHRcdGlmICggYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYm91bmRpbmcgc3BoZXJlXG5cblx0XHR2YXIgYm91bmRpbmdTcGhlcmUgPSBzb3VyY2UuYm91bmRpbmdTcGhlcmU7XG5cblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdC8vIGRyYXcgcmFuZ2VcblxuXHRcdHRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gc291cmNlLmRyYXdSYW5nZS5zdGFydDtcblx0XHR0aGlzLmRyYXdSYW5nZS5jb3VudCA9IHNvdXJjZS5kcmF3UmFuZ2UuY291bnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIEJveEdlb21ldHJ5XG5cbmZ1bmN0aW9uIEJveEdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIGRlcHRoU2VnbWVudHMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdCb3hHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHdpZHRoOiB3aWR0aCxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRkZXB0aDogZGVwdGgsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0ZGVwdGhTZWdtZW50czogZGVwdGhTZWdtZW50c1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQm94QnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkJveEdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuQm94R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94R2VvbWV0cnk7XG5cbi8vIEJveEJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEJveEJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIGRlcHRoU2VnbWVudHMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdCb3hCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHdpZHRoOiB3aWR0aCxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRkZXB0aDogZGVwdGgsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0ZGVwdGhTZWdtZW50czogZGVwdGhTZWdtZW50c1xuXHR9O1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0d2lkdGggPSB3aWR0aCB8fCAxO1xuXHRoZWlnaHQgPSBoZWlnaHQgfHwgMTtcblx0ZGVwdGggPSBkZXB0aCB8fCAxO1xuXG5cdC8vIHNlZ21lbnRzXG5cblx0d2lkdGhTZWdtZW50cyA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCAxO1xuXHRoZWlnaHRTZWdtZW50cyA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgMTtcblx0ZGVwdGhTZWdtZW50cyA9IE1hdGguZmxvb3IoIGRlcHRoU2VnbWVudHMgKSB8fCAxO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgbnVtYmVyT2ZWZXJ0aWNlcyA9IDA7XG5cdHZhciBncm91cFN0YXJ0ID0gMDtcblxuXHQvLyBidWlsZCBlYWNoIHNpZGUgb2YgdGhlIGJveCBnZW9tZXRyeVxuXG5cdGJ1aWxkUGxhbmUoICd6JywgJ3knLCAneCcsIC0gMSwgLSAxLCBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgZGVwdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDAgKTsgLy8gcHhcblx0YnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgMSwgLSAxLCBkZXB0aCwgaGVpZ2h0LCAtIHdpZHRoLCBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMSApOyAvLyBueFxuXHRidWlsZFBsYW5lKCAneCcsICd6JywgJ3knLCAxLCAxLCB3aWR0aCwgZGVwdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMiApOyAvLyBweVxuXHRidWlsZFBsYW5lKCAneCcsICd6JywgJ3knLCAxLCAtIDEsIHdpZHRoLCBkZXB0aCwgLSBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGRlcHRoU2VnbWVudHMsIDMgKTsgLy8gbnlcblx0YnVpbGRQbGFuZSggJ3gnLCAneScsICd6JywgMSwgLSAxLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDQgKTsgLy8gcHpcblx0YnVpbGRQbGFuZSggJ3gnLCAneScsICd6JywgLSAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsIC0gZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA1ICk7IC8vIG56XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdGZ1bmN0aW9uIGJ1aWxkUGxhbmUoIHUsIHYsIHcsIHVkaXIsIHZkaXIsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBncmlkWCwgZ3JpZFksIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHR2YXIgc2VnbWVudFdpZHRoID0gd2lkdGggLyBncmlkWDtcblx0XHR2YXIgc2VnbWVudEhlaWdodCA9IGhlaWdodCAvIGdyaWRZO1xuXG5cdFx0dmFyIHdpZHRoSGFsZiA9IHdpZHRoIC8gMjtcblx0XHR2YXIgaGVpZ2h0SGFsZiA9IGhlaWdodCAvIDI7XG5cdFx0dmFyIGRlcHRoSGFsZiA9IGRlcHRoIC8gMjtcblxuXHRcdHZhciBncmlkWDEgPSBncmlkWCArIDE7XG5cdFx0dmFyIGdyaWRZMSA9IGdyaWRZICsgMTtcblxuXHRcdHZhciB2ZXJ0ZXhDb3VudGVyID0gMDtcblx0XHR2YXIgZ3JvdXBDb3VudCA9IDA7XG5cblx0XHR2YXIgaXgsIGl5O1xuXG5cdFx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0XHRmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFkxOyBpeSArKyApIHtcblxuXHRcdFx0dmFyIHkgPSBpeSAqIHNlZ21lbnRIZWlnaHQgLSBoZWlnaHRIYWxmO1xuXG5cdFx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHtcblxuXHRcdFx0XHR2YXIgeCA9IGl4ICogc2VnbWVudFdpZHRoIC0gd2lkdGhIYWxmO1xuXG5cdFx0XHRcdC8vIHNldCB2YWx1ZXMgdG8gY29ycmVjdCB2ZWN0b3IgY29tcG9uZW50XG5cblx0XHRcdFx0dmVjdG9yWyB1IF0gPSB4ICogdWRpcjtcblx0XHRcdFx0dmVjdG9yWyB2IF0gPSB5ICogdmRpcjtcblx0XHRcdFx0dmVjdG9yWyB3IF0gPSBkZXB0aEhhbGY7XG5cblx0XHRcdFx0Ly8gbm93IGFwcGx5IHZlY3RvciB0byB2ZXJ0ZXggYnVmZmVyXG5cblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHRcdC8vIHNldCB2YWx1ZXMgdG8gY29ycmVjdCB2ZWN0b3IgY29tcG9uZW50XG5cblx0XHRcdFx0dmVjdG9yWyB1IF0gPSAwO1xuXHRcdFx0XHR2ZWN0b3JbIHYgXSA9IDA7XG5cdFx0XHRcdHZlY3RvclsgdyBdID0gZGVwdGggPiAwID8gMSA6IC0gMTtcblxuXHRcdFx0XHQvLyBub3cgYXBwbHkgdmVjdG9yIHRvIG5vcm1hbCBidWZmZXJcblxuXHRcdFx0XHRub3JtYWxzLnB1c2goIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0XHQvLyB1dnNcblxuXHRcdFx0XHR1dnMucHVzaCggaXggLyBncmlkWCApO1xuXHRcdFx0XHR1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7XG5cblx0XHRcdFx0Ly8gY291bnRlcnNcblxuXHRcdFx0XHR2ZXJ0ZXhDb3VudGVyICs9IDE7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGluZGljZXNcblxuXHRcdC8vIDEuIHlvdSBuZWVkIHRocmVlIGluZGljZXMgdG8gZHJhdyBhIHNpbmdsZSBmYWNlXG5cdFx0Ly8gMi4gYSBzaW5nbGUgc2VnbWVudCBjb25zaXN0cyBvZiB0d28gZmFjZXNcblx0XHQvLyAzLiBzbyB3ZSBuZWVkIHRvIGdlbmVyYXRlIHNpeCAoMiozKSBpbmRpY2VzIHBlciBzZWdtZW50XG5cblx0XHRmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkge1xuXG5cdFx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFg7IGl4ICsrICkge1xuXG5cdFx0XHRcdHZhciBhID0gbnVtYmVyT2ZWZXJ0aWNlcyArIGl4ICsgZ3JpZFgxICogaXk7XG5cdFx0XHRcdHZhciBiID0gbnVtYmVyT2ZWZXJ0aWNlcyArIGl4ICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdFx0dmFyIGMgPSBudW1iZXJPZlZlcnRpY2VzICsgKCBpeCArIDEgKSArIGdyaWRYMSAqICggaXkgKyAxICk7XG5cdFx0XHRcdHZhciBkID0gbnVtYmVyT2ZWZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiBpeTtcblxuXHRcdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdFx0XHQvLyBpbmNyZWFzZSBjb3VudGVyXG5cblx0XHRcdFx0Z3JvdXBDb3VudCArPSA2O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0c2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIG1hdGVyaWFsSW5kZXggKTtcblxuXHRcdC8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgdmFsdWUgZm9yIGdyb3Vwc1xuXG5cdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXG5cdFx0Ly8gdXBkYXRlIHRvdGFsIG51bWJlciBvZiB2ZXJ0aWNlc1xuXG5cdFx0bnVtYmVyT2ZWZXJ0aWNlcyArPSB2ZXJ0ZXhDb3VudGVyO1xuXG5cdH1cblxufVxuXG5Cb3hCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkJveEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJveEJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFBsYW5lR2VvbWV0cnlcblxuZnVuY3Rpb24gUGxhbmVHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQbGFuZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBQbGFuZUJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblBsYW5lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5QbGFuZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBsYW5lR2VvbWV0cnk7XG5cbi8vIFBsYW5lQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gUGxhbmVCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQbGFuZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzXG5cdH07XG5cblx0d2lkdGggPSB3aWR0aCB8fCAxO1xuXHRoZWlnaHQgPSBoZWlnaHQgfHwgMTtcblxuXHR2YXIgd2lkdGhfaGFsZiA9IHdpZHRoIC8gMjtcblx0dmFyIGhlaWdodF9oYWxmID0gaGVpZ2h0IC8gMjtcblxuXHR2YXIgZ3JpZFggPSBNYXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICkgfHwgMTtcblx0dmFyIGdyaWRZID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCAxO1xuXG5cdHZhciBncmlkWDEgPSBncmlkWCArIDE7XG5cdHZhciBncmlkWTEgPSBncmlkWSArIDE7XG5cblx0dmFyIHNlZ21lbnRfd2lkdGggPSB3aWR0aCAvIGdyaWRYO1xuXHR2YXIgc2VnbWVudF9oZWlnaHQgPSBoZWlnaHQgLyBncmlkWTtcblxuXHR2YXIgaXgsIGl5O1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFkxOyBpeSArKyApIHtcblxuXHRcdHZhciB5ID0gaXkgKiBzZWdtZW50X2hlaWdodCAtIGhlaWdodF9oYWxmO1xuXG5cdFx0Zm9yICggaXggPSAwOyBpeCA8IGdyaWRYMTsgaXggKysgKSB7XG5cblx0XHRcdHZhciB4ID0gaXggKiBzZWdtZW50X3dpZHRoIC0gd2lkdGhfaGFsZjtcblxuXHRcdFx0dmVydGljZXMucHVzaCggeCwgLSB5LCAwICk7XG5cblx0XHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXG5cdFx0XHR1dnMucHVzaCggaXggLyBncmlkWCApO1xuXHRcdFx0dXZzLnB1c2goIDEgLSAoIGl5IC8gZ3JpZFkgKSApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaXkgPSAwOyBpeSA8IGdyaWRZOyBpeSArKyApIHtcblxuXHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDsgaXggKysgKSB7XG5cblx0XHRcdHZhciBhID0gaXggKyBncmlkWDEgKiBpeTtcblx0XHRcdHZhciBiID0gaXggKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0dmFyIGMgPSAoIGl4ICsgMSApICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdHZhciBkID0gKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5O1xuXG5cdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuUGxhbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBsYW5lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG52YXIgbWF0ZXJpYWxJZCA9IDA7XG5cbmZ1bmN0aW9uIE1hdGVyaWFsKCkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogbWF0ZXJpYWxJZCArKyB9ICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cdHRoaXMudHlwZSA9ICdNYXRlcmlhbCc7XG5cblx0dGhpcy5mb2cgPSB0cnVlO1xuXHR0aGlzLmxpZ2h0cyA9IHRydWU7XG5cblx0dGhpcy5ibGVuZGluZyA9IE5vcm1hbEJsZW5kaW5nO1xuXHR0aGlzLnNpZGUgPSBGcm9udFNpZGU7XG5cdHRoaXMuZmxhdFNoYWRpbmcgPSBmYWxzZTtcblx0dGhpcy52ZXJ0ZXhDb2xvcnMgPSBOb0NvbG9yczsgLy8gVEhSRUUuTm9Db2xvcnMsIFRIUkVFLlZlcnRleENvbG9ycywgVEhSRUUuRmFjZUNvbG9yc1xuXG5cdHRoaXMub3BhY2l0eSA9IDE7XG5cdHRoaXMudHJhbnNwYXJlbnQgPSBmYWxzZTtcblxuXHR0aGlzLmJsZW5kU3JjID0gU3JjQWxwaGFGYWN0b3I7XG5cdHRoaXMuYmxlbmREc3QgPSBPbmVNaW51c1NyY0FscGhhRmFjdG9yO1xuXHR0aGlzLmJsZW5kRXF1YXRpb24gPSBBZGRFcXVhdGlvbjtcblx0dGhpcy5ibGVuZFNyY0FscGhhID0gbnVsbDtcblx0dGhpcy5ibGVuZERzdEFscGhhID0gbnVsbDtcblx0dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsO1xuXG5cdHRoaXMuZGVwdGhGdW5jID0gTGVzc0VxdWFsRGVwdGg7XG5cdHRoaXMuZGVwdGhUZXN0ID0gdHJ1ZTtcblx0dGhpcy5kZXB0aFdyaXRlID0gdHJ1ZTtcblxuXHR0aGlzLmNsaXBwaW5nUGxhbmVzID0gbnVsbDtcblx0dGhpcy5jbGlwSW50ZXJzZWN0aW9uID0gZmFsc2U7XG5cdHRoaXMuY2xpcFNoYWRvd3MgPSBmYWxzZTtcblxuXHR0aGlzLnNoYWRvd1NpZGUgPSBudWxsO1xuXG5cdHRoaXMuY29sb3JXcml0ZSA9IHRydWU7XG5cblx0dGhpcy5wcmVjaXNpb24gPSBudWxsOyAvLyBvdmVycmlkZSB0aGUgcmVuZGVyZXIncyBkZWZhdWx0IHByZWNpc2lvbiBmb3IgdGhpcyBtYXRlcmlhbFxuXG5cdHRoaXMucG9seWdvbk9mZnNldCA9IGZhbHNlO1xuXHR0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgPSAwO1xuXHR0aGlzLnBvbHlnb25PZmZzZXRVbml0cyA9IDA7XG5cblx0dGhpcy5kaXRoZXJpbmcgPSBmYWxzZTtcblxuXHR0aGlzLmFscGhhVGVzdCA9IDA7XG5cdHRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gZmFsc2U7XG5cblx0dGhpcy5vdmVyZHJhdyA9IDA7IC8vIE92ZXJkcmF3biBwaXhlbHMgKHR5cGljYWxseSBiZXR3ZWVuIDAgYW5kIDEpIGZvciBmaXhpbmcgYW50aWFsaWFzaW5nIGdhcHMgaW4gQ2FudmFzUmVuZGVyZXJcblxuXHR0aGlzLnZpc2libGUgPSB0cnVlO1xuXG5cdHRoaXMudXNlckRhdGEgPSB7fTtcblxuXHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxufVxuXG5NYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTWF0ZXJpYWwsXG5cblx0aXNNYXRlcmlhbDogdHJ1ZSxcblxuXHRvbkJlZm9yZUNvbXBpbGU6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdHNldFZhbHVlczogZnVuY3Rpb24gKCB2YWx1ZXMgKSB7XG5cblx0XHRpZiAoIHZhbHVlcyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiB2YWx1ZXMgKSB7XG5cblx0XHRcdHZhciBuZXdWYWx1ZSA9IHZhbHVlc1sga2V5IF07XG5cblx0XHRcdGlmICggbmV3VmFsdWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuTWF0ZXJpYWw6ICdcIiArIGtleSArIFwiJyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLlwiICk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGZvciBiYWNrd2FyZCBjb21wYXRhYmlsaXR5IGlmIHNoYWRpbmcgaXMgc2V0IGluIHRoZSBjb25zdHJ1Y3RvclxuXHRcdFx0aWYgKCBrZXkgPT09ICdzaGFkaW5nJyApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLicgKTtcblx0XHRcdFx0dGhpcy5mbGF0U2hhZGluZyA9ICggbmV3VmFsdWUgPT09IEZsYXRTaGFkaW5nICkgPyB0cnVlIDogZmFsc2U7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBjdXJyZW50VmFsdWUgPSB0aGlzWyBrZXkgXTtcblxuXHRcdFx0aWYgKCBjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuXCIgKyB0aGlzLnR5cGUgKyBcIjogJ1wiICsga2V5ICsgXCInIGlzIG5vdCBhIHByb3BlcnR5IG9mIHRoaXMgbWF0ZXJpYWwuXCIgKTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlLmlzQ29sb3IgKSB7XG5cblx0XHRcdFx0Y3VycmVudFZhbHVlLnNldCggbmV3VmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggKCBjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlLmlzVmVjdG9yMyApICYmICggbmV3VmFsdWUgJiYgbmV3VmFsdWUuaXNWZWN0b3IzICkgKSB7XG5cblx0XHRcdFx0Y3VycmVudFZhbHVlLmNvcHkoIG5ld1ZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gJ292ZXJkcmF3JyApIHtcblxuXHRcdFx0XHQvLyBlbnN1cmUgb3ZlcmRyYXcgaXMgYmFja3dhcmRzLWNvbXBhdGlibGUgd2l0aCBsZWdhY3kgYm9vbGVhbiB0eXBlXG5cdFx0XHRcdHRoaXNbIGtleSBdID0gTnVtYmVyKCBuZXdWYWx1ZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXNbIGtleSBdID0gbmV3VmFsdWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGlzUm9vdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApO1xuXG5cdFx0aWYgKCBpc1Jvb3QgKSB7XG5cblx0XHRcdG1ldGEgPSB7XG5cdFx0XHRcdHRleHR1cmVzOiB7fSxcblx0XHRcdFx0aW1hZ2VzOiB7fVxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHZhciBkYXRhID0ge1xuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnTWF0ZXJpYWwnLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdNYXRlcmlhbC50b0pTT04nXG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8vIHN0YW5kYXJkIE1hdGVyaWFsIHNlcmlhbGl6YXRpb25cblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1lO1xuXG5cdFx0aWYgKCB0aGlzLmNvbG9yICYmIHRoaXMuY29sb3IuaXNDb2xvciApIGRhdGEuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpO1xuXG5cdFx0aWYgKCB0aGlzLnJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5yb3VnaG5lc3MgPSB0aGlzLnJvdWdobmVzcztcblx0XHRpZiAoIHRoaXMubWV0YWxuZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLm1ldGFsbmVzcyA9IHRoaXMubWV0YWxuZXNzO1xuXG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlICYmIHRoaXMuZW1pc3NpdmUuaXNDb2xvciApIGRhdGEuZW1pc3NpdmUgPSB0aGlzLmVtaXNzaXZlLmdldEhleCgpO1xuXHRcdGlmICggdGhpcy5lbWlzc2l2ZUludGVuc2l0eSAhPT0gMSApIGRhdGEuZW1pc3NpdmVJbnRlbnNpdHkgPSB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdFx0aWYgKCB0aGlzLnNwZWN1bGFyICYmIHRoaXMuc3BlY3VsYXIuaXNDb2xvciApIGRhdGEuc3BlY3VsYXIgPSB0aGlzLnNwZWN1bGFyLmdldEhleCgpO1xuXHRcdGlmICggdGhpcy5zaGluaW5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEuc2hpbmluZXNzID0gdGhpcy5zaGluaW5lc3M7XG5cdFx0aWYgKCB0aGlzLmNsZWFyQ29hdCAhPT0gdW5kZWZpbmVkICkgZGF0YS5jbGVhckNvYXQgPSB0aGlzLmNsZWFyQ29hdDtcblx0XHRpZiAoIHRoaXMuY2xlYXJDb2F0Um91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLmNsZWFyQ29hdFJvdWdobmVzcyA9IHRoaXMuY2xlYXJDb2F0Um91Z2huZXNzO1xuXG5cdFx0aWYgKCB0aGlzLm1hcCAmJiB0aGlzLm1hcC5pc1RleHR1cmUgKSBkYXRhLm1hcCA9IHRoaXMubWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0aWYgKCB0aGlzLmFscGhhTWFwICYmIHRoaXMuYWxwaGFNYXAuaXNUZXh0dXJlICkgZGF0YS5hbHBoYU1hcCA9IHRoaXMuYWxwaGFNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMubGlnaHRNYXAgJiYgdGhpcy5saWdodE1hcC5pc1RleHR1cmUgKSBkYXRhLmxpZ2h0TWFwID0gdGhpcy5saWdodE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5idW1wTWFwICYmIHRoaXMuYnVtcE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuYnVtcE1hcCA9IHRoaXMuYnVtcE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdFx0ZGF0YS5idW1wU2NhbGUgPSB0aGlzLmJ1bXBTY2FsZTtcblxuXHRcdH1cblx0XHRpZiAoIHRoaXMubm9ybWFsTWFwICYmIHRoaXMubm9ybWFsTWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5ub3JtYWxNYXAgPSB0aGlzLm5vcm1hbE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdFx0ZGF0YS5ub3JtYWxTY2FsZSA9IHRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpO1xuXG5cdFx0fVxuXHRcdGlmICggdGhpcy5kaXNwbGFjZW1lbnRNYXAgJiYgdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudE1hcCA9IHRoaXMuZGlzcGxhY2VtZW50TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudFNjYWxlID0gdGhpcy5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50QmlhcyA9IHRoaXMuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblx0XHRpZiAoIHRoaXMucm91Z2huZXNzTWFwICYmIHRoaXMucm91Z2huZXNzTWFwLmlzVGV4dHVyZSApIGRhdGEucm91Z2huZXNzTWFwID0gdGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMubWV0YWxuZXNzTWFwICYmIHRoaXMubWV0YWxuZXNzTWFwLmlzVGV4dHVyZSApIGRhdGEubWV0YWxuZXNzTWFwID0gdGhpcy5tZXRhbG5lc3NNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblxuXHRcdGlmICggdGhpcy5lbWlzc2l2ZU1hcCAmJiB0aGlzLmVtaXNzaXZlTWFwLmlzVGV4dHVyZSApIGRhdGEuZW1pc3NpdmVNYXAgPSB0aGlzLmVtaXNzaXZlTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0aWYgKCB0aGlzLnNwZWN1bGFyTWFwICYmIHRoaXMuc3BlY3VsYXJNYXAuaXNUZXh0dXJlICkgZGF0YS5zcGVjdWxhck1hcCA9IHRoaXMuc3BlY3VsYXJNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblxuXHRcdGlmICggdGhpcy5lbnZNYXAgJiYgdGhpcy5lbnZNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmVudk1hcCA9IHRoaXMuZW52TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLnJlZmxlY3Rpdml0eSA9IHRoaXMucmVmbGVjdGl2aXR5OyAvLyBTY2FsZSBiZWhpbmQgZW52TWFwXG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZ3JhZGllbnRNYXAgJiYgdGhpcy5ncmFkaWVudE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuZ3JhZGllbnRNYXAgPSB0aGlzLmdyYWRpZW50TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuc2l6ZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaXplID0gdGhpcy5zaXplO1xuXHRcdGlmICggdGhpcy5zaXplQXR0ZW51YXRpb24gIT09IHVuZGVmaW5lZCApIGRhdGEuc2l6ZUF0dGVudWF0aW9uID0gdGhpcy5zaXplQXR0ZW51YXRpb247XG5cblx0XHRpZiAoIHRoaXMuYmxlbmRpbmcgIT09IE5vcm1hbEJsZW5kaW5nICkgZGF0YS5ibGVuZGluZyA9IHRoaXMuYmxlbmRpbmc7XG5cdFx0aWYgKCB0aGlzLmZsYXRTaGFkaW5nID09PSB0cnVlICkgZGF0YS5mbGF0U2hhZGluZyA9IHRoaXMuZmxhdFNoYWRpbmc7XG5cdFx0aWYgKCB0aGlzLnNpZGUgIT09IEZyb250U2lkZSApIGRhdGEuc2lkZSA9IHRoaXMuc2lkZTtcblx0XHRpZiAoIHRoaXMudmVydGV4Q29sb3JzICE9PSBOb0NvbG9ycyApIGRhdGEudmVydGV4Q29sb3JzID0gdGhpcy52ZXJ0ZXhDb2xvcnM7XG5cblx0XHRpZiAoIHRoaXMub3BhY2l0eSA8IDEgKSBkYXRhLm9wYWNpdHkgPSB0aGlzLm9wYWNpdHk7XG5cdFx0aWYgKCB0aGlzLnRyYW5zcGFyZW50ID09PSB0cnVlICkgZGF0YS50cmFuc3BhcmVudCA9IHRoaXMudHJhbnNwYXJlbnQ7XG5cblx0XHRkYXRhLmRlcHRoRnVuYyA9IHRoaXMuZGVwdGhGdW5jO1xuXHRcdGRhdGEuZGVwdGhUZXN0ID0gdGhpcy5kZXB0aFRlc3Q7XG5cdFx0ZGF0YS5kZXB0aFdyaXRlID0gdGhpcy5kZXB0aFdyaXRlO1xuXG5cdFx0Ly8gcm90YXRpb24gKFNwcml0ZU1hdGVyaWFsKVxuXHRcdGlmICggdGhpcy5yb3RhdGlvbiAhPT0gMCApIGRhdGEucm90YXRpb24gPSB0aGlzLnJvdGF0aW9uO1xuXG5cdFx0aWYgKCB0aGlzLmxpbmV3aWR0aCAhPT0gMSApIGRhdGEubGluZXdpZHRoID0gdGhpcy5saW5ld2lkdGg7XG5cdFx0aWYgKCB0aGlzLmRhc2hTaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLmRhc2hTaXplID0gdGhpcy5kYXNoU2l6ZTtcblx0XHRpZiAoIHRoaXMuZ2FwU2l6ZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5nYXBTaXplID0gdGhpcy5nYXBTaXplO1xuXHRcdGlmICggdGhpcy5zY2FsZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5zY2FsZSA9IHRoaXMuc2NhbGU7XG5cblx0XHRpZiAoIHRoaXMuZGl0aGVyaW5nID09PSB0cnVlICkgZGF0YS5kaXRoZXJpbmcgPSB0cnVlO1xuXG5cdFx0aWYgKCB0aGlzLmFscGhhVGVzdCA+IDAgKSBkYXRhLmFscGhhVGVzdCA9IHRoaXMuYWxwaGFUZXN0O1xuXHRcdGlmICggdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSBkYXRhLnByZW11bHRpcGxpZWRBbHBoYSA9IHRoaXMucHJlbXVsdGlwbGllZEFscGhhO1xuXG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZSA9PT0gdHJ1ZSApIGRhdGEud2lyZWZyYW1lID0gdGhpcy53aXJlZnJhbWU7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA+IDEgKSBkYXRhLndpcmVmcmFtZUxpbmV3aWR0aCA9IHRoaXMud2lyZWZyYW1lTGluZXdpZHRoO1xuXHRcdGlmICggdGhpcy53aXJlZnJhbWVMaW5lY2FwICE9PSAncm91bmQnICkgZGF0YS53aXJlZnJhbWVMaW5lY2FwID0gdGhpcy53aXJlZnJhbWVMaW5lY2FwO1xuXHRcdGlmICggdGhpcy53aXJlZnJhbWVMaW5lam9pbiAhPT0gJ3JvdW5kJyApIGRhdGEud2lyZWZyYW1lTGluZWpvaW4gPSB0aGlzLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdFx0aWYgKCB0aGlzLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIGRhdGEubW9ycGhUYXJnZXRzID0gdHJ1ZTtcblx0XHRpZiAoIHRoaXMuc2tpbm5pbmcgPT09IHRydWUgKSBkYXRhLnNraW5uaW5nID0gdHJ1ZTtcblxuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIGRhdGEudmlzaWJsZSA9IGZhbHNlO1xuXHRcdGlmICggSlNPTi5zdHJpbmdpZnkoIHRoaXMudXNlckRhdGEgKSAhPT0gJ3t9JyApIGRhdGEudXNlckRhdGEgPSB0aGlzLnVzZXJEYXRhO1xuXG5cdFx0Ly8gVE9ETzogQ29waWVkIGZyb20gT2JqZWN0M0QudG9KU09OXG5cblx0XHRmdW5jdGlvbiBleHRyYWN0RnJvbUNhY2hlKCBjYWNoZSApIHtcblxuXHRcdFx0dmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIGNhY2hlICkge1xuXG5cdFx0XHRcdHZhciBkYXRhID0gY2FjaGVbIGtleSBdO1xuXHRcdFx0XHRkZWxldGUgZGF0YS5tZXRhZGF0YTtcblx0XHRcdFx0dmFsdWVzLnB1c2goIGRhdGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWVzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBpc1Jvb3QgKSB7XG5cblx0XHRcdHZhciB0ZXh0dXJlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEudGV4dHVyZXMgKTtcblx0XHRcdHZhciBpbWFnZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmltYWdlcyApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmVzLmxlbmd0aCA+IDAgKSBkYXRhLnRleHR1cmVzID0gdGV4dHVyZXM7XG5cdFx0XHRpZiAoIGltYWdlcy5sZW5ndGggPiAwICkgZGF0YS5pbWFnZXMgPSBpbWFnZXM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXG5cdFx0dGhpcy5mb2cgPSBzb3VyY2UuZm9nO1xuXHRcdHRoaXMubGlnaHRzID0gc291cmNlLmxpZ2h0cztcblxuXHRcdHRoaXMuYmxlbmRpbmcgPSBzb3VyY2UuYmxlbmRpbmc7XG5cdFx0dGhpcy5zaWRlID0gc291cmNlLnNpZGU7XG5cdFx0dGhpcy5mbGF0U2hhZGluZyA9IHNvdXJjZS5mbGF0U2hhZGluZztcblx0XHR0aGlzLnZlcnRleENvbG9ycyA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnM7XG5cblx0XHR0aGlzLm9wYWNpdHkgPSBzb3VyY2Uub3BhY2l0eTtcblx0XHR0aGlzLnRyYW5zcGFyZW50ID0gc291cmNlLnRyYW5zcGFyZW50O1xuXG5cdFx0dGhpcy5ibGVuZFNyYyA9IHNvdXJjZS5ibGVuZFNyYztcblx0XHR0aGlzLmJsZW5kRHN0ID0gc291cmNlLmJsZW5kRHN0O1xuXHRcdHRoaXMuYmxlbmRFcXVhdGlvbiA9IHNvdXJjZS5ibGVuZEVxdWF0aW9uO1xuXHRcdHRoaXMuYmxlbmRTcmNBbHBoYSA9IHNvdXJjZS5ibGVuZFNyY0FscGhhO1xuXHRcdHRoaXMuYmxlbmREc3RBbHBoYSA9IHNvdXJjZS5ibGVuZERzdEFscGhhO1xuXHRcdHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhID0gc291cmNlLmJsZW5kRXF1YXRpb25BbHBoYTtcblxuXHRcdHRoaXMuZGVwdGhGdW5jID0gc291cmNlLmRlcHRoRnVuYztcblx0XHR0aGlzLmRlcHRoVGVzdCA9IHNvdXJjZS5kZXB0aFRlc3Q7XG5cdFx0dGhpcy5kZXB0aFdyaXRlID0gc291cmNlLmRlcHRoV3JpdGU7XG5cblx0XHR0aGlzLmNvbG9yV3JpdGUgPSBzb3VyY2UuY29sb3JXcml0ZTtcblxuXHRcdHRoaXMucHJlY2lzaW9uID0gc291cmNlLnByZWNpc2lvbjtcblxuXHRcdHRoaXMucG9seWdvbk9mZnNldCA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0O1xuXHRcdHRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0RmFjdG9yO1xuXHRcdHRoaXMucG9seWdvbk9mZnNldFVuaXRzID0gc291cmNlLnBvbHlnb25PZmZzZXRVbml0cztcblxuXHRcdHRoaXMuZGl0aGVyaW5nID0gc291cmNlLmRpdGhlcmluZztcblxuXHRcdHRoaXMuYWxwaGFUZXN0ID0gc291cmNlLmFscGhhVGVzdDtcblx0XHR0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9IHNvdXJjZS5wcmVtdWx0aXBsaWVkQWxwaGE7XG5cblx0XHR0aGlzLm92ZXJkcmF3ID0gc291cmNlLm92ZXJkcmF3O1xuXG5cdFx0dGhpcy52aXNpYmxlID0gc291cmNlLnZpc2libGU7XG5cdFx0dGhpcy51c2VyRGF0YSA9IEpTT04ucGFyc2UoIEpTT04uc3RyaW5naWZ5KCBzb3VyY2UudXNlckRhdGEgKSApO1xuXG5cdFx0dGhpcy5jbGlwU2hhZG93cyA9IHNvdXJjZS5jbGlwU2hhZG93cztcblx0XHR0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBzb3VyY2UuY2xpcEludGVyc2VjdGlvbjtcblxuXHRcdHZhciBzcmNQbGFuZXMgPSBzb3VyY2UuY2xpcHBpbmdQbGFuZXMsXG5cdFx0XHRkc3RQbGFuZXMgPSBudWxsO1xuXG5cdFx0aWYgKCBzcmNQbGFuZXMgIT09IG51bGwgKSB7XG5cblx0XHRcdHZhciBuID0gc3JjUGxhbmVzLmxlbmd0aDtcblx0XHRcdGRzdFBsYW5lcyA9IG5ldyBBcnJheSggbiApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKVxuXHRcdFx0XHRkc3RQbGFuZXNbIGkgXSA9IHNyY1BsYW5lc1sgaSBdLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNsaXBwaW5nUGxhbmVzID0gZHN0UGxhbmVzO1xuXG5cdFx0dGhpcy5zaGFkb3dTaWRlID0gc291cmNlLnNoYWRvd1NpZGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSxcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICBkZXB0aFRlc3Q6IDxib29sPixcbiAqICBkZXB0aFdyaXRlOiA8Ym9vbD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hCYXNpY01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaEJhc2ljTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGVtaXNzaXZlXG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuYW9NYXAgPSBudWxsO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMuZW52TWFwID0gbnVsbDtcblx0dGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gMTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4O1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hCYXNpY01hdGVyaWFsO1xuXG5NZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoQmFzaWNNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XG5cdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBkZWZpbmVzOiB7IFwibGFiZWxcIiA6IFwidmFsdWVcIiB9LFxuICogIHVuaWZvcm1zOiB7IFwicGFyYW1ldGVyMVwiOiB7IHZhbHVlOiAxLjAgfSwgXCJwYXJhbWV0ZXIyXCI6IHsgdmFsdWUyOiAyIH0gfSxcbiAqXG4gKiAgZnJhZ21lbnRTaGFkZXI6IDxzdHJpbmc+LFxuICogIHZlcnRleFNoYWRlcjogPHN0cmluZz4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgbGlnaHRzOiA8Ym9vbD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBTaGFkZXJNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYWRlck1hdGVyaWFsJztcblxuXHR0aGlzLmRlZmluZXMgPSB7fTtcblx0dGhpcy51bmlmb3JtcyA9IHt9O1xuXG5cdHRoaXMudmVydGV4U2hhZGVyID0gJ3ZvaWQgbWFpbigpIHtcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XFxufSc7XG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSAndm9pZCBtYWluKCkge1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDEuMCwgMC4wLCAwLjAsIDEuMCApO1xcbn0nO1xuXG5cdHRoaXMubGluZXdpZHRoID0gMTtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBzY2VuZSBmb2dcblx0dGhpcy5saWdodHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBzY2VuZSBsaWdodHNcblx0dGhpcy5jbGlwcGluZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHVzZXItZGVmaW5lZCBjbGlwcGluZyBwbGFuZXNcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2tpbm5pbmcgYXR0cmlidXRlIHN0cmVhbXNcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBtb3JwaCB0YXJnZXRzXG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7IC8vIHNldCB0byB1c2UgbW9ycGggbm9ybWFsc1xuXG5cdHRoaXMuZXh0ZW5zaW9ucyA9IHtcblx0XHRkZXJpdmF0aXZlczogZmFsc2UsIC8vIHNldCB0byB1c2UgZGVyaXZhdGl2ZXNcblx0XHRmcmFnRGVwdGg6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGZyYWdtZW50IGRlcHRoIHZhbHVlc1xuXHRcdGRyYXdCdWZmZXJzOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSBkcmF3IGJ1ZmZlcnNcblx0XHRzaGFkZXJUZXh0dXJlTE9EOiBmYWxzZSAvLyBzZXQgdG8gdXNlIHNoYWRlciB0ZXh0dXJlIExPRFxuXHR9O1xuXG5cdC8vIFdoZW4gcmVuZGVyZWQgZ2VvbWV0cnkgZG9lc24ndCBpbmNsdWRlIHRoZXNlIGF0dHJpYnV0ZXMgYnV0IHRoZSBtYXRlcmlhbCBkb2VzLFxuXHQvLyB1c2UgdGhlc2UgZGVmYXVsdCB2YWx1ZXMgaW4gV2ViR0wuIFRoaXMgYXZvaWRzIGVycm9ycyB3aGVuIGJ1ZmZlciBkYXRhIGlzIG1pc3NpbmcuXG5cdHRoaXMuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IHtcblx0XHQnY29sb3InOiBbIDEsIDEsIDEgXSxcblx0XHQndXYnOiBbIDAsIDAgXSxcblx0XHQndXYyJzogWyAwLCAwIF1cblx0fTtcblxuXHR0aGlzLmluZGV4MEF0dHJpYnV0ZU5hbWUgPSB1bmRlZmluZWQ7XG5cdHRoaXMudW5pZm9ybXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0aWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIHBhcmFtZXRlcnMuYXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdyBiZSBkZWZpbmVkIGluIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxuXHR9XG5cbn1cblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFkZXJNYXRlcmlhbDtcblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZGVyTWF0ZXJpYWwgPSB0cnVlO1xuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBzb3VyY2UuZnJhZ21lbnRTaGFkZXI7XG5cdHRoaXMudmVydGV4U2hhZGVyID0gc291cmNlLnZlcnRleFNoYWRlcjtcblxuXHR0aGlzLnVuaWZvcm1zID0gVW5pZm9ybXNVdGlscy5jbG9uZSggc291cmNlLnVuaWZvcm1zICk7XG5cblx0dGhpcy5kZWZpbmVzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5kZWZpbmVzICk7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0dGhpcy5saWdodHMgPSBzb3VyY2UubGlnaHRzO1xuXHR0aGlzLmNsaXBwaW5nID0gc291cmNlLmNsaXBwaW5nO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0dGhpcy5leHRlbnNpb25zID0gc291cmNlLmV4dGVuc2lvbnM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0dmFyIGRhdGEgPSBNYXRlcmlhbC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRkYXRhLnVuaWZvcm1zID0gdGhpcy51bmlmb3Jtcztcblx0ZGF0YS52ZXJ0ZXhTaGFkZXIgPSB0aGlzLnZlcnRleFNoYWRlcjtcblx0ZGF0YS5mcmFnbWVudFNoYWRlciA9IHRoaXMuZnJhZ21lbnRTaGFkZXI7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIFJheSggb3JpZ2luLCBkaXJlY3Rpb24gKSB7XG5cblx0dGhpcy5vcmlnaW4gPSAoIG9yaWdpbiAhPT0gdW5kZWZpbmVkICkgPyBvcmlnaW4gOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLmRpcmVjdGlvbiA9ICggZGlyZWN0aW9uICE9PSB1bmRlZmluZWQgKSA/IGRpcmVjdGlvbiA6IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUmF5LnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBvcmlnaW4sIGRpcmVjdGlvbiApIHtcblxuXHRcdHRoaXMub3JpZ2luLmNvcHkoIG9yaWdpbiApO1xuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIGRpcmVjdGlvbiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCByYXkgKSB7XG5cblx0XHR0aGlzLm9yaWdpbi5jb3B5KCByYXkub3JpZ2luICk7XG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggcmF5LmRpcmVjdGlvbiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhdDogZnVuY3Rpb24gKCB0LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5hdCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLmRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLm9yaWdpbiApO1xuXG5cdH0sXG5cblx0bG9va0F0OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLmRpcmVjdGlvbi5jb3B5KCB2ICkuc3ViKCB0aGlzLm9yaWdpbiApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyZWNhc3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmVjYXN0KCB0ICkge1xuXG5cdFx0XHR0aGlzLm9yaWdpbi5jb3B5KCB0aGlzLmF0KCB0LCB2MSApICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvc2VzdFBvaW50VG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0dmFyIGRpcmVjdGlvbkRpc3RhbmNlID0gdGFyZ2V0LmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdGlmICggZGlyZWN0aW9uRGlzdGFuY2UgPCAwICkge1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMub3JpZ2luICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIGRpcmVjdGlvbkRpc3RhbmNlICkuYWRkKCB0aGlzLm9yaWdpbiApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VTcVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICkge1xuXG5cdFx0XHR2YXIgZGlyZWN0aW9uRGlzdGFuY2UgPSB2MS5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5vcmlnaW4gKS5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRcdC8vIHBvaW50IGJlaGluZCB0aGUgcmF5XG5cblx0XHRcdGlmICggZGlyZWN0aW9uRGlzdGFuY2UgPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiB0aGlzLm9yaWdpbi5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2MS5jb3B5KCB0aGlzLmRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCBkaXJlY3Rpb25EaXN0YW5jZSApLmFkZCggdGhpcy5vcmlnaW4gKTtcblxuXHRcdFx0cmV0dXJuIHYxLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZGlzdGFuY2VTcVRvU2VnbWVudDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHNlZ0NlbnRlciA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHNlZ0RpciA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGRpZmYgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGRpc3RhbmNlU3FUb1NlZ21lbnQoIHYwLCB2MSwgb3B0aW9uYWxQb2ludE9uUmF5LCBvcHRpb25hbFBvaW50T25TZWdtZW50ICkge1xuXG5cdFx0XHQvLyBmcm9tIGh0dHA6Ly93d3cuZ2VvbWV0cmljdG9vbHMuY29tL0dURW5naW5lL0luY2x1ZGUvTWF0aGVtYXRpY3MvR3RlRGlzdFJheVNlZ21lbnQuaFxuXHRcdFx0Ly8gSXQgcmV0dXJucyB0aGUgbWluIGRpc3RhbmNlIGJldHdlZW4gdGhlIHJheSBhbmQgdGhlIHNlZ21lbnRcblx0XHRcdC8vIGRlZmluZWQgYnkgdjAgYW5kIHYxXG5cdFx0XHQvLyBJdCBjYW4gYWxzbyBzZXQgdHdvIG9wdGlvbmFsIHRhcmdldHMgOlxuXHRcdFx0Ly8gLSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgcmF5XG5cdFx0XHQvLyAtIFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSBzZWdtZW50XG5cblx0XHRcdHNlZ0NlbnRlci5jb3B5KCB2MCApLmFkZCggdjEgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cdFx0XHRzZWdEaXIuY29weSggdjEgKS5zdWIoIHYwICkubm9ybWFsaXplKCk7XG5cdFx0XHRkaWZmLmNvcHkoIHRoaXMub3JpZ2luICkuc3ViKCBzZWdDZW50ZXIgKTtcblxuXHRcdFx0dmFyIHNlZ0V4dGVudCA9IHYwLmRpc3RhbmNlVG8oIHYxICkgKiAwLjU7XG5cdFx0XHR2YXIgYTAxID0gLSB0aGlzLmRpcmVjdGlvbi5kb3QoIHNlZ0RpciApO1xuXHRcdFx0dmFyIGIwID0gZGlmZi5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cdFx0XHR2YXIgYjEgPSAtIGRpZmYuZG90KCBzZWdEaXIgKTtcblx0XHRcdHZhciBjID0gZGlmZi5sZW5ndGhTcSgpO1xuXHRcdFx0dmFyIGRldCA9IE1hdGguYWJzKCAxIC0gYTAxICogYTAxICk7XG5cdFx0XHR2YXIgczAsIHMxLCBzcXJEaXN0LCBleHREZXQ7XG5cblx0XHRcdGlmICggZGV0ID4gMCApIHtcblxuXHRcdFx0XHQvLyBUaGUgcmF5IGFuZCBzZWdtZW50IGFyZSBub3QgcGFyYWxsZWwuXG5cblx0XHRcdFx0czAgPSBhMDEgKiBiMSAtIGIwO1xuXHRcdFx0XHRzMSA9IGEwMSAqIGIwIC0gYjE7XG5cdFx0XHRcdGV4dERldCA9IHNlZ0V4dGVudCAqIGRldDtcblxuXHRcdFx0XHRpZiAoIHMwID49IDAgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHMxID49IC0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHMxIDw9IGV4dERldCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyByZWdpb24gMFxuXHRcdFx0XHRcdFx0XHQvLyBNaW5pbXVtIGF0IGludGVyaW9yIHBvaW50cyBvZiByYXkgYW5kIHNlZ21lbnQuXG5cblx0XHRcdFx0XHRcdFx0dmFyIGludkRldCA9IDEgLyBkZXQ7XG5cdFx0XHRcdFx0XHRcdHMwICo9IGludkRldDtcblx0XHRcdFx0XHRcdFx0czEgKj0gaW52RGV0O1xuXHRcdFx0XHRcdFx0XHRzcXJEaXN0ID0gczAgKiAoIHMwICsgYTAxICogczEgKyAyICogYjAgKSArIHMxICogKCBhMDEgKiBzMCArIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAxXG5cblx0XHRcdFx0XHRcdFx0czEgPSBzZWdFeHRlbnQ7XG5cdFx0XHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTtcblx0XHRcdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDVcblxuXHRcdFx0XHRcdFx0czEgPSAtIHNlZ0V4dGVudDtcblx0XHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTtcblx0XHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGlmICggczEgPD0gLSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiA0XG5cblx0XHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCAtIGEwMSAqIHNlZ0V4dGVudCArIGIwICkgKTtcblx0XHRcdFx0XHRcdHMxID0gKCBzMCA+IDAgKSA/IC0gc2VnRXh0ZW50IDogTWF0aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTtcblx0XHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzMSA8PSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAzXG5cblx0XHRcdFx0XHRcdHMwID0gMDtcblx0XHRcdFx0XHRcdHMxID0gTWF0aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTtcblx0XHRcdFx0XHRcdHNxckRpc3QgPSBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyByZWdpb24gMlxuXG5cdFx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogc2VnRXh0ZW50ICsgYjAgKSApO1xuXHRcdFx0XHRcdFx0czEgPSAoIHMwID4gMCApID8gc2VnRXh0ZW50IDogTWF0aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTtcblx0XHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIFJheSBhbmQgc2VnbWVudCBhcmUgcGFyYWxsZWwuXG5cblx0XHRcdFx0czEgPSAoIGEwMSA+IDAgKSA/IC0gc2VnRXh0ZW50IDogc2VnRXh0ZW50O1xuXHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7XG5cdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvcHRpb25hbFBvaW50T25SYXkgKSB7XG5cblx0XHRcdFx0b3B0aW9uYWxQb2ludE9uUmF5LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHMwICkuYWRkKCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggb3B0aW9uYWxQb2ludE9uU2VnbWVudCApIHtcblxuXHRcdFx0XHRvcHRpb25hbFBvaW50T25TZWdtZW50LmNvcHkoIHNlZ0RpciApLm11bHRpcGx5U2NhbGFyKCBzMSApLmFkZCggc2VnQ2VudGVyICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNxckRpc3Q7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3RTcGhlcmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0U3BoZXJlKCBzcGhlcmUsIHRhcmdldCApIHtcblxuXHRcdFx0djEuc3ViVmVjdG9ycyggc3BoZXJlLmNlbnRlciwgdGhpcy5vcmlnaW4gKTtcblx0XHRcdHZhciB0Y2EgPSB2MS5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cdFx0XHR2YXIgZDIgPSB2MS5kb3QoIHYxICkgLSB0Y2EgKiB0Y2E7XG5cdFx0XHR2YXIgcmFkaXVzMiA9IHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzO1xuXG5cdFx0XHRpZiAoIGQyID4gcmFkaXVzMiApIHJldHVybiBudWxsO1xuXG5cdFx0XHR2YXIgdGhjID0gTWF0aC5zcXJ0KCByYWRpdXMyIC0gZDIgKTtcblxuXHRcdFx0Ly8gdDAgPSBmaXJzdCBpbnRlcnNlY3QgcG9pbnQgLSBlbnRyYW5jZSBvbiBmcm9udCBvZiBzcGhlcmVcblx0XHRcdHZhciB0MCA9IHRjYSAtIHRoYztcblxuXHRcdFx0Ly8gdDEgPSBzZWNvbmQgaW50ZXJzZWN0IHBvaW50IC0gZXhpdCBwb2ludCBvbiBiYWNrIG9mIHNwaGVyZVxuXHRcdFx0dmFyIHQxID0gdGNhICsgdGhjO1xuXG5cdFx0XHQvLyB0ZXN0IHRvIHNlZSBpZiBib3RoIHQwIGFuZCB0MSBhcmUgYmVoaW5kIHRoZSByYXkgLSBpZiBzbywgcmV0dXJuIG51bGxcblx0XHRcdGlmICggdDAgPCAwICYmIHQxIDwgMCApIHJldHVybiBudWxsO1xuXG5cdFx0XHQvLyB0ZXN0IHRvIHNlZSBpZiB0MCBpcyBiZWhpbmQgdGhlIHJheTpcblx0XHRcdC8vIGlmIGl0IGlzLCB0aGUgcmF5IGlzIGluc2lkZSB0aGUgc3BoZXJlLCBzbyByZXR1cm4gdGhlIHNlY29uZCBleGl0IHBvaW50IHNjYWxlZCBieSB0MSxcblx0XHRcdC8vIGluIG9yZGVyIHRvIGFsd2F5cyByZXR1cm4gYW4gaW50ZXJzZWN0IHBvaW50IHRoYXQgaXMgaW4gZnJvbnQgb2YgdGhlIHJheS5cblx0XHRcdGlmICggdDAgPCAwICkgcmV0dXJuIHRoaXMuYXQoIHQxLCB0YXJnZXQgKTtcblxuXHRcdFx0Ly8gZWxzZSB0MCBpcyBpbiBmcm9udCBvZiB0aGUgcmF5LCBzbyByZXR1cm4gdGhlIGZpcnN0IGNvbGxpc2lvbiBwb2ludCBzY2FsZWQgYnkgdDBcblx0XHRcdHJldHVybiB0aGlzLmF0KCB0MCwgdGFyZ2V0ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHJldHVybiB0aGlzLmRpc3RhbmNlVG9Qb2ludCggc3BoZXJlLmNlbnRlciApIDw9IHNwaGVyZS5yYWRpdXM7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHR2YXIgZGVub21pbmF0b3IgPSBwbGFuZS5ub3JtYWwuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHtcblxuXHRcdFx0Ly8gbGluZSBpcyBjb3BsYW5hciwgcmV0dXJuIG9yaWdpblxuXHRcdFx0aWYgKCBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMub3JpZ2luICkgPT09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIDA7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gTnVsbCBpcyBwcmVmZXJhYmxlIHRvIHVuZGVmaW5lZCBzaW5jZSB1bmRlZmluZWQgbWVhbnMuLi4uIGl0IGlzIHVuZGVmaW5lZFxuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdHZhciB0ID0gLSAoIHRoaXMub3JpZ2luLmRvdCggcGxhbmUubm9ybWFsICkgKyBwbGFuZS5jb25zdGFudCApIC8gZGVub21pbmF0b3I7XG5cblx0XHQvLyBSZXR1cm4gaWYgdGhlIHJheSBuZXZlciBpbnRlcnNlY3RzIHRoZSBwbGFuZVxuXG5cdFx0cmV0dXJuIHQgPj0gMCA/IHQgOiBudWxsO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0UGxhbmU6IGZ1bmN0aW9uICggcGxhbmUsIHRhcmdldCApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5kaXN0YW5jZVRvUGxhbmUoIHBsYW5lICk7XG5cblx0XHRpZiAoIHQgPT09IG51bGwgKSB7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuYXQoIHQsIHRhcmdldCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0Ly8gY2hlY2sgaWYgdGhlIHJheSBsaWVzIG9uIHRoZSBwbGFuZSBmaXJzdFxuXG5cdFx0dmFyIGRpc3RUb1BvaW50ID0gcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0aWYgKCBkaXN0VG9Qb2ludCA9PT0gMCApIHtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9XG5cblx0XHR2YXIgZGVub21pbmF0b3IgPSBwbGFuZS5ub3JtYWwuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdFx0aWYgKCBkZW5vbWluYXRvciAqIGRpc3RUb1BvaW50IDwgMCApIHtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9XG5cblx0XHQvLyByYXkgb3JpZ2luIGlzIGJlaGluZCB0aGUgcGxhbmUgKGFuZCBpcyBwb2ludGluZyBiZWhpbmQgaXQpXG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RCb3g6IGZ1bmN0aW9uICggYm94LCB0YXJnZXQgKSB7XG5cblx0XHR2YXIgdG1pbiwgdG1heCwgdHltaW4sIHR5bWF4LCB0em1pbiwgdHptYXg7XG5cblx0XHR2YXIgaW52ZGlyeCA9IDEgLyB0aGlzLmRpcmVjdGlvbi54LFxuXHRcdFx0aW52ZGlyeSA9IDEgLyB0aGlzLmRpcmVjdGlvbi55LFxuXHRcdFx0aW52ZGlyeiA9IDEgLyB0aGlzLmRpcmVjdGlvbi56O1xuXG5cdFx0dmFyIG9yaWdpbiA9IHRoaXMub3JpZ2luO1xuXG5cdFx0aWYgKCBpbnZkaXJ4ID49IDAgKSB7XG5cblx0XHRcdHRtaW4gPSAoIGJveC5taW4ueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xuXHRcdFx0dG1heCA9ICggYm94Lm1heC54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0bWluID0gKCBib3gubWF4LnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblx0XHRcdHRtYXggPSAoIGJveC5taW4ueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBpbnZkaXJ5ID49IDAgKSB7XG5cblx0XHRcdHR5bWluID0gKCBib3gubWluLnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTtcblx0XHRcdHR5bWF4ID0gKCBib3gubWF4LnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHR5bWluID0gKCBib3gubWF4LnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTtcblx0XHRcdHR5bWF4ID0gKCBib3gubWluLnkgLSBvcmlnaW4ueSApICogaW52ZGlyeTtcblxuXHRcdH1cblxuXHRcdGlmICggKCB0bWluID4gdHltYXggKSB8fCAoIHR5bWluID4gdG1heCApICkgcmV0dXJuIG51bGw7XG5cblx0XHQvLyBUaGVzZSBsaW5lcyBhbHNvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0bWluIG9yIHRtYXggaXMgTmFOXG5cdFx0Ly8gKHJlc3VsdCBvZiAwICogSW5maW5pdHkpLiB4ICE9PSB4IHJldHVybnMgdHJ1ZSBpZiB4IGlzIE5hTlxuXG5cdFx0aWYgKCB0eW1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1pbiApIHRtaW4gPSB0eW1pbjtcblxuXHRcdGlmICggdHltYXggPCB0bWF4IHx8IHRtYXggIT09IHRtYXggKSB0bWF4ID0gdHltYXg7XG5cblx0XHRpZiAoIGludmRpcnogPj0gMCApIHtcblxuXHRcdFx0dHptaW4gPSAoIGJveC5taW4ueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6O1xuXHRcdFx0dHptYXggPSAoIGJveC5tYXgueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dHptaW4gPSAoIGJveC5tYXgueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6O1xuXHRcdFx0dHptYXggPSAoIGJveC5taW4ueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIHRtaW4gPiB0em1heCApIHx8ICggdHptaW4gPiB0bWF4ICkgKSByZXR1cm4gbnVsbDtcblxuXHRcdGlmICggdHptaW4gPiB0bWluIHx8IHRtaW4gIT09IHRtaW4gKSB0bWluID0gdHptaW47XG5cblx0XHRpZiAoIHR6bWF4IDwgdG1heCB8fCB0bWF4ICE9PSB0bWF4ICkgdG1heCA9IHR6bWF4O1xuXG5cdFx0Ly9yZXR1cm4gcG9pbnQgY2xvc2VzdCB0byB0aGUgcmF5IChwb3NpdGl2ZSBzaWRlKVxuXG5cdFx0aWYgKCB0bWF4IDwgMCApIHJldHVybiBudWxsO1xuXG5cdFx0cmV0dXJuIHRoaXMuYXQoIHRtaW4gPj0gMCA/IHRtaW4gOiB0bWF4LCB0YXJnZXQgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdHNCb3goIGJveCApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0Qm94KCBib3gsIHYgKSAhPT0gbnVsbDtcblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0aW50ZXJzZWN0VHJpYW5nbGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIENvbXB1dGUgdGhlIG9mZnNldCBvcmlnaW4sIGVkZ2VzLCBhbmQgbm9ybWFsLlxuXHRcdHZhciBkaWZmID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZWRnZTEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBlZGdlMiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0VHJpYW5nbGUoIGEsIGIsIGMsIGJhY2tmYWNlQ3VsbGluZywgdGFyZ2V0ICkge1xuXG5cdFx0XHQvLyBmcm9tIGh0dHA6Ly93d3cuZ2VvbWV0cmljdG9vbHMuY29tL0dURW5naW5lL0luY2x1ZGUvTWF0aGVtYXRpY3MvR3RlSW50clJheTNUcmlhbmdsZTMuaFxuXG5cdFx0XHRlZGdlMS5zdWJWZWN0b3JzKCBiLCBhICk7XG5cdFx0XHRlZGdlMi5zdWJWZWN0b3JzKCBjLCBhICk7XG5cdFx0XHRub3JtYWwuY3Jvc3NWZWN0b3JzKCBlZGdlMSwgZWRnZTIgKTtcblxuXHRcdFx0Ly8gU29sdmUgUSArIHQqRCA9IGIxKkUxICsgYjIqRTIgKFEgPSBrRGlmZiwgRCA9IHJheSBkaXJlY3Rpb24sXG5cdFx0XHQvLyBFMSA9IGtFZGdlMSwgRTIgPSBrRWRnZTIsIE4gPSBDcm9zcyhFMSxFMikpIGJ5XG5cdFx0XHQvLyAgIHxEb3QoRCxOKXwqYjEgPSBzaWduKERvdChELE4pKSpEb3QoRCxDcm9zcyhRLEUyKSlcblx0XHRcdC8vICAgfERvdChELE4pfCpiMiA9IHNpZ24oRG90KEQsTikpKkRvdChELENyb3NzKEUxLFEpKVxuXHRcdFx0Ly8gICB8RG90KEQsTil8KnQgPSAtc2lnbihEb3QoRCxOKSkqRG90KFEsTilcblx0XHRcdHZhciBEZE4gPSB0aGlzLmRpcmVjdGlvbi5kb3QoIG5vcm1hbCApO1xuXHRcdFx0dmFyIHNpZ247XG5cblx0XHRcdGlmICggRGROID4gMCApIHtcblxuXHRcdFx0XHRpZiAoIGJhY2tmYWNlQ3VsbGluZyApIHJldHVybiBudWxsO1xuXHRcdFx0XHRzaWduID0gMTtcblxuXHRcdFx0fSBlbHNlIGlmICggRGROIDwgMCApIHtcblxuXHRcdFx0XHRzaWduID0gLSAxO1xuXHRcdFx0XHREZE4gPSAtIERkTjtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHRkaWZmLnN1YlZlY3RvcnMoIHRoaXMub3JpZ2luLCBhICk7XG5cdFx0XHR2YXIgRGRReEUyID0gc2lnbiAqIHRoaXMuZGlyZWN0aW9uLmRvdCggZWRnZTIuY3Jvc3NWZWN0b3JzKCBkaWZmLCBlZGdlMiApICk7XG5cblx0XHRcdC8vIGIxIDwgMCwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0XHRpZiAoIERkUXhFMiA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIERkRTF4USA9IHNpZ24gKiB0aGlzLmRpcmVjdGlvbi5kb3QoIGVkZ2UxLmNyb3NzKCBkaWZmICkgKTtcblxuXHRcdFx0Ly8gYjIgPCAwLCBubyBpbnRlcnNlY3Rpb25cblx0XHRcdGlmICggRGRFMXhRIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBiMStiMiA+IDEsIG5vIGludGVyc2VjdGlvblxuXHRcdFx0aWYgKCBEZFF4RTIgKyBEZEUxeFEgPiBEZE4gKSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gTGluZSBpbnRlcnNlY3RzIHRyaWFuZ2xlLCBjaGVjayBpZiByYXkgZG9lcy5cblx0XHRcdHZhciBRZE4gPSAtIHNpZ24gKiBkaWZmLmRvdCggbm9ybWFsICk7XG5cblx0XHRcdC8vIHQgPCAwLCBubyBpbnRlcnNlY3Rpb25cblx0XHRcdGlmICggUWROIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSYXkgaW50ZXJzZWN0cyB0cmlhbmdsZS5cblx0XHRcdHJldHVybiB0aGlzLmF0KCBRZE4gLyBEZE4sIHRhcmdldCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG1hdHJpeDQgKSB7XG5cblx0XHR0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQoIG1hdHJpeDQgKTtcblx0XHR0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIG1hdHJpeDQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHJheSApIHtcblxuXHRcdHJldHVybiByYXkub3JpZ2luLmVxdWFscyggdGhpcy5vcmlnaW4gKSAmJiByYXkuZGlyZWN0aW9uLmVxdWFscyggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gTGluZTMoIHN0YXJ0LCBlbmQgKSB7XG5cblx0dGhpcy5zdGFydCA9ICggc3RhcnQgIT09IHVuZGVmaW5lZCApID8gc3RhcnQgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLmVuZCA9ICggZW5kICE9PSB1bmRlZmluZWQgKSA/IGVuZCA6IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTGluZTMucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHN0YXJ0LCBlbmQgKSB7XG5cblx0XHR0aGlzLnN0YXJ0LmNvcHkoIHN0YXJ0ICk7XG5cdFx0dGhpcy5lbmQuY29weSggZW5kICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0XHR0aGlzLnN0YXJ0LmNvcHkoIGxpbmUuc3RhcnQgKTtcblx0XHR0aGlzLmVuZC5jb3B5KCBsaW5lLmVuZCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRDZW50ZXI6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5zdGFydCwgdGhpcy5lbmQgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fSxcblxuXHRkZWx0YTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmRlbHRhKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnN1YlZlY3RvcnMoIHRoaXMuZW5kLCB0aGlzLnN0YXJ0ICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5lbmQgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKCB0aGlzLmVuZCApO1xuXG5cdH0sXG5cblx0YXQ6IGZ1bmN0aW9uICggdCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5hdCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZGVsdGEoIHRhcmdldCApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnN0YXJ0ICk7XG5cblx0fSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3RhcnRQID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgc3RhcnRFbmQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIoIHBvaW50LCBjbGFtcFRvTGluZSApIHtcblxuXHRcdFx0c3RhcnRQLnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLnN0YXJ0ICk7XG5cdFx0XHRzdGFydEVuZC5zdWJWZWN0b3JzKCB0aGlzLmVuZCwgdGhpcy5zdGFydCApO1xuXG5cdFx0XHR2YXIgc3RhcnRFbmQyID0gc3RhcnRFbmQuZG90KCBzdGFydEVuZCApO1xuXHRcdFx0dmFyIHN0YXJ0RW5kX3N0YXJ0UCA9IHN0YXJ0RW5kLmRvdCggc3RhcnRQICk7XG5cblx0XHRcdHZhciB0ID0gc3RhcnRFbmRfc3RhcnRQIC8gc3RhcnRFbmQyO1xuXG5cdFx0XHRpZiAoIGNsYW1wVG9MaW5lICkge1xuXG5cdFx0XHRcdHQgPSBfTWF0aC5jbGFtcCggdCwgMCwgMSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvc2VzdFBvaW50VG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgY2xhbXBUb0xpbmUsIHRhcmdldCApIHtcblxuXHRcdHZhciB0ID0gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKCBwb2ludCwgY2xhbXBUb0xpbmUgKTtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZGVsdGEoIHRhcmdldCApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnN0YXJ0ICk7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dGhpcy5zdGFydC5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXHRcdHRoaXMuZW5kLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBsaW5lICkge1xuXG5cdFx0cmV0dXJuIGxpbmUuc3RhcnQuZXF1YWxzKCB0aGlzLnN0YXJ0ICkgJiYgbGluZS5lbmQuZXF1YWxzKCB0aGlzLmVuZCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVHJpYW5nbGUoIGEsIGIsIGMgKSB7XG5cblx0dGhpcy5hID0gKCBhICE9PSB1bmRlZmluZWQgKSA/IGEgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLmIgPSAoIGIgIT09IHVuZGVmaW5lZCApID8gYiA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuYyA9ICggYyAhPT0gdW5kZWZpbmVkICkgPyBjIDogbmV3IFZlY3RvcjMoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBUcmlhbmdsZSwge1xuXG5cdGdldE5vcm1hbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYwID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXROb3JtYWwoIGEsIGIsIGMsIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmdldE5vcm1hbCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGFyZ2V0LnN1YlZlY3RvcnMoIGMsIGIgKTtcblx0XHRcdHYwLnN1YlZlY3RvcnMoIGEsIGIgKTtcblx0XHRcdHRhcmdldC5jcm9zcyggdjAgKTtcblxuXHRcdFx0dmFyIHRhcmdldExlbmd0aFNxID0gdGFyZ2V0Lmxlbmd0aFNxKCk7XG5cdFx0XHRpZiAoIHRhcmdldExlbmd0aFNxID4gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdGFyZ2V0Lm11bHRpcGx5U2NhbGFyKCAxIC8gTWF0aC5zcXJ0KCB0YXJnZXRMZW5ndGhTcSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRhcmdldC5zZXQoIDAsIDAsIDAgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdC8vIHN0YXRpYy9pbnN0YW5jZSBtZXRob2QgdG8gY2FsY3VsYXRlIGJhcnljZW50cmljIGNvb3JkaW5hdGVzXG5cdC8vIGJhc2VkIG9uOiBodHRwOi8vd3d3LmJsYWNrcGF3bi5jb20vdGV4dHMvcG9pbnRpbnBvbHkvZGVmYXVsdC5odG1sXG5cdGdldEJhcnljb29yZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYwID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0QmFyeWNvb3JkKCBwb2ludCwgYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdFx0XHR2MC5zdWJWZWN0b3JzKCBjLCBhICk7XG5cdFx0XHR2MS5zdWJWZWN0b3JzKCBiLCBhICk7XG5cdFx0XHR2Mi5zdWJWZWN0b3JzKCBwb2ludCwgYSApO1xuXG5cdFx0XHR2YXIgZG90MDAgPSB2MC5kb3QoIHYwICk7XG5cdFx0XHR2YXIgZG90MDEgPSB2MC5kb3QoIHYxICk7XG5cdFx0XHR2YXIgZG90MDIgPSB2MC5kb3QoIHYyICk7XG5cdFx0XHR2YXIgZG90MTEgPSB2MS5kb3QoIHYxICk7XG5cdFx0XHR2YXIgZG90MTIgPSB2MS5kb3QoIHYyICk7XG5cblx0XHRcdHZhciBkZW5vbSA9ICggZG90MDAgKiBkb3QxMSAtIGRvdDAxICogZG90MDEgKTtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmdldEJhcnljb29yZCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY29sbGluZWFyIG9yIHNpbmd1bGFyIHRyaWFuZ2xlXG5cdFx0XHRpZiAoIGRlbm9tID09PSAwICkge1xuXG5cdFx0XHRcdC8vIGFyYml0cmFyeSBsb2NhdGlvbiBvdXRzaWRlIG9mIHRyaWFuZ2xlP1xuXHRcdFx0XHQvLyBub3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSBiZXN0IGlkZWEsIG1heWJlIHNob3VsZCBiZSByZXR1cm5pbmcgdW5kZWZpbmVkXG5cdFx0XHRcdHJldHVybiB0YXJnZXQuc2V0KCAtIDIsIC0gMSwgLSAxICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGludkRlbm9tID0gMSAvIGRlbm9tO1xuXHRcdFx0dmFyIHUgPSAoIGRvdDExICogZG90MDIgLSBkb3QwMSAqIGRvdDEyICkgKiBpbnZEZW5vbTtcblx0XHRcdHZhciB2ID0gKCBkb3QwMCAqIGRvdDEyIC0gZG90MDEgKiBkb3QwMiApICogaW52RGVub207XG5cblx0XHRcdC8vIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIG11c3QgYWx3YXlzIHN1bSB0byAxXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMSAtIHUgLSB2LCB2LCB1ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjb250YWluc1BvaW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNvbnRhaW5zUG9pbnQoIHBvaW50LCBhLCBiLCBjICkge1xuXG5cdFx0XHRUcmlhbmdsZS5nZXRCYXJ5Y29vcmQoIHBvaW50LCBhLCBiLCBjLCB2MSApO1xuXG5cdFx0XHRyZXR1cm4gKCB2MS54ID49IDAgKSAmJiAoIHYxLnkgPj0gMCApICYmICggKCB2MS54ICsgdjEueSApIDw9IDEgKTtcblxuXHRcdH07XG5cblx0fSgpXG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVHJpYW5nbGUucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIGEsIGIsIGMgKSB7XG5cblx0XHR0aGlzLmEuY29weSggYSApO1xuXHRcdHRoaXMuYi5jb3B5KCBiICk7XG5cdFx0dGhpcy5jLmNvcHkoIGMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50c0FuZEluZGljZXM6IGZ1bmN0aW9uICggcG9pbnRzLCBpMCwgaTEsIGkyICkge1xuXG5cdFx0dGhpcy5hLmNvcHkoIHBvaW50c1sgaTAgXSApO1xuXHRcdHRoaXMuYi5jb3B5KCBwb2ludHNbIGkxIF0gKTtcblx0XHR0aGlzLmMuY29weSggcG9pbnRzWyBpMiBdICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHRyaWFuZ2xlICkge1xuXG5cdFx0dGhpcy5hLmNvcHkoIHRyaWFuZ2xlLmEgKTtcblx0XHR0aGlzLmIuY29weSggdHJpYW5nbGUuYiApO1xuXHRcdHRoaXMuYy5jb3B5KCB0cmlhbmdsZS5jICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEFyZWE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRBcmVhKCkge1xuXG5cdFx0XHR2MC5zdWJWZWN0b3JzKCB0aGlzLmMsIHRoaXMuYiApO1xuXHRcdFx0djEuc3ViVmVjdG9ycyggdGhpcy5hLCB0aGlzLmIgKTtcblxuXHRcdFx0cmV0dXJuIHYwLmNyb3NzKCB2MSApLmxlbmd0aCgpICogMC41O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Z2V0TWlkcG9pbnQ6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5nZXRNaWRwb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLmEsIHRoaXMuYiApLmFkZCggdGhpcy5jICkubXVsdGlwbHlTY2FsYXIoIDEgLyAzICk7XG5cblx0fSxcblxuXHRnZXROb3JtYWw6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldE5vcm1hbCggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgdGFyZ2V0ICk7XG5cblx0fSxcblxuXHRnZXRQbGFuZTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmdldFBsYW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldEZyb21Db3BsYW5hclBvaW50cyggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApO1xuXG5cdH0sXG5cblx0Z2V0QmFyeWNvb3JkOiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0QmFyeWNvb3JkKCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgdGFyZ2V0ICk7XG5cblx0fSxcblxuXHRjb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmNvbnRhaW5zUG9pbnQoIHBvaW50LCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiBib3guaW50ZXJzZWN0c1RyaWFuZ2xlKCB0aGlzICk7XG5cblx0fSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcGxhbmUgPSBuZXcgUGxhbmUoKTtcblx0XHR2YXIgZWRnZUxpc3QgPSBbIG5ldyBMaW5lMygpLCBuZXcgTGluZTMoKSwgbmV3IExpbmUzKCkgXTtcblx0XHR2YXIgcHJvamVjdGVkUG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBjbG9zZXN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsb3Nlc3RQb2ludFRvUG9pbnQoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbWluRGlzdGFuY2UgPSBJbmZpbml0eTtcblxuXHRcdFx0Ly8gcHJvamVjdCB0aGUgcG9pbnQgb250byB0aGUgcGxhbmUgb2YgdGhlIHRyaWFuZ2xlXG5cblx0XHRcdHBsYW5lLnNldEZyb21Db3BsYW5hclBvaW50cyggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApO1xuXHRcdFx0cGxhbmUucHJvamVjdFBvaW50KCBwb2ludCwgcHJvamVjdGVkUG9pbnQgKTtcblxuXHRcdFx0Ly8gY2hlY2sgaWYgdGhlIHByb2plY3Rpb24gbGllcyB3aXRoaW4gdGhlIHRyaWFuZ2xlXG5cblx0XHRcdGlmICggdGhpcy5jb250YWluc1BvaW50KCBwcm9qZWN0ZWRQb2ludCApID09PSB0cnVlICkge1xuXG5cdFx0XHRcdC8vIGlmIHNvLCB0aGlzIGlzIHRoZSBjbG9zZXN0IHBvaW50XG5cblx0XHRcdFx0dGFyZ2V0LmNvcHkoIHByb2plY3RlZFBvaW50ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gaWYgbm90LCB0aGUgcG9pbnQgZmFsbHMgb3V0c2lkZSB0aGUgdHJpYW5nbGUuIHRoZSB0YXJnZXQgaXMgdGhlIGNsb3Nlc3QgcG9pbnQgdG8gdGhlIHRyaWFuZ2xlJ3MgZWRnZXMgb3IgdmVydGljZXNcblxuXHRcdFx0XHRlZGdlTGlzdFsgMCBdLnNldCggdGhpcy5hLCB0aGlzLmIgKTtcblx0XHRcdFx0ZWRnZUxpc3RbIDEgXS5zZXQoIHRoaXMuYiwgdGhpcy5jICk7XG5cdFx0XHRcdGVkZ2VMaXN0WyAyIF0uc2V0KCB0aGlzLmMsIHRoaXMuYSApO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGVkZ2VMaXN0Lmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGVkZ2VMaXN0WyBpIF0uY2xvc2VzdFBvaW50VG9Qb2ludCggcHJvamVjdGVkUG9pbnQsIHRydWUsIGNsb3Nlc3RQb2ludCApO1xuXG5cdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gcHJvamVjdGVkUG9pbnQuZGlzdGFuY2VUb1NxdWFyZWQoIGNsb3Nlc3RQb2ludCApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IG1pbkRpc3RhbmNlICkge1xuXG5cdFx0XHRcdFx0XHRtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuXG5cdFx0XHRcdFx0XHR0YXJnZXQuY29weSggY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0YXJnZXQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdHJpYW5nbGUgKSB7XG5cblx0XHRyZXR1cm4gdHJpYW5nbGUuYS5lcXVhbHMoIHRoaXMuYSApICYmIHRyaWFuZ2xlLmIuZXF1YWxzKCB0aGlzLmIgKSAmJiB0cmlhbmdsZS5jLmVxdWFscyggdGhpcy5jICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBqb25vYnIxIC8gaHR0cDovL2pvbm9icjEuY29tL1xuICovXG5cbmZ1bmN0aW9uIE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2gnO1xuXG5cdHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkID8gZ2VvbWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmIH0gKTtcblxuXHR0aGlzLmRyYXdNb2RlID0gVHJpYW5nbGVzRHJhd01vZGU7XG5cblx0dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKTtcblxufVxuXG5NZXNoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE1lc2gsXG5cblx0aXNNZXNoOiB0cnVlLFxuXG5cdHNldERyYXdNb2RlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5kcmF3TW9kZSA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZHJhd01vZGUgPSBzb3VyY2UuZHJhd01vZGU7XG5cblx0XHRpZiAoIHNvdXJjZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBzb3VyY2UubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHNvdXJjZS5tb3JwaFRhcmdldERpY3Rpb25hcnkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1cGRhdGVNb3JwaFRhcmdldHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0dmFyIG0sIG1sLCBuYW1lO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzO1xuXHRcdFx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyggbW9ycGhBdHRyaWJ1dGVzICk7XG5cblx0XHRcdGlmICgga2V5cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sga2V5c1sgMCBdIF07XG5cblx0XHRcdFx0aWYgKCBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBbXTtcblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9O1xuXG5cdFx0XHRcdFx0Zm9yICggbSA9IDAsIG1sID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7XG5cblx0XHRcdFx0XHRcdG5hbWUgPSBtb3JwaEF0dHJpYnV0ZVsgbSBdLm5hbWUgfHwgU3RyaW5nKCBtICk7XG5cblx0XHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goIDAgKTtcblx0XHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBuYW1lIF0gPSBtO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgIT09IHVuZGVmaW5lZCAmJiBtb3JwaFRhcmdldHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdO1xuXHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9O1xuXG5cdFx0XHRcdGZvciAoIG0gPSAwLCBtbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IG0gPCBtbDsgbSArKyApIHtcblxuXHRcdFx0XHRcdG5hbWUgPSBtb3JwaFRhcmdldHNbIG0gXS5uYW1lIHx8IFN0cmluZyggbSApO1xuXG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCggMCApO1xuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBuYW1lIF0gPSBtO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW52ZXJzZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIHJheSA9IG5ldyBSYXkoKTtcblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0dmFyIHZBID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdkIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2QyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgdGVtcEEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB0ZW1wQiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHRlbXBDID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB1dkEgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB1dkIgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB1dkMgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0dmFyIGJhcnljb29yZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgaW50ZXJzZWN0aW9uUG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBpbnRlcnNlY3Rpb25Qb2ludFdvcmxkID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZ1bmN0aW9uIHV2SW50ZXJzZWN0aW9uKCBwb2ludCwgcDEsIHAyLCBwMywgdXYxLCB1djIsIHV2MyApIHtcblxuXHRcdFx0VHJpYW5nbGUuZ2V0QmFyeWNvb3JkKCBwb2ludCwgcDEsIHAyLCBwMywgYmFyeWNvb3JkICk7XG5cblx0XHRcdHV2MS5tdWx0aXBseVNjYWxhciggYmFyeWNvb3JkLnggKTtcblx0XHRcdHV2Mi5tdWx0aXBseVNjYWxhciggYmFyeWNvb3JkLnkgKTtcblx0XHRcdHV2My5tdWx0aXBseVNjYWxhciggYmFyeWNvb3JkLnogKTtcblxuXHRcdFx0dXYxLmFkZCggdXYyICkuYWRkKCB1djMgKTtcblxuXHRcdFx0cmV0dXJuIHV2MS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgbWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCBwQSwgcEIsIHBDLCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGludGVyc2VjdDtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHtcblxuXHRcdFx0XHRpbnRlcnNlY3QgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHBDLCBwQiwgcEEsIHRydWUsIHBvaW50ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aW50ZXJzZWN0ID0gcmF5LmludGVyc2VjdFRyaWFuZ2xlKCBwQSwgcEIsIHBDLCBtYXRlcmlhbC5zaWRlICE9PSBEb3VibGVTaWRlLCBwb2ludCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaW50ZXJzZWN0ID09PSBudWxsICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdGludGVyc2VjdGlvblBvaW50V29ybGQuY29weSggcG9pbnQgKTtcblx0XHRcdGludGVyc2VjdGlvblBvaW50V29ybGQuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0aW9uUG9pbnRXb3JsZCApO1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuIG51bGw7XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0cG9pbnQ6IGludGVyc2VjdGlvblBvaW50V29ybGQuY2xvbmUoKSxcblx0XHRcdFx0b2JqZWN0OiBvYmplY3Rcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCBvYmplY3QsIHJheWNhc3RlciwgcmF5LCBwb3NpdGlvbiwgdXYsIGEsIGIsIGMgKSB7XG5cblx0XHRcdHZBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBhICk7XG5cdFx0XHR2Qi5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgYiApO1xuXHRcdFx0dkMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGMgKTtcblxuXHRcdFx0dmFyIGludGVyc2VjdGlvbiA9IGNoZWNrSW50ZXJzZWN0aW9uKCBvYmplY3QsIG9iamVjdC5tYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIHZBLCB2QiwgdkMsIGludGVyc2VjdGlvblBvaW50ICk7XG5cblx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xuXG5cdFx0XHRcdGlmICggdXYgKSB7XG5cblx0XHRcdFx0XHR1dkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGEgKTtcblx0XHRcdFx0XHR1dkIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGIgKTtcblx0XHRcdFx0XHR1dkMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGMgKTtcblxuXHRcdFx0XHRcdGludGVyc2VjdGlvbi51diA9IHV2SW50ZXJzZWN0aW9uKCBpbnRlcnNlY3Rpb25Qb2ludCwgdkEsIHZCLCB2QywgdXZBLCB1dkIsIHV2QyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgZmFjZSA9IG5ldyBGYWNlMyggYSwgYiwgYyApO1xuXHRcdFx0XHRUcmlhbmdsZS5nZXROb3JtYWwoIHZBLCB2QiwgdkMsIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2UgPSBmYWNlO1xuXHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gYTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gaW50ZXJzZWN0aW9uO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRcdHZhciBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XG5cdFx0XHR2YXIgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdHNwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdFx0Ly9cblxuXHRcdFx0aW52ZXJzZU1hdHJpeC5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApO1xuXHRcdFx0cmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIGludmVyc2VNYXRyaXggKTtcblxuXHRcdFx0Ly8gQ2hlY2sgYm91bmRpbmdCb3ggYmVmb3JlIGNvbnRpbnVpbmdcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHJheS5pbnRlcnNlY3RzQm94KCBnZW9tZXRyeS5ib3VuZGluZ0JveCApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgaW50ZXJzZWN0aW9uO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIGEsIGIsIGM7XG5cdFx0XHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdFx0XHR2YXIgdXYgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnV2O1xuXHRcdFx0XHR2YXIgaSwgbDtcblxuXHRcdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0Ly8gaW5kZXhlZCBidWZmZXIgZ2VvbWV0cnlcblxuXHRcdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gaW5kZXguY291bnQ7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRcdGEgPSBpbmRleC5nZXRYKCBpICk7XG5cdFx0XHRcdFx0XHRiID0gaW5kZXguZ2V0WCggaSArIDEgKTtcblx0XHRcdFx0XHRcdGMgPSBpbmRleC5nZXRYKCBpICsgMiApO1xuXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIHV2LCBhLCBiLCBjICk7XG5cblx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xuXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKCBpIC8gMyApOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gaW5kaWNlcyBidWZmZXIgc2VtYW50aWNzXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Ly8gbm9uLWluZGV4ZWQgYnVmZmVyIGdlb21ldHJ5XG5cblx0XHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IHBvc2l0aW9uLmNvdW50OyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHRhID0gaTtcblx0XHRcdFx0XHRcdGIgPSBpICsgMTtcblx0XHRcdFx0XHRcdGMgPSBpICsgMjtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgcmF5Y2FzdGVyLCByYXksIHBvc2l0aW9uLCB1diwgYSwgYiwgYyApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciBmdkEsIGZ2QiwgZnZDO1xuXHRcdFx0XHR2YXIgaXNNdWx0aU1hdGVyaWFsID0gQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdFx0dmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7XG5cdFx0XHRcdHZhciB1dnM7XG5cblx0XHRcdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyAwIF07XG5cdFx0XHRcdGlmICggZmFjZVZlcnRleFV2cy5sZW5ndGggPiAwICkgdXZzID0gZmFjZVZlcnRleFV2cztcblxuXHRcdFx0XHRmb3IgKCB2YXIgZiA9IDAsIGZsID0gZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBmIF07XG5cdFx0XHRcdFx0dmFyIGZhY2VNYXRlcmlhbCA9IGlzTXVsdGlNYXRlcmlhbCA/IG1hdGVyaWFsWyBmYWNlLm1hdGVyaWFsSW5kZXggXSA6IG1hdGVyaWFsO1xuXG5cdFx0XHRcdFx0aWYgKCBmYWNlTWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0ZnZBID0gdmVydGljZXNbIGZhY2UuYSBdO1xuXHRcdFx0XHRcdGZ2QiA9IHZlcnRpY2VzWyBmYWNlLmIgXTtcblx0XHRcdFx0XHRmdkMgPSB2ZXJ0aWNlc1sgZmFjZS5jIF07XG5cblx0XHRcdFx0XHRpZiAoIGZhY2VNYXRlcmlhbC5tb3JwaFRhcmdldHMgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBtb3JwaFRhcmdldHMgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHM7XG5cdFx0XHRcdFx0XHR2YXIgbW9ycGhJbmZsdWVuY2VzID0gdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM7XG5cblx0XHRcdFx0XHRcdHZBLnNldCggMCwgMCwgMCApO1xuXHRcdFx0XHRcdFx0dkIuc2V0KCAwLCAwLCAwICk7XG5cdFx0XHRcdFx0XHR2Qy5zZXQoIDAsIDAsIDAgKTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIHQgPSAwLCB0bCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IHQgPCB0bDsgdCArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2YXIgaW5mbHVlbmNlID0gbW9ycGhJbmZsdWVuY2VzWyB0IF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpbmZsdWVuY2UgPT09IDAgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0XHR2YXIgdGFyZ2V0cyA9IG1vcnBoVGFyZ2V0c1sgdCBdLnZlcnRpY2VzO1xuXG5cdFx0XHRcdFx0XHRcdHZBLmFkZFNjYWxlZFZlY3RvciggdGVtcEEuc3ViVmVjdG9ycyggdGFyZ2V0c1sgZmFjZS5hIF0sIGZ2QSApLCBpbmZsdWVuY2UgKTtcblx0XHRcdFx0XHRcdFx0dkIuYWRkU2NhbGVkVmVjdG9yKCB0ZW1wQi5zdWJWZWN0b3JzKCB0YXJnZXRzWyBmYWNlLmIgXSwgZnZCICksIGluZmx1ZW5jZSApO1xuXHRcdFx0XHRcdFx0XHR2Qy5hZGRTY2FsZWRWZWN0b3IoIHRlbXBDLnN1YlZlY3RvcnMoIHRhcmdldHNbIGZhY2UuYyBdLCBmdkMgKSwgaW5mbHVlbmNlICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0dkEuYWRkKCBmdkEgKTtcblx0XHRcdFx0XHRcdHZCLmFkZCggZnZCICk7XG5cdFx0XHRcdFx0XHR2Qy5hZGQoIGZ2QyApO1xuXG5cdFx0XHRcdFx0XHRmdkEgPSB2QTtcblx0XHRcdFx0XHRcdGZ2QiA9IHZCO1xuXHRcdFx0XHRcdFx0ZnZDID0gdkM7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0ludGVyc2VjdGlvbiggdGhpcywgZmFjZU1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgZnZBLCBmdkIsIGZ2QywgaW50ZXJzZWN0aW9uUG9pbnQgKTtcblxuXHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHV2cyAmJiB1dnNbIGYgXSApIHtcblxuXHRcdFx0XHRcdFx0XHR2YXIgdXZzX2YgPSB1dnNbIGYgXTtcblx0XHRcdFx0XHRcdFx0dXZBLmNvcHkoIHV2c19mWyAwIF0gKTtcblx0XHRcdFx0XHRcdFx0dXZCLmNvcHkoIHV2c19mWyAxIF0gKTtcblx0XHRcdFx0XHRcdFx0dXZDLmNvcHkoIHV2c19mWyAyIF0gKTtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24udXYgPSB1dkludGVyc2VjdGlvbiggaW50ZXJzZWN0aW9uUG9pbnQsIGZ2QSwgZnZCLCBmdkMsIHV2QSwgdXZCLCB1dkMgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZSA9IGZhY2U7XG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gZjtcblx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEJhY2tncm91bmQoIHJlbmRlcmVyLCBzdGF0ZSwgZ2VvbWV0cmllcywgcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdHZhciBjbGVhckNvbG9yID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHR2YXIgY2xlYXJBbHBoYSA9IDA7XG5cblx0dmFyIHBsYW5lQ2FtZXJhLCBwbGFuZU1lc2g7XG5cdHZhciBib3hNZXNoO1xuXG5cdGZ1bmN0aW9uIHJlbmRlciggcmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYSwgZm9yY2VDbGVhciApIHtcblxuXHRcdHZhciBiYWNrZ3JvdW5kID0gc2NlbmUuYmFja2dyb3VuZDtcblxuXHRcdGlmICggYmFja2dyb3VuZCA9PT0gbnVsbCApIHtcblxuXHRcdFx0c2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc0NvbG9yICkge1xuXG5cdFx0XHRzZXRDbGVhciggYmFja2dyb3VuZCwgMSApO1xuXHRcdFx0Zm9yY2VDbGVhciA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlbmRlcmVyLmF1dG9DbGVhciB8fCBmb3JjZUNsZWFyICkge1xuXG5cdFx0XHRyZW5kZXJlci5jbGVhciggcmVuZGVyZXIuYXV0b0NsZWFyQ29sb3IsIHJlbmRlcmVyLmF1dG9DbGVhckRlcHRoLCByZW5kZXJlci5hdXRvQ2xlYXJTdGVuY2lsICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc0N1YmVUZXh0dXJlICkge1xuXG5cdFx0XHRpZiAoIGJveE1lc2ggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRib3hNZXNoID0gbmV3IE1lc2goXG5cdFx0XHRcdFx0bmV3IEJveEJ1ZmZlckdlb21ldHJ5KCAxLCAxLCAxICksXG5cdFx0XHRcdFx0bmV3IFNoYWRlck1hdGVyaWFsKCB7XG5cdFx0XHRcdFx0XHR1bmlmb3JtczogU2hhZGVyTGliLmN1YmUudW5pZm9ybXMsXG5cdFx0XHRcdFx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckxpYi5jdWJlLnZlcnRleFNoYWRlcixcblx0XHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJMaWIuY3ViZS5mcmFnbWVudFNoYWRlcixcblx0XHRcdFx0XHRcdHNpZGU6IEJhY2tTaWRlLFxuXHRcdFx0XHRcdFx0ZGVwdGhUZXN0OiB0cnVlLFxuXHRcdFx0XHRcdFx0ZGVwdGhXcml0ZTogZmFsc2UsXG5cdFx0XHRcdFx0XHRmb2c6IGZhbHNlXG5cdFx0XHRcdFx0fSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ym94TWVzaC5nZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoICdub3JtYWwnICk7XG5cdFx0XHRcdGJveE1lc2guZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAndXYnICk7XG5cblx0XHRcdFx0Ym94TWVzaC5vbkJlZm9yZVJlbmRlciA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmNvcHlQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0fTtcblxuXHRcdFx0XHRnZW9tZXRyaWVzLnVwZGF0ZSggYm94TWVzaC5nZW9tZXRyeSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGJveE1lc2gubWF0ZXJpYWwudW5pZm9ybXMudEN1YmUudmFsdWUgPSBiYWNrZ3JvdW5kO1xuXG5cdFx0XHRyZW5kZXJMaXN0LnB1c2goIGJveE1lc2gsIGJveE1lc2guZ2VvbWV0cnksIGJveE1lc2gubWF0ZXJpYWwsIDAsIG51bGwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGlmICggcGxhbmVDYW1lcmEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRwbGFuZUNhbWVyYSA9IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIC0gMSwgMSwgMSwgLSAxLCAwLCAxICk7XG5cblx0XHRcdFx0cGxhbmVNZXNoID0gbmV3IE1lc2goXG5cdFx0XHRcdFx0bmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoIDIsIDIgKSxcblx0XHRcdFx0XHRuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgZGVwdGhUZXN0OiBmYWxzZSwgZGVwdGhXcml0ZTogZmFsc2UsIGZvZzogZmFsc2UgfSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Z2VvbWV0cmllcy51cGRhdGUoIHBsYW5lTWVzaC5nZW9tZXRyeSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHBsYW5lTWVzaC5tYXRlcmlhbC5tYXAgPSBiYWNrZ3JvdW5kO1xuXG5cdFx0XHQvLyBUT0RPIFB1c2ggdGhpcyB0byByZW5kZXJMaXN0XG5cblx0XHRcdHJlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggcGxhbmVDYW1lcmEsIG51bGwsIHBsYW5lTWVzaC5nZW9tZXRyeSwgcGxhbmVNZXNoLm1hdGVyaWFsLCBwbGFuZU1lc2gsIG51bGwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0Q2xlYXIoIGNvbG9yLCBhbHBoYSApIHtcblxuXHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIsIGFscGhhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldENsZWFyQ29sb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIGNsZWFyQ29sb3I7XG5cblx0XHR9LFxuXHRcdHNldENsZWFyQ29sb3I6IGZ1bmN0aW9uICggY29sb3IsIGFscGhhICkge1xuXG5cdFx0XHRjbGVhckNvbG9yLnNldCggY29sb3IgKTtcblx0XHRcdGNsZWFyQWxwaGEgPSBhbHBoYSAhPT0gdW5kZWZpbmVkID8gYWxwaGEgOiAxO1xuXHRcdFx0c2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTtcblxuXHRcdH0sXG5cdFx0Z2V0Q2xlYXJBbHBoYTogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gY2xlYXJBbHBoYTtcblxuXHRcdH0sXG5cdFx0c2V0Q2xlYXJBbHBoYTogZnVuY3Rpb24gKCBhbHBoYSApIHtcblxuXHRcdFx0Y2xlYXJBbHBoYSA9IGFscGhhO1xuXHRcdFx0c2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTtcblxuXHRcdH0sXG5cdFx0cmVuZGVyOiByZW5kZXJcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEJ1ZmZlclJlbmRlcmVyKCBnbCwgZXh0ZW5zaW9ucywgaW5mbyApIHtcblxuXHR2YXIgbW9kZTtcblxuXHRmdW5jdGlvbiBzZXRNb2RlKCB2YWx1ZSApIHtcblxuXHRcdG1vZGUgPSB2YWx1ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyKCBzdGFydCwgY291bnQgKSB7XG5cblx0XHRnbC5kcmF3QXJyYXlzKCBtb2RlLCBzdGFydCwgY291bnQgKTtcblxuXHRcdGluZm8udXBkYXRlKCBjb3VudCwgbW9kZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJJbnN0YW5jZXMoIGdlb21ldHJ5LCBzdGFydCwgY291bnQgKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdFx0aWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0aWYgKCBwb3NpdGlvbi5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRjb3VudCA9IHBvc2l0aW9uLmRhdGEuY291bnQ7XG5cblx0XHRcdGV4dGVuc2lvbi5kcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUoIG1vZGUsIDAsIGNvdW50LCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZXh0ZW5zaW9uLmRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSggbW9kZSwgc3RhcnQsIGNvdW50LCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdFx0fVxuXG5cdFx0aW5mby51cGRhdGUoIGNvdW50LCBtb2RlLCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdH1cblxuXHQvL1xuXG5cdHRoaXMuc2V0TW9kZSA9IHNldE1vZGU7XG5cdHRoaXMucmVuZGVyID0gcmVuZGVyO1xuXHR0aGlzLnJlbmRlckluc3RhbmNlcyA9IHJlbmRlckluc3RhbmNlcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xDYXBhYmlsaXRpZXMoIGdsLCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzICkge1xuXG5cdHZhciBtYXhBbmlzb3Ryb3B5O1xuXG5cdGZ1bmN0aW9uIGdldE1heEFuaXNvdHJvcHkoKSB7XG5cblx0XHRpZiAoIG1heEFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHJldHVybiBtYXhBbmlzb3Ryb3B5O1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApO1xuXG5cdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdG1heEFuaXNvdHJvcHkgPSBnbC5nZXRQYXJhbWV0ZXIoIGV4dGVuc2lvbi5NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1heEFuaXNvdHJvcHkgPSAwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1heEFuaXNvdHJvcHk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldE1heFByZWNpc2lvbiggcHJlY2lzaW9uICkge1xuXG5cdFx0aWYgKCBwcmVjaXNpb24gPT09ICdoaWdocCcgKSB7XG5cblx0XHRcdGlmICggZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5WRVJURVhfU0hBREVSLCBnbC5ISUdIX0ZMT0FUICkucHJlY2lzaW9uID4gMCAmJlxuXHRcdFx0ICAgICBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLkZSQUdNRU5UX1NIQURFUiwgZ2wuSElHSF9GTE9BVCApLnByZWNpc2lvbiA+IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuICdoaWdocCc7XG5cblx0XHRcdH1cblxuXHRcdFx0cHJlY2lzaW9uID0gJ21lZGl1bXAnO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwcmVjaXNpb24gPT09ICdtZWRpdW1wJyApIHtcblxuXHRcdFx0aWYgKCBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIGdsLlZFUlRFWF9TSEFERVIsIGdsLk1FRElVTV9GTE9BVCApLnByZWNpc2lvbiA+IDAgJiZcblx0XHRcdCAgICAgZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5GUkFHTUVOVF9TSEFERVIsIGdsLk1FRElVTV9GTE9BVCApLnByZWNpc2lvbiA+IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuICdtZWRpdW1wJztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuICdsb3dwJztcblxuXHR9XG5cblx0dmFyIHByZWNpc2lvbiA9IHBhcmFtZXRlcnMucHJlY2lzaW9uICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZWNpc2lvbiA6ICdoaWdocCc7XG5cdHZhciBtYXhQcmVjaXNpb24gPSBnZXRNYXhQcmVjaXNpb24oIHByZWNpc2lvbiApO1xuXG5cdGlmICggbWF4UHJlY2lzaW9uICE9PSBwcmVjaXNpb24gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOicsIHByZWNpc2lvbiwgJ25vdCBzdXBwb3J0ZWQsIHVzaW5nJywgbWF4UHJlY2lzaW9uLCAnaW5zdGVhZC4nICk7XG5cdFx0cHJlY2lzaW9uID0gbWF4UHJlY2lzaW9uO1xuXG5cdH1cblxuXHR2YXIgbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA9IHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA9PT0gdHJ1ZTtcblxuXHR2YXIgbWF4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTICk7XG5cdHZhciBtYXhWZXJ0ZXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTICk7XG5cdHZhciBtYXhUZXh0dXJlU2l6ZSA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1RFWFRVUkVfU0laRSApO1xuXHR2YXIgbWF4Q3ViZW1hcFNpemUgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgKTtcblxuXHR2YXIgbWF4QXR0cmlidXRlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9BVFRSSUJTICk7XG5cdHZhciBtYXhWZXJ0ZXhVbmlmb3JtcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMgKTtcblx0dmFyIG1heFZhcnlpbmdzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkFSWUlOR19WRUNUT1JTICk7XG5cdHZhciBtYXhGcmFnbWVudFVuaWZvcm1zID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTICk7XG5cblx0dmFyIHZlcnRleFRleHR1cmVzID0gbWF4VmVydGV4VGV4dHVyZXMgPiAwO1xuXHR2YXIgZmxvYXRGcmFnbWVudFRleHR1cmVzID0gISEgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKTtcblx0dmFyIGZsb2F0VmVydGV4VGV4dHVyZXMgPSB2ZXJ0ZXhUZXh0dXJlcyAmJiBmbG9hdEZyYWdtZW50VGV4dHVyZXM7XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldE1heEFuaXNvdHJvcHk6IGdldE1heEFuaXNvdHJvcHksXG5cdFx0Z2V0TWF4UHJlY2lzaW9uOiBnZXRNYXhQcmVjaXNpb24sXG5cblx0XHRwcmVjaXNpb246IHByZWNpc2lvbixcblx0XHRsb2dhcml0aG1pY0RlcHRoQnVmZmVyOiBsb2dhcml0aG1pY0RlcHRoQnVmZmVyLFxuXG5cdFx0bWF4VGV4dHVyZXM6IG1heFRleHR1cmVzLFxuXHRcdG1heFZlcnRleFRleHR1cmVzOiBtYXhWZXJ0ZXhUZXh0dXJlcyxcblx0XHRtYXhUZXh0dXJlU2l6ZTogbWF4VGV4dHVyZVNpemUsXG5cdFx0bWF4Q3ViZW1hcFNpemU6IG1heEN1YmVtYXBTaXplLFxuXG5cdFx0bWF4QXR0cmlidXRlczogbWF4QXR0cmlidXRlcyxcblx0XHRtYXhWZXJ0ZXhVbmlmb3JtczogbWF4VmVydGV4VW5pZm9ybXMsXG5cdFx0bWF4VmFyeWluZ3M6IG1heFZhcnlpbmdzLFxuXHRcdG1heEZyYWdtZW50VW5pZm9ybXM6IG1heEZyYWdtZW50VW5pZm9ybXMsXG5cblx0XHR2ZXJ0ZXhUZXh0dXJlczogdmVydGV4VGV4dHVyZXMsXG5cdFx0ZmxvYXRGcmFnbWVudFRleHR1cmVzOiBmbG9hdEZyYWdtZW50VGV4dHVyZXMsXG5cdFx0ZmxvYXRWZXJ0ZXhUZXh0dXJlczogZmxvYXRWZXJ0ZXhUZXh0dXJlc1xuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gV2ViR0xDbGlwcGluZygpIHtcblxuXHR2YXIgc2NvcGUgPSB0aGlzLFxuXG5cdFx0Z2xvYmFsU3RhdGUgPSBudWxsLFxuXHRcdG51bUdsb2JhbFBsYW5lcyA9IDAsXG5cdFx0bG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZSxcblx0XHRyZW5kZXJpbmdTaGFkb3dzID0gZmFsc2UsXG5cblx0XHRwbGFuZSA9IG5ldyBQbGFuZSgpLFxuXHRcdHZpZXdOb3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLFxuXG5cdFx0dW5pZm9ybSA9IHsgdmFsdWU6IG51bGwsIG5lZWRzVXBkYXRlOiBmYWxzZSB9O1xuXG5cdHRoaXMudW5pZm9ybSA9IHVuaWZvcm07XG5cdHRoaXMubnVtUGxhbmVzID0gMDtcblx0dGhpcy5udW1JbnRlcnNlY3Rpb24gPSAwO1xuXG5cdHRoaXMuaW5pdCA9IGZ1bmN0aW9uICggcGxhbmVzLCBlbmFibGVMb2NhbENsaXBwaW5nLCBjYW1lcmEgKSB7XG5cblx0XHR2YXIgZW5hYmxlZCA9XG5cdFx0XHRwbGFuZXMubGVuZ3RoICE9PSAwIHx8XG5cdFx0XHRlbmFibGVMb2NhbENsaXBwaW5nIHx8XG5cdFx0XHQvLyBlbmFibGUgc3RhdGUgb2YgcHJldmlvdXMgZnJhbWUgLSB0aGUgY2xpcHBpbmcgY29kZSBoYXMgdG9cblx0XHRcdC8vIHJ1biBhbm90aGVyIGZyYW1lIGluIG9yZGVyIHRvIHJlc2V0IHRoZSBzdGF0ZTpcblx0XHRcdG51bUdsb2JhbFBsYW5lcyAhPT0gMCB8fFxuXHRcdFx0bG9jYWxDbGlwcGluZ0VuYWJsZWQ7XG5cblx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZCA9IGVuYWJsZUxvY2FsQ2xpcHBpbmc7XG5cblx0XHRnbG9iYWxTdGF0ZSA9IHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCAwICk7XG5cdFx0bnVtR2xvYmFsUGxhbmVzID0gcGxhbmVzLmxlbmd0aDtcblxuXHRcdHJldHVybiBlbmFibGVkO1xuXG5cdH07XG5cblx0dGhpcy5iZWdpblNoYWRvd3MgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZW5kZXJpbmdTaGFkb3dzID0gdHJ1ZTtcblx0XHRwcm9qZWN0UGxhbmVzKCBudWxsICk7XG5cblx0fTtcblxuXHR0aGlzLmVuZFNoYWRvd3MgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZW5kZXJpbmdTaGFkb3dzID0gZmFsc2U7XG5cdFx0cmVzZXRHbG9iYWxTdGF0ZSgpO1xuXG5cdH07XG5cblx0dGhpcy5zZXRTdGF0ZSA9IGZ1bmN0aW9uICggcGxhbmVzLCBjbGlwSW50ZXJzZWN0aW9uLCBjbGlwU2hhZG93cywgY2FtZXJhLCBjYWNoZSwgZnJvbUNhY2hlICkge1xuXG5cdFx0aWYgKCAhIGxvY2FsQ2xpcHBpbmdFbmFibGVkIHx8IHBsYW5lcyA9PT0gbnVsbCB8fCBwbGFuZXMubGVuZ3RoID09PSAwIHx8IHJlbmRlcmluZ1NoYWRvd3MgJiYgISBjbGlwU2hhZG93cyApIHtcblxuXHRcdFx0Ly8gdGhlcmUncyBubyBsb2NhbCBjbGlwcGluZ1xuXG5cdFx0XHRpZiAoIHJlbmRlcmluZ1NoYWRvd3MgKSB7XG5cblx0XHRcdFx0Ly8gdGhlcmUncyBubyBnbG9iYWwgY2xpcHBpbmdcblxuXHRcdFx0XHRwcm9qZWN0UGxhbmVzKCBudWxsICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmVzZXRHbG9iYWxTdGF0ZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgbkdsb2JhbCA9IHJlbmRlcmluZ1NoYWRvd3MgPyAwIDogbnVtR2xvYmFsUGxhbmVzLFxuXHRcdFx0XHRsR2xvYmFsID0gbkdsb2JhbCAqIDQsXG5cblx0XHRcdFx0ZHN0QXJyYXkgPSBjYWNoZS5jbGlwcGluZ1N0YXRlIHx8IG51bGw7XG5cblx0XHRcdHVuaWZvcm0udmFsdWUgPSBkc3RBcnJheTsgLy8gZW5zdXJlIHVuaXF1ZSBzdGF0ZVxuXG5cdFx0XHRkc3RBcnJheSA9IHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCBsR2xvYmFsLCBmcm9tQ2FjaGUgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBsR2xvYmFsOyArKyBpICkge1xuXG5cdFx0XHRcdGRzdEFycmF5WyBpIF0gPSBnbG9iYWxTdGF0ZVsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNhY2hlLmNsaXBwaW5nU3RhdGUgPSBkc3RBcnJheTtcblx0XHRcdHRoaXMubnVtSW50ZXJzZWN0aW9uID0gY2xpcEludGVyc2VjdGlvbiA/IHRoaXMubnVtUGxhbmVzIDogMDtcblx0XHRcdHRoaXMubnVtUGxhbmVzICs9IG5HbG9iYWw7XG5cblx0XHR9XG5cblxuXHR9O1xuXG5cdGZ1bmN0aW9uIHJlc2V0R2xvYmFsU3RhdGUoKSB7XG5cblx0XHRpZiAoIHVuaWZvcm0udmFsdWUgIT09IGdsb2JhbFN0YXRlICkge1xuXG5cdFx0XHR1bmlmb3JtLnZhbHVlID0gZ2xvYmFsU3RhdGU7XG5cdFx0XHR1bmlmb3JtLm5lZWRzVXBkYXRlID0gbnVtR2xvYmFsUGxhbmVzID4gMDtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm51bVBsYW5lcyA9IG51bUdsb2JhbFBsYW5lcztcblx0XHRzY29wZS5udW1JbnRlcnNlY3Rpb24gPSAwO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgZHN0T2Zmc2V0LCBza2lwVHJhbnNmb3JtICkge1xuXG5cdFx0dmFyIG5QbGFuZXMgPSBwbGFuZXMgIT09IG51bGwgPyBwbGFuZXMubGVuZ3RoIDogMCxcblx0XHRcdGRzdEFycmF5ID0gbnVsbDtcblxuXHRcdGlmICggblBsYW5lcyAhPT0gMCApIHtcblxuXHRcdFx0ZHN0QXJyYXkgPSB1bmlmb3JtLnZhbHVlO1xuXG5cdFx0XHRpZiAoIHNraXBUcmFuc2Zvcm0gIT09IHRydWUgfHwgZHN0QXJyYXkgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIGZsYXRTaXplID0gZHN0T2Zmc2V0ICsgblBsYW5lcyAqIDQsXG5cdFx0XHRcdFx0dmlld01hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2U7XG5cblx0XHRcdFx0dmlld05vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHRpZiAoIGRzdEFycmF5ID09PSBudWxsIHx8IGRzdEFycmF5Lmxlbmd0aCA8IGZsYXRTaXplICkge1xuXG5cdFx0XHRcdFx0ZHN0QXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCBmbGF0U2l6ZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGk0ID0gZHN0T2Zmc2V0OyBpICE9PSBuUGxhbmVzOyArKyBpLCBpNCArPSA0ICkge1xuXG5cdFx0XHRcdFx0cGxhbmUuY29weSggcGxhbmVzWyBpIF0gKS5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXgsIHZpZXdOb3JtYWxNYXRyaXggKTtcblxuXHRcdFx0XHRcdHBsYW5lLm5vcm1hbC50b0FycmF5KCBkc3RBcnJheSwgaTQgKTtcblx0XHRcdFx0XHRkc3RBcnJheVsgaTQgKyAzIF0gPSBwbGFuZS5jb25zdGFudDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5O1xuXHRcdFx0dW5pZm9ybS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRzY29wZS5udW1QbGFuZXMgPSBuUGxhbmVzO1xuXG5cdFx0cmV0dXJuIGRzdEFycmF5O1xuXG5cdH1cblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xFeHRlbnNpb25zKCBnbCApIHtcblxuXHR2YXIgZXh0ZW5zaW9ucyA9IHt9O1xuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdFx0aWYgKCBleHRlbnNpb25zWyBuYW1lIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZXh0ZW5zaW9uc1sgbmFtZSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBleHRlbnNpb247XG5cblx0XHRcdHN3aXRjaCAoIG5hbWUgKSB7XG5cblx0XHRcdFx0Y2FzZSAnV0VCR0xfZGVwdGhfdGV4dHVyZSc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdNT1pfV0VCR0xfZGVwdGhfdGV4dHVyZScgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfZGVwdGhfdGV4dHVyZScgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnOlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnOlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJzpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggbmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6ICcgKyBuYW1lICsgJyBleHRlbnNpb24gbm90IHN1cHBvcnRlZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZXh0ZW5zaW9uc1sgbmFtZSBdID0gZXh0ZW5zaW9uO1xuXG5cdFx0XHRyZXR1cm4gZXh0ZW5zaW9uO1xuXG5cdFx0fVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMR2VvbWV0cmllcyggZ2wsIGF0dHJpYnV0ZXMsIGluZm8gKSB7XG5cblx0dmFyIGdlb21ldHJpZXMgPSB7fTtcblx0dmFyIHdpcmVmcmFtZUF0dHJpYnV0ZXMgPSB7fTtcblxuXHRmdW5jdGlvbiBvbkdlb21ldHJ5RGlzcG9zZSggZXZlbnQgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBldmVudC50YXJnZXQ7XG5cdFx0dmFyIGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYnVmZmVyZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBidWZmZXJnZW9tZXRyeS5pbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gYnVmZmVyZ2VvbWV0cnkuYXR0cmlidXRlcyApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGJ1ZmZlcmdlb21ldHJ5LmF0dHJpYnV0ZXNbIG5hbWUgXSApO1xuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cnkucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbkdlb21ldHJ5RGlzcG9zZSApO1xuXG5cdFx0ZGVsZXRlIGdlb21ldHJpZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHQvLyBUT0RPIFJlbW92ZSBkdXBsaWNhdGUgY29kZVxuXG5cdFx0dmFyIGF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGF0dHJpYnV0ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlcy5yZW1vdmUoIGF0dHJpYnV0ZSApO1xuXHRcdFx0ZGVsZXRlIHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHR9XG5cblx0XHRhdHRyaWJ1dGUgPSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBidWZmZXJnZW9tZXRyeS5pZCBdO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBhdHRyaWJ1dGUgKTtcblx0XHRcdGRlbGV0ZSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBidWZmZXJnZW9tZXRyeS5pZCBdO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGluZm8ubWVtb3J5Lmdlb21ldHJpZXMgLS07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldCggb2JqZWN0LCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGJ1ZmZlcmdlb21ldHJ5ICkgcmV0dXJuIGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdFx0Z2VvbWV0cnkuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbkdlb21ldHJ5RGlzcG9zZSApO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJ5O1xuXG5cdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5fYnVmZmVyR2VvbWV0cnkgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRnZW9tZXRyeS5fYnVmZmVyR2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKS5zZXRGcm9tT2JqZWN0KCBvYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeTtcblxuXHRcdH1cblxuXHRcdGdlb21ldHJpZXNbIGdlb21ldHJ5LmlkIF0gPSBidWZmZXJnZW9tZXRyeTtcblxuXHRcdGluZm8ubWVtb3J5Lmdlb21ldHJpZXMgKys7XG5cblx0XHRyZXR1cm4gYnVmZmVyZ2VvbWV0cnk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBpbmRleCwgZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIgKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGdlb21ldHJ5QXR0cmlidXRlcyApIHtcblxuXHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGdlb21ldHJ5QXR0cmlidXRlc1sgbmFtZSBdLCBnbC5BUlJBWV9CVUZGRVIgKTtcblxuXHRcdH1cblxuXHRcdC8vIG1vcnBoIHRhcmdldHNcblxuXHRcdHZhciBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBtb3JwaEF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhcnJheSA9IG1vcnBoQXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBhcnJheVsgaSBdLCBnbC5BUlJBWV9CVUZGRVIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGF0dHJpYnV0ZSApIHJldHVybiBhdHRyaWJ1dGU7XG5cblx0XHR2YXIgaW5kaWNlcyA9IFtdO1xuXG5cdFx0dmFyIGdlb21ldHJ5SW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHR2YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdC8vIGNvbnNvbGUudGltZSggJ3dpcmVmcmFtZScgKTtcblxuXHRcdGlmICggZ2VvbWV0cnlJbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gZ2VvbWV0cnlJbmRleC5hcnJheTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdHZhciBhID0gYXJyYXlbIGkgKyAwIF07XG5cdFx0XHRcdHZhciBiID0gYXJyYXlbIGkgKyAxIF07XG5cdFx0XHRcdHZhciBjID0gYXJyYXlbIGkgKyAyIF07XG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBiLCBjLCBjLCBhICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBhcnJheSA9IGdlb21ldHJ5QXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gKCBhcnJheS5sZW5ndGggLyAzICkgLSAxOyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdHZhciBhID0gaSArIDA7XG5cdFx0XHRcdHZhciBiID0gaSArIDE7XG5cdFx0XHRcdHZhciBjID0gaSArIDI7XG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBiLCBjLCBjLCBhICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGNvbnNvbGUudGltZUVuZCggJ3dpcmVmcmFtZScgKTtcblxuXHRcdGF0dHJpYnV0ZSA9IG5ldyAoIGFycmF5TWF4KCBpbmRpY2VzICkgPiA2NTUzNSA/IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSA6IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSApKCBpbmRpY2VzLCAxICk7XG5cblx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggYXR0cmlidXRlLCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiApO1xuXG5cdFx0d2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXSA9IGF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiBhdHRyaWJ1dGU7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGdldCxcblx0XHR1cGRhdGU6IHVwZGF0ZSxcblxuXHRcdGdldFdpcmVmcmFtZUF0dHJpYnV0ZTogZ2V0V2lyZWZyYW1lQXR0cmlidXRlXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIoIGdsLCBleHRlbnNpb25zLCBpbmZvICkge1xuXG5cdHZhciBtb2RlO1xuXG5cdGZ1bmN0aW9uIHNldE1vZGUoIHZhbHVlICkge1xuXG5cdFx0bW9kZSA9IHZhbHVlO1xuXG5cdH1cblxuXHR2YXIgdHlwZSwgYnl0ZXNQZXJFbGVtZW50O1xuXG5cdGZ1bmN0aW9uIHNldEluZGV4KCB2YWx1ZSApIHtcblxuXHRcdHR5cGUgPSB2YWx1ZS50eXBlO1xuXHRcdGJ5dGVzUGVyRWxlbWVudCA9IHZhbHVlLmJ5dGVzUGVyRWxlbWVudDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyKCBzdGFydCwgY291bnQgKSB7XG5cblx0XHRnbC5kcmF3RWxlbWVudHMoIG1vZGUsIGNvdW50LCB0eXBlLCBzdGFydCAqIGJ5dGVzUGVyRWxlbWVudCApO1xuXG5cdFx0aW5mby51cGRhdGUoIGNvdW50LCBtb2RlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlckluc3RhbmNlcyggZ2VvbWV0cnksIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRleHRlbnNpb24uZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUoIG1vZGUsIGNvdW50LCB0eXBlLCBzdGFydCAqIGJ5dGVzUGVyRWxlbWVudCwgZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgKTtcblxuXHRcdGluZm8udXBkYXRlKCBjb3VudCwgbW9kZSwgZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgKTtcblxuXHR9XG5cblx0Ly9cblxuXHR0aGlzLnNldE1vZGUgPSBzZXRNb2RlO1xuXHR0aGlzLnNldEluZGV4ID0gc2V0SW5kZXg7XG5cdHRoaXMucmVuZGVyID0gcmVuZGVyO1xuXHR0aGlzLnJlbmRlckluc3RhbmNlcyA9IHJlbmRlckluc3RhbmNlcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gV2ViR0xJbmZvKCBnbCApIHtcblxuXHR2YXIgbWVtb3J5ID0ge1xuXHRcdGdlb21ldHJpZXM6IDAsXG5cdFx0dGV4dHVyZXM6IDBcblx0fTtcblxuXHR2YXIgcmVuZGVyID0ge1xuXHRcdGZyYW1lOiAwLFxuXHRcdGNhbGxzOiAwLFxuXHRcdHRyaWFuZ2xlczogMCxcblx0XHRwb2ludHM6IDAsXG5cdFx0bGluZXM6IDBcblx0fTtcblxuXHRmdW5jdGlvbiB1cGRhdGUoIGNvdW50LCBtb2RlLCBpbnN0YW5jZUNvdW50ICkge1xuXG5cdFx0aW5zdGFuY2VDb3VudCA9IGluc3RhbmNlQ291bnQgfHwgMTtcblxuXHRcdHJlbmRlci5jYWxscyArKztcblxuXHRcdHN3aXRjaCAoIG1vZGUgKSB7XG5cblx0XHRcdGNhc2UgZ2wuVFJJQU5HTEVTOlxuXHRcdFx0XHRyZW5kZXIudHJpYW5nbGVzICs9IGluc3RhbmNlQ291bnQgKiAoIGNvdW50IC8gMyApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBnbC5UUklBTkdMRV9TVFJJUDpcblx0XHRcdGNhc2UgZ2wuVFJJQU5HTEVfRkFOOlxuXHRcdFx0XHRyZW5kZXIudHJpYW5nbGVzICs9IGluc3RhbmNlQ291bnQgKiAoIGNvdW50IC0gMiApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBnbC5MSU5FUzpcblx0XHRcdFx0cmVuZGVyLmxpbmVzICs9IGluc3RhbmNlQ291bnQgKiAoIGNvdW50IC8gMiApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBnbC5MSU5FX1NUUklQOlxuXHRcdFx0XHRyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLSAxICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGdsLkxJTkVfTE9PUDpcblx0XHRcdFx0cmVuZGVyLmxpbmVzICs9IGluc3RhbmNlQ291bnQgKiBjb3VudDtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgZ2wuUE9JTlRTOlxuXHRcdFx0XHRyZW5kZXIucG9pbnRzICs9IGluc3RhbmNlQ291bnQgKiBjb3VudDtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTEluZm86IFVua25vd24gZHJhdyBtb2RlOicsIG1vZGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXG5cdFx0cmVuZGVyLmZyYW1lICsrO1xuXHRcdHJlbmRlci5jYWxscyA9IDA7XG5cdFx0cmVuZGVyLnRyaWFuZ2xlcyA9IDA7XG5cdFx0cmVuZGVyLnBvaW50cyA9IDA7XG5cdFx0cmVuZGVyLmxpbmVzID0gMDtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRtZW1vcnk6IG1lbW9yeSxcblx0XHRyZW5kZXI6IHJlbmRlcixcblx0XHRwcm9ncmFtczogbnVsbCxcblx0XHRhdXRvUmVzZXQ6IHRydWUsXG5cdFx0cmVzZXQ6IHJlc2V0LFxuXHRcdHVwZGF0ZTogdXBkYXRlXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIGFic051bWVyaWNhbFNvcnQoIGEsIGIgKSB7XG5cblx0cmV0dXJuIE1hdGguYWJzKCBiWyAxIF0gKSAtIE1hdGguYWJzKCBhWyAxIF0gKTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTE1vcnBodGFyZ2V0cyggZ2wgKSB7XG5cblx0dmFyIGluZmx1ZW5jZXNMaXN0ID0ge307XG5cdHZhciBtb3JwaEluZmx1ZW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KCA4ICk7XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcHJvZ3JhbSApIHtcblxuXHRcdHZhciBvYmplY3RJbmZsdWVuY2VzID0gb2JqZWN0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztcblxuXHRcdHZhciBsZW5ndGggPSBvYmplY3RJbmZsdWVuY2VzLmxlbmd0aDtcblxuXHRcdHZhciBpbmZsdWVuY2VzID0gaW5mbHVlbmNlc0xpc3RbIGdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGluZmx1ZW5jZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gaW5pdGlhbGlzZSBsaXN0XG5cblx0XHRcdGluZmx1ZW5jZXMgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdGluZmx1ZW5jZXNbIGkgXSA9IFsgaSwgMCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGluZmx1ZW5jZXNMaXN0WyBnZW9tZXRyeS5pZCBdID0gaW5mbHVlbmNlcztcblxuXHRcdH1cblxuXHRcdHZhciBtb3JwaFRhcmdldHMgPSBtYXRlcmlhbC5tb3JwaFRhcmdldHMgJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdHZhciBtb3JwaE5vcm1hbHMgPSBtYXRlcmlhbC5tb3JwaE5vcm1hbHMgJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdC8vIFJlbW92ZSBjdXJyZW50IG1vcnBoQXR0cmlidXRlc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaW5mbHVlbmNlID0gaW5mbHVlbmNlc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGluZmx1ZW5jZVsgMSBdICE9PSAwICkge1xuXG5cdFx0XHRcdGlmICggbW9ycGhUYXJnZXRzICkgZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbW9ycGhUYXJnZXQnICsgaSApO1xuXHRcdFx0XHRpZiAoIG1vcnBoTm9ybWFscyApIGdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSggJ21vcnBoTm9ybWFsJyArIGkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gQ29sbGVjdCBpbmZsdWVuY2VzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbmZsdWVuY2UgPSBpbmZsdWVuY2VzWyBpIF07XG5cblx0XHRcdGluZmx1ZW5jZVsgMCBdID0gaTtcblx0XHRcdGluZmx1ZW5jZVsgMSBdID0gb2JqZWN0SW5mbHVlbmNlc1sgaSBdO1xuXG5cdFx0fVxuXG5cdFx0aW5mbHVlbmNlcy5zb3J0KCBhYnNOdW1lcmljYWxTb3J0ICk7XG5cblx0XHQvLyBBZGQgbW9ycGhBdHRyaWJ1dGVzXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA4OyBpICsrICkge1xuXG5cdFx0XHR2YXIgaW5mbHVlbmNlID0gaW5mbHVlbmNlc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGluZmx1ZW5jZSApIHtcblxuXHRcdFx0XHR2YXIgaW5kZXggPSBpbmZsdWVuY2VbIDAgXTtcblx0XHRcdFx0dmFyIHZhbHVlID0gaW5mbHVlbmNlWyAxIF07XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSApIHtcblxuXHRcdFx0XHRcdGlmICggbW9ycGhUYXJnZXRzICkgZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnbW9ycGhUYXJnZXQnICsgaSwgbW9ycGhUYXJnZXRzWyBpbmRleCBdICk7XG5cdFx0XHRcdFx0aWYgKCBtb3JwaE5vcm1hbHMgKSBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdtb3JwaE5vcm1hbCcgKyBpLCBtb3JwaE5vcm1hbHNbIGluZGV4IF0gKTtcblxuXHRcdFx0XHRcdG1vcnBoSW5mbHVlbmNlc1sgaSBdID0gdmFsdWU7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdG1vcnBoSW5mbHVlbmNlc1sgaSBdID0gMDtcblxuXHRcdH1cblxuXHRcdHByb2dyYW0uZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZSggZ2wsICdtb3JwaFRhcmdldEluZmx1ZW5jZXMnLCBtb3JwaEluZmx1ZW5jZXMgKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdHVwZGF0ZTogdXBkYXRlXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xPYmplY3RzKCBnZW9tZXRyaWVzLCBpbmZvICkge1xuXG5cdHZhciB1cGRhdGVMaXN0ID0ge307XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QgKSB7XG5cblx0XHR2YXIgZnJhbWUgPSBpbmZvLnJlbmRlci5mcmFtZTtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblx0XHR2YXIgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzLmdldCggb2JqZWN0LCBnZW9tZXRyeSApO1xuXG5cdFx0Ly8gVXBkYXRlIG9uY2UgcGVyIGZyYW1lXG5cblx0XHRpZiAoIHVwZGF0ZUxpc3RbIGJ1ZmZlcmdlb21ldHJ5LmlkIF0gIT09IGZyYW1lICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0YnVmZmVyZ2VvbWV0cnkudXBkYXRlRnJvbU9iamVjdCggb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cmllcy51cGRhdGUoIGJ1ZmZlcmdlb21ldHJ5ICk7XG5cblx0XHRcdHVwZGF0ZUxpc3RbIGJ1ZmZlcmdlb21ldHJ5LmlkIF0gPSBmcmFtZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBidWZmZXJnZW9tZXRyeTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcblxuXHRcdHVwZGF0ZUxpc3QgPSB7fTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdHVwZGF0ZTogdXBkYXRlLFxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2VcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDdWJlVGV4dHVyZSggaW1hZ2VzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdGltYWdlcyA9IGltYWdlcyAhPT0gdW5kZWZpbmVkID8gaW1hZ2VzIDogW107XG5cdG1hcHBpbmcgPSBtYXBwaW5nICE9PSB1bmRlZmluZWQgPyBtYXBwaW5nIDogQ3ViZVJlZmxlY3Rpb25NYXBwaW5nO1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgaW1hZ2VzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICk7XG5cblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXG59XG5cbkN1YmVUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5DdWJlVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJlVGV4dHVyZTtcblxuQ3ViZVRleHR1cmUucHJvdG90eXBlLmlzQ3ViZVRleHR1cmUgPSB0cnVlO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIEN1YmVUZXh0dXJlLnByb3RvdHlwZSwgJ2ltYWdlcycsIHtcblxuXHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmltYWdlO1xuXG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5pbWFnZSA9IHZhbHVlO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgdHNjaHdcbiAqXG4gKiBVbmlmb3JtcyBvZiBhIHByb2dyYW0uXG4gKiBUaG9zZSBmb3JtIGEgdHJlZSBzdHJ1Y3R1cmUgd2l0aCBhIHNwZWNpYWwgdG9wLWxldmVsIGNvbnRhaW5lciBmb3IgdGhlIHJvb3QsXG4gKiB3aGljaCB5b3UgZ2V0IGJ5IGNhbGxpbmcgJ25ldyBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSwgcmVuZGVyZXIgKScuXG4gKlxuICpcbiAqIFByb3BlcnRpZXMgb2YgaW5uZXIgbm9kZXMgaW5jbHVkaW5nIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyOlxuICpcbiAqIC5zZXEgLSBhcnJheSBvZiBuZXN0ZWQgdW5pZm9ybXNcbiAqIC5tYXAgLSBuZXN0ZWQgdW5pZm9ybXMgYnkgbmFtZVxuICpcbiAqXG4gKiBNZXRob2RzIG9mIGFsbCBub2RlcyBleGNlcHQgdGhlIHRvcC1sZXZlbCBjb250YWluZXI6XG4gKlxuICogLnNldFZhbHVlKCBnbCwgdmFsdWUsIFtyZW5kZXJlcl0gKVxuICpcbiAqIFx0XHR1cGxvYWRzIGEgdW5pZm9ybSB2YWx1ZShzKVxuICogIFx0dGhlICdyZW5kZXJlcicgcGFyYW1ldGVyIGlzIG5lZWRlZCBmb3Igc2FtcGxlciB1bmlmb3Jtc1xuICpcbiAqXG4gKiBTdGF0aWMgbWV0aG9kcyBvZiB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciAocmVuZGVyZXIgZmFjdG9yaXphdGlvbnMpOlxuICpcbiAqIC51cGxvYWQoIGdsLCBzZXEsIHZhbHVlcywgcmVuZGVyZXIgKVxuICpcbiAqIFx0XHRzZXRzIHVuaWZvcm1zIGluICdzZXEnIHRvICd2YWx1ZXNbaWRdLnZhbHVlJ1xuICpcbiAqIC5zZXFXaXRoVmFsdWUoIHNlcSwgdmFsdWVzICkgOiBmaWx0ZXJlZFNlcVxuICpcbiAqIFx0XHRmaWx0ZXJzICdzZXEnIGVudHJpZXMgd2l0aCBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHZhbHVlc1xuICpcbiAqXG4gKiBNZXRob2RzIG9mIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyIChyZW5kZXJlciBmYWN0b3JpemF0aW9ucyk6XG4gKlxuICogLnNldFZhbHVlKCBnbCwgbmFtZSwgdmFsdWUgKVxuICpcbiAqIFx0XHRzZXRzIHVuaWZvcm0gd2l0aCAgbmFtZSAnbmFtZScgdG8gJ3ZhbHVlJ1xuICpcbiAqIC5zZXQoIGdsLCBvYmosIHByb3AgKVxuICpcbiAqIFx0XHRzZXRzIHVuaWZvcm0gZnJvbSBvYmplY3QgYW5kIHByb3BlcnR5IHdpdGggc2FtZSBuYW1lIHRoYW4gdW5pZm9ybVxuICpcbiAqIC5zZXRPcHRpb25hbCggZ2wsIG9iaiwgcHJvcCApXG4gKlxuICogXHRcdGxpa2UgLnNldCBmb3IgYW4gb3B0aW9uYWwgcHJvcGVydHkgb2YgdGhlIG9iamVjdFxuICpcbiAqL1xuXG52YXIgZW1wdHlUZXh0dXJlID0gbmV3IFRleHR1cmUoKTtcbnZhciBlbXB0eUN1YmVUZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCk7XG5cbi8vIC0tLSBCYXNlIGZvciBpbm5lciBub2RlcyAoaW5jbHVkaW5nIHRoZSByb290KSAtLS1cblxuZnVuY3Rpb24gVW5pZm9ybUNvbnRhaW5lcigpIHtcblxuXHR0aGlzLnNlcSA9IFtdO1xuXHR0aGlzLm1hcCA9IHt9O1xuXG59XG5cbi8vIC0tLSBVdGlsaXRpZXMgLS0tXG5cbi8vIEFycmF5IENhY2hlcyAocHJvdmlkZSB0eXBlZCBhcnJheXMgZm9yIHRlbXBvcmFyeSBieSBzaXplKVxuXG52YXIgYXJyYXlDYWNoZUYzMiA9IFtdO1xudmFyIGFycmF5Q2FjaGVJMzIgPSBbXTtcblxuLy8gRmxvYXQzMkFycmF5IGNhY2hlcyB1c2VkIGZvciB1cGxvYWRpbmcgTWF0cml4IHVuaWZvcm1zXG5cbnZhciBtYXQ0YXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCAxNiApO1xudmFyIG1hdDNhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDkgKTtcblxuLy8gRmxhdHRlbmluZyBmb3IgYXJyYXlzIG9mIHZlY3RvcnMgYW5kIG1hdHJpY2VzXG5cbmZ1bmN0aW9uIGZsYXR0ZW4oIGFycmF5LCBuQmxvY2tzLCBibG9ja1NpemUgKSB7XG5cblx0dmFyIGZpcnN0RWxlbSA9IGFycmF5WyAwIF07XG5cblx0aWYgKCBmaXJzdEVsZW0gPD0gMCB8fCBmaXJzdEVsZW0gPiAwICkgcmV0dXJuIGFycmF5O1xuXHQvLyB1bm9wdGltaXplZDogISBpc05hTiggZmlyc3RFbGVtIClcblx0Ly8gc2VlIGh0dHA6Ly9qYWNrc29uZHVuc3Rhbi5jb20vYXJ0aWNsZXMvOTgzXG5cblx0dmFyIG4gPSBuQmxvY2tzICogYmxvY2tTaXplLFxuXHRcdHIgPSBhcnJheUNhY2hlRjMyWyBuIF07XG5cblx0aWYgKCByID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRyID0gbmV3IEZsb2F0MzJBcnJheSggbiApO1xuXHRcdGFycmF5Q2FjaGVGMzJbIG4gXSA9IHI7XG5cblx0fVxuXG5cdGlmICggbkJsb2NrcyAhPT0gMCApIHtcblxuXHRcdGZpcnN0RWxlbS50b0FycmF5KCByLCAwICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDEsIG9mZnNldCA9IDA7IGkgIT09IG5CbG9ja3M7ICsrIGkgKSB7XG5cblx0XHRcdG9mZnNldCArPSBibG9ja1NpemU7XG5cdFx0XHRhcnJheVsgaSBdLnRvQXJyYXkoIHIsIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gcjtcblxufVxuXG4vLyBUZXh0dXJlIHVuaXQgYWxsb2NhdGlvblxuXG5mdW5jdGlvbiBhbGxvY1RleFVuaXRzKCByZW5kZXJlciwgbiApIHtcblxuXHR2YXIgciA9IGFycmF5Q2FjaGVJMzJbIG4gXTtcblxuXHRpZiAoIHIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHIgPSBuZXcgSW50MzJBcnJheSggbiApO1xuXHRcdGFycmF5Q2FjaGVJMzJbIG4gXSA9IHI7XG5cblx0fVxuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApXG5cdFx0clsgaSBdID0gcmVuZGVyZXIuYWxsb2NUZXh0dXJlVW5pdCgpO1xuXG5cdHJldHVybiByO1xuXG59XG5cbi8vIC0tLSBTZXR0ZXJzIC0tLVxuXG4vLyBOb3RlOiBEZWZpbmluZyB0aGVzZSBtZXRob2RzIGV4dGVybmFsbHksIGJlY2F1c2UgdGhleSBjb21lIGluIGEgYnVuY2hcbi8vIGFuZCB0aGlzIHdheSB0aGVpciBuYW1lcyBtaW5pZnkuXG5cbi8vIFNpbmdsZSBzY2FsYXJcblxuZnVuY3Rpb24gc2V0VmFsdWUxZiggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTFmKCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTFpKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdiApO1xuXG59XG5cbi8vIFNpbmdsZSBmbG9hdCB2ZWN0b3IgKGZyb20gZmxhdCBhcnJheSBvciBUSFJFRS5WZWN0b3JOKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTJmdiggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LnggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLnVuaWZvcm0yZnYoIHRoaXMuYWRkciwgdiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRnbC51bmlmb3JtMmYoIHRoaXMuYWRkciwgdi54LCB2LnkgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWUzZnYoIGdsLCB2ICkge1xuXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtM2YoIHRoaXMuYWRkciwgdi54LCB2LnksIHYueiApO1xuXG5cdH0gZWxzZSBpZiAoIHYuciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wudW5pZm9ybTNmKCB0aGlzLmFkZHIsIHYuciwgdi5nLCB2LmIgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Z2wudW5pZm9ybTNmdiggdGhpcy5hZGRyLCB2ICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlNGZ2KCBnbCwgdiApIHtcblxuXHRpZiAoIHYueCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wudW5pZm9ybTRmdiggdGhpcy5hZGRyLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdCBnbC51bmlmb3JtNGYoIHRoaXMuYWRkciwgdi54LCB2LnksIHYueiwgdi53ICk7XG5cblx0fVxuXG59XG5cbi8vIFNpbmdsZSBtYXRyaXggKGZyb20gZmxhdCBhcnJheSBvciBNYXRyaXhOKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTJmbSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRyLCBmYWxzZSwgdi5lbGVtZW50cyB8fCB2ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWUzZm0oIGdsLCB2ICkge1xuXG5cdGlmICggdi5lbGVtZW50cyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRtYXQzYXJyYXkuc2V0KCB2LmVsZW1lbnRzICk7XG5cdFx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgbWF0M2FycmF5ICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlNGZtKCBnbCwgdiApIHtcblxuXHRpZiAoIHYuZWxlbWVudHMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMuYWRkciwgZmFsc2UsIHYgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0bWF0NGFycmF5LnNldCggdi5lbGVtZW50cyApO1xuXHRcdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMuYWRkciwgZmFsc2UsIG1hdDRhcnJheSApO1xuXG5cdH1cblxufVxuXG4vLyBTaW5nbGUgdGV4dHVyZSAoMkQgLyBDdWJlKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVQxKCBnbCwgdiwgcmVuZGVyZXIgKSB7XG5cblx0dmFyIHVuaXQgPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7XG5cdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB1bml0ICk7XG5cdHJlbmRlcmVyLnNldFRleHR1cmUyRCggdiB8fCBlbXB0eVRleHR1cmUsIHVuaXQgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVQ2KCBnbCwgdiwgcmVuZGVyZXIgKSB7XG5cblx0dmFyIHVuaXQgPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7XG5cdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB1bml0ICk7XG5cdHJlbmRlcmVyLnNldFRleHR1cmVDdWJlKCB2IHx8IGVtcHR5Q3ViZVRleHR1cmUsIHVuaXQgKTtcblxufVxuXG4vLyBJbnRlZ2VyIC8gQm9vbGVhbiB2ZWN0b3JzIG9yIGFycmF5cyB0aGVyZW9mIChhbHdheXMgZmxhdCBhcnJheXMpXG5cbmZ1bmN0aW9uIHNldFZhbHVlMml2KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMml2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTNpdiggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTNpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWU0aXYoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm00aXYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5cbi8vIEhlbHBlciB0byBwaWNrIHRoZSByaWdodCBzZXR0ZXIgZm9yIHRoZSBzaW5ndWxhciBjYXNlXG5cbmZ1bmN0aW9uIGdldFNpbmd1bGFyU2V0dGVyKCB0eXBlICkge1xuXG5cdHN3aXRjaCAoIHR5cGUgKSB7XG5cblx0XHRjYXNlIDB4MTQwNjogcmV0dXJuIHNldFZhbHVlMWY7IC8vIEZMT0FUXG5cdFx0Y2FzZSAweDhiNTA6IHJldHVybiBzZXRWYWx1ZTJmdjsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1MTogcmV0dXJuIHNldFZhbHVlM2Z2OyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjUyOiByZXR1cm4gc2V0VmFsdWU0ZnY7IC8vIF9WRUM0XG5cblx0XHRjYXNlIDB4OGI1YTogcmV0dXJuIHNldFZhbHVlMmZtOyAvLyBfTUFUMlxuXHRcdGNhc2UgMHg4YjViOiByZXR1cm4gc2V0VmFsdWUzZm07IC8vIF9NQVQzXG5cdFx0Y2FzZSAweDhiNWM6IHJldHVybiBzZXRWYWx1ZTRmbTsgLy8gX01BVDRcblxuXHRcdGNhc2UgMHg4YjVlOiBjYXNlIDB4OGQ2NjogcmV0dXJuIHNldFZhbHVlVDE7IC8vIFNBTVBMRVJfMkQsIFNBTVBMRVJfRVhURVJOQUxfT0VTXG5cdFx0Y2FzZSAweDhiNjA6IHJldHVybiBzZXRWYWx1ZVQ2OyAvLyBTQU1QTEVSX0NVQkVcblxuXHRcdGNhc2UgMHgxNDA0OiBjYXNlIDB4OGI1NjogcmV0dXJuIHNldFZhbHVlMWk7IC8vIElOVCwgQk9PTFxuXHRcdGNhc2UgMHg4YjUzOiBjYXNlIDB4OGI1NzogcmV0dXJuIHNldFZhbHVlMml2OyAvLyBfVkVDMlxuXHRcdGNhc2UgMHg4YjU0OiBjYXNlIDB4OGI1ODogcmV0dXJuIHNldFZhbHVlM2l2OyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjU1OiBjYXNlIDB4OGI1OTogcmV0dXJuIHNldFZhbHVlNGl2OyAvLyBfVkVDNFxuXG5cdH1cblxufVxuXG4vLyBBcnJheSBvZiBzY2FsYXJzXG5cbmZ1bmN0aW9uIHNldFZhbHVlMWZ2KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMWZ2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuZnVuY3Rpb24gc2V0VmFsdWUxaXYoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5cbi8vIEFycmF5IG9mIHZlY3RvcnMgKGZsYXQgb3IgZnJvbSBUSFJFRSBjbGFzc2VzKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYyYSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTJmdiggdGhpcy5hZGRyLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDIgKSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVjNhKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtM2Z2KCB0aGlzLmFkZHIsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMyApICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWNGEoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm00ZnYoIHRoaXMuYWRkciwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCA0ICkgKTtcblxufVxuXG4vLyBBcnJheSBvZiBtYXRyaWNlcyAoZmxhdCBvciBmcm9tIFRIUkVFIGNsYXNlcylcblxuZnVuY3Rpb24gc2V0VmFsdWVNMmEoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm1NYXRyaXgyZnYoIHRoaXMuYWRkciwgZmFsc2UsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgNCApICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVNM2EoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm1NYXRyaXgzZnYoIHRoaXMuYWRkciwgZmFsc2UsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgOSApICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVNNGEoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMuYWRkciwgZmFsc2UsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMTYgKSApO1xuXG59XG5cbi8vIEFycmF5IG9mIHRleHR1cmVzICgyRCAvIEN1YmUpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVDFhKCBnbCwgdiwgcmVuZGVyZXIgKSB7XG5cblx0dmFyIG4gPSB2Lmxlbmd0aCxcblx0XHR1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICk7XG5cblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB1bml0cyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHJlbmRlcmVyLnNldFRleHR1cmUyRCggdlsgaSBdIHx8IGVtcHR5VGV4dHVyZSwgdW5pdHNbIGkgXSApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVQ2YSggZ2wsIHYsIHJlbmRlcmVyICkge1xuXG5cdHZhciBuID0gdi5sZW5ndGgsXG5cdFx0dW5pdHMgPSBhbGxvY1RleFVuaXRzKCByZW5kZXJlciwgbiApO1xuXG5cdGdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdW5pdHMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRyZW5kZXJlci5zZXRUZXh0dXJlQ3ViZSggdlsgaSBdIHx8IGVtcHR5Q3ViZVRleHR1cmUsIHVuaXRzWyBpIF0gKTtcblxuXHR9XG5cbn1cblxuLy8gSGVscGVyIHRvIHBpY2sgdGhlIHJpZ2h0IHNldHRlciBmb3IgYSBwdXJlIChib3R0b20tbGV2ZWwpIGFycmF5XG5cbmZ1bmN0aW9uIGdldFB1cmVBcnJheVNldHRlciggdHlwZSApIHtcblxuXHRzd2l0Y2ggKCB0eXBlICkge1xuXG5cdFx0Y2FzZSAweDE0MDY6IHJldHVybiBzZXRWYWx1ZTFmdjsgLy8gRkxPQVRcblx0XHRjYXNlIDB4OGI1MDogcmV0dXJuIHNldFZhbHVlVjJhOyAvLyBfVkVDMlxuXHRcdGNhc2UgMHg4YjUxOiByZXR1cm4gc2V0VmFsdWVWM2E7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTI6IHJldHVybiBzZXRWYWx1ZVY0YTsgLy8gX1ZFQzRcblxuXHRcdGNhc2UgMHg4YjVhOiByZXR1cm4gc2V0VmFsdWVNMmE7IC8vIF9NQVQyXG5cdFx0Y2FzZSAweDhiNWI6IHJldHVybiBzZXRWYWx1ZU0zYTsgLy8gX01BVDNcblx0XHRjYXNlIDB4OGI1YzogcmV0dXJuIHNldFZhbHVlTTRhOyAvLyBfTUFUNFxuXG5cdFx0Y2FzZSAweDhiNWU6IHJldHVybiBzZXRWYWx1ZVQxYTsgLy8gU0FNUExFUl8yRFxuXHRcdGNhc2UgMHg4YjYwOiByZXR1cm4gc2V0VmFsdWVUNmE7IC8vIFNBTVBMRVJfQ1VCRVxuXG5cdFx0Y2FzZSAweDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFsdWUxaXY7IC8vIElOVCwgQk9PTFxuXHRcdGNhc2UgMHg4YjUzOiBjYXNlIDB4OGI1NzogcmV0dXJuIHNldFZhbHVlMml2OyAvLyBfVkVDMlxuXHRcdGNhc2UgMHg4YjU0OiBjYXNlIDB4OGI1ODogcmV0dXJuIHNldFZhbHVlM2l2OyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjU1OiBjYXNlIDB4OGI1OTogcmV0dXJuIHNldFZhbHVlNGl2OyAvLyBfVkVDNFxuXG5cdH1cblxufVxuXG4vLyAtLS0gVW5pZm9ybSBDbGFzc2VzIC0tLVxuXG5mdW5jdGlvbiBTaW5nbGVVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIHtcblxuXHR0aGlzLmlkID0gaWQ7XG5cdHRoaXMuYWRkciA9IGFkZHI7XG5cdHRoaXMuc2V0VmFsdWUgPSBnZXRTaW5ndWxhclNldHRlciggYWN0aXZlSW5mby50eXBlICk7XG5cblx0Ly8gdGhpcy5wYXRoID0gYWN0aXZlSW5mby5uYW1lOyAvLyBERUJVR1xuXG59XG5cbmZ1bmN0aW9uIFB1cmVBcnJheVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblx0dGhpcy5hZGRyID0gYWRkcjtcblx0dGhpcy5zaXplID0gYWN0aXZlSW5mby5zaXplO1xuXHR0aGlzLnNldFZhbHVlID0gZ2V0UHVyZUFycmF5U2V0dGVyKCBhY3RpdmVJbmZvLnR5cGUgKTtcblxuXHQvLyB0aGlzLnBhdGggPSBhY3RpdmVJbmZvLm5hbWU7IC8vIERFQlVHXG5cbn1cblxuZnVuY3Rpb24gU3RydWN0dXJlZFVuaWZvcm0oIGlkICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblxuXHRVbmlmb3JtQ29udGFpbmVyLmNhbGwoIHRoaXMgKTsgLy8gbWl4LWluXG5cbn1cblxuU3RydWN0dXJlZFVuaWZvcm0ucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKCBnbCwgdmFsdWUgKSB7XG5cblx0Ly8gTm90ZTogRG9uJ3QgbmVlZCBhbiBleHRyYSAncmVuZGVyZXInIHBhcmFtZXRlciwgc2luY2Ugc2FtcGxlcnNcblx0Ly8gYXJlIG5vdCBhbGxvd2VkIGluIHN0cnVjdHVyZWQgdW5pZm9ybXMuXG5cblx0dmFyIHNlcSA9IHRoaXMuc2VxO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHR2YXIgdSA9IHNlcVsgaSBdO1xuXHRcdHUuc2V0VmFsdWUoIGdsLCB2YWx1ZVsgdS5pZCBdICk7XG5cblx0fVxuXG59O1xuXG4vLyAtLS0gVG9wLWxldmVsIC0tLVxuXG4vLyBQYXJzZXIgLSBidWlsZHMgdXAgdGhlIHByb3BlcnR5IHRyZWUgZnJvbSB0aGUgcGF0aCBzdHJpbmdzXG5cbnZhciBSZVBhdGhQYXJ0ID0gLyhbXFx3XFxkX10rKShcXF0pPyhcXFt8XFwuKT8vZztcblxuLy8gZXh0cmFjdHNcbi8vIFx0LSB0aGUgaWRlbnRpZmllciAobWVtYmVyIG5hbWUgb3IgYXJyYXkgaW5kZXgpXG4vLyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCByaWdodCBicmFja2V0IChmb3VuZCB3aGVuIGFycmF5IGluZGV4KVxuLy8gIC0gZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgbGVmdCBicmFja2V0IG9yIGRvdCAodHlwZSBvZiBzdWJzY3JpcHQpXG4vL1xuLy8gTm90ZTogVGhlc2UgcG9ydGlvbnMgY2FuIGJlIHJlYWQgaW4gYSBub24tb3ZlcmxhcHBpbmcgZmFzaGlvbiBhbmRcbi8vIGFsbG93IHN0cmFpZ2h0Zm9yd2FyZCBwYXJzaW5nIG9mIHRoZSBoaWVyYXJjaHkgdGhhdCBXZWJHTCBlbmNvZGVzXG4vLyBpbiB0aGUgdW5pZm9ybSBuYW1lcy5cblxuZnVuY3Rpb24gYWRkVW5pZm9ybSggY29udGFpbmVyLCB1bmlmb3JtT2JqZWN0ICkge1xuXG5cdGNvbnRhaW5lci5zZXEucHVzaCggdW5pZm9ybU9iamVjdCApO1xuXHRjb250YWluZXIubWFwWyB1bmlmb3JtT2JqZWN0LmlkIF0gPSB1bmlmb3JtT2JqZWN0O1xuXG59XG5cbmZ1bmN0aW9uIHBhcnNlVW5pZm9ybSggYWN0aXZlSW5mbywgYWRkciwgY29udGFpbmVyICkge1xuXG5cdHZhciBwYXRoID0gYWN0aXZlSW5mby5uYW1lLFxuXHRcdHBhdGhMZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuXHQvLyByZXNldCBSZWdFeHAgb2JqZWN0LCBiZWNhdXNlIG9mIHRoZSBlYXJseSBleGl0IG9mIGEgcHJldmlvdXMgcnVuXG5cdFJlUGF0aFBhcnQubGFzdEluZGV4ID0gMDtcblxuXHRmb3IgKCA7IDsgKSB7XG5cblx0XHR2YXIgbWF0Y2ggPSBSZVBhdGhQYXJ0LmV4ZWMoIHBhdGggKSxcblx0XHRcdG1hdGNoRW5kID0gUmVQYXRoUGFydC5sYXN0SW5kZXgsXG5cblx0XHRcdGlkID0gbWF0Y2hbIDEgXSxcblx0XHRcdGlkSXNJbmRleCA9IG1hdGNoWyAyIF0gPT09ICddJyxcblx0XHRcdHN1YnNjcmlwdCA9IG1hdGNoWyAzIF07XG5cblx0XHRpZiAoIGlkSXNJbmRleCApIGlkID0gaWQgfCAwOyAvLyBjb252ZXJ0IHRvIGludGVnZXJcblxuXHRcdGlmICggc3Vic2NyaXB0ID09PSB1bmRlZmluZWQgfHwgc3Vic2NyaXB0ID09PSAnWycgJiYgbWF0Y2hFbmQgKyAyID09PSBwYXRoTGVuZ3RoICkge1xuXG5cdFx0XHQvLyBiYXJlIG5hbWUgb3IgXCJwdXJlXCIgYm90dG9tLWxldmVsIGFycmF5IFwiWzBdXCIgc3VmZml4XG5cblx0XHRcdGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgc3Vic2NyaXB0ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRuZXcgU2luZ2xlVW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSA6XG5cdFx0XHRcdG5ldyBQdXJlQXJyYXlVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApICk7XG5cblx0XHRcdGJyZWFrO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gc3RlcCBpbnRvIGlubmVyIG5vZGUgLyBjcmVhdGUgaXQgaW4gY2FzZSBpdCBkb2Vzbid0IGV4aXN0XG5cblx0XHRcdHZhciBtYXAgPSBjb250YWluZXIubWFwLCBuZXh0ID0gbWFwWyBpZCBdO1xuXG5cdFx0XHRpZiAoIG5leHQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRuZXh0ID0gbmV3IFN0cnVjdHVyZWRVbmlmb3JtKCBpZCApO1xuXHRcdFx0XHRhZGRVbmlmb3JtKCBjb250YWluZXIsIG5leHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb250YWluZXIgPSBuZXh0O1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG4vLyBSb290IENvbnRhaW5lclxuXG5mdW5jdGlvbiBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSwgcmVuZGVyZXIgKSB7XG5cblx0VW5pZm9ybUNvbnRhaW5lci5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuXG5cdHZhciBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuQUNUSVZFX1VOSUZPUk1TICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbjsgKysgaSApIHtcblxuXHRcdHZhciBpbmZvID0gZ2wuZ2V0QWN0aXZlVW5pZm9ybSggcHJvZ3JhbSwgaSApLFxuXHRcdFx0YWRkciA9IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgaW5mby5uYW1lICk7XG5cblx0XHRwYXJzZVVuaWZvcm0oIGluZm8sIGFkZHIsIHRoaXMgKTtcblxuXHR9XG5cbn1cblxuV2ViR0xVbmlmb3Jtcy5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAoIGdsLCBuYW1lLCB2YWx1ZSApIHtcblxuXHR2YXIgdSA9IHRoaXMubWFwWyBuYW1lIF07XG5cblx0aWYgKCB1ICE9PSB1bmRlZmluZWQgKSB1LnNldFZhbHVlKCBnbCwgdmFsdWUsIHRoaXMucmVuZGVyZXIgKTtcblxufTtcblxuV2ViR0xVbmlmb3Jtcy5wcm90b3R5cGUuc2V0T3B0aW9uYWwgPSBmdW5jdGlvbiAoIGdsLCBvYmplY3QsIG5hbWUgKSB7XG5cblx0dmFyIHYgPSBvYmplY3RbIG5hbWUgXTtcblxuXHRpZiAoIHYgIT09IHVuZGVmaW5lZCApIHRoaXMuc2V0VmFsdWUoIGdsLCBuYW1lLCB2ICk7XG5cbn07XG5cblxuLy8gU3RhdGljIGludGVyZmFjZVxuXG5XZWJHTFVuaWZvcm1zLnVwbG9hZCA9IGZ1bmN0aW9uICggZ2wsIHNlcSwgdmFsdWVzLCByZW5kZXJlciApIHtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0dmFyIHUgPSBzZXFbIGkgXSxcblx0XHRcdHYgPSB2YWx1ZXNbIHUuaWQgXTtcblxuXHRcdGlmICggdi5uZWVkc1VwZGF0ZSAhPT0gZmFsc2UgKSB7XG5cblx0XHRcdC8vIG5vdGU6IGFsd2F5cyB1cGRhdGluZyB3aGVuIC5uZWVkc1VwZGF0ZSBpcyB1bmRlZmluZWRcblx0XHRcdHUuc2V0VmFsdWUoIGdsLCB2LnZhbHVlLCByZW5kZXJlciApO1xuXG5cdFx0fVxuXG5cdH1cblxufTtcblxuV2ViR0xVbmlmb3Jtcy5zZXFXaXRoVmFsdWUgPSBmdW5jdGlvbiAoIHNlcSwgdmFsdWVzICkge1xuXG5cdHZhciByID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHZhciB1ID0gc2VxWyBpIF07XG5cdFx0aWYgKCB1LmlkIGluIHZhbHVlcyApIHIucHVzaCggdSApO1xuXG5cdH1cblxuXHRyZXR1cm4gcjtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBzdHJpbmcgKSB7XG5cblx0dmFyIGxpbmVzID0gc3RyaW5nLnNwbGl0KCAnXFxuJyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdGxpbmVzWyBpIF0gPSAoIGkgKyAxICkgKyAnOiAnICsgbGluZXNbIGkgXTtcblxuXHR9XG5cblx0cmV0dXJuIGxpbmVzLmpvaW4oICdcXG4nICk7XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xTaGFkZXIoIGdsLCB0eXBlLCBzdHJpbmcgKSB7XG5cblx0dmFyIHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggdHlwZSApO1xuXG5cdGdsLnNoYWRlclNvdXJjZSggc2hhZGVyLCBzdHJpbmcgKTtcblx0Z2wuY29tcGlsZVNoYWRlciggc2hhZGVyICk7XG5cblx0aWYgKCBnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoIHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTaGFkZXI6IFNoYWRlciBjb3VsZG5cXCd0IGNvbXBpbGUuJyApO1xuXG5cdH1cblxuXHRpZiAoIGdsLmdldFNoYWRlckluZm9Mb2coIHNoYWRlciApICE9PSAnJyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZGVyOiBnbC5nZXRTaGFkZXJJbmZvTG9nKCknLCB0eXBlID09PSBnbC5WRVJURVhfU0hBREVSID8gJ3ZlcnRleCcgOiAnZnJhZ21lbnQnLCBnbC5nZXRTaGFkZXJJbmZvTG9nKCBzaGFkZXIgKSwgYWRkTGluZU51bWJlcnMoIHN0cmluZyApICk7XG5cblx0fVxuXG5cdC8vIC0tZW5hYmxlLXByaXZpbGVnZWQtd2ViZ2wtZXh0ZW5zaW9uXG5cdC8vIGNvbnNvbGUubG9nKCB0eXBlLCBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZWJ1Z19zaGFkZXJzJyApLmdldFRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UoIHNoYWRlciApICk7XG5cblx0cmV0dXJuIHNoYWRlcjtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIHByb2dyYW1JZENvdW50ID0gMDtcblxuZnVuY3Rpb24gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBlbmNvZGluZyApIHtcblxuXHRzd2l0Y2ggKCBlbmNvZGluZyApIHtcblxuXHRcdGNhc2UgTGluZWFyRW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnTGluZWFyJywgJyggdmFsdWUgKScgXTtcblx0XHRjYXNlIHNSR0JFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdzUkdCJywgJyggdmFsdWUgKScgXTtcblx0XHRjYXNlIFJHQkVFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JFJywgJyggdmFsdWUgKScgXTtcblx0XHRjYXNlIFJHQk03RW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCTScsICcoIHZhbHVlLCA3LjAgKScgXTtcblx0XHRjYXNlIFJHQk0xNkVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ1JHQk0nLCAnKCB2YWx1ZSwgMTYuMCApJyBdO1xuXHRcdGNhc2UgUkdCREVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ1JHQkQnLCAnKCB2YWx1ZSwgMjU2LjAgKScgXTtcblx0XHRjYXNlIEdhbW1hRW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnR2FtbWEnLCAnKCB2YWx1ZSwgZmxvYXQoIEdBTU1BX0ZBQ1RPUiApICknIF07XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ3Vuc3VwcG9ydGVkIGVuY29kaW5nOiAnICsgZW5jb2RpbmcgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGVuY29kaW5nICkge1xuXG5cdHZhciBjb21wb25lbnRzID0gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBlbmNvZGluZyApO1xuXHRyZXR1cm4gJ3ZlYzQgJyArIGZ1bmN0aW9uTmFtZSArICcoIHZlYzQgdmFsdWUgKSB7IHJldHVybiAnICsgY29tcG9uZW50c1sgMCBdICsgJ1RvTGluZWFyJyArIGNvbXBvbmVudHNbIDEgXSArICc7IH0nO1xuXG59XG5cbmZ1bmN0aW9uIGdldFRleGVsRW5jb2RpbmdGdW5jdGlvbiggZnVuY3Rpb25OYW1lLCBlbmNvZGluZyApIHtcblxuXHR2YXIgY29tcG9uZW50cyA9IGdldEVuY29kaW5nQ29tcG9uZW50cyggZW5jb2RpbmcgKTtcblx0cmV0dXJuICd2ZWM0ICcgKyBmdW5jdGlvbk5hbWUgKyAnKCB2ZWM0IHZhbHVlICkgeyByZXR1cm4gTGluZWFyVG8nICsgY29tcG9uZW50c1sgMCBdICsgY29tcG9uZW50c1sgMSBdICsgJzsgfSc7XG5cbn1cblxuZnVuY3Rpb24gZ2V0VG9uZU1hcHBpbmdGdW5jdGlvbiggZnVuY3Rpb25OYW1lLCB0b25lTWFwcGluZyApIHtcblxuXHR2YXIgdG9uZU1hcHBpbmdOYW1lO1xuXG5cdHN3aXRjaCAoIHRvbmVNYXBwaW5nICkge1xuXG5cdFx0Y2FzZSBMaW5lYXJUb25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdMaW5lYXInO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFJlaW5oYXJkVG9uZU1hcHBpbmc6XG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSAnUmVpbmhhcmQnO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFVuY2hhcnRlZDJUb25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdVbmNoYXJ0ZWQyJztcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBDaW5lb25Ub25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdPcHRpbWl6ZWRDaW5lb24nO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAndW5zdXBwb3J0ZWQgdG9uZU1hcHBpbmc6ICcgKyB0b25lTWFwcGluZyApO1xuXG5cdH1cblxuXHRyZXR1cm4gJ3ZlYzMgJyArIGZ1bmN0aW9uTmFtZSArICcoIHZlYzMgY29sb3IgKSB7IHJldHVybiAnICsgdG9uZU1hcHBpbmdOYW1lICsgJ1RvbmVNYXBwaW5nKCBjb2xvciApOyB9JztcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUV4dGVuc2lvbnMoIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMsIHJlbmRlcmVyRXh0ZW5zaW9ucyApIHtcblxuXHRleHRlbnNpb25zID0gZXh0ZW5zaW9ucyB8fCB7fTtcblxuXHR2YXIgY2h1bmtzID0gW1xuXHRcdCggZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcyB8fCBwYXJhbWV0ZXJzLmVudk1hcEN1YmVVViB8fCBwYXJhbWV0ZXJzLmJ1bXBNYXAgfHwgcGFyYW1ldGVycy5ub3JtYWxNYXAgfHwgcGFyYW1ldGVycy5mbGF0U2hhZGluZyApID8gJyNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogZW5hYmxlJyA6ICcnLFxuXHRcdCggZXh0ZW5zaW9ucy5mcmFnRGVwdGggfHwgcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICkgJiYgcmVuZGVyZXJFeHRlbnNpb25zLmdldCggJ0VYVF9mcmFnX2RlcHRoJyApID8gJyNleHRlbnNpb24gR0xfRVhUX2ZyYWdfZGVwdGggOiBlbmFibGUnIDogJycsXG5cdFx0KCBleHRlbnNpb25zLmRyYXdCdWZmZXJzICkgJiYgcmVuZGVyZXJFeHRlbnNpb25zLmdldCggJ1dFQkdMX2RyYXdfYnVmZmVycycgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlJyA6ICcnLFxuXHRcdCggZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9EIHx8IHBhcmFtZXRlcnMuZW52TWFwICkgJiYgcmVuZGVyZXJFeHRlbnNpb25zLmdldCggJ0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QnICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfc2hhZGVyX3RleHR1cmVfbG9kIDogZW5hYmxlJyA6ICcnXG5cdF07XG5cblx0cmV0dXJuIGNodW5rcy5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVEZWZpbmVzKCBkZWZpbmVzICkge1xuXG5cdHZhciBjaHVua3MgPSBbXTtcblxuXHRmb3IgKCB2YXIgbmFtZSBpbiBkZWZpbmVzICkge1xuXG5cdFx0dmFyIHZhbHVlID0gZGVmaW5lc1sgbmFtZSBdO1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSBjb250aW51ZTtcblxuXHRcdGNodW5rcy5wdXNoKCAnI2RlZmluZSAnICsgbmFtZSArICcgJyArIHZhbHVlICk7XG5cblx0fVxuXG5cdHJldHVybiBjaHVua3Muam9pbiggJ1xcbicgKTtcblxufVxuXG5mdW5jdGlvbiBmZXRjaEF0dHJpYnV0ZUxvY2F0aW9ucyggZ2wsIHByb2dyYW0gKSB7XG5cblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblxuXHR2YXIgbiA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLkFDVElWRV9BVFRSSUJVVEVTICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbjsgaSArKyApIHtcblxuXHRcdHZhciBpbmZvID0gZ2wuZ2V0QWN0aXZlQXR0cmliKCBwcm9ncmFtLCBpICk7XG5cdFx0dmFyIG5hbWUgPSBpbmZvLm5hbWU7XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUHJvZ3JhbTogQUNUSVZFIFZFUlRFWCBBVFRSSUJVVEU6JywgbmFtZSwgaSApO1xuXG5cdFx0YXR0cmlidXRlc1sgbmFtZSBdID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24oIHByb2dyYW0sIG5hbWUgKTtcblxuXHR9XG5cblx0cmV0dXJuIGF0dHJpYnV0ZXM7XG5cbn1cblxuZnVuY3Rpb24gZmlsdGVyRW1wdHlMaW5lKCBzdHJpbmcgKSB7XG5cblx0cmV0dXJuIHN0cmluZyAhPT0gJyc7XG5cbn1cblxuZnVuY3Rpb24gcmVwbGFjZUxpZ2h0TnVtcyggc3RyaW5nLCBwYXJhbWV0ZXJzICkge1xuXG5cdHJldHVybiBzdHJpbmdcblx0XHQucmVwbGFjZSggL05VTV9ESVJfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtRGlyTGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9TUE9UX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1SZWN0QXJlYUxpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fUE9JTlRfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtUG9pbnRMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX0hFTUlfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtSGVtaUxpZ2h0cyApO1xuXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyggc3RyaW5nLCBwYXJhbWV0ZXJzICkge1xuXG5cdHJldHVybiBzdHJpbmdcblx0XHQucmVwbGFjZSggL05VTV9DTElQUElOR19QTEFORVMvZywgcGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcyApXG5cdFx0LnJlcGxhY2UoIC9VTklPTl9DTElQUElOR19QTEFORVMvZywgKCBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzIC0gcGFyYW1ldGVycy5udW1DbGlwSW50ZXJzZWN0aW9uICkgKTtcblxufVxuXG5mdW5jdGlvbiBwYXJzZUluY2x1ZGVzKCBzdHJpbmcgKSB7XG5cblx0dmFyIHBhdHRlcm4gPSAvXlsgXFx0XSojaW5jbHVkZSArPChbXFx3XFxkLl0rKT4vZ207XG5cblx0ZnVuY3Rpb24gcmVwbGFjZSggbWF0Y2gsIGluY2x1ZGUgKSB7XG5cblx0XHR2YXIgcmVwbGFjZSA9IFNoYWRlckNodW5rWyBpbmNsdWRlIF07XG5cblx0XHRpZiAoIHJlcGxhY2UgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIDwnICsgaW5jbHVkZSArICc+JyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBhcnNlSW5jbHVkZXMoIHJlcGxhY2UgKTtcblxuXHR9XG5cblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBwYXR0ZXJuLCByZXBsYWNlICk7XG5cbn1cblxuZnVuY3Rpb24gdW5yb2xsTG9vcHMoIHN0cmluZyApIHtcblxuXHR2YXIgcGF0dGVybiA9IC8jcHJhZ21hIHVucm9sbF9sb29wW1xcc10rP2ZvciBcXCggaW50IGkgXFw9IChcXGQrKVxcOyBpIDwgKFxcZCspXFw7IGkgXFwrXFwrIFxcKSBcXHsoW1xcc1xcU10rPykoPz1cXH0pXFx9L2c7XG5cblx0ZnVuY3Rpb24gcmVwbGFjZSggbWF0Y2gsIHN0YXJ0LCBlbmQsIHNuaXBwZXQgKSB7XG5cblx0XHR2YXIgdW5yb2xsID0gJyc7XG5cblx0XHRmb3IgKCB2YXIgaSA9IHBhcnNlSW50KCBzdGFydCApOyBpIDwgcGFyc2VJbnQoIGVuZCApOyBpICsrICkge1xuXG5cdFx0XHR1bnJvbGwgKz0gc25pcHBldC5yZXBsYWNlKCAvXFxbIGkgXFxdL2csICdbICcgKyBpICsgJyBdJyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVucm9sbDtcblxuXHR9XG5cblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBwYXR0ZXJuLCByZXBsYWNlICk7XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xQcm9ncmFtKCByZW5kZXJlciwgZXh0ZW5zaW9ucywgY29kZSwgbWF0ZXJpYWwsIHNoYWRlciwgcGFyYW1ldGVycyApIHtcblxuXHR2YXIgZ2wgPSByZW5kZXJlci5jb250ZXh0O1xuXG5cdHZhciBkZWZpbmVzID0gbWF0ZXJpYWwuZGVmaW5lcztcblxuXHR2YXIgdmVydGV4U2hhZGVyID0gc2hhZGVyLnZlcnRleFNoYWRlcjtcblx0dmFyIGZyYWdtZW50U2hhZGVyID0gc2hhZGVyLmZyYWdtZW50U2hhZGVyO1xuXG5cdHZhciBzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX0JBU0lDJztcblxuXHRpZiAoIHBhcmFtZXRlcnMuc2hhZG93TWFwVHlwZSA9PT0gUENGU2hhZG93TWFwICkge1xuXG5cdFx0c2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9QQ0YnO1xuXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMuc2hhZG93TWFwVHlwZSA9PT0gUENGU29mdFNoYWRvd01hcCApIHtcblxuXHRcdHNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQnO1xuXG5cdH1cblxuXHR2YXIgZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFJztcblx0dmFyIGVudk1hcE1vZGVEZWZpbmUgPSAnRU5WTUFQX01PREVfUkVGTEVDVElPTic7XG5cdHZhciBlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFknO1xuXG5cdGlmICggcGFyYW1ldGVycy5lbnZNYXAgKSB7XG5cblx0XHRzd2l0Y2ggKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyApIHtcblxuXHRcdFx0Y2FzZSBDdWJlUmVmbGVjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEN1YmVSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkVfVVYnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfRVFVSVJFQyc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX1NQSEVSRSc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdFx0c3dpdGNoICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgKSB7XG5cblx0XHRcdGNhc2UgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0Y2FzZSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwTW9kZURlZmluZSA9ICdFTlZNQVBfTU9ERV9SRUZSQUNUSU9OJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0XHRzd2l0Y2ggKCBtYXRlcmlhbC5jb21iaW5lICkge1xuXG5cdFx0XHRjYXNlIE11bHRpcGx5T3BlcmF0aW9uOlxuXHRcdFx0XHRlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFknO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBNaXhPcGVyYXRpb246XG5cdFx0XHRcdGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NSVgnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBBZGRPcGVyYXRpb246XG5cdFx0XHRcdGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19BREQnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHR9XG5cblx0dmFyIGdhbW1hRmFjdG9yRGVmaW5lID0gKCByZW5kZXJlci5nYW1tYUZhY3RvciA+IDAgKSA/IHJlbmRlcmVyLmdhbW1hRmFjdG9yIDogMS4wO1xuXG5cdC8vIGNvbnNvbGUubG9nKCAnYnVpbGRpbmcgbmV3IHByb2dyYW0gJyApO1xuXG5cdC8vXG5cblx0dmFyIGN1c3RvbUV4dGVuc2lvbnMgPSBnZW5lcmF0ZUV4dGVuc2lvbnMoIG1hdGVyaWFsLmV4dGVuc2lvbnMsIHBhcmFtZXRlcnMsIGV4dGVuc2lvbnMgKTtcblxuXHR2YXIgY3VzdG9tRGVmaW5lcyA9IGdlbmVyYXRlRGVmaW5lcyggZGVmaW5lcyApO1xuXG5cdC8vXG5cblx0dmFyIHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG5cblx0dmFyIHByZWZpeFZlcnRleCwgcHJlZml4RnJhZ21lbnQ7XG5cblx0aWYgKCBtYXRlcmlhbC5pc1Jhd1NoYWRlck1hdGVyaWFsICkge1xuXG5cdFx0cHJlZml4VmVydGV4ID0gW1xuXG5cdFx0XHRjdXN0b21EZWZpbmVzXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHRcdGlmICggcHJlZml4VmVydGV4Lmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHByZWZpeFZlcnRleCArPSAnXFxuJztcblxuXHRcdH1cblxuXHRcdHByZWZpeEZyYWdtZW50ID0gW1xuXG5cdFx0XHRjdXN0b21FeHRlbnNpb25zLFxuXHRcdFx0Y3VzdG9tRGVmaW5lc1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0XHRpZiAoIHByZWZpeEZyYWdtZW50Lmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHByZWZpeEZyYWdtZW50ICs9ICdcXG4nO1xuXG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHRwcmVmaXhWZXJ0ZXggPSBbXG5cblx0XHRcdCdwcmVjaXNpb24gJyArIHBhcmFtZXRlcnMucHJlY2lzaW9uICsgJyBmbG9hdDsnLFxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGludDsnLFxuXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgc2hhZGVyLm5hbWUsXG5cblx0XHRcdGN1c3RvbURlZmluZXMsXG5cblx0XHRcdHBhcmFtZXRlcnMuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyA/ICcjZGVmaW5lIFZFUlRFWF9URVhUVVJFUycgOiAnJyxcblxuXHRcdFx0JyNkZWZpbmUgR0FNTUFfRkFDVE9SICcgKyBnYW1tYUZhY3RvckRlZmluZSxcblxuXHRcdFx0JyNkZWZpbmUgTUFYX0JPTkVTICcgKyBwYXJhbWV0ZXJzLm1heEJvbmVzLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZyApID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2dFeHAgKSA/ICcjZGVmaW5lIEZPR19FWFAyJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLm1hcCA/ICcjZGVmaW5lIFVTRV9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lIFVTRV9FTlZNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBNb2RlRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmxpZ2h0TWFwID8gJyNkZWZpbmUgVVNFX0xJR0hUTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5hb01hcCA/ICcjZGVmaW5lIFVTRV9BT01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW1pc3NpdmVNYXAgPyAnI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmJ1bXBNYXAgPyAnI2RlZmluZSBVU0VfQlVNUE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubm9ybWFsTWFwID8gJyNkZWZpbmUgVVNFX05PUk1BTE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZGlzcGxhY2VtZW50TWFwICYmIHBhcmFtZXRlcnMuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyA/ICcjZGVmaW5lIFVTRV9ESVNQTEFDRU1FTlRNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnNwZWN1bGFyTWFwID8gJyNkZWZpbmUgVVNFX1NQRUNVTEFSTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5yb3VnaG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5tZXRhbG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfTUVUQUxORVNTTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5hbHBoYU1hcCA/ICcjZGVmaW5lIFVTRV9BTFBIQU1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4Q29sb3JzID8gJyNkZWZpbmUgVVNFX0NPTE9SJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nID8gJyNkZWZpbmUgRkxBVF9TSEFERUQnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2tpbm5pbmcgPyAnI2RlZmluZSBVU0VfU0tJTk5JTkcnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnVzZVZlcnRleFRleHR1cmUgPyAnI2RlZmluZSBCT05FX1RFWFRVUkUnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubW9ycGhUYXJnZXRzID8gJyNkZWZpbmUgVVNFX01PUlBIVEFSR0VUUycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubW9ycGhOb3JtYWxzICYmIHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPT09IGZhbHNlID8gJyNkZWZpbmUgVVNFX01PUlBITk9STUFMUycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZG91YmxlU2lkZWQgPyAnI2RlZmluZSBET1VCTEVfU0lERUQnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmZsaXBTaWRlZCA/ICcjZGVmaW5lIEZMSVBfU0lERUQnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lIFVTRV9TSEFET1dNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSAnICsgc2hhZG93TWFwVHlwZURlZmluZSA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnNpemVBdHRlbnVhdGlvbiA/ICcjZGVmaW5lIFVTRV9TSVpFQVRURU5VQVRJT04nIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRicgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciAmJiBleHRlbnNpb25zLmdldCggJ0VYVF9mcmFnX2RlcHRoJyApID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGX0VYVCcgOiAnJyxcblxuXHRcdFx0J3VuaWZvcm0gbWF0NCBtb2RlbE1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0NCB2aWV3TWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsnLFxuXG5cdFx0XHQnYXR0cmlidXRlIHZlYzMgcG9zaXRpb247Jyxcblx0XHRcdCdhdHRyaWJ1dGUgdmVjMyBub3JtYWw7Jyxcblx0XHRcdCdhdHRyaWJ1dGUgdmVjMiB1djsnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9DT0xPUicsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIGNvbG9yOycsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMnLFxuXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDA7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MTsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQyOycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDM7JyxcblxuXHRcdFx0J1x0I2lmZGVmIFVTRV9NT1JQSE5PUk1BTFMnLFxuXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDE7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMzsnLFxuXG5cdFx0XHQnXHQjZWxzZScsXG5cblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ0OycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDY7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ3OycsXG5cblx0XHRcdCdcdCNlbmRpZicsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9TS0lOTklORycsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWM0IHNraW5JbmRleDsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgc2tpbldlaWdodDsnLFxuXG5cdFx0XHQnI2VuZGlmJyxcblxuXHRcdFx0J1xcbidcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdFx0cHJlZml4RnJhZ21lbnQgPSBbXG5cblx0XHRcdGN1c3RvbUV4dGVuc2lvbnMsXG5cblx0XHRcdCdwcmVjaXNpb24gJyArIHBhcmFtZXRlcnMucHJlY2lzaW9uICsgJyBmbG9hdDsnLFxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGludDsnLFxuXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgc2hhZGVyLm5hbWUsXG5cblx0XHRcdGN1c3RvbURlZmluZXMsXG5cblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFUZXN0ID8gJyNkZWZpbmUgQUxQSEFURVNUICcgKyBwYXJhbWV0ZXJzLmFscGhhVGVzdCA6ICcnLFxuXG5cdFx0XHQnI2RlZmluZSBHQU1NQV9GQUNUT1IgJyArIGdhbW1hRmFjdG9yRGVmaW5lLFxuXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nICkgPyAnI2RlZmluZSBVU0VfRk9HJyA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZ0V4cCApID8gJyNkZWZpbmUgRk9HX0VYUDInIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubWFwID8gJyNkZWZpbmUgVVNFX01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgVVNFX0VOVk1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcFR5cGVEZWZpbmUgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcE1vZGVEZWZpbmUgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcEJsZW5kaW5nRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmxpZ2h0TWFwID8gJyNkZWZpbmUgVVNFX0xJR0hUTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5hb01hcCA/ICcjZGVmaW5lIFVTRV9BT01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW1pc3NpdmVNYXAgPyAnI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmJ1bXBNYXAgPyAnI2RlZmluZSBVU0VfQlVNUE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubm9ybWFsTWFwID8gJyNkZWZpbmUgVVNFX05PUk1BTE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhDb2xvcnMgPyAnI2RlZmluZSBVU0VfQ09MT1InIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZ3JhZGllbnRNYXAgPyAnI2RlZmluZSBVU0VfR1JBRElFTlRNQVAnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5kb3VibGVTaWRlZCA/ICcjZGVmaW5lIERPVUJMRV9TSURFRCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhID8gJyNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQScgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyA/ICcjZGVmaW5lIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFMnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRicgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciAmJiBleHRlbnNpb25zLmdldCggJ0VYVF9mcmFnX2RlcHRoJyApID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGX0VYVCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgJiYgZXh0ZW5zaW9ucy5nZXQoICdFWFRfc2hhZGVyX3RleHR1cmVfbG9kJyApID8gJyNkZWZpbmUgVEVYVFVSRV9MT0RfRVhUJyA6ICcnLFxuXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247JyxcblxuXHRcdFx0KCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyAnI2RlZmluZSBUT05FX01BUFBJTkcnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/IFNoYWRlckNodW5rWyAndG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCcgXSA6ICcnLCAvLyB0aGlzIGNvZGUgaXMgcmVxdWlyZWQgaGVyZSBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgdGhlIHRvbmVNYXBwaW5nKCkgZnVuY3Rpb24gZGVmaW5lZCBiZWxvd1xuXHRcdFx0KCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyBnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCAndG9uZU1hcHBpbmcnLCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICkgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5kaXRoZXJpbmcgPyAnI2RlZmluZSBESVRIRVJJTkcnIDogJycsXG5cblx0XHRcdCggcGFyYW1ldGVycy5vdXRwdXRFbmNvZGluZyB8fCBwYXJhbWV0ZXJzLm1hcEVuY29kaW5nIHx8IHBhcmFtZXRlcnMuZW52TWFwRW5jb2RpbmcgfHwgcGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nICkgPyBTaGFkZXJDaHVua1sgJ2VuY29kaW5nc19wYXJzX2ZyYWdtZW50JyBdIDogJycsIC8vIHRoaXMgY29kZSBpcyByZXF1aXJlZCBoZXJlIGJlY2F1c2UgaXQgaXMgdXNlZCBieSB0aGUgdmFyaW91cyBlbmNvZGluZy9kZWNvZGluZyBmdW5jdGlvbiBkZWZpbmVkIGJlbG93XG5cdFx0XHRwYXJhbWV0ZXJzLm1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnbWFwVGV4ZWxUb0xpbmVhcicsIHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgKSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXBFbmNvZGluZyA/IGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggJ2Vudk1hcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW1pc3NpdmVNYXBFbmNvZGluZyA/IGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggJ2VtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhcicsIHBhcmFtZXRlcnMuZW1pc3NpdmVNYXBFbmNvZGluZyApIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nID8gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCAnbGluZWFyVG9PdXRwdXRUZXhlbCcsIHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgKSA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmRlcHRoUGFja2luZyA/ICcjZGVmaW5lIERFUFRIX1BBQ0tJTkcgJyArIG1hdGVyaWFsLmRlcHRoUGFja2luZyA6ICcnLFxuXG5cdFx0XHQnXFxuJ1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0fVxuXG5cdHZlcnRleFNoYWRlciA9IHBhcnNlSW5jbHVkZXMoIHZlcnRleFNoYWRlciApO1xuXHR2ZXJ0ZXhTaGFkZXIgPSByZXBsYWNlTGlnaHROdW1zKCB2ZXJ0ZXhTaGFkZXIsIHBhcmFtZXRlcnMgKTtcblx0dmVydGV4U2hhZGVyID0gcmVwbGFjZUNsaXBwaW5nUGxhbmVOdW1zKCB2ZXJ0ZXhTaGFkZXIsIHBhcmFtZXRlcnMgKTtcblxuXHRmcmFnbWVudFNoYWRlciA9IHBhcnNlSW5jbHVkZXMoIGZyYWdtZW50U2hhZGVyICk7XG5cdGZyYWdtZW50U2hhZGVyID0gcmVwbGFjZUxpZ2h0TnVtcyggZnJhZ21lbnRTaGFkZXIsIHBhcmFtZXRlcnMgKTtcblx0ZnJhZ21lbnRTaGFkZXIgPSByZXBsYWNlQ2xpcHBpbmdQbGFuZU51bXMoIGZyYWdtZW50U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cblx0dmVydGV4U2hhZGVyID0gdW5yb2xsTG9vcHMoIHZlcnRleFNoYWRlciApO1xuXHRmcmFnbWVudFNoYWRlciA9IHVucm9sbExvb3BzKCBmcmFnbWVudFNoYWRlciApO1xuXG5cdHZhciB2ZXJ0ZXhHbHNsID0gcHJlZml4VmVydGV4ICsgdmVydGV4U2hhZGVyO1xuXHR2YXIgZnJhZ21lbnRHbHNsID0gcHJlZml4RnJhZ21lbnQgKyBmcmFnbWVudFNoYWRlcjtcblxuXHQvLyBjb25zb2xlLmxvZyggJypWRVJURVgqJywgdmVydGV4R2xzbCApO1xuXHQvLyBjb25zb2xlLmxvZyggJypGUkFHTUVOVConLCBmcmFnbWVudEdsc2wgKTtcblxuXHR2YXIgZ2xWZXJ0ZXhTaGFkZXIgPSBXZWJHTFNoYWRlciggZ2wsIGdsLlZFUlRFWF9TSEFERVIsIHZlcnRleEdsc2wgKTtcblx0dmFyIGdsRnJhZ21lbnRTaGFkZXIgPSBXZWJHTFNoYWRlciggZ2wsIGdsLkZSQUdNRU5UX1NIQURFUiwgZnJhZ21lbnRHbHNsICk7XG5cblx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBnbFZlcnRleFNoYWRlciApO1xuXHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGdsRnJhZ21lbnRTaGFkZXIgKTtcblxuXHQvLyBGb3JjZSBhIHBhcnRpY3VsYXIgYXR0cmlidXRlIHRvIGluZGV4IDAuXG5cblx0aWYgKCBtYXRlcmlhbC5pbmRleDBBdHRyaWJ1dGVOYW1lICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC5iaW5kQXR0cmliTG9jYXRpb24oIHByb2dyYW0sIDAsIG1hdGVyaWFsLmluZGV4MEF0dHJpYnV0ZU5hbWUgKTtcblxuXHR9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIHtcblxuXHRcdC8vIHByb2dyYW1zIHdpdGggbW9ycGhUYXJnZXRzIGRpc3BsYWNlIHBvc2l0aW9uIG91dCBvZiBhdHRyaWJ1dGUgMFxuXHRcdGdsLmJpbmRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgMCwgJ3Bvc2l0aW9uJyApO1xuXG5cdH1cblxuXHRnbC5saW5rUHJvZ3JhbSggcHJvZ3JhbSApO1xuXG5cdHZhciBwcm9ncmFtTG9nID0gZ2wuZ2V0UHJvZ3JhbUluZm9Mb2coIHByb2dyYW0gKS50cmltKCk7XG5cdHZhciB2ZXJ0ZXhMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBnbFZlcnRleFNoYWRlciApLnRyaW0oKTtcblx0dmFyIGZyYWdtZW50TG9nID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyggZ2xGcmFnbWVudFNoYWRlciApLnRyaW0oKTtcblxuXHR2YXIgcnVubmFibGUgPSB0cnVlO1xuXHR2YXIgaGF2ZURpYWdub3N0aWNzID0gdHJ1ZTtcblxuXHQvLyBjb25zb2xlLmxvZyggJyoqVkVSVEVYKionLCBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZWJ1Z19zaGFkZXJzJyApLmdldFRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UoIGdsVmVydGV4U2hhZGVyICkgKTtcblx0Ly8gY29uc29sZS5sb2coICcqKkZSQUdNRU5UKionLCBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZWJ1Z19zaGFkZXJzJyApLmdldFRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UoIGdsRnJhZ21lbnRTaGFkZXIgKSApO1xuXG5cdGlmICggZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuTElOS19TVEFUVVMgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRydW5uYWJsZSA9IGZhbHNlO1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUHJvZ3JhbTogc2hhZGVyIGVycm9yOiAnLCBnbC5nZXRFcnJvcigpLCAnZ2wuVkFMSURBVEVfU1RBVFVTJywgZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuVkFMSURBVEVfU1RBVFVTICksICdnbC5nZXRQcm9ncmFtSW5mb0xvZycsIHByb2dyYW1Mb2csIHZlcnRleExvZywgZnJhZ21lbnRMb2cgKTtcblxuXHR9IGVsc2UgaWYgKCBwcm9ncmFtTG9nICE9PSAnJyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbTogZ2wuZ2V0UHJvZ3JhbUluZm9Mb2coKScsIHByb2dyYW1Mb2cgKTtcblxuXHR9IGVsc2UgaWYgKCB2ZXJ0ZXhMb2cgPT09ICcnIHx8IGZyYWdtZW50TG9nID09PSAnJyApIHtcblxuXHRcdGhhdmVEaWFnbm9zdGljcyA9IGZhbHNlO1xuXG5cdH1cblxuXHRpZiAoIGhhdmVEaWFnbm9zdGljcyApIHtcblxuXHRcdHRoaXMuZGlhZ25vc3RpY3MgPSB7XG5cblx0XHRcdHJ1bm5hYmxlOiBydW5uYWJsZSxcblx0XHRcdG1hdGVyaWFsOiBtYXRlcmlhbCxcblxuXHRcdFx0cHJvZ3JhbUxvZzogcHJvZ3JhbUxvZyxcblxuXHRcdFx0dmVydGV4U2hhZGVyOiB7XG5cblx0XHRcdFx0bG9nOiB2ZXJ0ZXhMb2csXG5cdFx0XHRcdHByZWZpeDogcHJlZml4VmVydGV4XG5cblx0XHRcdH0sXG5cblx0XHRcdGZyYWdtZW50U2hhZGVyOiB7XG5cblx0XHRcdFx0bG9nOiBmcmFnbWVudExvZyxcblx0XHRcdFx0cHJlZml4OiBwcmVmaXhGcmFnbWVudFxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH1cblxuXHQvLyBjbGVhbiB1cFxuXG5cdGdsLmRlbGV0ZVNoYWRlciggZ2xWZXJ0ZXhTaGFkZXIgKTtcblx0Z2wuZGVsZXRlU2hhZGVyKCBnbEZyYWdtZW50U2hhZGVyICk7XG5cblx0Ly8gc2V0IHVwIGNhY2hpbmcgZm9yIHVuaWZvcm0gbG9jYXRpb25zXG5cblx0dmFyIGNhY2hlZFVuaWZvcm1zO1xuXG5cdHRoaXMuZ2V0VW5pZm9ybXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIGNhY2hlZFVuaWZvcm1zID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNhY2hlZFVuaWZvcm1zID0gbmV3IFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhY2hlZFVuaWZvcm1zO1xuXG5cdH07XG5cblx0Ly8gc2V0IHVwIGNhY2hpbmcgZm9yIGF0dHJpYnV0ZSBsb2NhdGlvbnNcblxuXHR2YXIgY2FjaGVkQXR0cmlidXRlcztcblxuXHR0aGlzLmdldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIGNhY2hlZEF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y2FjaGVkQXR0cmlidXRlcyA9IGZldGNoQXR0cmlidXRlTG9jYXRpb25zKCBnbCwgcHJvZ3JhbSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhY2hlZEF0dHJpYnV0ZXM7XG5cblx0fTtcblxuXHQvLyBmcmVlIHJlc291cmNlXG5cblx0dGhpcy5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0Z2wuZGVsZXRlUHJvZ3JhbSggcHJvZ3JhbSApO1xuXHRcdHRoaXMucHJvZ3JhbSA9IHVuZGVmaW5lZDtcblxuXHR9O1xuXG5cdC8vIERFUFJFQ0FURURcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywge1xuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbTogLnVuaWZvcm1zIGlzIG5vdyAuZ2V0VW5pZm9ybXMoKS4nICk7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldFVuaWZvcm1zKCk7XG5cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0YXR0cmlidXRlczoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiAuYXR0cmlidXRlcyBpcyBub3cgLmdldEF0dHJpYnV0ZXMoKS4nICk7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldEF0dHJpYnV0ZXMoKTtcblxuXHRcdFx0fVxuXHRcdH1cblxuXHR9ICk7XG5cblxuXHQvL1xuXG5cdHRoaXMubmFtZSA9IHNoYWRlci5uYW1lO1xuXHR0aGlzLmlkID0gcHJvZ3JhbUlkQ291bnQgKys7XG5cdHRoaXMuY29kZSA9IGNvZGU7XG5cdHRoaXMudXNlZFRpbWVzID0gMTtcblx0dGhpcy5wcm9ncmFtID0gcHJvZ3JhbTtcblx0dGhpcy52ZXJ0ZXhTaGFkZXIgPSBnbFZlcnRleFNoYWRlcjtcblx0dGhpcy5mcmFnbWVudFNoYWRlciA9IGdsRnJhZ21lbnRTaGFkZXI7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMUHJvZ3JhbXMoIHJlbmRlcmVyLCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKSB7XG5cblx0dmFyIHByb2dyYW1zID0gW107XG5cblx0dmFyIHNoYWRlcklEcyA9IHtcblx0XHRNZXNoRGVwdGhNYXRlcmlhbDogJ2RlcHRoJyxcblx0XHRNZXNoRGlzdGFuY2VNYXRlcmlhbDogJ2Rpc3RhbmNlUkdCQScsXG5cdFx0TWVzaE5vcm1hbE1hdGVyaWFsOiAnbm9ybWFsJyxcblx0XHRNZXNoQmFzaWNNYXRlcmlhbDogJ2Jhc2ljJyxcblx0XHRNZXNoTGFtYmVydE1hdGVyaWFsOiAnbGFtYmVydCcsXG5cdFx0TWVzaFBob25nTWF0ZXJpYWw6ICdwaG9uZycsXG5cdFx0TWVzaFRvb25NYXRlcmlhbDogJ3Bob25nJyxcblx0XHRNZXNoU3RhbmRhcmRNYXRlcmlhbDogJ3BoeXNpY2FsJyxcblx0XHRNZXNoUGh5c2ljYWxNYXRlcmlhbDogJ3BoeXNpY2FsJyxcblx0XHRMaW5lQmFzaWNNYXRlcmlhbDogJ2Jhc2ljJyxcblx0XHRMaW5lRGFzaGVkTWF0ZXJpYWw6ICdkYXNoZWQnLFxuXHRcdFBvaW50c01hdGVyaWFsOiAncG9pbnRzJyxcblx0XHRTaGFkb3dNYXRlcmlhbDogJ3NoYWRvdydcblx0fTtcblxuXHR2YXIgcGFyYW1ldGVyTmFtZXMgPSBbXG5cdFx0XCJwcmVjaXNpb25cIiwgXCJzdXBwb3J0c1ZlcnRleFRleHR1cmVzXCIsIFwibWFwXCIsIFwibWFwRW5jb2RpbmdcIiwgXCJlbnZNYXBcIiwgXCJlbnZNYXBNb2RlXCIsIFwiZW52TWFwRW5jb2RpbmdcIixcblx0XHRcImxpZ2h0TWFwXCIsIFwiYW9NYXBcIiwgXCJlbWlzc2l2ZU1hcFwiLCBcImVtaXNzaXZlTWFwRW5jb2RpbmdcIiwgXCJidW1wTWFwXCIsIFwibm9ybWFsTWFwXCIsIFwiZGlzcGxhY2VtZW50TWFwXCIsIFwic3BlY3VsYXJNYXBcIixcblx0XHRcInJvdWdobmVzc01hcFwiLCBcIm1ldGFsbmVzc01hcFwiLCBcImdyYWRpZW50TWFwXCIsXG5cdFx0XCJhbHBoYU1hcFwiLCBcImNvbWJpbmVcIiwgXCJ2ZXJ0ZXhDb2xvcnNcIiwgXCJmb2dcIiwgXCJ1c2VGb2dcIiwgXCJmb2dFeHBcIixcblx0XHRcImZsYXRTaGFkaW5nXCIsIFwic2l6ZUF0dGVudWF0aW9uXCIsIFwibG9nYXJpdGhtaWNEZXB0aEJ1ZmZlclwiLCBcInNraW5uaW5nXCIsXG5cdFx0XCJtYXhCb25lc1wiLCBcInVzZVZlcnRleFRleHR1cmVcIiwgXCJtb3JwaFRhcmdldHNcIiwgXCJtb3JwaE5vcm1hbHNcIixcblx0XHRcIm1heE1vcnBoVGFyZ2V0c1wiLCBcIm1heE1vcnBoTm9ybWFsc1wiLCBcInByZW11bHRpcGxpZWRBbHBoYVwiLFxuXHRcdFwibnVtRGlyTGlnaHRzXCIsIFwibnVtUG9pbnRMaWdodHNcIiwgXCJudW1TcG90TGlnaHRzXCIsIFwibnVtSGVtaUxpZ2h0c1wiLCBcIm51bVJlY3RBcmVhTGlnaHRzXCIsXG5cdFx0XCJzaGFkb3dNYXBFbmFibGVkXCIsIFwic2hhZG93TWFwVHlwZVwiLCBcInRvbmVNYXBwaW5nXCIsICdwaHlzaWNhbGx5Q29ycmVjdExpZ2h0cycsXG5cdFx0XCJhbHBoYVRlc3RcIiwgXCJkb3VibGVTaWRlZFwiLCBcImZsaXBTaWRlZFwiLCBcIm51bUNsaXBwaW5nUGxhbmVzXCIsIFwibnVtQ2xpcEludGVyc2VjdGlvblwiLCBcImRlcHRoUGFja2luZ1wiLCBcImRpdGhlcmluZ1wiXG5cdF07XG5cblxuXHRmdW5jdGlvbiBhbGxvY2F0ZUJvbmVzKCBvYmplY3QgKSB7XG5cblx0XHR2YXIgc2tlbGV0b24gPSBvYmplY3Quc2tlbGV0b247XG5cdFx0dmFyIGJvbmVzID0gc2tlbGV0b24uYm9uZXM7XG5cblx0XHRpZiAoIGNhcGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVzICkge1xuXG5cdFx0XHRyZXR1cm4gMTAyNDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGRlZmF1bHQgZm9yIHdoZW4gb2JqZWN0IGlzIG5vdCBzcGVjaWZpZWRcblx0XHRcdC8vICggZm9yIGV4YW1wbGUgd2hlbiBwcmVidWlsZGluZyBzaGFkZXIgdG8gYmUgdXNlZCB3aXRoIG11bHRpcGxlIG9iamVjdHMgKVxuXHRcdFx0Ly9cblx0XHRcdC8vICAtIGxlYXZlIHNvbWUgZXh0cmEgc3BhY2UgZm9yIG90aGVyIHVuaWZvcm1zXG5cdFx0XHQvLyAgLSBsaW1pdCBoZXJlIGlzIEFOR0xFJ3MgMjU0IG1heCB1bmlmb3JtIHZlY3RvcnNcblx0XHRcdC8vICAgICh1cCB0byA1NCBzaG91bGQgYmUgc2FmZSlcblxuXHRcdFx0dmFyIG5WZXJ0ZXhVbmlmb3JtcyA9IGNhcGFiaWxpdGllcy5tYXhWZXJ0ZXhVbmlmb3Jtcztcblx0XHRcdHZhciBuVmVydGV4TWF0cmljZXMgPSBNYXRoLmZsb29yKCAoIG5WZXJ0ZXhVbmlmb3JtcyAtIDIwICkgLyA0ICk7XG5cblx0XHRcdHZhciBtYXhCb25lcyA9IE1hdGgubWluKCBuVmVydGV4TWF0cmljZXMsIGJvbmVzLmxlbmd0aCApO1xuXG5cdFx0XHRpZiAoIG1heEJvbmVzIDwgYm9uZXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFNrZWxldG9uIGhhcyAnICsgYm9uZXMubGVuZ3RoICsgJyBib25lcy4gVGhpcyBHUFUgc3VwcG9ydHMgJyArIG1heEJvbmVzICsgJy4nICk7XG5cdFx0XHRcdHJldHVybiAwO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXhCb25lcztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWFwLCBnYW1tYU92ZXJyaWRlTGluZWFyICkge1xuXG5cdFx0dmFyIGVuY29kaW5nO1xuXG5cdFx0aWYgKCAhIG1hcCApIHtcblxuXHRcdFx0ZW5jb2RpbmcgPSBMaW5lYXJFbmNvZGluZztcblxuXHRcdH0gZWxzZSBpZiAoIG1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGVuY29kaW5nID0gbWFwLmVuY29kaW5nO1xuXG5cdFx0fSBlbHNlIGlmICggbWFwLmlzV2ViR0xSZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuXCIgKTtcblx0XHRcdGVuY29kaW5nID0gbWFwLnRleHR1cmUuZW5jb2Rpbmc7XG5cblx0XHR9XG5cblx0XHQvLyBhZGQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIFdlYkdMUmVuZGVyZXIuZ2FtbWFJbnB1dC9nYW1tYU91dHB1dCBwYXJhbWV0ZXIsIHNob3VsZCBwcm9iYWJseSBiZSByZW1vdmVkIGF0IHNvbWUgcG9pbnQuXG5cdFx0aWYgKCBlbmNvZGluZyA9PT0gTGluZWFyRW5jb2RpbmcgJiYgZ2FtbWFPdmVycmlkZUxpbmVhciApIHtcblxuXHRcdFx0ZW5jb2RpbmcgPSBHYW1tYUVuY29kaW5nO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVuY29kaW5nO1xuXG5cdH1cblxuXHR0aGlzLmdldFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBsaWdodHMsIHNoYWRvd3MsIGZvZywgbkNsaXBQbGFuZXMsIG5DbGlwSW50ZXJzZWN0aW9uLCBvYmplY3QgKSB7XG5cblx0XHR2YXIgc2hhZGVySUQgPSBzaGFkZXJJRHNbIG1hdGVyaWFsLnR5cGUgXTtcblxuXHRcdC8vIGhldXJpc3RpY3MgdG8gY3JlYXRlIHNoYWRlciBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBsaWdodHMgaW4gdGhlIHNjZW5lXG5cdFx0Ly8gKG5vdCB0byBibG93IG92ZXIgbWF4TGlnaHRzIGJ1ZGdldClcblxuXHRcdHZhciBtYXhCb25lcyA9IG9iamVjdC5pc1NraW5uZWRNZXNoID8gYWxsb2NhdGVCb25lcyggb2JqZWN0ICkgOiAwO1xuXHRcdHZhciBwcmVjaXNpb24gPSBjYXBhYmlsaXRpZXMucHJlY2lzaW9uO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5wcmVjaXNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdHByZWNpc2lvbiA9IGNhcGFiaWxpdGllcy5nZXRNYXhQcmVjaXNpb24oIG1hdGVyaWFsLnByZWNpc2lvbiApO1xuXG5cdFx0XHRpZiAoIHByZWNpc2lvbiAhPT0gbWF0ZXJpYWwucHJlY2lzaW9uICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbS5nZXRQYXJhbWV0ZXJzOicsIG1hdGVyaWFsLnByZWNpc2lvbiwgJ25vdCBzdXBwb3J0ZWQsIHVzaW5nJywgcHJlY2lzaW9uLCAnaW5zdGVhZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XG5cblx0XHR2YXIgcGFyYW1ldGVycyA9IHtcblxuXHRcdFx0c2hhZGVySUQ6IHNoYWRlcklELFxuXG5cdFx0XHRwcmVjaXNpb246IHByZWNpc2lvbixcblx0XHRcdHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6IGNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcyxcblx0XHRcdG91dHB1dEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCAoICEgY3VycmVudFJlbmRlclRhcmdldCApID8gbnVsbCA6IGN1cnJlbnRSZW5kZXJUYXJnZXQudGV4dHVyZSwgcmVuZGVyZXIuZ2FtbWFPdXRwdXQgKSxcblx0XHRcdG1hcDogISEgbWF0ZXJpYWwubWFwLFxuXHRcdFx0bWFwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hdGVyaWFsLm1hcCwgcmVuZGVyZXIuZ2FtbWFJbnB1dCApLFxuXHRcdFx0ZW52TWFwOiAhISBtYXRlcmlhbC5lbnZNYXAsXG5cdFx0XHRlbnZNYXBNb2RlOiBtYXRlcmlhbC5lbnZNYXAgJiYgbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcsXG5cdFx0XHRlbnZNYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwuZW52TWFwLCByZW5kZXJlci5nYW1tYUlucHV0ICksXG5cdFx0XHRlbnZNYXBDdWJlVVY6ICggISEgbWF0ZXJpYWwuZW52TWFwICkgJiYgKCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nID09PSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyApIHx8ICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgPT09IEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nICkgKSxcblx0XHRcdGxpZ2h0TWFwOiAhISBtYXRlcmlhbC5saWdodE1hcCxcblx0XHRcdGFvTWFwOiAhISBtYXRlcmlhbC5hb01hcCxcblx0XHRcdGVtaXNzaXZlTWFwOiAhISBtYXRlcmlhbC5lbWlzc2l2ZU1hcCxcblx0XHRcdGVtaXNzaXZlTWFwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwLCByZW5kZXJlci5nYW1tYUlucHV0ICksXG5cdFx0XHRidW1wTWFwOiAhISBtYXRlcmlhbC5idW1wTWFwLFxuXHRcdFx0bm9ybWFsTWFwOiAhISBtYXRlcmlhbC5ub3JtYWxNYXAsXG5cdFx0XHRkaXNwbGFjZW1lbnRNYXA6ICEhIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCxcblx0XHRcdHJvdWdobmVzc01hcDogISEgbWF0ZXJpYWwucm91Z2huZXNzTWFwLFxuXHRcdFx0bWV0YWxuZXNzTWFwOiAhISBtYXRlcmlhbC5tZXRhbG5lc3NNYXAsXG5cdFx0XHRzcGVjdWxhck1hcDogISEgbWF0ZXJpYWwuc3BlY3VsYXJNYXAsXG5cdFx0XHRhbHBoYU1hcDogISEgbWF0ZXJpYWwuYWxwaGFNYXAsXG5cblx0XHRcdGdyYWRpZW50TWFwOiAhISBtYXRlcmlhbC5ncmFkaWVudE1hcCxcblxuXHRcdFx0Y29tYmluZTogbWF0ZXJpYWwuY29tYmluZSxcblxuXHRcdFx0dmVydGV4Q29sb3JzOiBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMsXG5cblx0XHRcdGZvZzogISEgZm9nLFxuXHRcdFx0dXNlRm9nOiBtYXRlcmlhbC5mb2csXG5cdFx0XHRmb2dFeHA6ICggZm9nICYmIGZvZy5pc0ZvZ0V4cDIgKSxcblxuXHRcdFx0ZmxhdFNoYWRpbmc6IG1hdGVyaWFsLmZsYXRTaGFkaW5nLFxuXG5cdFx0XHRzaXplQXR0ZW51YXRpb246IG1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbixcblx0XHRcdGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGNhcGFiaWxpdGllcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyLFxuXG5cdFx0XHRza2lubmluZzogbWF0ZXJpYWwuc2tpbm5pbmcgJiYgbWF4Qm9uZXMgPiAwLFxuXHRcdFx0bWF4Qm9uZXM6IG1heEJvbmVzLFxuXHRcdFx0dXNlVmVydGV4VGV4dHVyZTogY2FwYWJpbGl0aWVzLmZsb2F0VmVydGV4VGV4dHVyZXMsXG5cblx0XHRcdG1vcnBoVGFyZ2V0czogbWF0ZXJpYWwubW9ycGhUYXJnZXRzLFxuXHRcdFx0bW9ycGhOb3JtYWxzOiBtYXRlcmlhbC5tb3JwaE5vcm1hbHMsXG5cdFx0XHRtYXhNb3JwaFRhcmdldHM6IHJlbmRlcmVyLm1heE1vcnBoVGFyZ2V0cyxcblx0XHRcdG1heE1vcnBoTm9ybWFsczogcmVuZGVyZXIubWF4TW9ycGhOb3JtYWxzLFxuXG5cdFx0XHRudW1EaXJMaWdodHM6IGxpZ2h0cy5kaXJlY3Rpb25hbC5sZW5ndGgsXG5cdFx0XHRudW1Qb2ludExpZ2h0czogbGlnaHRzLnBvaW50Lmxlbmd0aCxcblx0XHRcdG51bVNwb3RMaWdodHM6IGxpZ2h0cy5zcG90Lmxlbmd0aCxcblx0XHRcdG51bVJlY3RBcmVhTGlnaHRzOiBsaWdodHMucmVjdEFyZWEubGVuZ3RoLFxuXHRcdFx0bnVtSGVtaUxpZ2h0czogbGlnaHRzLmhlbWkubGVuZ3RoLFxuXG5cdFx0XHRudW1DbGlwcGluZ1BsYW5lczogbkNsaXBQbGFuZXMsXG5cdFx0XHRudW1DbGlwSW50ZXJzZWN0aW9uOiBuQ2xpcEludGVyc2VjdGlvbixcblxuXHRcdFx0ZGl0aGVyaW5nOiBtYXRlcmlhbC5kaXRoZXJpbmcsXG5cblx0XHRcdHNoYWRvd01hcEVuYWJsZWQ6IHJlbmRlcmVyLnNoYWRvd01hcC5lbmFibGVkICYmIG9iamVjdC5yZWNlaXZlU2hhZG93ICYmIHNoYWRvd3MubGVuZ3RoID4gMCxcblx0XHRcdHNoYWRvd01hcFR5cGU6IHJlbmRlcmVyLnNoYWRvd01hcC50eXBlLFxuXG5cdFx0XHR0b25lTWFwcGluZzogcmVuZGVyZXIudG9uZU1hcHBpbmcsXG5cdFx0XHRwaHlzaWNhbGx5Q29ycmVjdExpZ2h0czogcmVuZGVyZXIucGh5c2ljYWxseUNvcnJlY3RMaWdodHMsXG5cblx0XHRcdHByZW11bHRpcGxpZWRBbHBoYTogbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhLFxuXG5cdFx0XHRhbHBoYVRlc3Q6IG1hdGVyaWFsLmFscGhhVGVzdCxcblx0XHRcdGRvdWJsZVNpZGVkOiBtYXRlcmlhbC5zaWRlID09PSBEb3VibGVTaWRlLFxuXHRcdFx0ZmxpcFNpZGVkOiBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSxcblxuXHRcdFx0ZGVwdGhQYWNraW5nOiAoIG1hdGVyaWFsLmRlcHRoUGFja2luZyAhPT0gdW5kZWZpbmVkICkgPyBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgOiBmYWxzZVxuXG5cdFx0fTtcblxuXHRcdHJldHVybiBwYXJhbWV0ZXJzO1xuXG5cdH07XG5cblx0dGhpcy5nZXRQcm9ncmFtQ29kZSA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIHBhcmFtZXRlcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSBbXTtcblxuXHRcdGlmICggcGFyYW1ldGVycy5zaGFkZXJJRCApIHtcblxuXHRcdFx0YXJyYXkucHVzaCggcGFyYW1ldGVycy5zaGFkZXJJRCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXIgKTtcblx0XHRcdGFycmF5LnB1c2goIG1hdGVyaWFsLnZlcnRleFNoYWRlciApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kZWZpbmVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciBuYW1lIGluIG1hdGVyaWFsLmRlZmluZXMgKSB7XG5cblx0XHRcdFx0YXJyYXkucHVzaCggbmFtZSApO1xuXHRcdFx0XHRhcnJheS5wdXNoKCBtYXRlcmlhbC5kZWZpbmVzWyBuYW1lIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgcGFyYW1ldGVyTmFtZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzWyBwYXJhbWV0ZXJOYW1lc1sgaSBdIF0gKTtcblxuXHRcdH1cblxuXHRcdGFycmF5LnB1c2goIG1hdGVyaWFsLm9uQmVmb3JlQ29tcGlsZS50b1N0cmluZygpICk7XG5cblx0XHRhcnJheS5wdXNoKCByZW5kZXJlci5nYW1tYU91dHB1dCApO1xuXG5cdFx0cmV0dXJuIGFycmF5LmpvaW4oKTtcblxuXHR9O1xuXG5cdHRoaXMuYWNxdWlyZVByb2dyYW0gPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBzaGFkZXIsIHBhcmFtZXRlcnMsIGNvZGUgKSB7XG5cblx0XHR2YXIgcHJvZ3JhbTtcblxuXHRcdC8vIENoZWNrIGlmIGNvZGUgaGFzIGJlZW4gYWxyZWFkeSBjb21waWxlZFxuXHRcdGZvciAoIHZhciBwID0gMCwgcGwgPSBwcm9ncmFtcy5sZW5ndGg7IHAgPCBwbDsgcCArKyApIHtcblxuXHRcdFx0dmFyIHByb2dyYW1JbmZvID0gcHJvZ3JhbXNbIHAgXTtcblxuXHRcdFx0aWYgKCBwcm9ncmFtSW5mby5jb2RlID09PSBjb2RlICkge1xuXG5cdFx0XHRcdHByb2dyYW0gPSBwcm9ncmFtSW5mbztcblx0XHRcdFx0KysgcHJvZ3JhbS51c2VkVGltZXM7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwcm9ncmFtID0gbmV3IFdlYkdMUHJvZ3JhbSggcmVuZGVyZXIsIGV4dGVuc2lvbnMsIGNvZGUsIG1hdGVyaWFsLCBzaGFkZXIsIHBhcmFtZXRlcnMgKTtcblx0XHRcdHByb2dyYW1zLnB1c2goIHByb2dyYW0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH07XG5cblx0dGhpcy5yZWxlYXNlUHJvZ3JhbSA9IGZ1bmN0aW9uICggcHJvZ3JhbSApIHtcblxuXHRcdGlmICggLS0gcHJvZ3JhbS51c2VkVGltZXMgPT09IDAgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBmcm9tIHVub3JkZXJlZCBzZXRcblx0XHRcdHZhciBpID0gcHJvZ3JhbXMuaW5kZXhPZiggcHJvZ3JhbSApO1xuXHRcdFx0cHJvZ3JhbXNbIGkgXSA9IHByb2dyYW1zWyBwcm9ncmFtcy5sZW5ndGggLSAxIF07XG5cdFx0XHRwcm9ncmFtcy5wb3AoKTtcblxuXHRcdFx0Ly8gRnJlZSBXZWJHTCByZXNvdXJjZXNcblx0XHRcdHByb2dyYW0uZGVzdHJveSgpO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0Ly8gRXhwb3NlZCBmb3IgcmVzb3VyY2UgbW9uaXRvcmluZyAmIGVycm9yIGZlZWRiYWNrIHZpYSByZW5kZXJlci5pbmZvOlxuXHR0aGlzLnByb2dyYW1zID0gcHJvZ3JhbXM7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIGZvcmRhY2lvdXMgLyBmb3JkYWNpb3VzLmdpdGh1Yi5pb1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMUHJvcGVydGllcygpIHtcblxuXHR2YXIgcHJvcGVydGllcyA9IG5ldyBXZWFrTWFwKCk7XG5cblx0ZnVuY3Rpb24gZ2V0KCBvYmplY3QgKSB7XG5cblx0XHR2YXIgbWFwID0gcHJvcGVydGllcy5nZXQoIG9iamVjdCApO1xuXG5cdFx0aWYgKCBtYXAgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bWFwID0ge307XG5cdFx0XHRwcm9wZXJ0aWVzLnNldCggb2JqZWN0LCBtYXAgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBtYXA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbW92ZSggb2JqZWN0ICkge1xuXG5cdFx0cHJvcGVydGllcy5kZWxldGUoIG9iamVjdCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCwga2V5LCB2YWx1ZSApIHtcblxuXHRcdHByb3BlcnRpZXMuZ2V0KCBvYmplY3QgKVsga2V5IF0gPSB2YWx1ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcblxuXHRcdHByb3BlcnRpZXMgPSBuZXcgV2Vha01hcCgpO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGdldDogZ2V0LFxuXHRcdHJlbW92ZTogcmVtb3ZlLFxuXHRcdHVwZGF0ZTogdXBkYXRlLFxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2Vcblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gcGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7XG5cblx0aWYgKCBhLnJlbmRlck9yZGVyICE9PSBiLnJlbmRlck9yZGVyICkge1xuXG5cdFx0cmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyO1xuXG5cdH0gZWxzZSBpZiAoIGEucHJvZ3JhbSAmJiBiLnByb2dyYW0gJiYgYS5wcm9ncmFtICE9PSBiLnByb2dyYW0gKSB7XG5cblx0XHRyZXR1cm4gYS5wcm9ncmFtLmlkIC0gYi5wcm9ncmFtLmlkO1xuXG5cdH0gZWxzZSBpZiAoIGEubWF0ZXJpYWwuaWQgIT09IGIubWF0ZXJpYWwuaWQgKSB7XG5cblx0XHRyZXR1cm4gYS5tYXRlcmlhbC5pZCAtIGIubWF0ZXJpYWwuaWQ7XG5cblx0fSBlbHNlIGlmICggYS56ICE9PSBiLnogKSB7XG5cblx0XHRyZXR1cm4gYS56IC0gYi56O1xuXG5cdH0gZWxzZSB7XG5cblx0XHRyZXR1cm4gYS5pZCAtIGIuaWQ7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHJldmVyc2VQYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcblxuXHRpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7XG5cblx0fSBpZiAoIGEueiAhPT0gYi56ICkge1xuXG5cdFx0cmV0dXJuIGIueiAtIGEuejtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cmV0dXJuIGEuaWQgLSBiLmlkO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBXZWJHTFJlbmRlckxpc3QoKSB7XG5cblx0dmFyIHJlbmRlckl0ZW1zID0gW107XG5cdHZhciByZW5kZXJJdGVtc0luZGV4ID0gMDtcblxuXHR2YXIgb3BhcXVlID0gW107XG5cdHZhciB0cmFuc3BhcmVudCA9IFtdO1xuXG5cdGZ1bmN0aW9uIGluaXQoKSB7XG5cblx0XHRyZW5kZXJJdGVtc0luZGV4ID0gMDtcblxuXHRcdG9wYXF1ZS5sZW5ndGggPSAwO1xuXHRcdHRyYW5zcGFyZW50Lmxlbmd0aCA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCB6LCBncm91cCApIHtcblxuXHRcdHZhciByZW5kZXJJdGVtID0gcmVuZGVySXRlbXNbIHJlbmRlckl0ZW1zSW5kZXggXTtcblxuXHRcdGlmICggcmVuZGVySXRlbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZW5kZXJJdGVtID0ge1xuXHRcdFx0XHRpZDogb2JqZWN0LmlkLFxuXHRcdFx0XHRvYmplY3Q6IG9iamVjdCxcblx0XHRcdFx0Z2VvbWV0cnk6IGdlb21ldHJ5LFxuXHRcdFx0XHRtYXRlcmlhbDogbWF0ZXJpYWwsXG5cdFx0XHRcdHByb2dyYW06IG1hdGVyaWFsLnByb2dyYW0sXG5cdFx0XHRcdHJlbmRlck9yZGVyOiBvYmplY3QucmVuZGVyT3JkZXIsXG5cdFx0XHRcdHo6IHosXG5cdFx0XHRcdGdyb3VwOiBncm91cFxuXHRcdFx0fTtcblxuXHRcdFx0cmVuZGVySXRlbXNbIHJlbmRlckl0ZW1zSW5kZXggXSA9IHJlbmRlckl0ZW07XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZW5kZXJJdGVtLmlkID0gb2JqZWN0LmlkO1xuXHRcdFx0cmVuZGVySXRlbS5vYmplY3QgPSBvYmplY3Q7XG5cdFx0XHRyZW5kZXJJdGVtLmdlb21ldHJ5ID0gZ2VvbWV0cnk7XG5cdFx0XHRyZW5kZXJJdGVtLm1hdGVyaWFsID0gbWF0ZXJpYWw7XG5cdFx0XHRyZW5kZXJJdGVtLnByb2dyYW0gPSBtYXRlcmlhbC5wcm9ncmFtO1xuXHRcdFx0cmVuZGVySXRlbS5yZW5kZXJPcmRlciA9IG9iamVjdC5yZW5kZXJPcmRlcjtcblx0XHRcdHJlbmRlckl0ZW0ueiA9IHo7XG5cdFx0XHRyZW5kZXJJdGVtLmdyb3VwID0gZ3JvdXA7XG5cblx0XHR9XG5cblx0XHQoIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlID8gdHJhbnNwYXJlbnQgOiBvcGFxdWUgKS5wdXNoKCByZW5kZXJJdGVtICk7XG5cblx0XHRyZW5kZXJJdGVtc0luZGV4ICsrO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzb3J0KCkge1xuXG5cdFx0aWYgKCBvcGFxdWUubGVuZ3RoID4gMSApIG9wYXF1ZS5zb3J0KCBwYWludGVyU29ydFN0YWJsZSApO1xuXHRcdGlmICggdHJhbnNwYXJlbnQubGVuZ3RoID4gMSApIHRyYW5zcGFyZW50LnNvcnQoIHJldmVyc2VQYWludGVyU29ydFN0YWJsZSApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdG9wYXF1ZTogb3BhcXVlLFxuXHRcdHRyYW5zcGFyZW50OiB0cmFuc3BhcmVudCxcblxuXHRcdGluaXQ6IGluaXQsXG5cdFx0cHVzaDogcHVzaCxcblxuXHRcdHNvcnQ6IHNvcnRcblx0fTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFJlbmRlckxpc3RzKCkge1xuXG5cdHZhciBsaXN0cyA9IHt9O1xuXG5cdGZ1bmN0aW9uIGdldCggc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdHZhciBoYXNoID0gc2NlbmUuaWQgKyAnLCcgKyBjYW1lcmEuaWQ7XG5cdFx0dmFyIGxpc3QgPSBsaXN0c1sgaGFzaCBdO1xuXG5cdFx0aWYgKCBsaXN0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJMaXN0czonLCBoYXNoICk7XG5cblx0XHRcdGxpc3QgPSBuZXcgV2ViR0xSZW5kZXJMaXN0KCk7XG5cdFx0XHRsaXN0c1sgaGFzaCBdID0gbGlzdDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBsaXN0O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0bGlzdHMgPSB7fTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGdldCxcblx0XHRkaXNwb3NlOiBkaXNwb3NlXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFVuaWZvcm1zQ2FjaGUoKSB7XG5cblx0dmFyIGxpZ2h0cyA9IHt9O1xuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICggbGlnaHQgKSB7XG5cblx0XHRcdGlmICggbGlnaHRzWyBsaWdodC5pZCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGxpZ2h0c1sgbGlnaHQuaWQgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdW5pZm9ybXM7XG5cblx0XHRcdHN3aXRjaCAoIGxpZ2h0LnR5cGUgKSB7XG5cblx0XHRcdFx0Y2FzZSAnRGlyZWN0aW9uYWxMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cblx0XHRcdFx0XHRcdHNoYWRvdzogZmFsc2UsXG5cdFx0XHRcdFx0XHRzaGFkb3dCaWFzOiAwLFxuXHRcdFx0XHRcdFx0c2hhZG93UmFkaXVzOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnU3BvdExpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0Y29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdFx0XHRcdFx0ZGlzdGFuY2U6IDAsXG5cdFx0XHRcdFx0XHRjb25lQ29zOiAwLFxuXHRcdFx0XHRcdFx0cGVudW1icmFDb3M6IDAsXG5cdFx0XHRcdFx0XHRkZWNheTogMCxcblxuXHRcdFx0XHRcdFx0c2hhZG93OiBmYWxzZSxcblx0XHRcdFx0XHRcdHNoYWRvd0JpYXM6IDAsXG5cdFx0XHRcdFx0XHRzaGFkb3dSYWRpdXM6IDEsXG5cdFx0XHRcdFx0XHRzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdQb2ludExpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0Y29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdFx0XHRcdFx0ZGlzdGFuY2U6IDAsXG5cdFx0XHRcdFx0XHRkZWNheTogMCxcblxuXHRcdFx0XHRcdFx0c2hhZG93OiBmYWxzZSxcblx0XHRcdFx0XHRcdHNoYWRvd0JpYXM6IDAsXG5cdFx0XHRcdFx0XHRzaGFkb3dSYWRpdXM6IDEsXG5cdFx0XHRcdFx0XHRzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpLFxuXHRcdFx0XHRcdFx0c2hhZG93Q2FtZXJhTmVhcjogMSxcblx0XHRcdFx0XHRcdHNoYWRvd0NhbWVyYUZhcjogMTAwMFxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnSGVtaXNwaGVyZUxpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdHNreUNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdGdyb3VuZENvbG9yOiBuZXcgQ29sb3IoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnUmVjdEFyZWFMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGhhbGZXaWR0aDogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGhhbGZIZWlnaHQ6IG5ldyBWZWN0b3IzKClcblx0XHRcdFx0XHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBzZXQgUmVjdEFyZWFMaWdodCBzaGFkb3cgdW5pZm9ybXNcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGxpZ2h0c1sgbGlnaHQuaWQgXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRyZXR1cm4gdW5pZm9ybXM7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG52YXIgY291bnQgPSAwO1xuXG5mdW5jdGlvbiBXZWJHTExpZ2h0cygpIHtcblxuXHR2YXIgY2FjaGUgPSBuZXcgVW5pZm9ybXNDYWNoZSgpO1xuXG5cdHZhciBzdGF0ZSA9IHtcblxuXHRcdGlkOiBjb3VudCArKyxcblxuXHRcdGhhc2g6ICcnLFxuXG5cdFx0YW1iaWVudDogWyAwLCAwLCAwIF0sXG5cdFx0ZGlyZWN0aW9uYWw6IFtdLFxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWFwOiBbXSxcblx0XHRkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDogW10sXG5cdFx0c3BvdDogW10sXG5cdFx0c3BvdFNoYWRvd01hcDogW10sXG5cdFx0c3BvdFNoYWRvd01hdHJpeDogW10sXG5cdFx0cmVjdEFyZWE6IFtdLFxuXHRcdHBvaW50OiBbXSxcblx0XHRwb2ludFNoYWRvd01hcDogW10sXG5cdFx0cG9pbnRTaGFkb3dNYXRyaXg6IFtdLFxuXHRcdGhlbWk6IFtdXG5cblx0fTtcblxuXHR2YXIgdmVjdG9yMyA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBtYXRyaXg0ID0gbmV3IE1hdHJpeDQoKTtcblx0dmFyIG1hdHJpeDQyID0gbmV3IE1hdHJpeDQoKTtcblxuXHRmdW5jdGlvbiBzZXR1cCggbGlnaHRzLCBzaGFkb3dzLCBjYW1lcmEgKSB7XG5cblx0XHR2YXIgciA9IDAsIGcgPSAwLCBiID0gMDtcblxuXHRcdHZhciBkaXJlY3Rpb25hbExlbmd0aCA9IDA7XG5cdFx0dmFyIHBvaW50TGVuZ3RoID0gMDtcblx0XHR2YXIgc3BvdExlbmd0aCA9IDA7XG5cdFx0dmFyIHJlY3RBcmVhTGVuZ3RoID0gMDtcblx0XHR2YXIgaGVtaUxlbmd0aCA9IDA7XG5cblx0XHR2YXIgdmlld01hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2U7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBsaWdodHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGxpZ2h0ID0gbGlnaHRzWyBpIF07XG5cblx0XHRcdHZhciBjb2xvciA9IGxpZ2h0LmNvbG9yO1xuXHRcdFx0dmFyIGludGVuc2l0eSA9IGxpZ2h0LmludGVuc2l0eTtcblx0XHRcdHZhciBkaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNlO1xuXG5cdFx0XHR2YXIgc2hhZG93TWFwID0gKCBsaWdodC5zaGFkb3cgJiYgbGlnaHQuc2hhZG93Lm1hcCApID8gbGlnaHQuc2hhZG93Lm1hcC50ZXh0dXJlIDogbnVsbDtcblxuXHRcdFx0aWYgKCBsaWdodC5pc0FtYmllbnRMaWdodCApIHtcblxuXHRcdFx0XHRyICs9IGNvbG9yLnIgKiBpbnRlbnNpdHk7XG5cdFx0XHRcdGcgKz0gY29sb3IuZyAqIGludGVuc2l0eTtcblx0XHRcdFx0YiArPSBjb2xvci5iICogaW50ZW5zaXR5O1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0RpcmVjdGlvbmFsTGlnaHQgKSB7XG5cblx0XHRcdFx0dmFyIHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGxpZ2h0LmludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR2ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zdWIoIHZlY3RvcjMgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnNoYWRvdyA9IGxpZ2h0LmNhc3RTaGFkb3c7XG5cblx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0dmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhcztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBzaGFkb3dNYXA7XG5cdFx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBkaXJlY3Rpb25hbExlbmd0aCBdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDtcblx0XHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRkaXJlY3Rpb25hbExlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNTcG90TGlnaHQgKSB7XG5cblx0XHRcdFx0dmFyIHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpc3RhbmNlID0gZGlzdGFuY2U7XG5cblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc3ViKCB2ZWN0b3IzICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb25lQ29zID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICk7XG5cdFx0XHRcdHVuaWZvcm1zLnBlbnVtYnJhQ29zID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICogKCAxIC0gbGlnaHQucGVudW1icmEgKSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kZWNheSA9ICggbGlnaHQuZGlzdGFuY2UgPT09IDAgKSA/IDAuMCA6IGxpZ2h0LmRlY2F5O1xuXG5cdFx0XHRcdHVuaWZvcm1zLnNoYWRvdyA9IGxpZ2h0LmNhc3RTaGFkb3c7XG5cblx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0dmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhcztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c3RhdGUuc3BvdFNoYWRvd01hcFsgc3BvdExlbmd0aCBdID0gc2hhZG93TWFwO1xuXHRcdFx0XHRzdGF0ZS5zcG90U2hhZG93TWF0cml4WyBzcG90TGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXHRcdFx0XHRzdGF0ZS5zcG90WyBzcG90TGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRzcG90TGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1JlY3RBcmVhTGlnaHQgKSB7XG5cblx0XHRcdFx0dmFyIHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdC8vIChhKSBpbnRlbnNpdHkgaXMgdGhlIHRvdGFsIHZpc2libGUgbGlnaHQgZW1pdHRlZFxuXHRcdFx0XHQvL3VuaWZvcm1zLmNvbG9yLmNvcHkoIGNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSAvICggbGlnaHQud2lkdGggKiBsaWdodC5oZWlnaHQgKiBNYXRoLlBJICkgKTtcblxuXHRcdFx0XHQvLyAoYikgaW50ZW5zaXR5IGlzIHRoZSBicmlnaHRuZXNzIG9mIHRoZSBsaWdodFxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdC8vIGV4dHJhY3QgbG9jYWwgcm90YXRpb24gb2YgbGlnaHQgdG8gZGVyaXZlIHdpZHRoL2hlaWdodCBoYWxmIHZlY3RvcnNcblx0XHRcdFx0bWF0cml4NDIuaWRlbnRpdHkoKTtcblx0XHRcdFx0bWF0cml4NC5jb3B5KCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHRtYXRyaXg0LnByZW11bHRpcGx5KCB2aWV3TWF0cml4ICk7XG5cdFx0XHRcdG1hdHJpeDQyLmV4dHJhY3RSb3RhdGlvbiggbWF0cml4NCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZXaWR0aC5zZXQoIGxpZ2h0LndpZHRoICogMC41LCAwLjAsIDAuMCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5oYWxmSGVpZ2h0LnNldCggMC4wLCBsaWdodC5oZWlnaHQgKiAwLjUsIDAuMCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZXaWR0aC5hcHBseU1hdHJpeDQoIG1hdHJpeDQyICk7XG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZIZWlnaHQuYXBwbHlNYXRyaXg0KCBtYXRyaXg0MiApO1xuXG5cdFx0XHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBSZWN0QXJlYUxpZ2h0IGRpc3RhbmNlP1xuXHRcdFx0XHQvLyB1bmlmb3Jtcy5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuXG5cdFx0XHRcdHN0YXRlLnJlY3RBcmVhWyByZWN0QXJlYUxlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0cmVjdEFyZWFMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzUG9pbnRMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBsaWdodC5jb2xvciApLm11bHRpcGx5U2NhbGFyKCBsaWdodC5pbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlzdGFuY2UgPSBsaWdodC5kaXN0YW5jZTtcblx0XHRcdFx0dW5pZm9ybXMuZGVjYXkgPSAoIGxpZ2h0LmRpc3RhbmNlID09PSAwICkgPyAwLjAgOiBsaWdodC5kZWNheTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3cgPSBsaWdodC5jYXN0U2hhZG93O1xuXG5cdFx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdHZhciBzaGFkb3cgPSBsaWdodC5zaGFkb3c7XG5cblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1cztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93Q2FtZXJhTmVhciA9IHNoYWRvdy5jYW1lcmEubmVhcjtcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dDYW1lcmFGYXIgPSBzaGFkb3cuY2FtZXJhLmZhcjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c3RhdGUucG9pbnRTaGFkb3dNYXBbIHBvaW50TGVuZ3RoIF0gPSBzaGFkb3dNYXA7XG5cdFx0XHRcdHN0YXRlLnBvaW50U2hhZG93TWF0cml4WyBwb2ludExlbmd0aCBdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDtcblx0XHRcdFx0c3RhdGUucG9pbnRbIHBvaW50TGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRwb2ludExlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNIZW1pc3BoZXJlTGlnaHQgKSB7XG5cblx0XHRcdFx0dmFyIHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnNreUNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5ncm91bmRDb2xvci5jb3B5KCBsaWdodC5ncm91bmRDb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRzdGF0ZS5oZW1pWyBoZW1pTGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRoZW1pTGVuZ3RoICsrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5hbWJpZW50WyAwIF0gPSByO1xuXHRcdHN0YXRlLmFtYmllbnRbIDEgXSA9IGc7XG5cdFx0c3RhdGUuYW1iaWVudFsgMiBdID0gYjtcblxuXHRcdHN0YXRlLmRpcmVjdGlvbmFsLmxlbmd0aCA9IGRpcmVjdGlvbmFsTGVuZ3RoO1xuXHRcdHN0YXRlLnNwb3QubGVuZ3RoID0gc3BvdExlbmd0aDtcblx0XHRzdGF0ZS5yZWN0QXJlYS5sZW5ndGggPSByZWN0QXJlYUxlbmd0aDtcblx0XHRzdGF0ZS5wb2ludC5sZW5ndGggPSBwb2ludExlbmd0aDtcblx0XHRzdGF0ZS5oZW1pLmxlbmd0aCA9IGhlbWlMZW5ndGg7XG5cblx0XHRzdGF0ZS5oYXNoID0gc3RhdGUuaWQgKyAnLCcgKyBkaXJlY3Rpb25hbExlbmd0aCArICcsJyArIHBvaW50TGVuZ3RoICsgJywnICsgc3BvdExlbmd0aCArICcsJyArIHJlY3RBcmVhTGVuZ3RoICsgJywnICsgaGVtaUxlbmd0aCArICcsJyArIHNoYWRvd3MubGVuZ3RoO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdHNldHVwOiBzZXR1cCxcblx0XHRzdGF0ZTogc3RhdGVcblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJTdGF0ZSgpIHtcblxuXHR2YXIgbGlnaHRzID0gbmV3IFdlYkdMTGlnaHRzKCk7XG5cblx0dmFyIGxpZ2h0c0FycmF5ID0gW107XG5cdHZhciBzaGFkb3dzQXJyYXkgPSBbXTtcblx0dmFyIHNwcml0ZXNBcnJheSA9IFtdO1xuXG5cdGZ1bmN0aW9uIGluaXQoKSB7XG5cblx0XHRsaWdodHNBcnJheS5sZW5ndGggPSAwO1xuXHRcdHNoYWRvd3NBcnJheS5sZW5ndGggPSAwO1xuXHRcdHNwcml0ZXNBcnJheS5sZW5ndGggPSAwO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoTGlnaHQoIGxpZ2h0ICkge1xuXG5cdFx0bGlnaHRzQXJyYXkucHVzaCggbGlnaHQgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaFNoYWRvdyggc2hhZG93TGlnaHQgKSB7XG5cblx0XHRzaGFkb3dzQXJyYXkucHVzaCggc2hhZG93TGlnaHQgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaFNwcml0ZSggc2hhZG93TGlnaHQgKSB7XG5cblx0XHRzcHJpdGVzQXJyYXkucHVzaCggc2hhZG93TGlnaHQgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0dXBMaWdodHMoIGNhbWVyYSApIHtcblxuXHRcdGxpZ2h0cy5zZXR1cCggbGlnaHRzQXJyYXksIHNoYWRvd3NBcnJheSwgY2FtZXJhICk7XG5cblx0fVxuXG5cdHZhciBzdGF0ZSA9IHtcblx0XHRsaWdodHNBcnJheTogbGlnaHRzQXJyYXksXG5cdFx0c2hhZG93c0FycmF5OiBzaGFkb3dzQXJyYXksXG5cdFx0c3ByaXRlc0FycmF5OiBzcHJpdGVzQXJyYXksXG5cblx0XHRsaWdodHM6IGxpZ2h0c1xuXHR9O1xuXG5cdHJldHVybiB7XG5cdFx0aW5pdDogaW5pdCxcblx0XHRzdGF0ZTogc3RhdGUsXG5cdFx0c2V0dXBMaWdodHM6IHNldHVwTGlnaHRzLFxuXG5cdFx0cHVzaExpZ2h0OiBwdXNoTGlnaHQsXG5cdFx0cHVzaFNoYWRvdzogcHVzaFNoYWRvdyxcblx0XHRwdXNoU3ByaXRlOiBwdXNoU3ByaXRlXG5cdH07XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJTdGF0ZXMoKSB7XG5cblx0dmFyIHJlbmRlclN0YXRlcyA9IHt9O1xuXG5cdGZ1bmN0aW9uIGdldCggc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdHZhciBoYXNoID0gc2NlbmUuaWQgKyAnLCcgKyBjYW1lcmEuaWQ7XG5cblx0XHR2YXIgcmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXNbIGhhc2ggXTtcblxuXHRcdGlmICggcmVuZGVyU3RhdGUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmVuZGVyU3RhdGUgPSBuZXcgV2ViR0xSZW5kZXJTdGF0ZSgpO1xuXHRcdFx0cmVuZGVyU3RhdGVzWyBoYXNoIF0gPSByZW5kZXJTdGF0ZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZW5kZXJTdGF0ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcblxuXHRcdHJlbmRlclN0YXRlcyA9IHt9O1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGdldDogZ2V0LFxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2Vcblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHBzOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKlxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoRGVwdGhNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hEZXB0aE1hdGVyaWFsJztcblxuXHR0aGlzLmRlcHRoUGFja2luZyA9IEJhc2ljRGVwdGhQYWNraW5nO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTtcblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaERlcHRoTWF0ZXJpYWw7XG5cbk1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hEZXB0aE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmRlcHRoUGFja2luZyA9IHNvdXJjZS5kZXB0aFBhY2tpbmc7XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqXG4gKiAgcmVmZXJlbmNlUG9zaXRpb246IDxmbG9hdD4sXG4gKiAgbmVhckRpc3RhbmNlOiA8ZmxvYXQ+LFxuICogIGZhckRpc3RhbmNlOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PlxuICpcbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoRGlzdGFuY2VNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hEaXN0YW5jZU1hdGVyaWFsJztcblxuXHR0aGlzLnJlZmVyZW5jZVBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5uZWFyRGlzdGFuY2UgPSAxO1xuXHR0aGlzLmZhckRpc3RhbmNlID0gMTAwMDtcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTtcblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hEaXN0YW5jZU1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaERpc3RhbmNlTWF0ZXJpYWw7XG5cbk1lc2hEaXN0YW5jZU1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnJlZmVyZW5jZVBvc2l0aW9uLmNvcHkoIHNvdXJjZS5yZWZlcmVuY2VQb3NpdGlvbiApO1xuXHR0aGlzLm5lYXJEaXN0YW5jZSA9IHNvdXJjZS5uZWFyRGlzdGFuY2U7XG5cdHRoaXMuZmFyRGlzdGFuY2UgPSBzb3VyY2UuZmFyRGlzdGFuY2U7XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xTaGFkb3dNYXAoIF9yZW5kZXJlciwgX29iamVjdHMsIG1heFRleHR1cmVTaXplICkge1xuXG5cdHZhciBfZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCksXG5cdFx0X3Byb2pTY3JlZW5NYXRyaXggPSBuZXcgTWF0cml4NCgpLFxuXG5cdFx0X3NoYWRvd01hcFNpemUgPSBuZXcgVmVjdG9yMigpLFxuXHRcdF9tYXhTaGFkb3dNYXBTaXplID0gbmV3IFZlY3RvcjIoIG1heFRleHR1cmVTaXplLCBtYXhUZXh0dXJlU2l6ZSApLFxuXG5cdFx0X2xvb2tUYXJnZXQgPSBuZXcgVmVjdG9yMygpLFxuXHRcdF9saWdodFBvc2l0aW9uV29ybGQgPSBuZXcgVmVjdG9yMygpLFxuXG5cdFx0X01vcnBoaW5nRmxhZyA9IDEsXG5cdFx0X1NraW5uaW5nRmxhZyA9IDIsXG5cblx0XHRfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzID0gKCBfTW9ycGhpbmdGbGFnIHwgX1NraW5uaW5nRmxhZyApICsgMSxcblxuXHRcdF9kZXB0aE1hdGVyaWFscyA9IG5ldyBBcnJheSggX051bWJlck9mTWF0ZXJpYWxWYXJpYW50cyApLFxuXHRcdF9kaXN0YW5jZU1hdGVyaWFscyA9IG5ldyBBcnJheSggX051bWJlck9mTWF0ZXJpYWxWYXJpYW50cyApLFxuXG5cdFx0X21hdGVyaWFsQ2FjaGUgPSB7fTtcblxuXHR2YXIgc2hhZG93U2lkZSA9IHsgMDogQmFja1NpZGUsIDE6IEZyb250U2lkZSwgMjogRG91YmxlU2lkZSB9O1xuXG5cdHZhciBjdWJlRGlyZWN0aW9ucyA9IFtcblx0XHRuZXcgVmVjdG9yMyggMSwgMCwgMCApLCBuZXcgVmVjdG9yMyggLSAxLCAwLCAwICksIG5ldyBWZWN0b3IzKCAwLCAwLCAxICksXG5cdFx0bmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgLSAxLCAwIClcblx0XTtcblxuXHR2YXIgY3ViZVVwcyA9IFtcblx0XHRuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLFxuXHRcdG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAwLCAxICksXHRuZXcgVmVjdG9yMyggMCwgMCwgLSAxIClcblx0XTtcblxuXHR2YXIgY3ViZTJEVmlld1BvcnRzID0gW1xuXHRcdG5ldyBWZWN0b3I0KCksIG5ldyBWZWN0b3I0KCksIG5ldyBWZWN0b3I0KCksXG5cdFx0bmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKVxuXHRdO1xuXG5cdC8vIGluaXRcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHM7ICsrIGkgKSB7XG5cblx0XHR2YXIgdXNlTW9ycGhpbmcgPSAoIGkgJiBfTW9ycGhpbmdGbGFnICkgIT09IDA7XG5cdFx0dmFyIHVzZVNraW5uaW5nID0gKCBpICYgX1NraW5uaW5nRmxhZyApICE9PSAwO1xuXG5cdFx0dmFyIGRlcHRoTWF0ZXJpYWwgPSBuZXcgTWVzaERlcHRoTWF0ZXJpYWwoIHtcblxuXHRcdFx0ZGVwdGhQYWNraW5nOiBSR0JBRGVwdGhQYWNraW5nLFxuXG5cdFx0XHRtb3JwaFRhcmdldHM6IHVzZU1vcnBoaW5nLFxuXHRcdFx0c2tpbm5pbmc6IHVzZVNraW5uaW5nXG5cblx0XHR9ICk7XG5cblx0XHRfZGVwdGhNYXRlcmlhbHNbIGkgXSA9IGRlcHRoTWF0ZXJpYWw7XG5cblx0XHQvL1xuXG5cdFx0dmFyIGRpc3RhbmNlTWF0ZXJpYWwgPSBuZXcgTWVzaERpc3RhbmNlTWF0ZXJpYWwoIHtcblxuXHRcdFx0bW9ycGhUYXJnZXRzOiB1c2VNb3JwaGluZyxcblx0XHRcdHNraW5uaW5nOiB1c2VTa2lubmluZ1xuXG5cdFx0fSApO1xuXG5cdFx0X2Rpc3RhbmNlTWF0ZXJpYWxzWyBpIF0gPSBkaXN0YW5jZU1hdGVyaWFsO1xuXG5cdH1cblxuXHQvL1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTtcblx0dGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMudHlwZSA9IFBDRlNoYWRvd01hcDtcblxuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggbGlnaHRzLCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0aWYgKCBzY29wZS5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjtcblx0XHRpZiAoIHNjb3BlLmF1dG9VcGRhdGUgPT09IGZhbHNlICYmIHNjb3BlLm5lZWRzVXBkYXRlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdGlmICggbGlnaHRzLmxlbmd0aCA9PT0gMCApIHJldHVybjtcblxuXHRcdC8vIFRPRE8gQ2xlYW4gdXAgKG5lZWRlZCBpbiBjYXNlIG9mIGNvbnRleHRsb3N0KVxuXHRcdHZhciBfZ2wgPSBfcmVuZGVyZXIuY29udGV4dDtcblx0XHR2YXIgX3N0YXRlID0gX3JlbmRlcmVyLnN0YXRlO1xuXG5cdFx0Ly8gU2V0IEdMIHN0YXRlIGZvciBkZXB0aCBtYXAuXG5cdFx0X3N0YXRlLmRpc2FibGUoIF9nbC5CTEVORCApO1xuXHRcdF9zdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCAxLCAxLCAxLCAxICk7XG5cdFx0X3N0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggdHJ1ZSApO1xuXHRcdF9zdGF0ZS5zZXRTY2lzc29yVGVzdCggZmFsc2UgKTtcblxuXHRcdC8vIHJlbmRlciBkZXB0aCBtYXBcblxuXHRcdHZhciBmYWNlQ291bnQ7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbGlnaHRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbGlnaHQgPSBsaWdodHNbIGkgXTtcblx0XHRcdHZhciBzaGFkb3cgPSBsaWdodC5zaGFkb3c7XG5cdFx0XHR2YXIgaXNQb2ludExpZ2h0ID0gbGlnaHQgJiYgbGlnaHQuaXNQb2ludExpZ2h0O1xuXG5cdFx0XHRpZiAoIHNoYWRvdyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZG93TWFwOicsIGxpZ2h0LCAnaGFzIG5vIHNoYWRvdy4nICk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBzaGFkb3dDYW1lcmEgPSBzaGFkb3cuY2FtZXJhO1xuXG5cdFx0XHRfc2hhZG93TWFwU2l6ZS5jb3B5KCBzaGFkb3cubWFwU2l6ZSApO1xuXHRcdFx0X3NoYWRvd01hcFNpemUubWluKCBfbWF4U2hhZG93TWFwU2l6ZSApO1xuXG5cdFx0XHRpZiAoIGlzUG9pbnRMaWdodCApIHtcblxuXHRcdFx0XHR2YXIgdnBXaWR0aCA9IF9zaGFkb3dNYXBTaXplLng7XG5cdFx0XHRcdHZhciB2cEhlaWdodCA9IF9zaGFkb3dNYXBTaXplLnk7XG5cblx0XHRcdFx0Ly8gVGhlc2Ugdmlld3BvcnRzIG1hcCBhIGN1YmUtbWFwIG9udG8gYSAyRCB0ZXh0dXJlIHdpdGggdGhlXG5cdFx0XHRcdC8vIGZvbGxvd2luZyBvcmllbnRhdGlvbjpcblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gIHh6WFpcblx0XHRcdFx0Ly8gICB5IFlcblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gWCAtIFBvc2l0aXZlIHggZGlyZWN0aW9uXG5cdFx0XHRcdC8vIHggLSBOZWdhdGl2ZSB4IGRpcmVjdGlvblxuXHRcdFx0XHQvLyBZIC0gUG9zaXRpdmUgeSBkaXJlY3Rpb25cblx0XHRcdFx0Ly8geSAtIE5lZ2F0aXZlIHkgZGlyZWN0aW9uXG5cdFx0XHRcdC8vIFogLSBQb3NpdGl2ZSB6IGRpcmVjdGlvblxuXHRcdFx0XHQvLyB6IC0gTmVnYXRpdmUgeiBkaXJlY3Rpb25cblxuXHRcdFx0XHQvLyBwb3NpdGl2ZSBYXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgMCBdLnNldCggdnBXaWR0aCAqIDIsIHZwSGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXHRcdFx0XHQvLyBuZWdhdGl2ZSBYXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgMSBdLnNldCggMCwgdnBIZWlnaHQsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIHBvc2l0aXZlIFpcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAyIF0uc2V0KCB2cFdpZHRoICogMywgdnBIZWlnaHQsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIG5lZ2F0aXZlIFpcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAzIF0uc2V0KCB2cFdpZHRoLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gcG9zaXRpdmUgWVxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDQgXS5zZXQoIHZwV2lkdGggKiAzLCAwLCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXHRcdFx0XHQvLyBuZWdhdGl2ZSBZXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgNSBdLnNldCggdnBXaWR0aCwgMCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblxuXHRcdFx0XHRfc2hhZG93TWFwU2l6ZS54ICo9IDQuMDtcblx0XHRcdFx0X3NoYWRvd01hcFNpemUueSAqPSAyLjA7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzaGFkb3cubWFwID09PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBwYXJzID0geyBtaW5GaWx0ZXI6IE5lYXJlc3RGaWx0ZXIsIG1hZ0ZpbHRlcjogTmVhcmVzdEZpbHRlciwgZm9ybWF0OiBSR0JBRm9ybWF0IH07XG5cblx0XHRcdFx0c2hhZG93Lm1hcCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCggX3NoYWRvd01hcFNpemUueCwgX3NoYWRvd01hcFNpemUueSwgcGFycyApO1xuXHRcdFx0XHRzaGFkb3cubWFwLnRleHR1cmUubmFtZSA9IGxpZ2h0Lm5hbWUgKyBcIi5zaGFkb3dNYXBcIjtcblxuXHRcdFx0XHRzaGFkb3dDYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggc2hhZG93LmlzU3BvdExpZ2h0U2hhZG93ICkge1xuXG5cdFx0XHRcdHNoYWRvdy51cGRhdGUoIGxpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHNoYWRvd01hcCA9IHNoYWRvdy5tYXA7XG5cdFx0XHR2YXIgc2hhZG93TWF0cml4ID0gc2hhZG93Lm1hdHJpeDtcblxuXHRcdFx0X2xpZ2h0UG9zaXRpb25Xb3JsZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRzaGFkb3dDYW1lcmEucG9zaXRpb24uY29weSggX2xpZ2h0UG9zaXRpb25Xb3JsZCApO1xuXG5cdFx0XHRpZiAoIGlzUG9pbnRMaWdodCApIHtcblxuXHRcdFx0XHRmYWNlQ291bnQgPSA2O1xuXG5cdFx0XHRcdC8vIGZvciBwb2ludCBsaWdodHMgd2Ugc2V0IHRoZSBzaGFkb3cgbWF0cml4IHRvIGJlIGEgdHJhbnNsYXRpb24tb25seSBtYXRyaXhcblx0XHRcdFx0Ly8gZXF1YWwgdG8gaW52ZXJzZSBvZiB0aGUgbGlnaHQncyBwb3NpdGlvblxuXG5cdFx0XHRcdHNoYWRvd01hdHJpeC5tYWtlVHJhbnNsYXRpb24oIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC54LCAtIF9saWdodFBvc2l0aW9uV29ybGQueSwgLSBfbGlnaHRQb3NpdGlvbldvcmxkLnogKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmYWNlQ291bnQgPSAxO1xuXG5cdFx0XHRcdF9sb29rVGFyZ2V0LnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHNoYWRvd0NhbWVyYS5sb29rQXQoIF9sb29rVGFyZ2V0ICk7XG5cdFx0XHRcdHNoYWRvd0NhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0XHRcdC8vIGNvbXB1dGUgc2hhZG93IG1hdHJpeFxuXG5cdFx0XHRcdHNoYWRvd01hdHJpeC5zZXQoXG5cdFx0XHRcdFx0MC41LCAwLjAsIDAuMCwgMC41LFxuXHRcdFx0XHRcdDAuMCwgMC41LCAwLjAsIDAuNSxcblx0XHRcdFx0XHQwLjAsIDAuMCwgMC41LCAwLjUsXG5cdFx0XHRcdFx0MC4wLCAwLjAsIDAuMCwgMS4wXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0c2hhZG93TWF0cml4Lm11bHRpcGx5KCBzaGFkb3dDYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdFx0XHRzaGFkb3dNYXRyaXgubXVsdGlwbHkoIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRfcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBzaGFkb3dNYXAgKTtcblx0XHRcdF9yZW5kZXJlci5jbGVhcigpO1xuXG5cdFx0XHQvLyByZW5kZXIgc2hhZG93IG1hcCBmb3IgZWFjaCBjdWJlIGZhY2UgKGlmIG9tbmktZGlyZWN0aW9uYWwpIG9yXG5cdFx0XHQvLyBydW4gYSBzaW5nbGUgcGFzcyBpZiBub3RcblxuXHRcdFx0Zm9yICggdmFyIGZhY2UgPSAwOyBmYWNlIDwgZmFjZUNvdW50OyBmYWNlICsrICkge1xuXG5cdFx0XHRcdGlmICggaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdFx0X2xvb2tUYXJnZXQuY29weSggc2hhZG93Q2FtZXJhLnBvc2l0aW9uICk7XG5cdFx0XHRcdFx0X2xvb2tUYXJnZXQuYWRkKCBjdWJlRGlyZWN0aW9uc1sgZmFjZSBdICk7XG5cdFx0XHRcdFx0c2hhZG93Q2FtZXJhLnVwLmNvcHkoIGN1YmVVcHNbIGZhY2UgXSApO1xuXHRcdFx0XHRcdHNoYWRvd0NhbWVyYS5sb29rQXQoIF9sb29rVGFyZ2V0ICk7XG5cdFx0XHRcdFx0c2hhZG93Q2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHRcdFx0XHR2YXIgdnBEaW1lbnNpb25zID0gY3ViZTJEVmlld1BvcnRzWyBmYWNlIF07XG5cdFx0XHRcdFx0X3N0YXRlLnZpZXdwb3J0KCB2cERpbWVuc2lvbnMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gdXBkYXRlIGNhbWVyYSBtYXRyaWNlcyBhbmQgZnJ1c3R1bVxuXG5cdFx0XHRcdF9wcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0XHRcdF9mcnVzdHVtLnNldEZyb21NYXRyaXgoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRcdFx0Ly8gc2V0IG9iamVjdCBtYXRyaWNlcyAmIGZydXN0dW0gY3VsbGluZ1xuXG5cdFx0XHRcdHJlbmRlck9iamVjdCggc2NlbmUsIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c2NvcGUubmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHR9O1xuXG5cdGZ1bmN0aW9uIGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgbWF0ZXJpYWwsIGlzUG9pbnRMaWdodCwgbGlnaHRQb3NpdGlvbldvcmxkLCBzaGFkb3dDYW1lcmFOZWFyLCBzaGFkb3dDYW1lcmFGYXIgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHR2YXIgcmVzdWx0ID0gbnVsbDtcblxuXHRcdHZhciBtYXRlcmlhbFZhcmlhbnRzID0gX2RlcHRoTWF0ZXJpYWxzO1xuXHRcdHZhciBjdXN0b21NYXRlcmlhbCA9IG9iamVjdC5jdXN0b21EZXB0aE1hdGVyaWFsO1xuXG5cdFx0aWYgKCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRcdG1hdGVyaWFsVmFyaWFudHMgPSBfZGlzdGFuY2VNYXRlcmlhbHM7XG5cdFx0XHRjdXN0b21NYXRlcmlhbCA9IG9iamVjdC5jdXN0b21EaXN0YW5jZU1hdGVyaWFsO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAhIGN1c3RvbU1hdGVyaWFsICkge1xuXG5cdFx0XHR2YXIgdXNlTW9ycGhpbmcgPSBmYWxzZTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0dXNlTW9ycGhpbmcgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMgJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbi5sZW5ndGggPiAwO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHR1c2VNb3JwaGluZyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyAmJiBnZW9tZXRyeS5tb3JwaFRhcmdldHMubGVuZ3RoID4gMDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvYmplY3QuaXNTa2lubmVkTWVzaCAmJiBtYXRlcmlhbC5za2lubmluZyA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkb3dNYXA6IFRIUkVFLlNraW5uZWRNZXNoIHdpdGggbWF0ZXJpYWwuc2tpbm5pbmcgc2V0IHRvIGZhbHNlOicsIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB1c2VTa2lubmluZyA9IG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVyaWFsLnNraW5uaW5nO1xuXG5cdFx0XHR2YXIgdmFyaWFudEluZGV4ID0gMDtcblxuXHRcdFx0aWYgKCB1c2VNb3JwaGluZyApIHZhcmlhbnRJbmRleCB8PSBfTW9ycGhpbmdGbGFnO1xuXHRcdFx0aWYgKCB1c2VTa2lubmluZyApIHZhcmlhbnRJbmRleCB8PSBfU2tpbm5pbmdGbGFnO1xuXG5cdFx0XHRyZXN1bHQgPSBtYXRlcmlhbFZhcmlhbnRzWyB2YXJpYW50SW5kZXggXTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlc3VsdCA9IGN1c3RvbU1hdGVyaWFsO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBfcmVuZGVyZXIubG9jYWxDbGlwcGluZ0VuYWJsZWQgJiZcblx0XHRcdFx0bWF0ZXJpYWwuY2xpcFNoYWRvd3MgPT09IHRydWUgJiZcblx0XHRcdFx0bWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMubGVuZ3RoICE9PSAwICkge1xuXG5cdFx0XHQvLyBpbiB0aGlzIGNhc2Ugd2UgbmVlZCBhIHVuaXF1ZSBtYXRlcmlhbCBpbnN0YW5jZSByZWZsZWN0aW5nIHRoZVxuXHRcdFx0Ly8gYXBwcm9wcmlhdGUgc3RhdGVcblxuXHRcdFx0dmFyIGtleUEgPSByZXN1bHQudXVpZCwga2V5QiA9IG1hdGVyaWFsLnV1aWQ7XG5cblx0XHRcdHZhciBtYXRlcmlhbHNGb3JWYXJpYW50ID0gX21hdGVyaWFsQ2FjaGVbIGtleUEgXTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbHNGb3JWYXJpYW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWxzRm9yVmFyaWFudCA9IHt9O1xuXHRcdFx0XHRfbWF0ZXJpYWxDYWNoZVsga2V5QSBdID0gbWF0ZXJpYWxzRm9yVmFyaWFudDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgY2FjaGVkTWF0ZXJpYWwgPSBtYXRlcmlhbHNGb3JWYXJpYW50WyBrZXlCIF07XG5cblx0XHRcdGlmICggY2FjaGVkTWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjYWNoZWRNYXRlcmlhbCA9IHJlc3VsdC5jbG9uZSgpO1xuXHRcdFx0XHRtYXRlcmlhbHNGb3JWYXJpYW50WyBrZXlCIF0gPSBjYWNoZWRNYXRlcmlhbDtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHQgPSBjYWNoZWRNYXRlcmlhbDtcblxuXHRcdH1cblxuXHRcdHJlc3VsdC52aXNpYmxlID0gbWF0ZXJpYWwudmlzaWJsZTtcblx0XHRyZXN1bHQud2lyZWZyYW1lID0gbWF0ZXJpYWwud2lyZWZyYW1lO1xuXG5cdFx0cmVzdWx0LnNpZGUgPSAoIG1hdGVyaWFsLnNoYWRvd1NpZGUgIT0gbnVsbCApID8gbWF0ZXJpYWwuc2hhZG93U2lkZSA6IHNoYWRvd1NpZGVbIG1hdGVyaWFsLnNpZGUgXTtcblxuXHRcdHJlc3VsdC5jbGlwU2hhZG93cyA9IG1hdGVyaWFsLmNsaXBTaGFkb3dzO1xuXHRcdHJlc3VsdC5jbGlwcGluZ1BsYW5lcyA9IG1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzO1xuXHRcdHJlc3VsdC5jbGlwSW50ZXJzZWN0aW9uID0gbWF0ZXJpYWwuY2xpcEludGVyc2VjdGlvbjtcblxuXHRcdHJlc3VsdC53aXJlZnJhbWVMaW5ld2lkdGggPSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdFx0cmVzdWx0LmxpbmV3aWR0aCA9IG1hdGVyaWFsLmxpbmV3aWR0aDtcblxuXHRcdGlmICggaXNQb2ludExpZ2h0ICYmIHJlc3VsdC5pc01lc2hEaXN0YW5jZU1hdGVyaWFsICkge1xuXG5cdFx0XHRyZXN1bHQucmVmZXJlbmNlUG9zaXRpb24uY29weSggbGlnaHRQb3NpdGlvbldvcmxkICk7XG5cdFx0XHRyZXN1bHQubmVhckRpc3RhbmNlID0gc2hhZG93Q2FtZXJhTmVhcjtcblx0XHRcdHJlc3VsdC5mYXJEaXN0YW5jZSA9IHNoYWRvd0NhbWVyYUZhcjtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdCggb2JqZWN0LCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0aWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHR2YXIgdmlzaWJsZSA9IG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApO1xuXG5cdFx0aWYgKCB2aXNpYmxlICYmICggb2JqZWN0LmlzTWVzaCB8fCBvYmplY3QuaXNMaW5lIHx8IG9iamVjdC5pc1BvaW50cyApICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5jYXN0U2hhZG93ICYmICggISBvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bS5pbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSApICkge1xuXG5cdFx0XHRcdG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gX29iamVjdHMudXBkYXRlKCBvYmplY3QgKTtcblx0XHRcdFx0dmFyIG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsO1xuXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRcdHZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgayA9IDAsIGtsID0gZ3JvdXBzLmxlbmd0aDsgayA8IGtsOyBrICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGsgXTtcblx0XHRcdFx0XHRcdHZhciBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0aWYgKCBncm91cE1hdGVyaWFsICYmIGdyb3VwTWF0ZXJpYWwudmlzaWJsZSApIHtcblxuXHRcdFx0XHRcdFx0XHR2YXIgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgZ3JvdXBNYXRlcmlhbCwgaXNQb2ludExpZ2h0LCBfbGlnaHRQb3NpdGlvbldvcmxkLCBzaGFkb3dDYW1lcmEubmVhciwgc2hhZG93Q2FtZXJhLmZhciApO1xuXHRcdFx0XHRcdFx0XHRfcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBvYmplY3QsIGdyb3VwICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0dmFyIGRlcHRoTWF0ZXJpYWwgPSBnZXREZXB0aE1hdGVyaWFsKCBvYmplY3QsIG1hdGVyaWFsLCBpc1BvaW50TGlnaHQsIF9saWdodFBvc2l0aW9uV29ybGQsIHNoYWRvd0NhbWVyYS5uZWFyLCBzaGFkb3dDYW1lcmEuZmFyICk7XG5cdFx0XHRcdFx0X3JlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggc2hhZG93Q2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgb2JqZWN0LCBudWxsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRyZW5kZXJPYmplY3QoIGNoaWxkcmVuWyBpIF0sIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBpc1BvaW50TGlnaHQgKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIENhbnZhc1RleHR1cmUoIGNhbnZhcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgY2FudmFzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcblxuXHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxufVxuXG5DYW52YXNUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5DYW52YXNUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENhbnZhc1RleHR1cmU7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xTcHJpdGVSZW5kZXJlciggcmVuZGVyZXIsIGdsLCBzdGF0ZSwgdGV4dHVyZXMsIGNhcGFiaWxpdGllcyApIHtcblxuXHR2YXIgdmVydGV4QnVmZmVyLCBlbGVtZW50QnVmZmVyO1xuXHR2YXIgcHJvZ3JhbSwgYXR0cmlidXRlcywgdW5pZm9ybXM7XG5cblx0dmFyIHRleHR1cmU7XG5cblx0Ly8gZGVjb21wb3NlIG1hdHJpeFdvcmxkXG5cblx0dmFyIHNwcml0ZVBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHNwcml0ZVJvdGF0aW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblx0dmFyIHNwcml0ZVNjYWxlID0gbmV3IFZlY3RvcjMoKTtcblxuXHRmdW5jdGlvbiBpbml0KCkge1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggW1xuXHRcdFx0LSAwLjUsIC0gMC41LCAwLCAwLFxuXHRcdFx0ICAwLjUsIC0gMC41LCAxLCAwLFxuXHRcdFx0ICAwLjUsIDAuNSwgMSwgMSxcblx0XHRcdC0gMC41LCAwLjUsIDAsIDFcblx0XHRdICk7XG5cblx0XHR2YXIgZmFjZXMgPSBuZXcgVWludDE2QXJyYXkoIFtcblx0XHRcdDAsIDEsIDIsXG5cdFx0XHQwLCAyLCAzXG5cdFx0XSApO1xuXG5cdFx0dmVydGV4QnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0ZWxlbWVudEJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhCdWZmZXIgKTtcblx0XHRnbC5idWZmZXJEYXRhKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRpY2VzLCBnbC5TVEFUSUNfRFJBVyApO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRCdWZmZXIgKTtcblx0XHRnbC5idWZmZXJEYXRhKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZmFjZXMsIGdsLlNUQVRJQ19EUkFXICk7XG5cblx0XHRwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSgpO1xuXG5cdFx0YXR0cmlidXRlcyA9IHtcblx0XHRcdHBvc2l0aW9uOiBnbC5nZXRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgJ3Bvc2l0aW9uJyApLFxuXHRcdFx0dXY6IGdsLmdldEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCAndXYnIClcblx0XHR9O1xuXG5cdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHR1dk9mZnNldDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAndXZPZmZzZXQnICksXG5cdFx0XHR1dlNjYWxlOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICd1dlNjYWxlJyApLFxuXG5cdFx0XHRyb3RhdGlvbjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAncm90YXRpb24nICksXG5cdFx0XHRjZW50ZXI6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2NlbnRlcicgKSxcblx0XHRcdHNjYWxlOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdzY2FsZScgKSxcblxuXHRcdFx0Y29sb3I6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2NvbG9yJyApLFxuXHRcdFx0bWFwOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdtYXAnICksXG5cdFx0XHRvcGFjaXR5OiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdvcGFjaXR5JyApLFxuXG5cdFx0XHRtb2RlbFZpZXdNYXRyaXg6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ21vZGVsVmlld01hdHJpeCcgKSxcblx0XHRcdHByb2plY3Rpb25NYXRyaXg6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3Byb2plY3Rpb25NYXRyaXgnICksXG5cblx0XHRcdGZvZ1R5cGU6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ1R5cGUnICksXG5cdFx0XHRmb2dEZW5zaXR5OiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dEZW5zaXR5JyApLFxuXHRcdFx0Zm9nTmVhcjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nTmVhcicgKSxcblx0XHRcdGZvZ0ZhcjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nRmFyJyApLFxuXHRcdFx0Zm9nQ29sb3I6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ0NvbG9yJyApLFxuXHRcdFx0Zm9nRGVwdGg6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ0RlcHRoJyApLFxuXG5cdFx0XHRhbHBoYVRlc3Q6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2FscGhhVGVzdCcgKVxuXHRcdH07XG5cblx0XHR2YXIgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cdFx0Y2FudmFzLndpZHRoID0gODtcblx0XHRjYW52YXMuaGVpZ2h0ID0gODtcblxuXHRcdHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoICcyZCcgKTtcblx0XHRjb250ZXh0LmZpbGxTdHlsZSA9ICd3aGl0ZSc7XG5cdFx0Y29udGV4dC5maWxsUmVjdCggMCwgMCwgOCwgOCApO1xuXG5cdFx0dGV4dHVyZSA9IG5ldyBDYW52YXNUZXh0dXJlKCBjYW52YXMgKTtcblxuXHR9XG5cblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHNwcml0ZXMsIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIHNwcml0ZXMubGVuZ3RoID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Ly8gc2V0dXAgZ2xcblxuXHRcdGlmICggcHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpbml0KCk7XG5cblx0XHR9XG5cblx0XHRzdGF0ZS51c2VQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0XHRzdGF0ZS5pbml0QXR0cmlidXRlcygpO1xuXHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggYXR0cmlidXRlcy5wb3NpdGlvbiApO1xuXHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggYXR0cmlidXRlcy51diApO1xuXHRcdHN0YXRlLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7XG5cblx0XHRzdGF0ZS5kaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcblx0XHRzdGF0ZS5lbmFibGUoIGdsLkJMRU5EICk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRleEJ1ZmZlciApO1xuXHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGF0dHJpYnV0ZXMucG9zaXRpb24sIDIsIGdsLkZMT0FULCBmYWxzZSwgMiAqIDgsIDAgKTtcblx0XHRnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBhdHRyaWJ1dGVzLnV2LCAyLCBnbC5GTE9BVCwgZmFsc2UsIDIgKiA4LCA4ICk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudEJ1ZmZlciApO1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdW5pZm9ybXMucHJvamVjdGlvbk1hdHJpeCwgZmFsc2UsIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzICk7XG5cblx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBnbC5URVhUVVJFMCApO1xuXHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMubWFwLCAwICk7XG5cblx0XHR2YXIgb2xkRm9nVHlwZSA9IDA7XG5cdFx0dmFyIHNjZW5lRm9nVHlwZSA9IDA7XG5cdFx0dmFyIGZvZyA9IHNjZW5lLmZvZztcblxuXHRcdGlmICggZm9nICkge1xuXG5cdFx0XHRnbC51bmlmb3JtM2YoIHVuaWZvcm1zLmZvZ0NvbG9yLCBmb2cuY29sb3IuciwgZm9nLmNvbG9yLmcsIGZvZy5jb2xvci5iICk7XG5cblx0XHRcdGlmICggZm9nLmlzRm9nICkge1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xZiggdW5pZm9ybXMuZm9nTmVhciwgZm9nLm5lYXIgKTtcblx0XHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5mb2dGYXIsIGZvZy5mYXIgKTtcblxuXHRcdFx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLmZvZ1R5cGUsIDEgKTtcblx0XHRcdFx0b2xkRm9nVHlwZSA9IDE7XG5cdFx0XHRcdHNjZW5lRm9nVHlwZSA9IDE7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5mb2dEZW5zaXR5LCBmb2cuZGVuc2l0eSApO1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgMiApO1xuXHRcdFx0XHRvbGRGb2dUeXBlID0gMjtcblx0XHRcdFx0c2NlbmVGb2dUeXBlID0gMjtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dUeXBlLCAwICk7XG5cdFx0XHRvbGRGb2dUeXBlID0gMDtcblx0XHRcdHNjZW5lRm9nVHlwZSA9IDA7XG5cblx0XHR9XG5cblxuXHRcdC8vIHVwZGF0ZSBwb3NpdGlvbnMgYW5kIHNvcnRcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNwcml0ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHNwcml0ZSA9IHNwcml0ZXNbIGkgXTtcblxuXHRcdFx0c3ByaXRlLm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBzcHJpdGUubWF0cml4V29ybGQgKTtcblx0XHRcdHNwcml0ZS56ID0gLSBzcHJpdGUubW9kZWxWaWV3TWF0cml4LmVsZW1lbnRzWyAxNCBdO1xuXG5cdFx0fVxuXG5cdFx0c3ByaXRlcy5zb3J0KCBwYWludGVyU29ydFN0YWJsZSApO1xuXG5cdFx0Ly8gcmVuZGVyIGFsbCBzcHJpdGVzXG5cblx0XHR2YXIgc2NhbGUgPSBbXTtcblx0XHR2YXIgY2VudGVyID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzcHJpdGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBzcHJpdGUgPSBzcHJpdGVzWyBpIF07XG5cdFx0XHR2YXIgbWF0ZXJpYWwgPSBzcHJpdGUubWF0ZXJpYWw7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwudmlzaWJsZSA9PT0gZmFsc2UgKSBjb250aW51ZTtcblxuXHRcdFx0c3ByaXRlLm9uQmVmb3JlUmVuZGVyKCByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgdW5kZWZpbmVkLCBtYXRlcmlhbCwgdW5kZWZpbmVkICk7XG5cblx0XHRcdGdsLnVuaWZvcm0xZiggdW5pZm9ybXMuYWxwaGFUZXN0LCBtYXRlcmlhbC5hbHBoYVRlc3QgKTtcblx0XHRcdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHVuaWZvcm1zLm1vZGVsVmlld01hdHJpeCwgZmFsc2UsIHNwcml0ZS5tb2RlbFZpZXdNYXRyaXguZWxlbWVudHMgKTtcblxuXHRcdFx0c3ByaXRlLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggc3ByaXRlUG9zaXRpb24sIHNwcml0ZVJvdGF0aW9uLCBzcHJpdGVTY2FsZSApO1xuXG5cdFx0XHRzY2FsZVsgMCBdID0gc3ByaXRlU2NhbGUueDtcblx0XHRcdHNjYWxlWyAxIF0gPSBzcHJpdGVTY2FsZS55O1xuXG5cdFx0XHRjZW50ZXJbIDAgXSA9IHNwcml0ZS5jZW50ZXIueCAtIDAuNTtcblx0XHRcdGNlbnRlclsgMSBdID0gc3ByaXRlLmNlbnRlci55IC0gMC41O1xuXG5cdFx0XHR2YXIgZm9nVHlwZSA9IDA7XG5cblx0XHRcdGlmICggc2NlbmUuZm9nICYmIG1hdGVyaWFsLmZvZyApIHtcblxuXHRcdFx0XHRmb2dUeXBlID0gc2NlbmVGb2dUeXBlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggb2xkRm9nVHlwZSAhPT0gZm9nVHlwZSApIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLmZvZ1R5cGUsIGZvZ1R5cGUgKTtcblx0XHRcdFx0b2xkRm9nVHlwZSA9IGZvZ1R5cGU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5tYXAgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dk9mZnNldCwgbWF0ZXJpYWwubWFwLm9mZnNldC54LCBtYXRlcmlhbC5tYXAub2Zmc2V0LnkgKTtcblx0XHRcdFx0Z2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dlNjYWxlLCBtYXRlcmlhbC5tYXAucmVwZWF0LngsIG1hdGVyaWFsLm1hcC5yZXBlYXQueSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0yZiggdW5pZm9ybXMudXZPZmZzZXQsIDAsIDAgKTtcblx0XHRcdFx0Z2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dlNjYWxlLCAxLCAxICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5vcGFjaXR5LCBtYXRlcmlhbC5vcGFjaXR5ICk7XG5cdFx0XHRnbC51bmlmb3JtM2YoIHVuaWZvcm1zLmNvbG9yLCBtYXRlcmlhbC5jb2xvci5yLCBtYXRlcmlhbC5jb2xvci5nLCBtYXRlcmlhbC5jb2xvci5iICk7XG5cblx0XHRcdGdsLnVuaWZvcm0xZiggdW5pZm9ybXMucm90YXRpb24sIG1hdGVyaWFsLnJvdGF0aW9uICk7XG5cdFx0XHRnbC51bmlmb3JtMmZ2KCB1bmlmb3Jtcy5jZW50ZXIsIGNlbnRlciApO1xuXHRcdFx0Z2wudW5pZm9ybTJmdiggdW5pZm9ybXMuc2NhbGUsIHNjYWxlICk7XG5cblx0XHRcdHN0YXRlLnNldEJsZW5kaW5nKCBtYXRlcmlhbC5ibGVuZGluZywgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbiwgbWF0ZXJpYWwuYmxlbmRTcmMsIG1hdGVyaWFsLmJsZW5kRHN0LCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uQWxwaGEsIG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEsIG1hdGVyaWFsLmJsZW5kRHN0QWxwaGEsIG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSApO1xuXHRcdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCBtYXRlcmlhbC5kZXB0aFRlc3QgKTtcblx0XHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayggbWF0ZXJpYWwuZGVwdGhXcml0ZSApO1xuXHRcdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRNYXNrKCBtYXRlcmlhbC5jb2xvcldyaXRlICk7XG5cblx0XHRcdHRleHR1cmVzLnNldFRleHR1cmUyRCggbWF0ZXJpYWwubWFwIHx8IHRleHR1cmUsIDAgKTtcblxuXHRcdFx0Z2wuZHJhd0VsZW1lbnRzKCBnbC5UUklBTkdMRVMsIDYsIGdsLlVOU0lHTkVEX1NIT1JULCAwICk7XG5cblx0XHRcdHNwcml0ZS5vbkFmdGVyUmVuZGVyKCByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSwgdW5kZWZpbmVkLCBtYXRlcmlhbCwgdW5kZWZpbmVkICk7XG5cblx0XHR9XG5cblx0XHQvLyByZXN0b3JlIGdsXG5cblx0XHRzdGF0ZS5lbmFibGUoIGdsLkNVTExfRkFDRSApO1xuXG5cdFx0c3RhdGUucmVzZXQoKTtcblxuXHR9O1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZVByb2dyYW0oKSB7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcblxuXHRcdHZhciB2ZXJ0ZXhTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIGdsLlZFUlRFWF9TSEFERVIgKTtcblx0XHR2YXIgZnJhZ21lbnRTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIGdsLkZSQUdNRU5UX1NIQURFUiApO1xuXG5cdFx0Z2wuc2hhZGVyU291cmNlKCB2ZXJ0ZXhTaGFkZXIsIFtcblxuXHRcdFx0J3ByZWNpc2lvbiAnICsgY2FwYWJpbGl0aWVzLnByZWNpc2lvbiArICcgZmxvYXQ7JyxcblxuXHRcdFx0JyNkZWZpbmUgU0hBREVSX05BTUUgJyArICdTcHJpdGVNYXRlcmlhbCcsXG5cblx0XHRcdCd1bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIGZsb2F0IHJvdGF0aW9uOycsXG5cdFx0XHQndW5pZm9ybSB2ZWMyIGNlbnRlcjsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMiBzY2FsZTsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMiB1dk9mZnNldDsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMiB1dlNjYWxlOycsXG5cblx0XHRcdCdhdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjsnLFxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMyIHV2OycsXG5cblx0XHRcdCd2YXJ5aW5nIHZlYzIgdlVWOycsXG5cdFx0XHQndmFyeWluZyBmbG9hdCBmb2dEZXB0aDsnLFxuXG5cdFx0XHQndm9pZCBtYWluKCkgeycsXG5cblx0XHRcdCdcdHZVViA9IHV2T2Zmc2V0ICsgdXYgKiB1dlNjYWxlOycsXG5cblx0XHRcdCdcdHZlYzIgYWxpZ25lZFBvc2l0aW9uID0gKCBwb3NpdGlvbiAtIGNlbnRlciApICogc2NhbGU7JyxcblxuXHRcdFx0J1x0dmVjMiByb3RhdGVkUG9zaXRpb247Jyxcblx0XHRcdCdcdHJvdGF0ZWRQb3NpdGlvbi54ID0gY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTsnLFxuXHRcdFx0J1x0cm90YXRlZFBvc2l0aW9uLnkgPSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55OycsXG5cblx0XHRcdCdcdHZlYzQgbXZQb3NpdGlvbjsnLFxuXG5cdFx0XHQnXHRtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7Jyxcblx0XHRcdCdcdG12UG9zaXRpb24ueHkgKz0gcm90YXRlZFBvc2l0aW9uOycsXG5cblx0XHRcdCdcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247JyxcblxuXHRcdFx0J1x0Zm9nRGVwdGggPSAtIG12UG9zaXRpb24uejsnLFxuXG5cdFx0XHQnfSdcblxuXHRcdF0uam9pbiggJ1xcbicgKSApO1xuXG5cdFx0Z2wuc2hhZGVyU291cmNlKCBmcmFnbWVudFNoYWRlciwgW1xuXG5cdFx0XHQncHJlY2lzaW9uICcgKyBjYXBhYmlsaXRpZXMucHJlY2lzaW9uICsgJyBmbG9hdDsnLFxuXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgJ1Nwcml0ZU1hdGVyaWFsJyxcblxuXHRcdFx0J3VuaWZvcm0gdmVjMyBjb2xvcjsnLFxuXHRcdFx0J3VuaWZvcm0gc2FtcGxlcjJEIG1hcDsnLFxuXHRcdFx0J3VuaWZvcm0gZmxvYXQgb3BhY2l0eTsnLFxuXG5cdFx0XHQndW5pZm9ybSBpbnQgZm9nVHlwZTsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMyBmb2dDb2xvcjsnLFxuXHRcdFx0J3VuaWZvcm0gZmxvYXQgZm9nRGVuc2l0eTsnLFxuXHRcdFx0J3VuaWZvcm0gZmxvYXQgZm9nTmVhcjsnLFxuXHRcdFx0J3VuaWZvcm0gZmxvYXQgZm9nRmFyOycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCBhbHBoYVRlc3Q7JyxcblxuXHRcdFx0J3ZhcnlpbmcgdmVjMiB2VVY7Jyxcblx0XHRcdCd2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoOycsXG5cblx0XHRcdCd2b2lkIG1haW4oKSB7JyxcblxuXHRcdFx0J1x0dmVjNCB0ZXh0dXJlID0gdGV4dHVyZTJEKCBtYXAsIHZVViApOycsXG5cblx0XHRcdCdcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yICogdGV4dHVyZS54eXosIHRleHR1cmUuYSAqIG9wYWNpdHkgKTsnLFxuXG5cdFx0XHQnXHRpZiAoIGdsX0ZyYWdDb2xvci5hIDwgYWxwaGFUZXN0ICkgZGlzY2FyZDsnLFxuXG5cdFx0XHQnXHRpZiAoIGZvZ1R5cGUgPiAwICkgeycsXG5cblx0XHRcdCdcdFx0ZmxvYXQgZm9nRmFjdG9yID0gMC4wOycsXG5cblx0XHRcdCdcdFx0aWYgKCBmb2dUeXBlID09IDEgKSB7JyxcblxuXHRcdFx0J1x0XHRcdGZvZ0ZhY3RvciA9IHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZm9nRGVwdGggKTsnLFxuXG5cdFx0XHQnXHRcdH0gZWxzZSB7JyxcblxuXHRcdFx0J1x0XHRcdGNvbnN0IGZsb2F0IExPRzIgPSAxLjQ0MjY5NTsnLFxuXHRcdFx0J1x0XHRcdGZvZ0ZhY3RvciA9IGV4cDIoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiBmb2dEZXB0aCAqIGZvZ0RlcHRoICogTE9HMiApOycsXG5cdFx0XHQnXHRcdFx0Zm9nRmFjdG9yID0gMS4wIC0gY2xhbXAoIGZvZ0ZhY3RvciwgMC4wLCAxLjAgKTsnLFxuXG5cdFx0XHQnXHRcdH0nLFxuXG5cdFx0XHQnXHRcdGdsX0ZyYWdDb2xvci5yZ2IgPSBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTsnLFxuXG5cdFx0XHQnXHR9JyxcblxuXHRcdFx0J30nXG5cblx0XHRdLmpvaW4oICdcXG4nICkgKTtcblxuXHRcdGdsLmNvbXBpbGVTaGFkZXIoIHZlcnRleFNoYWRlciApO1xuXHRcdGdsLmNvbXBpbGVTaGFkZXIoIGZyYWdtZW50U2hhZGVyICk7XG5cblx0XHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIHZlcnRleFNoYWRlciApO1xuXHRcdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIgKTtcblxuXHRcdGdsLmxpbmtQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0XHRyZXR1cm4gcHJvZ3JhbTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7XG5cblx0XHRpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XG5cblx0XHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcblxuXHRcdH0gZWxzZSBpZiAoIGEueiAhPT0gYi56ICkge1xuXG5cdFx0XHRyZXR1cm4gYi56IC0gYS56O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIGIuaWQgLSBhLmlkO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xTdGF0ZSggZ2wsIGV4dGVuc2lvbnMsIHV0aWxzICkge1xuXG5cdGZ1bmN0aW9uIENvbG9yQnVmZmVyKCkge1xuXG5cdFx0dmFyIGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0dmFyIGNvbG9yID0gbmV3IFZlY3RvcjQoKTtcblx0XHR2YXIgY3VycmVudENvbG9yTWFzayA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRDb2xvckNsZWFyID0gbmV3IFZlY3RvcjQoIDAsIDAsIDAsIDAgKTtcblxuXHRcdHJldHVybiB7XG5cblx0XHRcdHNldE1hc2s6IGZ1bmN0aW9uICggY29sb3JNYXNrICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudENvbG9yTWFzayAhPT0gY29sb3JNYXNrICYmICEgbG9ja2VkICkge1xuXG5cdFx0XHRcdFx0Z2wuY29sb3JNYXNrKCBjb2xvck1hc2ssIGNvbG9yTWFzaywgY29sb3JNYXNrLCBjb2xvck1hc2sgKTtcblx0XHRcdFx0XHRjdXJyZW50Q29sb3JNYXNrID0gY29sb3JNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gbG9jaztcblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0Q2xlYXI6IGZ1bmN0aW9uICggciwgZywgYiwgYSwgcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhID09PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0ciAqPSBhOyBnICo9IGE7IGIgKj0gYTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29sb3Iuc2V0KCByLCBnLCBiLCBhICk7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50Q29sb3JDbGVhci5lcXVhbHMoIGNvbG9yICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0Z2wuY2xlYXJDb2xvciggciwgZywgYiwgYSApO1xuXHRcdFx0XHRcdGN1cnJlbnRDb2xvckNsZWFyLmNvcHkoIGNvbG9yICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRyZXNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdGN1cnJlbnRDb2xvck1hc2sgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50Q29sb3JDbGVhci5zZXQoIC0gMSwgMCwgMCwgMCApOyAvLyBzZXQgdG8gaW52YWxpZCBzdGF0ZVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBEZXB0aEJ1ZmZlcigpIHtcblxuXHRcdHZhciBsb2NrZWQgPSBmYWxzZTtcblxuXHRcdHZhciBjdXJyZW50RGVwdGhNYXNrID0gbnVsbDtcblx0XHR2YXIgY3VycmVudERlcHRoRnVuYyA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnREZXB0aENsZWFyID0gbnVsbDtcblxuXHRcdHJldHVybiB7XG5cblx0XHRcdHNldFRlc3Q6IGZ1bmN0aW9uICggZGVwdGhUZXN0ICkge1xuXG5cdFx0XHRcdGlmICggZGVwdGhUZXN0ICkge1xuXG5cdFx0XHRcdFx0ZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGRpc2FibGUoIGdsLkRFUFRIX1RFU1QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldE1hc2s6IGZ1bmN0aW9uICggZGVwdGhNYXNrICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoTWFzayAhPT0gZGVwdGhNYXNrICYmICEgbG9ja2VkICkge1xuXG5cdFx0XHRcdFx0Z2wuZGVwdGhNYXNrKCBkZXB0aE1hc2sgKTtcblx0XHRcdFx0XHRjdXJyZW50RGVwdGhNYXNrID0gZGVwdGhNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0RnVuYzogZnVuY3Rpb24gKCBkZXB0aEZ1bmMgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50RGVwdGhGdW5jICE9PSBkZXB0aEZ1bmMgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRcdFx0c3dpdGNoICggZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgTmV2ZXJEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTkVWRVIgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIEFsd2F5c0RlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5BTFdBWVMgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIExlc3NEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVTUyApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgTGVzc0VxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgRXF1YWxEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuRVFVQUwgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIEdyZWF0ZXJFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5HRVFVQUwgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIEdyZWF0ZXJEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuR1JFQVRFUiApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgTm90RXF1YWxEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTk9URVFVQUwgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGN1cnJlbnREZXB0aEZ1bmMgPSBkZXB0aEZ1bmM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBsb2NrO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRDbGVhcjogZnVuY3Rpb24gKCBkZXB0aCApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnREZXB0aENsZWFyICE9PSBkZXB0aCApIHtcblxuXHRcdFx0XHRcdGdsLmNsZWFyRGVwdGgoIGRlcHRoICk7XG5cdFx0XHRcdFx0Y3VycmVudERlcHRoQ2xlYXIgPSBkZXB0aDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gZmFsc2U7XG5cblx0XHRcdFx0Y3VycmVudERlcHRoTWFzayA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnREZXB0aEZ1bmMgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50RGVwdGhDbGVhciA9IG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIFN0ZW5jaWxCdWZmZXIoKSB7XG5cblx0XHR2YXIgbG9ja2VkID0gZmFsc2U7XG5cblx0XHR2YXIgY3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxGdW5jID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxSZWYgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxGYWlsID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxaRmFpbCA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbENsZWFyID0gbnVsbDtcblxuXHRcdHJldHVybiB7XG5cblx0XHRcdHNldFRlc3Q6IGZ1bmN0aW9uICggc3RlbmNpbFRlc3QgKSB7XG5cblx0XHRcdFx0aWYgKCBzdGVuY2lsVGVzdCApIHtcblxuXHRcdFx0XHRcdGVuYWJsZSggZ2wuU1RFTkNJTF9URVNUICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGRpc2FibGUoIGdsLlNURU5DSUxfVEVTVCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TWFzazogZnVuY3Rpb24gKCBzdGVuY2lsTWFzayApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTdGVuY2lsTWFzayAhPT0gc3RlbmNpbE1hc2sgJiYgISBsb2NrZWQgKSB7XG5cblx0XHRcdFx0XHRnbC5zdGVuY2lsTWFzayggc3RlbmNpbE1hc2sgKTtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbE1hc2sgPSBzdGVuY2lsTWFzaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldEZ1bmM6IGZ1bmN0aW9uICggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxGdW5jICE9PSBzdGVuY2lsRnVuYyB8fFxuXHRcdFx0XHQgICAgIGN1cnJlbnRTdGVuY2lsUmVmIFx0IT09IHN0ZW5jaWxSZWYgXHR8fFxuXHRcdFx0XHQgICAgIGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgIT09IHN0ZW5jaWxNYXNrICkge1xuXG5cdFx0XHRcdFx0Z2wuc3RlbmNpbEZ1bmMoIHN0ZW5jaWxGdW5jLCBzdGVuY2lsUmVmLCBzdGVuY2lsTWFzayApO1xuXG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jID0gc3RlbmNpbEZ1bmM7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxSZWYgPSBzdGVuY2lsUmVmO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBzdGVuY2lsTWFzaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldE9wOiBmdW5jdGlvbiAoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTdGVuY2lsRmFpbFx0ICE9PSBzdGVuY2lsRmFpbCBcdHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxaRmFpbCAhPT0gc3RlbmNpbFpGYWlsIHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxaUGFzcyAhPT0gc3RlbmNpbFpQYXNzICkge1xuXG5cdFx0XHRcdFx0Z2wuc3RlbmNpbE9wKCBzdGVuY2lsRmFpbCwgc3RlbmNpbFpGYWlsLCBzdGVuY2lsWlBhc3MgKTtcblxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsRmFpbCA9IHN0ZW5jaWxGYWlsO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBzdGVuY2lsWkZhaWw7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaUGFzcyA9IHN0ZW5jaWxaUGFzcztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIHN0ZW5jaWwgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbENsZWFyICE9PSBzdGVuY2lsICkge1xuXG5cdFx0XHRcdFx0Z2wuY2xlYXJTdGVuY2lsKCBzdGVuY2lsICk7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxDbGVhciA9IHN0ZW5jaWw7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRyZXNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsTWFzayA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuYyA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsUmVmID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsRmFpbCA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbFpQYXNzID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxDbGVhciA9IG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIGNvbG9yQnVmZmVyID0gbmV3IENvbG9yQnVmZmVyKCk7XG5cdHZhciBkZXB0aEJ1ZmZlciA9IG5ldyBEZXB0aEJ1ZmZlcigpO1xuXHR2YXIgc3RlbmNpbEJ1ZmZlciA9IG5ldyBTdGVuY2lsQnVmZmVyKCk7XG5cblx0dmFyIG1heFZlcnRleEF0dHJpYnV0ZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfQVRUUklCUyApO1xuXHR2YXIgbmV3QXR0cmlidXRlcyA9IG5ldyBVaW50OEFycmF5KCBtYXhWZXJ0ZXhBdHRyaWJ1dGVzICk7XG5cdHZhciBlbmFibGVkQXR0cmlidXRlcyA9IG5ldyBVaW50OEFycmF5KCBtYXhWZXJ0ZXhBdHRyaWJ1dGVzICk7XG5cdHZhciBhdHRyaWJ1dGVEaXZpc29ycyA9IG5ldyBVaW50OEFycmF5KCBtYXhWZXJ0ZXhBdHRyaWJ1dGVzICk7XG5cblx0dmFyIGNhcGFiaWxpdGllcyA9IHt9O1xuXG5cdHZhciBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPSBudWxsO1xuXG5cdHZhciBjdXJyZW50UHJvZ3JhbSA9IG51bGw7XG5cblx0dmFyIGN1cnJlbnRCbGVuZGluZyA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmRFcXVhdGlvbiA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmRTcmMgPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kRHN0ID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kU3JjQWxwaGEgPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsO1xuXHR2YXIgY3VycmVudFByZW11bHRpcGxlZEFscGhhID0gZmFsc2U7XG5cblx0dmFyIGN1cnJlbnRGbGlwU2lkZWQgPSBudWxsO1xuXHR2YXIgY3VycmVudEN1bGxGYWNlID0gbnVsbDtcblxuXHR2YXIgY3VycmVudExpbmVXaWR0aCA9IG51bGw7XG5cblx0dmFyIGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gbnVsbDtcblx0dmFyIGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgPSBudWxsO1xuXG5cdHZhciBtYXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMgKTtcblxuXHR2YXIgbGluZVdpZHRoQXZhaWxhYmxlID0gZmFsc2U7XG5cdHZhciB2ZXJzaW9uID0gMDtcblx0dmFyIGdsVmVyc2lvbiA9IGdsLmdldFBhcmFtZXRlciggZ2wuVkVSU0lPTiApO1xuXG5cdGlmICggZ2xWZXJzaW9uLmluZGV4T2YoICdXZWJHTCcgKSAhPT0gLSAxICkge1xuXG5cdFx0dmVyc2lvbiA9IHBhcnNlRmxvYXQoIC9eV2ViR0xcXCAoWzAtOV0pLy5leGVjKCBnbFZlcnNpb24gKVsgMSBdICk7XG5cdFx0bGluZVdpZHRoQXZhaWxhYmxlID0gKCB2ZXJzaW9uID49IDEuMCApO1xuXG5cdH0gZWxzZSBpZiAoIGdsVmVyc2lvbi5pbmRleE9mKCAnT3BlbkdMIEVTJyApICE9PSAtIDEgKSB7XG5cblx0XHR2ZXJzaW9uID0gcGFyc2VGbG9hdCggL15PcGVuR0xcXCBFU1xcIChbMC05XSkvLmV4ZWMoIGdsVmVyc2lvbiApWyAxIF0gKTtcblx0XHRsaW5lV2lkdGhBdmFpbGFibGUgPSAoIHZlcnNpb24gPj0gMi4wICk7XG5cblx0fVxuXG5cdHZhciBjdXJyZW50VGV4dHVyZVNsb3QgPSBudWxsO1xuXHR2YXIgY3VycmVudEJvdW5kVGV4dHVyZXMgPSB7fTtcblxuXHR2YXIgY3VycmVudFNjaXNzb3IgPSBuZXcgVmVjdG9yNCgpO1xuXHR2YXIgY3VycmVudFZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKTtcblxuXHRmdW5jdGlvbiBjcmVhdGVUZXh0dXJlKCB0eXBlLCB0YXJnZXQsIGNvdW50ICkge1xuXG5cdFx0dmFyIGRhdGEgPSBuZXcgVWludDhBcnJheSggNCApOyAvLyA0IGlzIHJlcXVpcmVkIHRvIG1hdGNoIGRlZmF1bHQgdW5wYWNrIGFsaWdubWVudCBvZiA0LlxuXHRcdHZhciB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuXG5cdFx0Z2wuYmluZFRleHR1cmUoIHR5cGUsIHRleHR1cmUgKTtcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCB0eXBlLCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QgKTtcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCB0eXBlLCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNvdW50OyBpICsrICkge1xuXG5cdFx0XHRnbC50ZXhJbWFnZTJEKCB0YXJnZXQgKyBpLCAwLCBnbC5SR0JBLCAxLCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBkYXRhICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9XG5cblx0dmFyIGVtcHR5VGV4dHVyZXMgPSB7fTtcblx0ZW1wdHlUZXh0dXJlc1sgZ2wuVEVYVFVSRV8yRCBdID0gY3JlYXRlVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV8yRCwgMSApO1xuXHRlbXB0eVRleHR1cmVzWyBnbC5URVhUVVJFX0NVQkVfTUFQIF0gPSBjcmVhdGVUZXh0dXJlKCBnbC5URVhUVVJFX0NVQkVfTUFQLCBnbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gsIDYgKTtcblxuXHQvLyBpbml0XG5cblx0Y29sb3JCdWZmZXIuc2V0Q2xlYXIoIDAsIDAsIDAsIDEgKTtcblx0ZGVwdGhCdWZmZXIuc2V0Q2xlYXIoIDEgKTtcblx0c3RlbmNpbEJ1ZmZlci5zZXRDbGVhciggMCApO1xuXG5cdGVuYWJsZSggZ2wuREVQVEhfVEVTVCApO1xuXHRkZXB0aEJ1ZmZlci5zZXRGdW5jKCBMZXNzRXF1YWxEZXB0aCApO1xuXG5cdHNldEZsaXBTaWRlZCggZmFsc2UgKTtcblx0c2V0Q3VsbEZhY2UoIEN1bGxGYWNlQmFjayApO1xuXHRlbmFibGUoIGdsLkNVTExfRkFDRSApO1xuXG5cdGVuYWJsZSggZ2wuQkxFTkQgKTtcblx0c2V0QmxlbmRpbmcoIE5vcm1hbEJsZW5kaW5nICk7XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBpbml0QXR0cmlidXRlcygpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG5ld0F0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0bmV3QXR0cmlidXRlc1sgaSBdID0gMDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRuZXdBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7XG5cblx0XHRpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9PT0gMCApIHtcblxuXHRcdFx0Z2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoIGF0dHJpYnV0ZSApO1xuXHRcdFx0ZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTtcblxuXHRcdH1cblxuXHRcdGlmICggYXR0cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0ZSBdICE9PSAwICkge1xuXG5cdFx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdFx0XHRleHRlbnNpb24udmVydGV4QXR0cmliRGl2aXNvckFOR0xFKCBhdHRyaWJ1dGUsIDAgKTtcblx0XHRcdGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSA9IDA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIGF0dHJpYnV0ZSwgbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRcdG5ld0F0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTtcblxuXHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID09PSAwICkge1xuXG5cdFx0XHRnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggYXR0cmlidXRlICk7XG5cdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gIT09IG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRcdGV4dGVuc2lvbi52ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUoIGF0dHJpYnV0ZSwgbWVzaFBlckF0dHJpYnV0ZSApO1xuXHRcdFx0YXR0cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0ZSBdID0gbWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBlbmFibGVkQXR0cmlidXRlcy5sZW5ndGg7IGkgIT09IGw7ICsrIGkgKSB7XG5cblx0XHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSAhPT0gbmV3QXR0cmlidXRlc1sgaSBdICkge1xuXG5cdFx0XHRcdGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSggaSApO1xuXHRcdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgaSBdID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBlbmFibGUoIGlkICkge1xuXG5cdFx0aWYgKCBjYXBhYmlsaXRpZXNbIGlkIF0gIT09IHRydWUgKSB7XG5cblx0XHRcdGdsLmVuYWJsZSggaWQgKTtcblx0XHRcdGNhcGFiaWxpdGllc1sgaWQgXSA9IHRydWU7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc2FibGUoIGlkICkge1xuXG5cdFx0aWYgKCBjYXBhYmlsaXRpZXNbIGlkIF0gIT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC5kaXNhYmxlKCBpZCApO1xuXHRcdFx0Y2FwYWJpbGl0aWVzWyBpZCBdID0gZmFsc2U7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpIHtcblxuXHRcdGlmICggY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzID09PSBudWxsICkge1xuXG5cdFx0XHRjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPSBbXTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKSB8fFxuXHRcdFx0ICAgICBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8XG5cdFx0XHQgICAgIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEnICkgfHxcblx0XHRcdCAgICAgZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXN0YycgKSApIHtcblxuXHRcdFx0XHR2YXIgZm9ybWF0cyA9IGdsLmdldFBhcmFtZXRlciggZ2wuQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgKTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBmb3JtYXRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cy5wdXNoKCBmb3JtYXRzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHM7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVzZVByb2dyYW0oIHByb2dyYW0gKSB7XG5cblx0XHRpZiAoIGN1cnJlbnRQcm9ncmFtICE9PSBwcm9ncmFtICkge1xuXG5cdFx0XHRnbC51c2VQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0XHRcdGN1cnJlbnRQcm9ncmFtID0gcHJvZ3JhbTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldEJsZW5kaW5nKCBibGVuZGluZywgYmxlbmRFcXVhdGlvbiwgYmxlbmRTcmMsIGJsZW5kRHN0LCBibGVuZEVxdWF0aW9uQWxwaGEsIGJsZW5kU3JjQWxwaGEsIGJsZW5kRHN0QWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdGlmICggYmxlbmRpbmcgIT09IE5vQmxlbmRpbmcgKSB7XG5cblx0XHRcdGVuYWJsZSggZ2wuQkxFTkQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRpc2FibGUoIGdsLkJMRU5EICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGJsZW5kaW5nICE9PSBDdXN0b21CbGVuZGluZyApIHtcblxuXHRcdFx0aWYgKCBibGVuZGluZyAhPT0gY3VycmVudEJsZW5kaW5nIHx8IHByZW11bHRpcGxpZWRBbHBoYSAhPT0gY3VycmVudFByZW11bHRpcGxlZEFscGhhICkge1xuXG5cdFx0XHRcdHN3aXRjaCAoIGJsZW5kaW5nICkge1xuXG5cdFx0XHRcdFx0Y2FzZSBBZGRpdGl2ZUJsZW5kaW5nOlxuXG5cdFx0XHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuT05FLCBnbC5PTkUsIGdsLk9ORSwgZ2wuT05FICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCBnbC5TUkNfQUxQSEEsIGdsLk9ORSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgU3VidHJhY3RpdmVCbGVuZGluZzpcblxuXHRcdFx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlpFUk8sIGdsLlpFUk8sIGdsLk9ORV9NSU5VU19TUkNfQ09MT1IsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uKCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIGdsLlpFUk8sIGdsLk9ORV9NSU5VU19TUkNfQ09MT1IgKTtcblxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlIE11bHRpcGx5QmxlbmRpbmc6XG5cblx0XHRcdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5aRVJPLCBnbC5TUkNfQ09MT1IsIGdsLlpFUk8sIGdsLlNSQ19BTFBIQSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb24oIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggZ2wuWkVSTywgZ2wuU1JDX0NPTE9SICk7XG5cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0ZGVmYXVsdDpcblxuXHRcdFx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSwgZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLlNSQ19BTFBIQSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSwgZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudEJsZW5kRXF1YXRpb24gPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kU3JjID0gbnVsbDtcblx0XHRcdGN1cnJlbnRCbGVuZERzdCA9IG51bGw7XG5cdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcblx0XHRcdGN1cnJlbnRCbGVuZFNyY0FscGhhID0gbnVsbDtcblx0XHRcdGN1cnJlbnRCbGVuZERzdEFscGhhID0gbnVsbDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGJsZW5kRXF1YXRpb25BbHBoYSA9IGJsZW5kRXF1YXRpb25BbHBoYSB8fCBibGVuZEVxdWF0aW9uO1xuXHRcdFx0YmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGEgfHwgYmxlbmRTcmM7XG5cdFx0XHRibGVuZERzdEFscGhhID0gYmxlbmREc3RBbHBoYSB8fCBibGVuZERzdDtcblxuXHRcdFx0aWYgKCBibGVuZEVxdWF0aW9uICE9PSBjdXJyZW50QmxlbmRFcXVhdGlvbiB8fCBibGVuZEVxdWF0aW9uQWxwaGEgIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgKSB7XG5cblx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCB1dGlscy5jb252ZXJ0KCBibGVuZEVxdWF0aW9uICksIHV0aWxzLmNvbnZlcnQoIGJsZW5kRXF1YXRpb25BbHBoYSApICk7XG5cblx0XHRcdFx0Y3VycmVudEJsZW5kRXF1YXRpb24gPSBibGVuZEVxdWF0aW9uO1xuXHRcdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYmxlbmRTcmMgIT09IGN1cnJlbnRCbGVuZFNyYyB8fCBibGVuZERzdCAhPT0gY3VycmVudEJsZW5kRHN0IHx8IGJsZW5kU3JjQWxwaGEgIT09IGN1cnJlbnRCbGVuZFNyY0FscGhhIHx8IGJsZW5kRHN0QWxwaGEgIT09IGN1cnJlbnRCbGVuZERzdEFscGhhICkge1xuXG5cdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCB1dGlscy5jb252ZXJ0KCBibGVuZFNyYyApLCB1dGlscy5jb252ZXJ0KCBibGVuZERzdCApLCB1dGlscy5jb252ZXJ0KCBibGVuZFNyY0FscGhhICksIHV0aWxzLmNvbnZlcnQoIGJsZW5kRHN0QWxwaGEgKSApO1xuXG5cdFx0XHRcdGN1cnJlbnRCbGVuZFNyYyA9IGJsZW5kU3JjO1xuXHRcdFx0XHRjdXJyZW50QmxlbmREc3QgPSBibGVuZERzdDtcblx0XHRcdFx0Y3VycmVudEJsZW5kU3JjQWxwaGEgPSBibGVuZFNyY0FscGhhO1xuXHRcdFx0XHRjdXJyZW50QmxlbmREc3RBbHBoYSA9IGJsZW5kRHN0QWxwaGE7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGN1cnJlbnRCbGVuZGluZyA9IGJsZW5kaW5nO1xuXHRcdGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IHByZW11bHRpcGxpZWRBbHBoYTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmcm9udEZhY2VDVyApIHtcblxuXHRcdG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGVcblx0XHRcdD8gZGlzYWJsZSggZ2wuQ1VMTF9GQUNFIClcblx0XHRcdDogZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcblxuXHRcdHZhciBmbGlwU2lkZWQgPSAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICk7XG5cdFx0aWYgKCBmcm9udEZhY2VDVyApIGZsaXBTaWRlZCA9ICEgZmxpcFNpZGVkO1xuXG5cdFx0c2V0RmxpcFNpZGVkKCBmbGlwU2lkZWQgKTtcblxuXHRcdG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlXG5cdFx0XHQ/IHNldEJsZW5kaW5nKCBtYXRlcmlhbC5ibGVuZGluZywgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbiwgbWF0ZXJpYWwuYmxlbmRTcmMsIG1hdGVyaWFsLmJsZW5kRHN0LCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uQWxwaGEsIG1hdGVyaWFsLmJsZW5kU3JjQWxwaGEsIG1hdGVyaWFsLmJsZW5kRHN0QWxwaGEsIG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSApXG5cdFx0XHQ6IHNldEJsZW5kaW5nKCBOb0JsZW5kaW5nICk7XG5cblx0XHRkZXB0aEJ1ZmZlci5zZXRGdW5jKCBtYXRlcmlhbC5kZXB0aEZ1bmMgKTtcblx0XHRkZXB0aEJ1ZmZlci5zZXRUZXN0KCBtYXRlcmlhbC5kZXB0aFRlc3QgKTtcblx0XHRkZXB0aEJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5kZXB0aFdyaXRlICk7XG5cdFx0Y29sb3JCdWZmZXIuc2V0TWFzayggbWF0ZXJpYWwuY29sb3JXcml0ZSApO1xuXG5cdFx0c2V0UG9seWdvbk9mZnNldCggbWF0ZXJpYWwucG9seWdvbk9mZnNldCwgbWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciwgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzICk7XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gc2V0RmxpcFNpZGVkKCBmbGlwU2lkZWQgKSB7XG5cblx0XHRpZiAoIGN1cnJlbnRGbGlwU2lkZWQgIT09IGZsaXBTaWRlZCApIHtcblxuXHRcdFx0aWYgKCBmbGlwU2lkZWQgKSB7XG5cblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCBnbC5DVyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGdsLmZyb250RmFjZSggZ2wuQ0NXICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudEZsaXBTaWRlZCA9IGZsaXBTaWRlZDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0Q3VsbEZhY2UoIGN1bGxGYWNlICkge1xuXG5cdFx0aWYgKCBjdWxsRmFjZSAhPT0gQ3VsbEZhY2VOb25lICkge1xuXG5cdFx0XHRlbmFibGUoIGdsLkNVTExfRkFDRSApO1xuXG5cdFx0XHRpZiAoIGN1bGxGYWNlICE9PSBjdXJyZW50Q3VsbEZhY2UgKSB7XG5cblx0XHRcdFx0aWYgKCBjdWxsRmFjZSA9PT0gQ3VsbEZhY2VCYWNrICkge1xuXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIGdsLkJBQ0sgKTtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBjdWxsRmFjZSA9PT0gQ3VsbEZhY2VGcm9udCApIHtcblxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCBnbC5GUk9OVCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggZ2wuRlJPTlRfQU5EX0JBQ0sgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRpc2FibGUoIGdsLkNVTExfRkFDRSApO1xuXG5cdFx0fVxuXG5cdFx0Y3VycmVudEN1bGxGYWNlID0gY3VsbEZhY2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldExpbmVXaWR0aCggd2lkdGggKSB7XG5cblx0XHRpZiAoIHdpZHRoICE9PSBjdXJyZW50TGluZVdpZHRoICkge1xuXG5cdFx0XHRpZiAoIGxpbmVXaWR0aEF2YWlsYWJsZSApIGdsLmxpbmVXaWR0aCggd2lkdGggKTtcblxuXHRcdFx0Y3VycmVudExpbmVXaWR0aCA9IHdpZHRoO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRQb2x5Z29uT2Zmc2V0KCBwb2x5Z29uT2Zmc2V0LCBmYWN0b3IsIHVuaXRzICkge1xuXG5cdFx0aWYgKCBwb2x5Z29uT2Zmc2V0ICkge1xuXG5cdFx0XHRlbmFibGUoIGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwgKTtcblxuXHRcdFx0aWYgKCBjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciAhPT0gZmFjdG9yIHx8IGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgIT09IHVuaXRzICkge1xuXG5cdFx0XHRcdGdsLnBvbHlnb25PZmZzZXQoIGZhY3RvciwgdW5pdHMgKTtcblxuXHRcdFx0XHRjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciA9IGZhY3Rvcjtcblx0XHRcdFx0Y3VycmVudFBvbHlnb25PZmZzZXRVbml0cyA9IHVuaXRzO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkaXNhYmxlKCBnbC5QT0xZR09OX09GRlNFVF9GSUxMICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFNjaXNzb3JUZXN0KCBzY2lzc29yVGVzdCApIHtcblxuXHRcdGlmICggc2Npc3NvclRlc3QgKSB7XG5cblx0XHRcdGVuYWJsZSggZ2wuU0NJU1NPUl9URVNUICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkaXNhYmxlKCBnbC5TQ0lTU09SX1RFU1QgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gdGV4dHVyZVxuXG5cdGZ1bmN0aW9uIGFjdGl2ZVRleHR1cmUoIHdlYmdsU2xvdCApIHtcblxuXHRcdGlmICggd2ViZ2xTbG90ID09PSB1bmRlZmluZWQgKSB3ZWJnbFNsb3QgPSBnbC5URVhUVVJFMCArIG1heFRleHR1cmVzIC0gMTtcblxuXHRcdGlmICggY3VycmVudFRleHR1cmVTbG90ICE9PSB3ZWJnbFNsb3QgKSB7XG5cblx0XHRcdGdsLmFjdGl2ZVRleHR1cmUoIHdlYmdsU2xvdCApO1xuXHRcdFx0Y3VycmVudFRleHR1cmVTbG90ID0gd2ViZ2xTbG90O1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBiaW5kVGV4dHVyZSggd2ViZ2xUeXBlLCB3ZWJnbFRleHR1cmUgKSB7XG5cblx0XHRpZiAoIGN1cnJlbnRUZXh0dXJlU2xvdCA9PT0gbnVsbCApIHtcblxuXHRcdFx0YWN0aXZlVGV4dHVyZSgpO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGJvdW5kVGV4dHVyZSA9IGN1cnJlbnRCb3VuZFRleHR1cmVzWyBjdXJyZW50VGV4dHVyZVNsb3QgXTtcblxuXHRcdGlmICggYm91bmRUZXh0dXJlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJvdW5kVGV4dHVyZSA9IHsgdHlwZTogdW5kZWZpbmVkLCB0ZXh0dXJlOiB1bmRlZmluZWQgfTtcblx0XHRcdGN1cnJlbnRCb3VuZFRleHR1cmVzWyBjdXJyZW50VGV4dHVyZVNsb3QgXSA9IGJvdW5kVGV4dHVyZTtcblxuXHRcdH1cblxuXHRcdGlmICggYm91bmRUZXh0dXJlLnR5cGUgIT09IHdlYmdsVHlwZSB8fCBib3VuZFRleHR1cmUudGV4dHVyZSAhPT0gd2ViZ2xUZXh0dXJlICkge1xuXG5cdFx0XHRnbC5iaW5kVGV4dHVyZSggd2ViZ2xUeXBlLCB3ZWJnbFRleHR1cmUgfHwgZW1wdHlUZXh0dXJlc1sgd2ViZ2xUeXBlIF0gKTtcblxuXHRcdFx0Ym91bmRUZXh0dXJlLnR5cGUgPSB3ZWJnbFR5cGU7XG5cdFx0XHRib3VuZFRleHR1cmUudGV4dHVyZSA9IHdlYmdsVGV4dHVyZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gY29tcHJlc3NlZFRleEltYWdlMkQoKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRnbC5jb21wcmVzc2VkVGV4SW1hZ2UyRC5hcHBseSggZ2wsIGFyZ3VtZW50cyApO1xuXG5cdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTonLCBlcnJvciApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB0ZXhJbWFnZTJEKCkge1xuXG5cdFx0dHJ5IHtcblxuXHRcdFx0Z2wudGV4SW1hZ2UyRC5hcHBseSggZ2wsIGFyZ3VtZW50cyApO1xuXG5cdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTonLCBlcnJvciApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIHNjaXNzb3IoIHNjaXNzb3IgKSB7XG5cblx0XHRpZiAoIGN1cnJlbnRTY2lzc29yLmVxdWFscyggc2Npc3NvciApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Z2wuc2Npc3Nvciggc2Npc3Nvci54LCBzY2lzc29yLnksIHNjaXNzb3Iueiwgc2Npc3Nvci53ICk7XG5cdFx0XHRjdXJyZW50U2Npc3Nvci5jb3B5KCBzY2lzc29yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHZpZXdwb3J0KCB2aWV3cG9ydCApIHtcblxuXHRcdGlmICggY3VycmVudFZpZXdwb3J0LmVxdWFscyggdmlld3BvcnQgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGdsLnZpZXdwb3J0KCB2aWV3cG9ydC54LCB2aWV3cG9ydC55LCB2aWV3cG9ydC56LCB2aWV3cG9ydC53ICk7XG5cdFx0XHRjdXJyZW50Vmlld3BvcnQuY29weSggdmlld3BvcnQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiByZXNldCgpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGVuYWJsZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgaSBdID09PSAxICkge1xuXG5cdFx0XHRcdGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSggaSApO1xuXHRcdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgaSBdID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Y2FwYWJpbGl0aWVzID0ge307XG5cblx0XHRjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPSBudWxsO1xuXG5cdFx0Y3VycmVudFRleHR1cmVTbG90ID0gbnVsbDtcblx0XHRjdXJyZW50Qm91bmRUZXh0dXJlcyA9IHt9O1xuXG5cdFx0Y3VycmVudFByb2dyYW0gPSBudWxsO1xuXG5cdFx0Y3VycmVudEJsZW5kaW5nID0gbnVsbDtcblxuXHRcdGN1cnJlbnRGbGlwU2lkZWQgPSBudWxsO1xuXHRcdGN1cnJlbnRDdWxsRmFjZSA9IG51bGw7XG5cblx0XHRjb2xvckJ1ZmZlci5yZXNldCgpO1xuXHRcdGRlcHRoQnVmZmVyLnJlc2V0KCk7XG5cdFx0c3RlbmNpbEJ1ZmZlci5yZXNldCgpO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0YnVmZmVyczoge1xuXHRcdFx0Y29sb3I6IGNvbG9yQnVmZmVyLFxuXHRcdFx0ZGVwdGg6IGRlcHRoQnVmZmVyLFxuXHRcdFx0c3RlbmNpbDogc3RlbmNpbEJ1ZmZlclxuXHRcdH0sXG5cblx0XHRpbml0QXR0cmlidXRlczogaW5pdEF0dHJpYnV0ZXMsXG5cdFx0ZW5hYmxlQXR0cmlidXRlOiBlbmFibGVBdHRyaWJ1dGUsXG5cdFx0ZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcjogZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcixcblx0XHRkaXNhYmxlVW51c2VkQXR0cmlidXRlczogZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMsXG5cdFx0ZW5hYmxlOiBlbmFibGUsXG5cdFx0ZGlzYWJsZTogZGlzYWJsZSxcblx0XHRnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHM6IGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyxcblxuXHRcdHVzZVByb2dyYW06IHVzZVByb2dyYW0sXG5cblx0XHRzZXRCbGVuZGluZzogc2V0QmxlbmRpbmcsXG5cdFx0c2V0TWF0ZXJpYWw6IHNldE1hdGVyaWFsLFxuXG5cdFx0c2V0RmxpcFNpZGVkOiBzZXRGbGlwU2lkZWQsXG5cdFx0c2V0Q3VsbEZhY2U6IHNldEN1bGxGYWNlLFxuXG5cdFx0c2V0TGluZVdpZHRoOiBzZXRMaW5lV2lkdGgsXG5cdFx0c2V0UG9seWdvbk9mZnNldDogc2V0UG9seWdvbk9mZnNldCxcblxuXHRcdHNldFNjaXNzb3JUZXN0OiBzZXRTY2lzc29yVGVzdCxcblxuXHRcdGFjdGl2ZVRleHR1cmU6IGFjdGl2ZVRleHR1cmUsXG5cdFx0YmluZFRleHR1cmU6IGJpbmRUZXh0dXJlLFxuXHRcdGNvbXByZXNzZWRUZXhJbWFnZTJEOiBjb21wcmVzc2VkVGV4SW1hZ2UyRCxcblx0XHR0ZXhJbWFnZTJEOiB0ZXhJbWFnZTJELFxuXG5cdFx0c2Npc3Nvcjogc2Npc3Nvcixcblx0XHR2aWV3cG9ydDogdmlld3BvcnQsXG5cblx0XHRyZXNldDogcmVzZXRcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFRleHR1cmVzKCBfZ2wsIGV4dGVuc2lvbnMsIHN0YXRlLCBwcm9wZXJ0aWVzLCBjYXBhYmlsaXRpZXMsIHV0aWxzLCBpbmZvICkge1xuXG5cdHZhciBfaXNXZWJHTDIgPSAoIHR5cGVvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ICE9PSAndW5kZWZpbmVkJyAmJiBfZ2wgaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ICk7IC8qIGdsb2JhbCBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ICovXG5cdHZhciBfdmlkZW9UZXh0dXJlcyA9IHt9O1xuXHR2YXIgX2NhbnZhcztcblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGNsYW1wVG9NYXhTaXplKCBpbWFnZSwgbWF4U2l6ZSApIHtcblxuXHRcdGlmICggaW1hZ2Uud2lkdGggPiBtYXhTaXplIHx8IGltYWdlLmhlaWdodCA+IG1heFNpemUgKSB7XG5cblx0XHRcdGlmICggJ2RhdGEnIGluIGltYWdlICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IGltYWdlIGluIERhdGFUZXh0dXJlIGlzIHRvbyBiaWcgKCcgKyBpbWFnZS53aWR0aCArICd4JyArIGltYWdlLmhlaWdodCArICcpLicgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFdhcm5pbmc6IFNjYWxpbmcgdGhyb3VnaCB0aGUgY2FudmFzIHdpbGwgb25seSB3b3JrIHdpdGggaW1hZ2VzIHRoYXQgdXNlXG5cdFx0XHQvLyBwcmVtdWx0aXBsaWVkIGFscGhhLlxuXG5cdFx0XHR2YXIgc2NhbGUgPSBtYXhTaXplIC8gTWF0aC5tYXgoIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0dmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXHRcdFx0Y2FudmFzLndpZHRoID0gTWF0aC5mbG9vciggaW1hZ2Uud2lkdGggKiBzY2FsZSApO1xuXHRcdFx0Y2FudmFzLmhlaWdodCA9IE1hdGguZmxvb3IoIGltYWdlLmhlaWdodCAqIHNjYWxlICk7XG5cblx0XHRcdHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoICcyZCcgKTtcblx0XHRcdGNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0ICk7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IGltYWdlIGlzIHRvbyBiaWcgKCcgKyBpbWFnZS53aWR0aCArICd4JyArIGltYWdlLmhlaWdodCArICcpLiBSZXNpemVkIHRvICcgKyBjYW52YXMud2lkdGggKyAneCcgKyBjYW52YXMuaGVpZ2h0LCBpbWFnZSApO1xuXG5cdFx0XHRyZXR1cm4gY2FudmFzO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGltYWdlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpc1Bvd2VyT2ZUd28oIGltYWdlICkge1xuXG5cdFx0cmV0dXJuIF9NYXRoLmlzUG93ZXJPZlR3byggaW1hZ2Uud2lkdGggKSAmJiBfTWF0aC5pc1Bvd2VyT2ZUd28oIGltYWdlLmhlaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBtYWtlUG93ZXJPZlR3byggaW1hZ2UgKSB7XG5cblx0XHRpZiAoIGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50IHx8IGltYWdlIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAgKSB7XG5cblx0XHRcdGlmICggX2NhbnZhcyA9PT0gdW5kZWZpbmVkICkgX2NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXG5cdFx0XHRfY2FudmFzLndpZHRoID0gX01hdGguZmxvb3JQb3dlck9mVHdvKCBpbWFnZS53aWR0aCApO1xuXHRcdFx0X2NhbnZhcy5oZWlnaHQgPSBfTWF0aC5mbG9vclBvd2VyT2ZUd28oIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHR2YXIgY29udGV4dCA9IF9jYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXHRcdFx0Y29udGV4dC5kcmF3SW1hZ2UoIGltYWdlLCAwLCAwLCBfY2FudmFzLndpZHRoLCBfY2FudmFzLmhlaWdodCApO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBpbWFnZSBpcyBub3QgcG93ZXIgb2YgdHdvICgnICsgaW1hZ2Uud2lkdGggKyAneCcgKyBpbWFnZS5oZWlnaHQgKyAnKS4gUmVzaXplZCB0byAnICsgX2NhbnZhcy53aWR0aCArICd4JyArIF9jYW52YXMuaGVpZ2h0LCBpbWFnZSApO1xuXG5cdFx0XHRyZXR1cm4gX2NhbnZhcztcblxuXHRcdH1cblxuXHRcdHJldHVybiBpbWFnZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdGV4dHVyZU5lZWRzUG93ZXJPZlR3byggdGV4dHVyZSApIHtcblxuXHRcdHJldHVybiAoIHRleHR1cmUud3JhcFMgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgfHwgdGV4dHVyZS53cmFwVCAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyApIHx8XG5cdFx0XHQoIHRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmIHRleHR1cmUubWluRmlsdGVyICE9PSBMaW5lYXJGaWx0ZXIgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd28gKSB7XG5cblx0XHRyZXR1cm4gdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgJiYgaXNQb3dlck9mVHdvICYmXG5cdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTmVhcmVzdEZpbHRlciAmJiB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTGluZWFyRmlsdGVyO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZU1pcG1hcCggdGFyZ2V0LCB0ZXh0dXJlLCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0X2dsLmdlbmVyYXRlTWlwbWFwKCB0YXJnZXQgKTtcblxuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHQvLyBOb3RlOiBNYXRoLmxvZyggeCApICogTWF0aC5MT0cyRSB1c2VkIGluc3RlYWQgb2YgTWF0aC5sb2cyKCB4ICkgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSBJRTExXG5cdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IE1hdGgubG9nKCBNYXRoLm1heCggd2lkdGgsIGhlaWdodCApICkgKiBNYXRoLkxPRzJFO1xuXG5cdH1cblxuXHQvLyBGYWxsYmFjayBmaWx0ZXJzIGZvciBub24tcG93ZXItb2YtMiB0ZXh0dXJlc1xuXG5cdGZ1bmN0aW9uIGZpbHRlckZhbGxiYWNrKCBmICkge1xuXG5cdFx0aWYgKCBmID09PSBOZWFyZXN0RmlsdGVyIHx8IGYgPT09IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyIHx8IGYgPT09IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIgKSB7XG5cblx0XHRcdHJldHVybiBfZ2wuTkVBUkVTVDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBfZ2wuTElORUFSO1xuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIG9uVGV4dHVyZURpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIHRleHR1cmUgPSBldmVudC50YXJnZXQ7XG5cblx0XHR0ZXh0dXJlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZVRleHR1cmUoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHtcblxuXHRcdFx0ZGVsZXRlIF92aWRlb1RleHR1cmVzWyB0ZXh0dXJlLmlkIF07XG5cblx0XHR9XG5cblx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyAtLTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25SZW5kZXJUYXJnZXREaXNwb3NlKCBldmVudCApIHtcblxuXHRcdHZhciByZW5kZXJUYXJnZXQgPSBldmVudC50YXJnZXQ7XG5cblx0XHRyZW5kZXJUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblJlbmRlclRhcmdldERpc3Bvc2UgKTtcblxuXHRcdGRlYWxsb2NhdGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0aW5mby5tZW1vcnkudGV4dHVyZXMgLS07XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZVRleHR1cmUoIHRleHR1cmUgKSB7XG5cblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmltYWdlICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKSB7XG5cblx0XHRcdC8vIGN1YmUgdGV4dHVyZVxuXG5cdFx0XHRfZ2wuZGVsZXRlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gMkQgdGV4dHVyZVxuXG5cdFx0XHRpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIGFsbCB3ZWJnbCBwcm9wZXJ0aWVzXG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIHRleHR1cmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XG5cblx0XHRpZiAoICEgcmVuZGVyVGFyZ2V0ICkgcmV0dXJuO1xuXG5cdFx0aWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRfZ2wuZGVsZXRlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5kaXNwb3NlKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTtcblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X2dsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICk7XG5cblx0XHR9XG5cblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggcmVuZGVyVGFyZ2V0ICk7XG5cblx0fVxuXG5cdC8vXG5cblxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgKSB1cGRhdGVWaWRlb1RleHR1cmUoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHtcblxuXHRcdFx0dmFyIGltYWdlID0gdGV4dHVyZS5pbWFnZTtcblxuXHRcdFx0aWYgKCBpbWFnZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCcsIHRleHR1cmUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW1hZ2UuY29tcGxldGUgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIGluY29tcGxldGUnLCB0ZXh0dXJlICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dXBsb2FkVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlQ3ViZSggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUuaW1hZ2UubGVuZ3RoID09PSA2ICkge1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudmVyc2lvbiA+IDAgJiYgdGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uICE9PSB0ZXh0dXJlLnZlcnNpb24gKSB7XG5cblx0XHRcdFx0aWYgKCAhIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRcdFx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyArKztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApO1xuXHRcdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKTtcblxuXHRcdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0ZXh0dXJlLmZsaXBZICk7XG5cblx0XHRcdFx0dmFyIGlzQ29tcHJlc3NlZCA9ICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgKTtcblx0XHRcdFx0dmFyIGlzRGF0YVRleHR1cmUgPSAoIHRleHR1cmUuaW1hZ2VbIDAgXSAmJiB0ZXh0dXJlLmltYWdlWyAwIF0uaXNEYXRhVGV4dHVyZSApO1xuXG5cdFx0XHRcdHZhciBjdWJlSW1hZ2UgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhIGlzQ29tcHJlc3NlZCAmJiAhIGlzRGF0YVRleHR1cmUgKSB7XG5cblx0XHRcdFx0XHRcdGN1YmVJbWFnZVsgaSBdID0gY2xhbXBUb01heFNpemUoIHRleHR1cmUuaW1hZ2VbIGkgXSwgY2FwYWJpbGl0aWVzLm1heEN1YmVtYXBTaXplICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRjdWJlSW1hZ2VbIGkgXSA9IGlzRGF0YVRleHR1cmUgPyB0ZXh0dXJlLmltYWdlWyBpIF0uaW1hZ2UgOiB0ZXh0dXJlLmltYWdlWyBpIF07XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBpbWFnZSA9IGN1YmVJbWFnZVsgMCBdLFxuXHRcdFx0XHRcdGlzUG93ZXJPZlR3b0ltYWdlID0gaXNQb3dlck9mVHdvKCBpbWFnZSApLFxuXHRcdFx0XHRcdGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQgKSxcblx0XHRcdFx0XHRnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTtcblxuXHRcdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdlICk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGlmICggISBpc0NvbXByZXNzZWQgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgMCwgZ2xGb3JtYXQsIGN1YmVJbWFnZVsgaSBdLndpZHRoLCBjdWJlSW1hZ2VbIGkgXS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGN1YmVJbWFnZVsgaSBdLmRhdGEgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgMCwgZ2xGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIGN1YmVJbWFnZVsgaSBdICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHZhciBtaXBtYXAsIG1pcG1hcHMgPSBjdWJlSW1hZ2VbIGkgXS5taXBtYXBzO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gbWlwbWFwcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBqIF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCQUZvcm1hdCAmJiB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCRm9ybWF0ICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBzdGF0ZS5nZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKS5pbmRleE9mKCBnbEZvcm1hdCApID4gLSAxICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGF0ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGosIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAuc2V0VGV4dHVyZUN1YmUoKScgKTtcblxuXHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIGosIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggISBpc0NvbXByZXNzZWQgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gMDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IG1pcG1hcHMubGVuZ3RoIC0gMTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdlICkgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBhc3N1bWUgaW1hZ2VzIGZvciBjdWJlIG1hcCBoYXZlIHRoZSBzYW1lIHNpemUuXG5cdFx0XHRcdFx0Z2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmUub25VcGRhdGUgKSB0ZXh0dXJlLm9uVXBkYXRlKCB0ZXh0dXJlICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApO1xuXHRcdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlQ3ViZUR5bmFtaWMoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVQYXJhbWV0ZXJzKCB0ZXh0dXJlVHlwZSwgdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uO1xuXG5cdFx0aWYgKCBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9XUkFQX1MsIHV0aWxzLmNvbnZlcnQoIHRleHR1cmUud3JhcFMgKSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9XUkFQX1QsIHV0aWxzLmNvbnZlcnQoIHRleHR1cmUud3JhcFQgKSApO1xuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01BR19GSUxURVIsIHV0aWxzLmNvbnZlcnQoIHRleHR1cmUubWFnRmlsdGVyICkgKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgdXRpbHMuY29udmVydCggdGV4dHVyZS5taW5GaWx0ZXIgKSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9XUkFQX1MsIF9nbC5DTEFNUF9UT19FREdFICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfVCwgX2dsLkNMQU1QX1RPX0VER0UgKTtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLndyYXBTICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nIHx8IHRleHR1cmUud3JhcFQgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLndyYXBTIGFuZCBUZXh0dXJlLndyYXBUIHNob3VsZCBiZSBzZXQgdG8gVEhSRUUuQ2xhbXBUb0VkZ2VXcmFwcGluZy4nLCB0ZXh0dXJlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBmaWx0ZXJGYWxsYmFjayggdGV4dHVyZS5tYWdGaWx0ZXIgKSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBmaWx0ZXJGYWxsYmFjayggdGV4dHVyZS5taW5GaWx0ZXIgKSApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmIHRleHR1cmUubWluRmlsdGVyICE9PSBMaW5lYXJGaWx0ZXIgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLm1pbkZpbHRlciBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLk5lYXJlc3RGaWx0ZXIgb3IgVEhSRUUuTGluZWFyRmlsdGVyLicsIHRleHR1cmUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiApIHtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IEZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicgKSA9PT0gbnVsbCApIHJldHVybjtcblx0XHRcdGlmICggdGV4dHVyZS50eXBlID09PSBIYWxmRmxvYXRUeXBlICYmIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXInICkgPT09IG51bGwgKSByZXR1cm47XG5cblx0XHRcdGlmICggdGV4dHVyZS5hbmlzb3Ryb3B5ID4gMSB8fCBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fY3VycmVudEFuaXNvdHJvcHkgKSB7XG5cblx0XHRcdFx0X2dsLnRleFBhcmFtZXRlcmYoIHRleHR1cmVUeXBlLCBleHRlbnNpb24uVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsIE1hdGgubWluKCB0ZXh0dXJlLmFuaXNvdHJvcHksIGNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkgKSApO1xuXHRcdFx0XHRwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fY3VycmVudEFuaXNvdHJvcHkgPSB0ZXh0dXJlLmFuaXNvdHJvcHk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBsb2FkVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID0gdHJ1ZTtcblxuXHRcdFx0dGV4dHVyZS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVGV4dHVyZURpc3Bvc2UgKTtcblxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgPSBfZ2wuY3JlYXRlVGV4dHVyZSgpO1xuXG5cdFx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyArKztcblxuXHRcdH1cblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0ZXh0dXJlLmZsaXBZICk7XG5cdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLCB0ZXh0dXJlLnByZW11bHRpcGx5QWxwaGEgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfQUxJR05NRU5ULCB0ZXh0dXJlLnVucGFja0FsaWdubWVudCApO1xuXG5cdFx0dmFyIGltYWdlID0gY2xhbXBUb01heFNpemUoIHRleHR1cmUuaW1hZ2UsIGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlTmVlZHNQb3dlck9mVHdvKCB0ZXh0dXJlICkgJiYgaXNQb3dlck9mVHdvKCBpbWFnZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0aW1hZ2UgPSBtYWtlUG93ZXJPZlR3byggaW1hZ2UgKTtcblxuXHRcdH1cblxuXHRcdHZhciBpc1Bvd2VyT2ZUd29JbWFnZSA9IGlzUG93ZXJPZlR3byggaW1hZ2UgKSxcblx0XHRcdGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQgKSxcblx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXG5cdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApO1xuXG5cdFx0dmFyIG1pcG1hcCwgbWlwbWFwcyA9IHRleHR1cmUubWlwbWFwcztcblxuXHRcdGlmICggdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0Ly8gcG9wdWxhdGUgZGVwdGggdGV4dHVyZSB3aXRoIGR1bW15IGRhdGFcblxuXHRcdFx0dmFyIGludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX0NPTVBPTkVOVDtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IEZsb2F0VHlwZSApIHtcblxuXHRcdFx0XHRpZiAoICEgX2lzV2ViR0wyICkgdGhyb3cgbmV3IEVycm9yKCAnRmxvYXQgRGVwdGggVGV4dHVyZSBvbmx5IHN1cHBvcnRlZCBpbiBXZWJHTDIuMCcgKTtcblx0XHRcdFx0aW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UMzJGO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBfaXNXZWJHTDIgKSB7XG5cblx0XHRcdFx0Ly8gV2ViR0wgMi4wIHJlcXVpcmVzIHNpZ25lZCBpbnRlcm5hbGZvcm1hdCBmb3IgZ2xUZXhJbWFnZTJEXG5cdFx0XHRcdGludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX0NPTVBPTkVOVDE2O1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgPT09IERlcHRoRm9ybWF0ICYmIGludGVybmFsRm9ybWF0ID09PSBfZ2wuREVQVEhfQ09NUE9ORU5UICkge1xuXG5cdFx0XHRcdC8vIFRoZSBlcnJvciBJTlZBTElEX09QRVJBVElPTiBpcyBnZW5lcmF0ZWQgYnkgdGV4SW1hZ2UyRCBpZiBmb3JtYXQgYW5kIGludGVybmFsZm9ybWF0IGFyZVxuXHRcdFx0XHQvLyBERVBUSF9DT01QT05FTlQgYW5kIHR5cGUgaXMgbm90IFVOU0lHTkVEX1NIT1JUIG9yIFVOU0lHTkVEX0lOVFxuXHRcdFx0XHQvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLylcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkU2hvcnRUeXBlICYmIHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRJbnRUeXBlICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVXNlIFVuc2lnbmVkU2hvcnRUeXBlIG9yIFVuc2lnbmVkSW50VHlwZSBmb3IgRGVwdGhGb3JtYXQgRGVwdGhUZXh0dXJlLicgKTtcblxuXHRcdFx0XHRcdHRleHR1cmUudHlwZSA9IFVuc2lnbmVkU2hvcnRUeXBlO1xuXHRcdFx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXB0aCBzdGVuY2lsIHRleHR1cmVzIG5lZWQgdGhlIERFUFRIX1NURU5DSUwgaW50ZXJuYWwgZm9ybWF0XG5cdFx0XHQvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLylcblx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHtcblxuXHRcdFx0XHRpbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9TVEVOQ0lMO1xuXG5cdFx0XHRcdC8vIFRoZSBlcnJvciBJTlZBTElEX09QRVJBVElPTiBpcyBnZW5lcmF0ZWQgYnkgdGV4SW1hZ2UyRCBpZiBmb3JtYXQgYW5kIGludGVybmFsZm9ybWF0IGFyZVxuXHRcdFx0XHQvLyBERVBUSF9TVEVOQ0lMIGFuZCB0eXBlIGlzIG5vdCBVTlNJR05FRF9JTlRfMjRfOF9XRUJHTC5cblx0XHRcdFx0Ly8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfZGVwdGhfdGV4dHVyZS8pXG5cdFx0XHRcdGlmICggdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZEludDI0OFR5cGUgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRJbnQyNDhUeXBlIGZvciBEZXB0aFN0ZW5jaWxGb3JtYXQgRGVwdGhUZXh0dXJlLicgKTtcblxuXHRcdFx0XHRcdHRleHR1cmUudHlwZSA9IFVuc2lnbmVkSW50MjQ4VHlwZTtcblx0XHRcdFx0XHRnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIDAsIGludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YVRleHR1cmUgKSB7XG5cblx0XHRcdC8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMgaWYgYXZhaWxhYmxlXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgbm8gbWFudWFsIG1pcG1hcHNcblx0XHRcdC8vIHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3RoZXIgbWlwbWFwIGxldmVsc1xuXG5cdFx0XHRpZiAoIG1pcG1hcHMubGVuZ3RoID4gMCAmJiBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGkgXTtcblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IG1pcG1hcHMubGVuZ3RoIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgZ2xGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdGV4dHVyZS5mb3JtYXQgIT09IFJHQkZvcm1hdCApIHtcblxuXHRcdFx0XHRcdGlmICggc3RhdGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZiggZ2xGb3JtYXQgKSA+IC0gMSApIHtcblxuXHRcdFx0XHRcdFx0c3RhdGUuY29tcHJlc3NlZFRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnVwbG9hZFRleHR1cmUoKScgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSBtaXBtYXBzLmxlbmd0aCAtIDE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyByZWd1bGFyIFRleHR1cmUgKGltYWdlLCB2aWRlbywgY2FudmFzKVxuXG5cdFx0XHQvLyB1c2UgbWFudWFsbHkgY3JlYXRlZCBtaXBtYXBzIGlmIGF2YWlsYWJsZVxuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIG5vIG1hbnVhbCBtaXBtYXBzXG5cdFx0XHQvLyBzZXQgMCBsZXZlbCBtaXBtYXAgYW5kIHRoZW4gdXNlIEdMIHRvIGdlbmVyYXRlIG90aGVyIG1pcG1hcCBsZXZlbHNcblxuXHRcdFx0aWYgKCBtaXBtYXBzLmxlbmd0aCA+IDAgJiYgaXNQb3dlck9mVHdvSW1hZ2UgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBpIF07XG5cdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IG1pcG1hcHMubGVuZ3RoIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgMCwgZ2xGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlICk7XG5cdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKSApIHtcblxuXHRcdFx0Z2VuZXJhdGVNaXBtYXAoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7XG5cblx0XHR9XG5cblx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gPSB0ZXh0dXJlLnZlcnNpb247XG5cblx0XHRpZiAoIHRleHR1cmUub25VcGRhdGUgKSB0ZXh0dXJlLm9uVXBkYXRlKCB0ZXh0dXJlICk7XG5cblx0fVxuXG5cdC8vIFJlbmRlciB0YXJnZXRzXG5cblx0Ly8gU2V0dXAgc3RvcmFnZSBmb3IgdGFyZ2V0IHRleHR1cmUgYW5kIGJpbmQgaXQgdG8gY29ycmVjdCBmcmFtZWJ1ZmZlclxuXHRmdW5jdGlvbiBzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggZnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCwgYXR0YWNobWVudCwgdGV4dHVyZVRhcmdldCApIHtcblxuXHRcdHZhciBnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQoIHJlbmRlclRhcmdldC50ZXh0dXJlLmZvcm1hdCApO1xuXHRcdHZhciBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCByZW5kZXJUYXJnZXQudGV4dHVyZS50eXBlICk7XG5cdFx0c3RhdGUudGV4SW1hZ2UyRCggdGV4dHVyZVRhcmdldCwgMCwgZ2xGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCApO1xuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTtcblx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgYXR0YWNobWVudCwgdGV4dHVyZVRhcmdldCwgcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICkuX193ZWJnbFRleHR1cmUsIDAgKTtcblx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIG51bGwgKTtcblxuXHR9XG5cblx0Ly8gU2V0dXAgc3RvcmFnZSBmb3IgaW50ZXJuYWwgZGVwdGgvc3RlbmNpbCBidWZmZXJzIGFuZCBiaW5kIHRvIGNvcnJlY3QgZnJhbWVidWZmZXJcblx0ZnVuY3Rpb24gc2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJidWZmZXIsIHJlbmRlclRhcmdldCApIHtcblxuXHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICYmICEgcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgKSB7XG5cblx0XHRcdF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCBfZ2wuUkVOREVSQlVGRkVSLCBfZ2wuREVQVEhfQ09NUE9ORU5UMTYsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9BVFRBQ0hNRU5ULCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAmJiByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIHtcblxuXHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIF9nbC5SRU5ERVJCVUZGRVIsIF9nbC5ERVBUSF9TVEVOQ0lMLCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULCBfZ2wuUkVOREVSQlVGRkVSLCByZW5kZXJidWZmZXIgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEZJWE1FOiBXZSBkb24ndCBzdXBwb3J0ICFkZXB0aCAhc3RlbmNpbFxuXHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIF9nbC5SRU5ERVJCVUZGRVIsIF9nbC5SR0JBNCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHR9XG5cblx0XHRfZ2wuYmluZFJlbmRlcmJ1ZmZlciggX2dsLlJFTkRFUkJVRkZFUiwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXR1cCByZXNvdXJjZXMgZm9yIGEgRGVwdGggVGV4dHVyZSBmb3IgYSBGQk8gKG5lZWRzIGFuIGV4dGVuc2lvbilcblx0ZnVuY3Rpb24gc2V0dXBEZXB0aFRleHR1cmUoIGZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICk7XG5cdFx0aWYgKCBpc0N1YmUgKSB0aHJvdyBuZXcgRXJyb3IoICdEZXB0aCBUZXh0dXJlIHdpdGggY3ViZSByZW5kZXIgdGFyZ2V0cyBpcyBub3Qgc3VwcG9ydGVkJyApO1xuXG5cdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xuXG5cdFx0aWYgKCAhICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSAmJiByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ3JlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUnICk7XG5cblx0XHR9XG5cblx0XHQvLyB1cGxvYWQgYW4gZW1wdHkgZGVwdGggdGV4dHVyZSB3aXRoIGZyYW1lYnVmZmVyIHNpemVcblx0XHRpZiAoICEgcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSB8fFxuXHRcdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoICE9PSByZW5kZXJUYXJnZXQud2lkdGggfHxcblx0XHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQgIT09IHJlbmRlclRhcmdldC5oZWlnaHQgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggPSByZW5kZXJUYXJnZXQud2lkdGg7XG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCA9IHJlbmRlclRhcmdldC5oZWlnaHQ7XG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHNldFRleHR1cmUyRCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSwgMCApO1xuXG5cdFx0dmFyIHdlYmdsRGVwdGhUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5mb3JtYXQgPT09IERlcHRoRm9ybWF0ICkge1xuXG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX0FUVEFDSE1FTlQsIF9nbC5URVhUVVJFXzJELCB3ZWJnbERlcHRoVGV4dHVyZSwgMCApO1xuXG5cdFx0fSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5mb3JtYXQgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHtcblxuXHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsIF9nbC5URVhUVVJFXzJELCB3ZWJnbERlcHRoVGV4dHVyZSwgMCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0JyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBTZXR1cCBHTCByZXNvdXJjZXMgZm9yIGEgbm9uLXRleHR1cmUgZGVwdGggYnVmZmVyXG5cdGZ1bmN0aW9uIHNldHVwRGVwdGhSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0dmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID09PSB0cnVlICk7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKSB7XG5cblx0XHRcdGlmICggaXNDdWJlICkgdGhyb3cgbmV3IEVycm9yKCAndGFyZ2V0LmRlcHRoVGV4dHVyZSBub3Qgc3VwcG9ydGVkIGluIEN1YmUgcmVuZGVyIHRhcmdldHMnICk7XG5cblx0XHRcdHNldHVwRGVwdGhUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTtcblx0XHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdID0gX2dsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuXHRcdFx0XHRcdHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgKTtcblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG5cdFx0XHRcdHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIG51bGwgKTtcblxuXHR9XG5cblx0Ly8gU2V0IHVwIEdMIHJlc291cmNlcyBmb3IgdGhlIHJlbmRlciB0YXJnZXRcblx0ZnVuY3Rpb24gc2V0dXBSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25SZW5kZXJUYXJnZXREaXNwb3NlICk7XG5cblx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyArKztcblxuXHRcdHZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA9PT0gdHJ1ZSApO1xuXHRcdHZhciBpc1RhcmdldFBvd2VyT2ZUd28gPSBpc1Bvd2VyT2ZUd28oIHJlbmRlclRhcmdldCApO1xuXG5cdFx0Ly8gU2V0dXAgZnJhbWVidWZmZXJcblxuXHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcblxuXHRcdH1cblxuXHRcdC8vIFNldHVwIGNvbG9yIGJ1ZmZlclxuXG5cdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblx0XHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgcmVuZGVyVGFyZ2V0LnRleHR1cmUsIGlzVGFyZ2V0UG93ZXJPZlR3byApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdLCByZW5kZXJUYXJnZXQsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggcmVuZGVyVGFyZ2V0LnRleHR1cmUsIGlzVGFyZ2V0UG93ZXJPZlR3byApICkge1xuXG5cdFx0XHRcdGdlbmVyYXRlTWlwbWFwKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgcmVuZGVyVGFyZ2V0LnRleHR1cmUsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgbnVsbCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXHRcdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFXzJELCByZW5kZXJUYXJnZXQudGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICk7XG5cdFx0XHRzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV8yRCApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggcmVuZGVyVGFyZ2V0LnRleHR1cmUsIGlzVGFyZ2V0UG93ZXJPZlR3byApICkge1xuXG5cdFx0XHRcdGdlbmVyYXRlTWlwbWFwKCBfZ2wuVEVYVFVSRV8yRCwgcmVuZGVyVGFyZ2V0LnRleHR1cmUsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8yRCwgbnVsbCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gU2V0dXAgZGVwdGggYW5kIHN0ZW5jaWwgYnVmZmVyc1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgKSB7XG5cblx0XHRcdHNldHVwRGVwdGhSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XG5cdFx0dmFyIGlzVGFyZ2V0UG93ZXJPZlR3byA9IGlzUG93ZXJPZlR3byggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgaXNUYXJnZXRQb3dlck9mVHdvICkgKSB7XG5cblx0XHRcdHZhciB0YXJnZXQgPSByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPyBfZ2wuVEVYVFVSRV9DVUJFX01BUCA6IF9nbC5URVhUVVJFXzJEO1xuXHRcdFx0dmFyIHdlYmdsVGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX193ZWJnbFRleHR1cmU7XG5cblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCB0YXJnZXQsIHdlYmdsVGV4dHVyZSApO1xuXHRcdFx0Z2VuZXJhdGVNaXBtYXAoIHRhcmdldCwgdGV4dHVyZSwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggdGFyZ2V0LCBudWxsICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZVZpZGVvVGV4dHVyZSggdGV4dHVyZSApIHtcblxuXHRcdHZhciBpZCA9IHRleHR1cmUuaWQ7XG5cdFx0dmFyIGZyYW1lID0gaW5mby5yZW5kZXIuZnJhbWU7XG5cblx0XHQvLyBDaGVjayB0aGUgbGFzdCBmcmFtZSB3ZSB1cGRhdGVkIHRoZSBWaWRlb1RleHR1cmVcblxuXHRcdGlmICggX3ZpZGVvVGV4dHVyZXNbIGlkIF0gIT09IGZyYW1lICkge1xuXG5cdFx0XHRfdmlkZW9UZXh0dXJlc1sgaWQgXSA9IGZyYW1lO1xuXHRcdFx0dGV4dHVyZS51cGRhdGUoKTtcblxuXHRcdH1cblxuXHR9XG5cblx0dGhpcy5zZXRUZXh0dXJlMkQgPSBzZXRUZXh0dXJlMkQ7XG5cdHRoaXMuc2V0VGV4dHVyZUN1YmUgPSBzZXRUZXh0dXJlQ3ViZTtcblx0dGhpcy5zZXRUZXh0dXJlQ3ViZUR5bmFtaWMgPSBzZXRUZXh0dXJlQ3ViZUR5bmFtaWM7XG5cdHRoaXMuc2V0dXBSZW5kZXJUYXJnZXQgPSBzZXR1cFJlbmRlclRhcmdldDtcblx0dGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAgPSB1cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIHRoZXNwaXRlIC8gaHR0cDovL3d3dy50d2l0dGVyLmNvbS90aGVzcGl0ZVxuICovXG5cbmZ1bmN0aW9uIFdlYkdMVXRpbHMoIGdsLCBleHRlbnNpb25zICkge1xuXG5cdGZ1bmN0aW9uIGNvbnZlcnQoIHAgKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uO1xuXG5cdFx0aWYgKCBwID09PSBSZXBlYXRXcmFwcGluZyApIHJldHVybiBnbC5SRVBFQVQ7XG5cdFx0aWYgKCBwID09PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkgcmV0dXJuIGdsLkNMQU1QX1RPX0VER0U7XG5cdFx0aWYgKCBwID09PSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nICkgcmV0dXJuIGdsLk1JUlJPUkVEX1JFUEVBVDtcblxuXHRcdGlmICggcCA9PT0gTmVhcmVzdEZpbHRlciApIHJldHVybiBnbC5ORUFSRVNUO1xuXHRcdGlmICggcCA9PT0gTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIgKSByZXR1cm4gZ2wuTkVBUkVTVF9NSVBNQVBfTkVBUkVTVDtcblx0XHRpZiAoIHAgPT09IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIgKSByZXR1cm4gZ2wuTkVBUkVTVF9NSVBNQVBfTElORUFSO1xuXG5cdFx0aWYgKCBwID09PSBMaW5lYXJGaWx0ZXIgKSByZXR1cm4gZ2wuTElORUFSO1xuXHRcdGlmICggcCA9PT0gTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciApIHJldHVybiBnbC5MSU5FQVJfTUlQTUFQX05FQVJFU1Q7XG5cdFx0aWYgKCBwID09PSBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIgKSByZXR1cm4gZ2wuTElORUFSX01JUE1BUF9MSU5FQVI7XG5cblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkQnl0ZVR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfQllURTtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9TSE9SVF80XzRfNF80O1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydDU1NTFUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUXzVfNV81XzE7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0NTY1VHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9TSE9SVF81XzZfNTtcblxuXHRcdGlmICggcCA9PT0gQnl0ZVR5cGUgKSByZXR1cm4gZ2wuQllURTtcblx0XHRpZiAoIHAgPT09IFNob3J0VHlwZSApIHJldHVybiBnbC5TSE9SVDtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnRUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX1NIT1JUO1xuXHRcdGlmICggcCA9PT0gSW50VHlwZSApIHJldHVybiBnbC5JTlQ7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZEludFR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfSU5UO1xuXHRcdGlmICggcCA9PT0gRmxvYXRUeXBlICkgcmV0dXJuIGdsLkZMT0FUO1xuXG5cdFx0aWYgKCBwID09PSBIYWxmRmxvYXRUeXBlICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkgcmV0dXJuIGV4dGVuc2lvbi5IQUxGX0ZMT0FUX09FUztcblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gQWxwaGFGb3JtYXQgKSByZXR1cm4gZ2wuQUxQSEE7XG5cdFx0aWYgKCBwID09PSBSR0JGb3JtYXQgKSByZXR1cm4gZ2wuUkdCO1xuXHRcdGlmICggcCA9PT0gUkdCQUZvcm1hdCApIHJldHVybiBnbC5SR0JBO1xuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlRm9ybWF0ICkgcmV0dXJuIGdsLkxVTUlOQU5DRTtcblx0XHRpZiAoIHAgPT09IEx1bWluYW5jZUFscGhhRm9ybWF0ICkgcmV0dXJuIGdsLkxVTUlOQU5DRV9BTFBIQTtcblx0XHRpZiAoIHAgPT09IERlcHRoRm9ybWF0ICkgcmV0dXJuIGdsLkRFUFRIX0NPTVBPTkVOVDtcblx0XHRpZiAoIHAgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHJldHVybiBnbC5ERVBUSF9TVEVOQ0lMO1xuXG5cdFx0aWYgKCBwID09PSBBZGRFcXVhdGlvbiApIHJldHVybiBnbC5GVU5DX0FERDtcblx0XHRpZiAoIHAgPT09IFN1YnRyYWN0RXF1YXRpb24gKSByZXR1cm4gZ2wuRlVOQ19TVUJUUkFDVDtcblx0XHRpZiAoIHAgPT09IFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uICkgcmV0dXJuIGdsLkZVTkNfUkVWRVJTRV9TVUJUUkFDVDtcblxuXHRcdGlmICggcCA9PT0gWmVyb0ZhY3RvciApIHJldHVybiBnbC5aRVJPO1xuXHRcdGlmICggcCA9PT0gT25lRmFjdG9yICkgcmV0dXJuIGdsLk9ORTtcblx0XHRpZiAoIHAgPT09IFNyY0NvbG9yRmFjdG9yICkgcmV0dXJuIGdsLlNSQ19DT0xPUjtcblx0XHRpZiAoIHAgPT09IE9uZU1pbnVzU3JjQ29sb3JGYWN0b3IgKSByZXR1cm4gZ2wuT05FX01JTlVTX1NSQ19DT0xPUjtcblx0XHRpZiAoIHAgPT09IFNyY0FscGhhRmFjdG9yICkgcmV0dXJuIGdsLlNSQ19BTFBIQTtcblx0XHRpZiAoIHAgPT09IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgKSByZXR1cm4gZ2wuT05FX01JTlVTX1NSQ19BTFBIQTtcblx0XHRpZiAoIHAgPT09IERzdEFscGhhRmFjdG9yICkgcmV0dXJuIGdsLkRTVF9BTFBIQTtcblx0XHRpZiAoIHAgPT09IE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IgKSByZXR1cm4gZ2wuT05FX01JTlVTX0RTVF9BTFBIQTtcblxuXHRcdGlmICggcCA9PT0gRHN0Q29sb3JGYWN0b3IgKSByZXR1cm4gZ2wuRFNUX0NPTE9SO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNEc3RDb2xvckZhY3RvciApIHJldHVybiBnbC5PTkVfTUlOVVNfRFNUX0NPTE9SO1xuXHRcdGlmICggcCA9PT0gU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciApIHJldHVybiBnbC5TUkNfQUxQSEFfU0FUVVJBVEU7XG5cblx0XHRpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0IHx8IHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0IHx8IHAgPT09IFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUzNUQ19EWFQxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVDtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDVfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0IHx8IHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUc7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX1BWUlRDXzJCUFBWMV9JTUc7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFJHQl9FVEMxX0Zvcm1hdCApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0w7XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFJHQkFfQVNUQ180eDRfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ181eDRfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ181eDVfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX0FTVENfNng1X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfNng2X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfOHg1X0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzh4Nl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzh4OF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEweDVfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEweDhfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXN0YycgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gTWluRXF1YXRpb24gfHwgcCA9PT0gTWF4RXF1YXRpb24gKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2JsZW5kX21pbm1heCcgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdFx0aWYgKCBwID09PSBNaW5FcXVhdGlvbiApIHJldHVybiBleHRlbnNpb24uTUlOX0VYVDtcblx0XHRcdFx0aWYgKCBwID09PSBNYXhFcXVhdGlvbiApIHJldHVybiBleHRlbnNpb24uTUFYX0VYVDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZEludDI0OFR5cGUgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSByZXR1cm4gZXh0ZW5zaW9uLlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIDA7XG5cblx0fVxuXG5cdHJldHVybiB7IGNvbnZlcnQ6IGNvbnZlcnQgfTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGdyZWdnbWFuIC8gaHR0cDovL2dhbWVzLmdyZWdnbWFuLmNvbS9cbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApIHtcblxuXHRDYW1lcmEuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQZXJzcGVjdGl2ZUNhbWVyYSc7XG5cblx0dGhpcy5mb3YgPSBmb3YgIT09IHVuZGVmaW5lZCA/IGZvdiA6IDUwO1xuXHR0aGlzLnpvb20gPSAxO1xuXG5cdHRoaXMubmVhciA9IG5lYXIgIT09IHVuZGVmaW5lZCA/IG5lYXIgOiAwLjE7XG5cdHRoaXMuZmFyID0gZmFyICE9PSB1bmRlZmluZWQgPyBmYXIgOiAyMDAwO1xuXHR0aGlzLmZvY3VzID0gMTA7XG5cblx0dGhpcy5hc3BlY3QgPSBhc3BlY3QgIT09IHVuZGVmaW5lZCA/IGFzcGVjdCA6IDE7XG5cdHRoaXMudmlldyA9IG51bGw7XG5cblx0dGhpcy5maWxtR2F1Z2UgPSAzNTtcdC8vIHdpZHRoIG9mIHRoZSBmaWxtIChkZWZhdWx0IGluIG1pbGxpbWV0ZXJzKVxuXHR0aGlzLmZpbG1PZmZzZXQgPSAwO1x0Ly8gaG9yaXpvbnRhbCBmaWxtIG9mZnNldCAoc2FtZSB1bml0IGFzIGdhdWdlKVxuXG5cdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG59XG5cblBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIENhbWVyYS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQZXJzcGVjdGl2ZUNhbWVyYSxcblxuXHRpc1BlcnNwZWN0aXZlQ2FtZXJhOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRDYW1lcmEucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdHRoaXMuZm92ID0gc291cmNlLmZvdjtcblx0XHR0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTtcblxuXHRcdHRoaXMubmVhciA9IHNvdXJjZS5uZWFyO1xuXHRcdHRoaXMuZmFyID0gc291cmNlLmZhcjtcblx0XHR0aGlzLmZvY3VzID0gc291cmNlLmZvY3VzO1xuXG5cdFx0dGhpcy5hc3BlY3QgPSBzb3VyY2UuYXNwZWN0O1xuXHRcdHRoaXMudmlldyA9IHNvdXJjZS52aWV3ID09PSBudWxsID8gbnVsbCA6IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UudmlldyApO1xuXG5cdFx0dGhpcy5maWxtR2F1Z2UgPSBzb3VyY2UuZmlsbUdhdWdlO1xuXHRcdHRoaXMuZmlsbU9mZnNldCA9IHNvdXJjZS5maWxtT2Zmc2V0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvKipcblx0ICogU2V0cyB0aGUgRk9WIGJ5IGZvY2FsIGxlbmd0aCBpbiByZXNwZWN0IHRvIHRoZSBjdXJyZW50IC5maWxtR2F1Z2UuXG5cdCAqXG5cdCAqIFRoZSBkZWZhdWx0IGZpbG0gZ2F1Z2UgaXMgMzUsIHNvIHRoYXQgdGhlIGZvY2FsIGxlbmd0aCBjYW4gYmUgc3BlY2lmaWVkIGZvclxuXHQgKiBhIDM1bW0gKGZ1bGwgZnJhbWUpIGNhbWVyYS5cblx0ICpcblx0ICogVmFsdWVzIGZvciBmb2NhbCBsZW5ndGggYW5kIGZpbG0gZ2F1Z2UgbXVzdCBoYXZlIHRoZSBzYW1lIHVuaXQuXG5cdCAqL1xuXHRzZXRGb2NhbExlbmd0aDogZnVuY3Rpb24gKCBmb2NhbExlbmd0aCApIHtcblxuXHRcdC8vIHNlZSBodHRwOi8vd3d3LmJvYmF0a2lucy5jb20vcGhvdG9ncmFwaHkvdGVjaG5pY2FsL2ZpZWxkX29mX3ZpZXcuaHRtbFxuXHRcdHZhciB2RXh0ZW50U2xvcGUgPSAwLjUgKiB0aGlzLmdldEZpbG1IZWlnaHQoKSAvIGZvY2FsTGVuZ3RoO1xuXG5cdFx0dGhpcy5mb3YgPSBfTWF0aC5SQUQyREVHICogMiAqIE1hdGguYXRhbiggdkV4dGVudFNsb3BlICk7XG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHQvKipcblx0ICogQ2FsY3VsYXRlcyB0aGUgZm9jYWwgbGVuZ3RoIGZyb20gdGhlIGN1cnJlbnQgLmZvdiBhbmQgLmZpbG1HYXVnZS5cblx0ICovXG5cdGdldEZvY2FsTGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdkV4dGVudFNsb3BlID0gTWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApO1xuXG5cdFx0cmV0dXJuIDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gdkV4dGVudFNsb3BlO1xuXG5cdH0sXG5cblx0Z2V0RWZmZWN0aXZlRk9WOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX01hdGguUkFEMkRFRyAqIDIgKiBNYXRoLmF0YW4oXG5cdFx0XHRNYXRoLnRhbiggX01hdGguREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICkgLyB0aGlzLnpvb20gKTtcblxuXHR9LFxuXG5cdGdldEZpbG1XaWR0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gZmlsbSBub3QgY29tcGxldGVseSBjb3ZlcmVkIGluIHBvcnRyYWl0IGZvcm1hdCAoYXNwZWN0IDwgMSlcblx0XHRyZXR1cm4gdGhpcy5maWxtR2F1Z2UgKiBNYXRoLm1pbiggdGhpcy5hc3BlY3QsIDEgKTtcblxuXHR9LFxuXG5cdGdldEZpbG1IZWlnaHQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGZpbG0gbm90IGNvbXBsZXRlbHkgY292ZXJlZCBpbiBsYW5kc2NhcGUgZm9ybWF0IChhc3BlY3QgPiAxKVxuXHRcdHJldHVybiB0aGlzLmZpbG1HYXVnZSAvIE1hdGgubWF4KCB0aGlzLmFzcGVjdCwgMSApO1xuXG5cdH0sXG5cblx0LyoqXG5cdCAqIFNldHMgYW4gb2Zmc2V0IGluIGEgbGFyZ2VyIGZydXN0dW0uIFRoaXMgaXMgdXNlZnVsIGZvciBtdWx0aS13aW5kb3cgb3Jcblx0ICogbXVsdGktbW9uaXRvci9tdWx0aS1tYWNoaW5lIHNldHVwcy5cblx0ICpcblx0ICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIDN4MiBtb25pdG9ycyBhbmQgZWFjaCBtb25pdG9yIGlzIDE5MjB4MTA4MCBhbmRcblx0ICogdGhlIG1vbml0b3JzIGFyZSBpbiBncmlkIGxpa2UgdGhpc1xuXHQgKlxuXHQgKiAgICstLS0rLS0tKy0tLStcblx0ICogICB8IEEgfCBCIHwgQyB8XG5cdCAqICAgKy0tLSstLS0rLS0tK1xuXHQgKiAgIHwgRCB8IEUgfCBGIHxcblx0ICogICArLS0tKy0tLSstLS0rXG5cdCAqXG5cdCAqIHRoZW4gZm9yIGVhY2ggbW9uaXRvciB5b3Ugd291bGQgY2FsbCBpdCBsaWtlIHRoaXNcblx0ICpcblx0ICogICB2YXIgdyA9IDE5MjA7XG5cdCAqICAgdmFyIGggPSAxMDgwO1xuXHQgKiAgIHZhciBmdWxsV2lkdGggPSB3ICogMztcblx0ICogICB2YXIgZnVsbEhlaWdodCA9IGggKiAyO1xuXHQgKlxuXHQgKiAgIC0tQS0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMCwgaCAqIDAsIHcsIGggKTtcblx0ICogICAtLUItLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDEsIGggKiAwLCB3LCBoICk7XG5cdCAqICAgLS1DLS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAyLCBoICogMCwgdywgaCApO1xuXHQgKiAgIC0tRC0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMCwgaCAqIDEsIHcsIGggKTtcblx0ICogICAtLUUtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDEsIGggKiAxLCB3LCBoICk7XG5cdCAqICAgLS1GLS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAyLCBoICogMSwgdywgaCApO1xuXHQgKlxuXHQgKiAgIE5vdGUgdGhlcmUgaXMgbm8gcmVhc29uIG1vbml0b3JzIGhhdmUgdG8gYmUgdGhlIHNhbWUgc2l6ZSBvciBpbiBhIGdyaWQuXG5cdCAqL1xuXHRzZXRWaWV3T2Zmc2V0OiBmdW5jdGlvbiAoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdHRoaXMuYXNwZWN0ID0gZnVsbFdpZHRoIC8gZnVsbEhlaWdodDtcblxuXHRcdGlmICggdGhpcy52aWV3ID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnZpZXcgPSB7XG5cdFx0XHRcdGVuYWJsZWQ6IHRydWUsXG5cdFx0XHRcdGZ1bGxXaWR0aDogMSxcblx0XHRcdFx0ZnVsbEhlaWdodDogMSxcblx0XHRcdFx0b2Zmc2V0WDogMCxcblx0XHRcdFx0b2Zmc2V0WTogMCxcblx0XHRcdFx0d2lkdGg6IDEsXG5cdFx0XHRcdGhlaWdodDogMVxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHRoaXMudmlldy5lbmFibGVkID0gdHJ1ZTtcblx0XHR0aGlzLnZpZXcuZnVsbFdpZHRoID0gZnVsbFdpZHRoO1xuXHRcdHRoaXMudmlldy5mdWxsSGVpZ2h0ID0gZnVsbEhlaWdodDtcblx0XHR0aGlzLnZpZXcub2Zmc2V0WCA9IHg7XG5cdFx0dGhpcy52aWV3Lm9mZnNldFkgPSB5O1xuXHRcdHRoaXMudmlldy53aWR0aCA9IHdpZHRoO1xuXHRcdHRoaXMudmlldy5oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR9LFxuXG5cdGNsZWFyVmlld09mZnNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMudmlldy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR9LFxuXG5cdHVwZGF0ZVByb2plY3Rpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBuZWFyID0gdGhpcy5uZWFyLFxuXHRcdFx0dG9wID0gbmVhciAqIE1hdGgudGFuKFxuXHRcdFx0XHRfTWF0aC5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbSxcblx0XHRcdGhlaWdodCA9IDIgKiB0b3AsXG5cdFx0XHR3aWR0aCA9IHRoaXMuYXNwZWN0ICogaGVpZ2h0LFxuXHRcdFx0bGVmdCA9IC0gMC41ICogd2lkdGgsXG5cdFx0XHR2aWV3ID0gdGhpcy52aWV3O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgJiYgdGhpcy52aWV3LmVuYWJsZWQgKSB7XG5cblx0XHRcdHZhciBmdWxsV2lkdGggPSB2aWV3LmZ1bGxXaWR0aCxcblx0XHRcdFx0ZnVsbEhlaWdodCA9IHZpZXcuZnVsbEhlaWdodDtcblxuXHRcdFx0bGVmdCArPSB2aWV3Lm9mZnNldFggKiB3aWR0aCAvIGZ1bGxXaWR0aDtcblx0XHRcdHRvcCAtPSB2aWV3Lm9mZnNldFkgKiBoZWlnaHQgLyBmdWxsSGVpZ2h0O1xuXHRcdFx0d2lkdGggKj0gdmlldy53aWR0aCAvIGZ1bGxXaWR0aDtcblx0XHRcdGhlaWdodCAqPSB2aWV3LmhlaWdodCAvIGZ1bGxIZWlnaHQ7XG5cblx0XHR9XG5cblx0XHR2YXIgc2tldyA9IHRoaXMuZmlsbU9mZnNldDtcblx0XHRpZiAoIHNrZXcgIT09IDAgKSBsZWZ0ICs9IG5lYXIgKiBza2V3IC8gdGhpcy5nZXRGaWxtV2lkdGgoKTtcblxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIGxlZnQgKyB3aWR0aCwgdG9wLCB0b3AgLSBoZWlnaHQsIG5lYXIsIHRoaXMuZmFyICk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC5mb3YgPSB0aGlzLmZvdjtcblx0XHRkYXRhLm9iamVjdC56b29tID0gdGhpcy56b29tO1xuXG5cdFx0ZGF0YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjtcblx0XHRkYXRhLm9iamVjdC5mYXIgPSB0aGlzLmZhcjtcblx0XHRkYXRhLm9iamVjdC5mb2N1cyA9IHRoaXMuZm9jdXM7XG5cblx0XHRkYXRhLm9iamVjdC5hc3BlY3QgPSB0aGlzLmFzcGVjdDtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkgZGF0YS5vYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCB0aGlzLnZpZXcgKTtcblxuXHRcdGRhdGEub2JqZWN0LmZpbG1HYXVnZSA9IHRoaXMuZmlsbUdhdWdlO1xuXHRcdGRhdGEub2JqZWN0LmZpbG1PZmZzZXQgPSB0aGlzLmZpbG1PZmZzZXQ7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEFycmF5Q2FtZXJhKCBhcnJheSApIHtcblxuXHRQZXJzcGVjdGl2ZUNhbWVyYS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5jYW1lcmFzID0gYXJyYXkgfHwgW107XG5cbn1cblxuQXJyYXlDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQXJyYXlDYW1lcmEsXG5cblx0aXNBcnJheUNhbWVyYTogdHJ1ZVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJWUk1hbmFnZXIoIHJlbmRlcmVyICkge1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dmFyIGRldmljZSA9IG51bGw7XG5cdHZhciBmcmFtZURhdGEgPSBudWxsO1xuXG5cdHZhciBwb3NlVGFyZ2V0ID0gbnVsbDtcblxuXHR2YXIgc3RhbmRpbmdNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR2YXIgc3RhbmRpbmdNYXRyaXhJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblxuXHRpZiAoIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICdWUkZyYW1lRGF0YScgaW4gd2luZG93ICkge1xuXG5cdFx0ZnJhbWVEYXRhID0gbmV3IHdpbmRvdy5WUkZyYW1lRGF0YSgpO1xuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAndnJkaXNwbGF5cHJlc2VudGNoYW5nZScsIG9uVlJEaXNwbGF5UHJlc2VudENoYW5nZSwgZmFsc2UgKTtcblxuXHR9XG5cblx0dmFyIG1hdHJpeFdvcmxkSW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cdHZhciB0ZW1wUXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cdHZhciB0ZW1wUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBjYW1lcmFMID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdGNhbWVyYUwuYm91bmRzID0gbmV3IFZlY3RvcjQoIDAuMCwgMC4wLCAwLjUsIDEuMCApO1xuXHRjYW1lcmFMLmxheWVycy5lbmFibGUoIDEgKTtcblxuXHR2YXIgY2FtZXJhUiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuXHRjYW1lcmFSLmJvdW5kcyA9IG5ldyBWZWN0b3I0KCAwLjUsIDAuMCwgMC41LCAxLjAgKTtcblx0Y2FtZXJhUi5sYXllcnMuZW5hYmxlKCAyICk7XG5cblx0dmFyIGNhbWVyYVZSID0gbmV3IEFycmF5Q2FtZXJhKCBbIGNhbWVyYUwsIGNhbWVyYVIgXSApO1xuXHRjYW1lcmFWUi5sYXllcnMuZW5hYmxlKCAxICk7XG5cdGNhbWVyYVZSLmxheWVycy5lbmFibGUoIDIgKTtcblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGlzUHJlc2VudGluZygpIHtcblxuXHRcdHJldHVybiBkZXZpY2UgIT09IG51bGwgJiYgZGV2aWNlLmlzUHJlc2VudGluZyA9PT0gdHJ1ZTtcblxuXHR9XG5cblx0dmFyIGN1cnJlbnRTaXplLCBjdXJyZW50UGl4ZWxSYXRpbztcblxuXHRmdW5jdGlvbiBvblZSRGlzcGxheVByZXNlbnRDaGFuZ2UoKSB7XG5cblx0XHRpZiAoIGlzUHJlc2VudGluZygpICkge1xuXG5cdFx0XHR2YXIgZXllUGFyYW1ldGVycyA9IGRldmljZS5nZXRFeWVQYXJhbWV0ZXJzKCAnbGVmdCcgKTtcblx0XHRcdHZhciByZW5kZXJXaWR0aCA9IGV5ZVBhcmFtZXRlcnMucmVuZGVyV2lkdGg7XG5cdFx0XHR2YXIgcmVuZGVySGVpZ2h0ID0gZXllUGFyYW1ldGVycy5yZW5kZXJIZWlnaHQ7XG5cblx0XHRcdGN1cnJlbnRQaXhlbFJhdGlvID0gcmVuZGVyZXIuZ2V0UGl4ZWxSYXRpbygpO1xuXHRcdFx0Y3VycmVudFNpemUgPSByZW5kZXJlci5nZXRTaXplKCk7XG5cblx0XHRcdHJlbmRlcmVyLnNldERyYXdpbmdCdWZmZXJTaXplKCByZW5kZXJXaWR0aCAqIDIsIHJlbmRlckhlaWdodCwgMSApO1xuXG5cdFx0fSBlbHNlIGlmICggc2NvcGUuZW5hYmxlZCApIHtcblxuXHRcdFx0cmVuZGVyZXIuc2V0RHJhd2luZ0J1ZmZlclNpemUoIGN1cnJlbnRTaXplLndpZHRoLCBjdXJyZW50U2l6ZS5oZWlnaHQsIGN1cnJlbnRQaXhlbFJhdGlvICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vXG5cblx0dGhpcy5lbmFibGVkID0gZmFsc2U7XG5cdHRoaXMudXNlckhlaWdodCA9IDEuNjtcblxuXHR0aGlzLmdldERldmljZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBkZXZpY2U7XG5cblx0fTtcblxuXHR0aGlzLnNldERldmljZSA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSBkZXZpY2UgPSB2YWx1ZTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0UG9zZVRhcmdldCA9IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0aWYgKCBvYmplY3QgIT09IHVuZGVmaW5lZCApIHBvc2VUYXJnZXQgPSBvYmplY3Q7XG5cblx0fTtcblxuXHR0aGlzLmdldENhbWVyYSA9IGZ1bmN0aW9uICggY2FtZXJhICkge1xuXG5cdFx0aWYgKCBkZXZpY2UgPT09IG51bGwgKSByZXR1cm4gY2FtZXJhO1xuXG5cdFx0ZGV2aWNlLmRlcHRoTmVhciA9IGNhbWVyYS5uZWFyO1xuXHRcdGRldmljZS5kZXB0aEZhciA9IGNhbWVyYS5mYXI7XG5cblx0XHRkZXZpY2UuZ2V0RnJhbWVEYXRhKCBmcmFtZURhdGEgKTtcblxuXHRcdC8vXG5cblx0XHR2YXIgc3RhZ2VQYXJhbWV0ZXJzID0gZGV2aWNlLnN0YWdlUGFyYW1ldGVycztcblxuXHRcdGlmICggc3RhZ2VQYXJhbWV0ZXJzICkge1xuXG5cdFx0XHRzdGFuZGluZ01hdHJpeC5mcm9tQXJyYXkoIHN0YWdlUGFyYW1ldGVycy5zaXR0aW5nVG9TdGFuZGluZ1RyYW5zZm9ybSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0c3RhbmRpbmdNYXRyaXgubWFrZVRyYW5zbGF0aW9uKCAwLCBzY29wZS51c2VySGVpZ2h0LCAwICk7XG5cblx0XHR9XG5cblxuXHRcdHZhciBwb3NlID0gZnJhbWVEYXRhLnBvc2U7XG5cdFx0dmFyIHBvc2VPYmplY3QgPSBwb3NlVGFyZ2V0ICE9PSBudWxsID8gcG9zZVRhcmdldCA6IGNhbWVyYTtcblxuXHRcdC8vIFdlIHdhbnQgdG8gbWFuaXB1bGF0ZSBwb3NlT2JqZWN0IGJ5IGl0cyBwb3NpdGlvbiBhbmQgcXVhdGVybmlvbiBjb21wb25lbnRzIHNpbmNlIHVzZXJzIG1heSByZWx5IG9uIHRoZW0uXG5cdFx0cG9zZU9iamVjdC5tYXRyaXguY29weSggc3RhbmRpbmdNYXRyaXggKTtcblx0XHRwb3NlT2JqZWN0Lm1hdHJpeC5kZWNvbXBvc2UoIHBvc2VPYmplY3QucG9zaXRpb24sIHBvc2VPYmplY3QucXVhdGVybmlvbiwgcG9zZU9iamVjdC5zY2FsZSApO1xuXG5cdFx0aWYgKCBwb3NlLm9yaWVudGF0aW9uICE9PSBudWxsICkge1xuXG5cdFx0XHR0ZW1wUXVhdGVybmlvbi5mcm9tQXJyYXkoIHBvc2Uub3JpZW50YXRpb24gKTtcblx0XHRcdHBvc2VPYmplY3QucXVhdGVybmlvbi5tdWx0aXBseSggdGVtcFF1YXRlcm5pb24gKTtcblxuXHRcdH1cblxuXHRcdGlmICggcG9zZS5wb3NpdGlvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGVtcFF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBzdGFuZGluZ01hdHJpeCApO1xuXHRcdFx0dGVtcFBvc2l0aW9uLmZyb21BcnJheSggcG9zZS5wb3NpdGlvbiApO1xuXHRcdFx0dGVtcFBvc2l0aW9uLmFwcGx5UXVhdGVybmlvbiggdGVtcFF1YXRlcm5pb24gKTtcblx0XHRcdHBvc2VPYmplY3QucG9zaXRpb24uYWRkKCB0ZW1wUG9zaXRpb24gKTtcblxuXHRcdH1cblxuXHRcdHBvc2VPYmplY3QudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdGlmICggZGV2aWNlLmlzUHJlc2VudGluZyA9PT0gZmFsc2UgKSByZXR1cm4gY2FtZXJhO1xuXG5cdFx0Ly9cblxuXHRcdGNhbWVyYUwubmVhciA9IGNhbWVyYS5uZWFyO1xuXHRcdGNhbWVyYVIubmVhciA9IGNhbWVyYS5uZWFyO1xuXG5cdFx0Y2FtZXJhTC5mYXIgPSBjYW1lcmEuZmFyO1xuXHRcdGNhbWVyYVIuZmFyID0gY2FtZXJhLmZhcjtcblxuXHRcdGNhbWVyYVZSLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXHRcdGNhbWVyYVZSLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cblx0XHRjYW1lcmFMLm1hdHJpeFdvcmxkSW52ZXJzZS5mcm9tQXJyYXkoIGZyYW1lRGF0YS5sZWZ0Vmlld01hdHJpeCApO1xuXHRcdGNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheSggZnJhbWVEYXRhLnJpZ2h0Vmlld01hdHJpeCApO1xuXG5cdFx0Ly8gVE9ETyAobXJkb29iKSBEb3VibGUgY2hlY2sgdGhpcyBjb2RlXG5cblx0XHRzdGFuZGluZ01hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSggc3RhbmRpbmdNYXRyaXggKTtcblxuXHRcdGNhbWVyYUwubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBzdGFuZGluZ01hdHJpeEludmVyc2UgKTtcblx0XHRjYW1lcmFSLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseSggc3RhbmRpbmdNYXRyaXhJbnZlcnNlICk7XG5cblx0XHR2YXIgcGFyZW50ID0gcG9zZU9iamVjdC5wYXJlbnQ7XG5cblx0XHRpZiAoIHBhcmVudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0bWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UoIHBhcmVudC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRjYW1lcmFMLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseSggbWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0XHRjYW1lcmFSLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseSggbWF0cml4V29ybGRJbnZlcnNlICk7XG5cblx0XHR9XG5cblx0XHQvLyBlbnZNYXAgYW5kIE1pcnJvciBuZWVkcyBjYW1lcmEubWF0cml4V29ybGRcblxuXHRcdGNhbWVyYUwubWF0cml4V29ybGQuZ2V0SW52ZXJzZSggY2FtZXJhTC5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRjYW1lcmFSLm1hdHJpeFdvcmxkLmdldEludmVyc2UoIGNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlICk7XG5cblx0XHRjYW1lcmFMLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KCBmcmFtZURhdGEubGVmdFByb2plY3Rpb25NYXRyaXggKTtcblx0XHRjYW1lcmFSLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KCBmcmFtZURhdGEucmlnaHRQcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHQvLyBIQUNLIChtcmRvb2IpXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3czYy93ZWJ2ci9pc3N1ZXMvMjAzXG5cblx0XHRjYW1lcmFWUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBsYXllcnMgPSBkZXZpY2UuZ2V0TGF5ZXJzKCk7XG5cblx0XHRpZiAoIGxheWVycy5sZW5ndGggKSB7XG5cblx0XHRcdHZhciBsYXllciA9IGxheWVyc1sgMCBdO1xuXG5cdFx0XHRpZiAoIGxheWVyLmxlZnRCb3VuZHMgIT09IG51bGwgJiYgbGF5ZXIubGVmdEJvdW5kcy5sZW5ndGggPT09IDQgKSB7XG5cblx0XHRcdFx0Y2FtZXJhTC5ib3VuZHMuZnJvbUFycmF5KCBsYXllci5sZWZ0Qm91bmRzICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBsYXllci5yaWdodEJvdW5kcyAhPT0gbnVsbCAmJiBsYXllci5yaWdodEJvdW5kcy5sZW5ndGggPT09IDQgKSB7XG5cblx0XHRcdFx0Y2FtZXJhUi5ib3VuZHMuZnJvbUFycmF5KCBsYXllci5yaWdodEJvdW5kcyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2FtZXJhVlI7XG5cblx0fTtcblxuXHR0aGlzLmdldFN0YW5kaW5nTWF0cml4ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHN0YW5kaW5nTWF0cml4O1xuXG5cdH07XG5cblx0dGhpcy5zdWJtaXRGcmFtZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggaXNQcmVzZW50aW5nKCkgKSBkZXZpY2Uuc3VibWl0RnJhbWUoKTtcblxuXHR9O1xuXG5cdHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAndnJkaXNwbGF5cHJlc2VudGNoYW5nZScsIG9uVlJEaXNwbGF5UHJlc2VudENoYW5nZSApO1xuXG5cdFx0fVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJlciggcGFyYW1ldGVycyApIHtcblxuXHRjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXInLCBSRVZJU0lPTiApO1xuXG5cdHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdHZhciBfY2FudmFzID0gcGFyYW1ldGVycy5jYW52YXMgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuY2FudmFzIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICksXG5cdFx0X2NvbnRleHQgPSBwYXJhbWV0ZXJzLmNvbnRleHQgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuY29udGV4dCA6IG51bGwsXG5cblx0XHRfYWxwaGEgPSBwYXJhbWV0ZXJzLmFscGhhICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmFscGhhIDogZmFsc2UsXG5cdFx0X2RlcHRoID0gcGFyYW1ldGVycy5kZXB0aCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5kZXB0aCA6IHRydWUsXG5cdFx0X3N0ZW5jaWwgPSBwYXJhbWV0ZXJzLnN0ZW5jaWwgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuc3RlbmNpbCA6IHRydWUsXG5cdFx0X2FudGlhbGlhcyA9IHBhcmFtZXRlcnMuYW50aWFsaWFzICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmFudGlhbGlhcyA6IGZhbHNlLFxuXHRcdF9wcmVtdWx0aXBsaWVkQWxwaGEgPSBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgOiB0cnVlLFxuXHRcdF9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgPSBwYXJhbWV0ZXJzLnByZXNlcnZlRHJhd2luZ0J1ZmZlciAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgOiBmYWxzZSxcblx0XHRfcG93ZXJQcmVmZXJlbmNlID0gcGFyYW1ldGVycy5wb3dlclByZWZlcmVuY2UgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucG93ZXJQcmVmZXJlbmNlIDogJ2RlZmF1bHQnO1xuXG5cdHZhciBjdXJyZW50UmVuZGVyTGlzdCA9IG51bGw7XG5cdHZhciBjdXJyZW50UmVuZGVyU3RhdGUgPSBudWxsO1xuXG5cdC8vIHB1YmxpYyBwcm9wZXJ0aWVzXG5cblx0dGhpcy5kb21FbGVtZW50ID0gX2NhbnZhcztcblx0dGhpcy5jb250ZXh0ID0gbnVsbDtcblxuXHQvLyBjbGVhcmluZ1xuXG5cdHRoaXMuYXV0b0NsZWFyID0gdHJ1ZTtcblx0dGhpcy5hdXRvQ2xlYXJDb2xvciA9IHRydWU7XG5cdHRoaXMuYXV0b0NsZWFyRGVwdGggPSB0cnVlO1xuXHR0aGlzLmF1dG9DbGVhclN0ZW5jaWwgPSB0cnVlO1xuXG5cdC8vIHNjZW5lIGdyYXBoXG5cblx0dGhpcy5zb3J0T2JqZWN0cyA9IHRydWU7XG5cblx0Ly8gdXNlci1kZWZpbmVkIGNsaXBwaW5nXG5cblx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IFtdO1xuXHR0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2U7XG5cblx0Ly8gcGh5c2ljYWxseSBiYXNlZCBzaGFkaW5nXG5cblx0dGhpcy5nYW1tYUZhY3RvciA9IDIuMDtcdC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHR0aGlzLmdhbW1hSW5wdXQgPSBmYWxzZTtcblx0dGhpcy5nYW1tYU91dHB1dCA9IGZhbHNlO1xuXG5cdC8vIHBoeXNpY2FsIGxpZ2h0c1xuXG5cdHRoaXMucGh5c2ljYWxseUNvcnJlY3RMaWdodHMgPSBmYWxzZTtcblxuXHQvLyB0b25lIG1hcHBpbmdcblxuXHR0aGlzLnRvbmVNYXBwaW5nID0gTGluZWFyVG9uZU1hcHBpbmc7XG5cdHRoaXMudG9uZU1hcHBpbmdFeHBvc3VyZSA9IDEuMDtcblx0dGhpcy50b25lTWFwcGluZ1doaXRlUG9pbnQgPSAxLjA7XG5cblx0Ly8gbW9ycGhzXG5cblx0dGhpcy5tYXhNb3JwaFRhcmdldHMgPSA4O1xuXHR0aGlzLm1heE1vcnBoTm9ybWFscyA9IDQ7XG5cblx0Ly8gaW50ZXJuYWwgcHJvcGVydGllc1xuXG5cdHZhciBfdGhpcyA9IHRoaXMsXG5cblx0XHRfaXNDb250ZXh0TG9zdCA9IGZhbHNlLFxuXG5cdFx0Ly8gaW50ZXJuYWwgc3RhdGUgY2FjaGVcblxuXHRcdF9jdXJyZW50UmVuZGVyVGFyZ2V0ID0gbnVsbCxcblx0XHRfY3VycmVudEZyYW1lYnVmZmVyID0gbnVsbCxcblx0XHRfY3VycmVudE1hdGVyaWFsSWQgPSAtIDEsXG5cdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSAnJyxcblxuXHRcdF9jdXJyZW50Q2FtZXJhID0gbnVsbCxcblx0XHRfY3VycmVudEFycmF5Q2FtZXJhID0gbnVsbCxcblxuXHRcdF9jdXJyZW50Vmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpLFxuXHRcdF9jdXJyZW50U2Npc3NvciA9IG5ldyBWZWN0b3I0KCksXG5cdFx0X2N1cnJlbnRTY2lzc29yVGVzdCA9IG51bGwsXG5cblx0XHQvL1xuXG5cdFx0X3VzZWRUZXh0dXJlVW5pdHMgPSAwLFxuXG5cdFx0Ly9cblxuXHRcdF93aWR0aCA9IF9jYW52YXMud2lkdGgsXG5cdFx0X2hlaWdodCA9IF9jYW52YXMuaGVpZ2h0LFxuXG5cdFx0X3BpeGVsUmF0aW8gPSAxLFxuXG5cdFx0X3ZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIF93aWR0aCwgX2hlaWdodCApLFxuXHRcdF9zY2lzc29yID0gbmV3IFZlY3RvcjQoIDAsIDAsIF93aWR0aCwgX2hlaWdodCApLFxuXHRcdF9zY2lzc29yVGVzdCA9IGZhbHNlLFxuXG5cdFx0Ly8gZnJ1c3R1bVxuXG5cdFx0X2ZydXN0dW0gPSBuZXcgRnJ1c3R1bSgpLFxuXG5cdFx0Ly8gY2xpcHBpbmdcblxuXHRcdF9jbGlwcGluZyA9IG5ldyBXZWJHTENsaXBwaW5nKCksXG5cdFx0X2NsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLFxuXHRcdF9sb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLFxuXG5cdFx0Ly8gY2FtZXJhIG1hdHJpY2VzIGNhY2hlXG5cblx0XHRfcHJvalNjcmVlbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCksXG5cblx0XHRfdmVjdG9yMyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0ZnVuY3Rpb24gZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpIHtcblxuXHRcdHJldHVybiBfY3VycmVudFJlbmRlclRhcmdldCA9PT0gbnVsbCA/IF9waXhlbFJhdGlvIDogMTtcblxuXHR9XG5cblx0Ly8gaW5pdGlhbGl6ZVxuXG5cdHZhciBfZ2w7XG5cblx0dHJ5IHtcblxuXHRcdHZhciBjb250ZXh0QXR0cmlidXRlcyA9IHtcblx0XHRcdGFscGhhOiBfYWxwaGEsXG5cdFx0XHRkZXB0aDogX2RlcHRoLFxuXHRcdFx0c3RlbmNpbDogX3N0ZW5jaWwsXG5cdFx0XHRhbnRpYWxpYXM6IF9hbnRpYWxpYXMsXG5cdFx0XHRwcmVtdWx0aXBsaWVkQWxwaGE6IF9wcmVtdWx0aXBsaWVkQWxwaGEsXG5cdFx0XHRwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IF9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIsXG5cdFx0XHRwb3dlclByZWZlcmVuY2U6IF9wb3dlclByZWZlcmVuY2Vcblx0XHR9O1xuXG5cdFx0Ly8gZXZlbnQgbGlzdGVuZXJzIG11c3QgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgV2ViR0wgY29udGV4dCBpcyBjcmVhdGVkLCBzZWUgIzEyNzUzXG5cblx0XHRfY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRsb3N0Jywgb25Db250ZXh0TG9zdCwgZmFsc2UgKTtcblx0XHRfY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsIG9uQ29udGV4dFJlc3RvcmUsIGZhbHNlICk7XG5cblx0XHRfZ2wgPSBfY29udGV4dCB8fCBfY2FudmFzLmdldENvbnRleHQoICd3ZWJnbCcsIGNvbnRleHRBdHRyaWJ1dGVzICkgfHwgX2NhbnZhcy5nZXRDb250ZXh0KCAnZXhwZXJpbWVudGFsLXdlYmdsJywgY29udGV4dEF0dHJpYnV0ZXMgKTtcblxuXHRcdGlmICggX2dsID09PSBudWxsICkge1xuXG5cdFx0XHRpZiAoIF9jYW52YXMuZ2V0Q29udGV4dCggJ3dlYmdsJyApICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ0Vycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJpYnV0ZXMuJyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ0Vycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQuJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBTb21lIGV4cGVyaW1lbnRhbC13ZWJnbCBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IGhhdmUgZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0XG5cblx0XHRpZiAoIF9nbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0X2dsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRyZXR1cm4geyAncmFuZ2VNaW4nOiAxLCAncmFuZ2VNYXgnOiAxLCAncHJlY2lzaW9uJzogMSB9O1xuXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAnICsgZXJyb3IubWVzc2FnZSApO1xuXG5cdH1cblxuXHR2YXIgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzLCBzdGF0ZSwgaW5mbztcblx0dmFyIHByb3BlcnRpZXMsIHRleHR1cmVzLCBhdHRyaWJ1dGVzLCBnZW9tZXRyaWVzLCBvYmplY3RzO1xuXHR2YXIgcHJvZ3JhbUNhY2hlLCByZW5kZXJMaXN0cywgcmVuZGVyU3RhdGVzO1xuXG5cdHZhciBiYWNrZ3JvdW5kLCBtb3JwaHRhcmdldHMsIGJ1ZmZlclJlbmRlcmVyLCBpbmRleGVkQnVmZmVyUmVuZGVyZXI7XG5cdHZhciBzcHJpdGVSZW5kZXJlcjtcblxuXHR2YXIgdXRpbHM7XG5cblx0ZnVuY3Rpb24gaW5pdEdMQ29udGV4dCgpIHtcblxuXHRcdGV4dGVuc2lvbnMgPSBuZXcgV2ViR0xFeHRlbnNpb25zKCBfZ2wgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ1dFQkdMX2RlcHRoX3RleHR1cmUnICk7XG5cdFx0ZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICk7XG5cdFx0ZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcicgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcycgKTtcblx0XHRleHRlbnNpb25zLmdldCggJ09FU19lbGVtZW50X2luZGV4X3VpbnQnICk7XG5cdFx0ZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdFx0dXRpbHMgPSBuZXcgV2ViR0xVdGlscyggX2dsLCBleHRlbnNpb25zICk7XG5cblx0XHRjYXBhYmlsaXRpZXMgPSBuZXcgV2ViR0xDYXBhYmlsaXRpZXMoIF9nbCwgZXh0ZW5zaW9ucywgcGFyYW1ldGVycyApO1xuXG5cdFx0c3RhdGUgPSBuZXcgV2ViR0xTdGF0ZSggX2dsLCBleHRlbnNpb25zLCB1dGlscyApO1xuXHRcdHN0YXRlLnNjaXNzb3IoIF9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApICk7XG5cdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblxuXHRcdGluZm8gPSBuZXcgV2ViR0xJbmZvKCBfZ2wgKTtcblx0XHRwcm9wZXJ0aWVzID0gbmV3IFdlYkdMUHJvcGVydGllcygpO1xuXHRcdHRleHR1cmVzID0gbmV3IFdlYkdMVGV4dHVyZXMoIF9nbCwgZXh0ZW5zaW9ucywgc3RhdGUsIHByb3BlcnRpZXMsIGNhcGFiaWxpdGllcywgdXRpbHMsIGluZm8gKTtcblx0XHRhdHRyaWJ1dGVzID0gbmV3IFdlYkdMQXR0cmlidXRlcyggX2dsICk7XG5cdFx0Z2VvbWV0cmllcyA9IG5ldyBXZWJHTEdlb21ldHJpZXMoIF9nbCwgYXR0cmlidXRlcywgaW5mbyApO1xuXHRcdG9iamVjdHMgPSBuZXcgV2ViR0xPYmplY3RzKCBnZW9tZXRyaWVzLCBpbmZvICk7XG5cdFx0bW9ycGh0YXJnZXRzID0gbmV3IFdlYkdMTW9ycGh0YXJnZXRzKCBfZ2wgKTtcblx0XHRwcm9ncmFtQ2FjaGUgPSBuZXcgV2ViR0xQcm9ncmFtcyggX3RoaXMsIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcyApO1xuXHRcdHJlbmRlckxpc3RzID0gbmV3IFdlYkdMUmVuZGVyTGlzdHMoKTtcblx0XHRyZW5kZXJTdGF0ZXMgPSBuZXcgV2ViR0xSZW5kZXJTdGF0ZXMoKTtcblxuXHRcdGJhY2tncm91bmQgPSBuZXcgV2ViR0xCYWNrZ3JvdW5kKCBfdGhpcywgc3RhdGUsIGdlb21ldHJpZXMsIF9wcmVtdWx0aXBsaWVkQWxwaGEgKTtcblxuXHRcdGJ1ZmZlclJlbmRlcmVyID0gbmV3IFdlYkdMQnVmZmVyUmVuZGVyZXIoIF9nbCwgZXh0ZW5zaW9ucywgaW5mbyApO1xuXHRcdGluZGV4ZWRCdWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggX2dsLCBleHRlbnNpb25zLCBpbmZvICk7XG5cblx0XHRzcHJpdGVSZW5kZXJlciA9IG5ldyBXZWJHTFNwcml0ZVJlbmRlcmVyKCBfdGhpcywgX2dsLCBzdGF0ZSwgdGV4dHVyZXMsIGNhcGFiaWxpdGllcyApO1xuXG5cdFx0aW5mby5wcm9ncmFtcyA9IHByb2dyYW1DYWNoZS5wcm9ncmFtcztcblxuXHRcdF90aGlzLmNvbnRleHQgPSBfZ2w7XG5cdFx0X3RoaXMuY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzO1xuXHRcdF90aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zO1xuXHRcdF90aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuXHRcdF90aGlzLnJlbmRlckxpc3RzID0gcmVuZGVyTGlzdHM7XG5cdFx0X3RoaXMuc3RhdGUgPSBzdGF0ZTtcblx0XHRfdGhpcy5pbmZvID0gaW5mbztcblxuXHR9XG5cblx0aW5pdEdMQ29udGV4dCgpO1xuXG5cdC8vIHZyXG5cblx0dmFyIHZyID0gbmV3IFdlYlZSTWFuYWdlciggX3RoaXMgKTtcblxuXHR0aGlzLnZyID0gdnI7XG5cblx0Ly8gc2hhZG93IG1hcFxuXG5cdHZhciBzaGFkb3dNYXAgPSBuZXcgV2ViR0xTaGFkb3dNYXAoIF90aGlzLCBvYmplY3RzLCBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZVNpemUgKTtcblxuXHR0aGlzLnNoYWRvd01hcCA9IHNoYWRvd01hcDtcblxuXHQvLyBBUElcblxuXHR0aGlzLmdldENvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2dsO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDb250ZXh0QXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfZ2wuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKTtcblxuXHR9O1xuXG5cdHRoaXMuZm9yY2VDb250ZXh0TG9zcyA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2xvc2VfY29udGV4dCcgKTtcblx0XHRpZiAoIGV4dGVuc2lvbiApIGV4dGVuc2lvbi5sb3NlQ29udGV4dCgpO1xuXG5cdH07XG5cblx0dGhpcy5mb3JjZUNvbnRleHRSZXN0b3JlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfbG9zZV9jb250ZXh0JyApO1xuXHRcdGlmICggZXh0ZW5zaW9uICkgZXh0ZW5zaW9uLnJlc3RvcmVDb250ZXh0KCk7XG5cblx0fTtcblxuXHR0aGlzLmdldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX3BpeGVsUmF0aW87XG5cblx0fTtcblxuXHR0aGlzLnNldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0X3BpeGVsUmF0aW8gPSB2YWx1ZTtcblxuXHRcdHRoaXMuc2V0U2l6ZSggX3dpZHRoLCBfaGVpZ2h0LCBmYWxzZSApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRTaXplID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHdpZHRoOiBfd2lkdGgsXG5cdFx0XHRoZWlnaHQ6IF9oZWlnaHRcblx0XHR9O1xuXG5cdH07XG5cblx0dGhpcy5zZXRTaXplID0gZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0LCB1cGRhdGVTdHlsZSApIHtcblxuXHRcdHZhciBkZXZpY2UgPSB2ci5nZXREZXZpY2UoKTtcblxuXHRcdGlmICggZGV2aWNlICYmIGRldmljZS5pc1ByZXNlbnRpbmcgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENhblxcJ3QgY2hhbmdlIHNpemUgd2hpbGUgVlIgZGV2aWNlIGlzIHByZXNlbnRpbmcuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0X3dpZHRoID0gd2lkdGg7XG5cdFx0X2hlaWdodCA9IGhlaWdodDtcblxuXHRcdF9jYW52YXMud2lkdGggPSB3aWR0aCAqIF9waXhlbFJhdGlvO1xuXHRcdF9jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogX3BpeGVsUmF0aW87XG5cblx0XHRpZiAoIHVwZGF0ZVN0eWxlICE9PSBmYWxzZSApIHtcblxuXHRcdFx0X2NhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4Jztcblx0XHRcdF9jYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcblxuXHRcdH1cblxuXHRcdHRoaXMuc2V0Vmlld3BvcnQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0RHJhd2luZ0J1ZmZlclNpemUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0d2lkdGg6IF93aWR0aCAqIF9waXhlbFJhdGlvLFxuXHRcdFx0aGVpZ2h0OiBfaGVpZ2h0ICogX3BpeGVsUmF0aW9cblx0XHR9O1xuXG5cdH07XG5cblx0dGhpcy5zZXREcmF3aW5nQnVmZmVyU2l6ZSA9IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCwgcGl4ZWxSYXRpbyApIHtcblxuXHRcdF93aWR0aCA9IHdpZHRoO1xuXHRcdF9oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRfcGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XG5cblx0XHRfY2FudmFzLndpZHRoID0gd2lkdGggKiBwaXhlbFJhdGlvO1xuXHRcdF9jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogcGl4ZWxSYXRpbztcblxuXHRcdHRoaXMuc2V0Vmlld3BvcnQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0Q3VycmVudFZpZXdwb3J0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50Vmlld3BvcnQ7XG5cblx0fTtcblxuXHR0aGlzLnNldFZpZXdwb3J0ID0gZnVuY3Rpb24gKCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0X3ZpZXdwb3J0LnNldCggeCwgX2hlaWdodCAtIHkgLSBoZWlnaHQsIHdpZHRoLCBoZWlnaHQgKTtcblx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApO1xuXG5cdH07XG5cblx0dGhpcy5zZXRTY2lzc29yID0gZnVuY3Rpb24gKCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0X3NjaXNzb3Iuc2V0KCB4LCBfaGVpZ2h0IC0geSAtIGhlaWdodCwgd2lkdGgsIGhlaWdodCApO1xuXHRcdHN0YXRlLnNjaXNzb3IoIF9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApICk7XG5cblx0fTtcblxuXHR0aGlzLnNldFNjaXNzb3JUZXN0ID0gZnVuY3Rpb24gKCBib29sZWFuICkge1xuXG5cdFx0c3RhdGUuc2V0U2Npc3NvclRlc3QoIF9zY2lzc29yVGVzdCA9IGJvb2xlYW4gKTtcblxuXHR9O1xuXG5cdC8vIENsZWFyaW5nXG5cblx0dGhpcy5nZXRDbGVhckNvbG9yID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIGJhY2tncm91bmQuZ2V0Q2xlYXJDb2xvcigpO1xuXG5cdH07XG5cblx0dGhpcy5zZXRDbGVhckNvbG9yID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0YmFja2dyb3VuZC5zZXRDbGVhckNvbG9yLmFwcGx5KCBiYWNrZ3JvdW5kLCBhcmd1bWVudHMgKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0Q2xlYXJBbHBoYSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBiYWNrZ3JvdW5kLmdldENsZWFyQWxwaGEoKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0Q2xlYXJBbHBoYSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGJhY2tncm91bmQuc2V0Q2xlYXJBbHBoYS5hcHBseSggYmFja2dyb3VuZCwgYXJndW1lbnRzICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyID0gZnVuY3Rpb24gKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKSB7XG5cblx0XHR2YXIgYml0cyA9IDA7XG5cblx0XHRpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgfHwgY29sb3IgKSBiaXRzIHw9IF9nbC5DT0xPUl9CVUZGRVJfQklUO1xuXHRcdGlmICggZGVwdGggPT09IHVuZGVmaW5lZCB8fCBkZXB0aCApIGJpdHMgfD0gX2dsLkRFUFRIX0JVRkZFUl9CSVQ7XG5cdFx0aWYgKCBzdGVuY2lsID09PSB1bmRlZmluZWQgfHwgc3RlbmNpbCApIGJpdHMgfD0gX2dsLlNURU5DSUxfQlVGRkVSX0JJVDtcblxuXHRcdF9nbC5jbGVhciggYml0cyApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhckNvbG9yID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jbGVhciggdHJ1ZSwgZmFsc2UsIGZhbHNlICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyRGVwdGggPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNsZWFyKCBmYWxzZSwgdHJ1ZSwgZmFsc2UgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJTdGVuY2lsID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jbGVhciggZmFsc2UsIGZhbHNlLCB0cnVlICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyVGFyZ2V0ID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdHRoaXMuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcblx0XHR0aGlzLmNsZWFyKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKTtcblxuXHR9O1xuXG5cdC8vXG5cblx0dGhpcy5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0X2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0bG9zdCcsIG9uQ29udGV4dExvc3QsIGZhbHNlICk7XG5cdFx0X2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0cmVzdG9yZWQnLCBvbkNvbnRleHRSZXN0b3JlLCBmYWxzZSApO1xuXG5cdFx0cmVuZGVyTGlzdHMuZGlzcG9zZSgpO1xuXHRcdHJlbmRlclN0YXRlcy5kaXNwb3NlKCk7XG5cdFx0cHJvcGVydGllcy5kaXNwb3NlKCk7XG5cdFx0b2JqZWN0cy5kaXNwb3NlKCk7XG5cblx0XHR2ci5kaXNwb3NlKCk7XG5cblx0XHRzdG9wQW5pbWF0aW9uKCk7XG5cblx0fTtcblxuXHQvLyBFdmVudHNcblxuXHRmdW5jdGlvbiBvbkNvbnRleHRMb3N0KCBldmVudCApIHtcblxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgTG9zdC4nICk7XG5cblx0XHRfaXNDb250ZXh0TG9zdCA9IHRydWU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uQ29udGV4dFJlc3RvcmUoIC8qIGV2ZW50ICovICkge1xuXG5cdFx0Y29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IFJlc3RvcmVkLicgKTtcblxuXHRcdF9pc0NvbnRleHRMb3N0ID0gZmFsc2U7XG5cblx0XHRpbml0R0xDb250ZXh0KCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uTWF0ZXJpYWxEaXNwb3NlKCBldmVudCApIHtcblxuXHRcdHZhciBtYXRlcmlhbCA9IGV2ZW50LnRhcmdldDtcblxuXHRcdG1hdGVyaWFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25NYXRlcmlhbERpc3Bvc2UgKTtcblxuXHRcdGRlYWxsb2NhdGVNYXRlcmlhbCggbWF0ZXJpYWwgKTtcblxuXHR9XG5cblx0Ly8gQnVmZmVyIGRlYWxsb2NhdGlvblxuXG5cdGZ1bmN0aW9uIGRlYWxsb2NhdGVNYXRlcmlhbCggbWF0ZXJpYWwgKSB7XG5cblx0XHRyZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlKCBtYXRlcmlhbCApO1xuXG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIG1hdGVyaWFsICk7XG5cblx0fVxuXG5cblx0ZnVuY3Rpb24gcmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZSggbWF0ZXJpYWwgKSB7XG5cblx0XHR2YXIgcHJvZ3JhbUluZm8gPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwgKS5wcm9ncmFtO1xuXG5cdFx0bWF0ZXJpYWwucHJvZ3JhbSA9IHVuZGVmaW5lZDtcblxuXHRcdGlmICggcHJvZ3JhbUluZm8gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cHJvZ3JhbUNhY2hlLnJlbGVhc2VQcm9ncmFtKCBwcm9ncmFtSW5mbyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBCdWZmZXIgcmVuZGVyaW5nXG5cblx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0SW1tZWRpYXRlKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICkge1xuXG5cdFx0b2JqZWN0LnJlbmRlciggZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRcdF90aGlzLnJlbmRlckJ1ZmZlckltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtLCBtYXRlcmlhbCApO1xuXG5cdFx0fSApO1xuXG5cdH1cblxuXHR0aGlzLnJlbmRlckJ1ZmZlckltbWVkaWF0ZSA9IGZ1bmN0aW9uICggb2JqZWN0LCBwcm9ncmFtLCBtYXRlcmlhbCApIHtcblxuXHRcdHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7XG5cblx0XHR2YXIgYnVmZmVycyA9IHByb3BlcnRpZXMuZ2V0KCBvYmplY3QgKTtcblxuXHRcdGlmICggb2JqZWN0Lmhhc1Bvc2l0aW9ucyAmJiAhIGJ1ZmZlcnMucG9zaXRpb24gKSBidWZmZXJzLnBvc2l0aW9uID0gX2dsLmNyZWF0ZUJ1ZmZlcigpO1xuXHRcdGlmICggb2JqZWN0Lmhhc05vcm1hbHMgJiYgISBidWZmZXJzLm5vcm1hbCApIGJ1ZmZlcnMubm9ybWFsID0gX2dsLmNyZWF0ZUJ1ZmZlcigpO1xuXHRcdGlmICggb2JqZWN0Lmhhc1V2cyAmJiAhIGJ1ZmZlcnMudXYgKSBidWZmZXJzLnV2ID0gX2dsLmNyZWF0ZUJ1ZmZlcigpO1xuXHRcdGlmICggb2JqZWN0Lmhhc0NvbG9ycyAmJiAhIGJ1ZmZlcnMuY29sb3IgKSBidWZmZXJzLmNvbG9yID0gX2dsLmNyZWF0ZUJ1ZmZlcigpO1xuXG5cdFx0dmFyIHByb2dyYW1BdHRyaWJ1dGVzID0gcHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7XG5cblx0XHRpZiAoIG9iamVjdC5oYXNQb3NpdGlvbnMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJzLnBvc2l0aW9uICk7XG5cdFx0XHRfZ2wuYnVmZmVyRGF0YSggX2dsLkFSUkFZX0JVRkZFUiwgb2JqZWN0LnBvc2l0aW9uQXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTtcblxuXHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5wb3NpdGlvbiApO1xuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLnBvc2l0aW9uLCAzLCBfZ2wuRkxPQVQsIGZhbHNlLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdC5oYXNOb3JtYWxzICkge1xuXG5cdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVycy5ub3JtYWwgKTtcblxuXHRcdFx0aWYgKCAhIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgJiZcblx0XHRcdFx0ISBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsICYmXG5cdFx0XHRcdCEgbWF0ZXJpYWwuaXNNZXNoTm9ybWFsTWF0ZXJpYWwgJiZcblx0XHRcdFx0bWF0ZXJpYWwuZmxhdFNoYWRpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gb2JqZWN0LmNvdW50ICogMzsgaSA8IGw7IGkgKz0gOSApIHtcblxuXHRcdFx0XHRcdHZhciBhcnJheSA9IG9iamVjdC5ub3JtYWxBcnJheTtcblxuXHRcdFx0XHRcdHZhciBueCA9ICggYXJyYXlbIGkgKyAwIF0gKyBhcnJheVsgaSArIDMgXSArIGFycmF5WyBpICsgNiBdICkgLyAzO1xuXHRcdFx0XHRcdHZhciBueSA9ICggYXJyYXlbIGkgKyAxIF0gKyBhcnJheVsgaSArIDQgXSArIGFycmF5WyBpICsgNyBdICkgLyAzO1xuXHRcdFx0XHRcdHZhciBueiA9ICggYXJyYXlbIGkgKyAyIF0gKyBhcnJheVsgaSArIDUgXSArIGFycmF5WyBpICsgOCBdICkgLyAzO1xuXG5cdFx0XHRcdFx0YXJyYXlbIGkgKyAwIF0gPSBueDtcblx0XHRcdFx0XHRhcnJheVsgaSArIDEgXSA9IG55O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgMiBdID0gbno7XG5cblx0XHRcdFx0XHRhcnJheVsgaSArIDMgXSA9IG54O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgNCBdID0gbnk7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA1IF0gPSBuejtcblxuXHRcdFx0XHRcdGFycmF5WyBpICsgNiBdID0gbng7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA3IF0gPSBueTtcblx0XHRcdFx0XHRhcnJheVsgaSArIDggXSA9IG56O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRfZ2wuYnVmZmVyRGF0YSggX2dsLkFSUkFZX0JVRkZFUiwgb2JqZWN0Lm5vcm1hbEFycmF5LCBfZ2wuRFlOQU1JQ19EUkFXICk7XG5cblx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMubm9ybWFsICk7XG5cblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy5ub3JtYWwsIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0Lmhhc1V2cyAmJiBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJzLnV2ICk7XG5cdFx0XHRfZ2wuYnVmZmVyRGF0YSggX2dsLkFSUkFZX0JVRkZFUiwgb2JqZWN0LnV2QXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTtcblxuXHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy51diApO1xuXG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMudXYsIDIsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0Lmhhc0NvbG9ycyAmJiBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgIT09IE5vQ29sb3JzICkge1xuXG5cdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVycy5jb2xvciApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC5jb2xvckFycmF5LCBfZ2wuRFlOQU1JQ19EUkFXICk7XG5cblx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMuY29sb3IgKTtcblxuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLmNvbG9yLCAzLCBfZ2wuRkxPQVQsIGZhbHNlLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpO1xuXG5cdFx0X2dsLmRyYXdBcnJheXMoIF9nbC5UUklBTkdMRVMsIDAsIG9iamVjdC5jb3VudCApO1xuXG5cdFx0b2JqZWN0LmNvdW50ID0gMDtcblxuXHR9O1xuXG5cdHRoaXMucmVuZGVyQnVmZmVyRGlyZWN0ID0gZnVuY3Rpb24gKCBjYW1lcmEsIGZvZywgZ2VvbWV0cnksIG1hdGVyaWFsLCBvYmplY3QsIGdyb3VwICkge1xuXG5cdFx0dmFyIGZyb250RmFjZUNXID0gKCBvYmplY3QuaXNNZXNoICYmIG9iamVjdC5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpIDwgMCApO1xuXG5cdFx0c3RhdGUuc2V0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmcm9udEZhY2VDVyApO1xuXG5cdFx0dmFyIHByb2dyYW0gPSBzZXRQcm9ncmFtKCBjYW1lcmEsIGZvZywgbWF0ZXJpYWwsIG9iamVjdCApO1xuXHRcdHZhciBnZW9tZXRyeVByb2dyYW0gPSBnZW9tZXRyeS5pZCArICdfJyArIHByb2dyYW0uaWQgKyAnXycgKyAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApO1xuXG5cdFx0dmFyIHVwZGF0ZUJ1ZmZlcnMgPSBmYWxzZTtcblxuXHRcdGlmICggZ2VvbWV0cnlQcm9ncmFtICE9PSBfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSApIHtcblxuXHRcdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSBnZW9tZXRyeVByb2dyYW07XG5cdFx0XHR1cGRhdGVCdWZmZXJzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyApIHtcblxuXHRcdFx0bW9ycGh0YXJnZXRzLnVwZGF0ZSggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHByb2dyYW0gKTtcblxuXHRcdFx0dXBkYXRlQnVmZmVycyA9IHRydWU7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0dmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHR2YXIgcmFuZ2VGYWN0b3IgPSAxO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSB7XG5cblx0XHRcdGluZGV4ID0gZ2VvbWV0cmllcy5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICk7XG5cdFx0XHRyYW5nZUZhY3RvciA9IDI7XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlO1xuXHRcdHZhciByZW5kZXJlciA9IGJ1ZmZlclJlbmRlcmVyO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0YXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXQoIGluZGV4ICk7XG5cblx0XHRcdHJlbmRlcmVyID0gaW5kZXhlZEJ1ZmZlclJlbmRlcmVyO1xuXHRcdFx0cmVuZGVyZXIuc2V0SW5kZXgoIGF0dHJpYnV0ZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB1cGRhdGVCdWZmZXJzICkge1xuXG5cdFx0XHRzZXR1cFZlcnRleEF0dHJpYnV0ZXMoIG1hdGVyaWFsLCBwcm9ncmFtLCBnZW9tZXRyeSApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGF0dHJpYnV0ZS5idWZmZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdHZhciBkYXRhQ291bnQgPSBJbmZpbml0eTtcblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdGRhdGFDb3VudCA9IGluZGV4LmNvdW50O1xuXG5cdFx0fSBlbHNlIGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0ZGF0YUNvdW50ID0gcG9zaXRpb24uY291bnQ7XG5cblx0XHR9XG5cblx0XHR2YXIgcmFuZ2VTdGFydCA9IGdlb21ldHJ5LmRyYXdSYW5nZS5zdGFydCAqIHJhbmdlRmFjdG9yO1xuXHRcdHZhciByYW5nZUNvdW50ID0gZ2VvbWV0cnkuZHJhd1JhbmdlLmNvdW50ICogcmFuZ2VGYWN0b3I7XG5cblx0XHR2YXIgZ3JvdXBTdGFydCA9IGdyb3VwICE9PSBudWxsID8gZ3JvdXAuc3RhcnQgKiByYW5nZUZhY3RvciA6IDA7XG5cdFx0dmFyIGdyb3VwQ291bnQgPSBncm91cCAhPT0gbnVsbCA/IGdyb3VwLmNvdW50ICogcmFuZ2VGYWN0b3IgOiBJbmZpbml0eTtcblxuXHRcdHZhciBkcmF3U3RhcnQgPSBNYXRoLm1heCggcmFuZ2VTdGFydCwgZ3JvdXBTdGFydCApO1xuXHRcdHZhciBkcmF3RW5kID0gTWF0aC5taW4oIGRhdGFDb3VudCwgcmFuZ2VTdGFydCArIHJhbmdlQ291bnQsIGdyb3VwU3RhcnQgKyBncm91cENvdW50ICkgLSAxO1xuXG5cdFx0dmFyIGRyYXdDb3VudCA9IE1hdGgubWF4KCAwLCBkcmF3RW5kIC0gZHJhd1N0YXJ0ICsgMSApO1xuXG5cdFx0aWYgKCBkcmF3Q291bnQgPT09IDAgKSByZXR1cm47XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRzdGF0ZS5zZXRMaW5lV2lkdGgoIG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aCAqIGdldFRhcmdldFBpeGVsUmF0aW8oKSApO1xuXHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORVMgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzd2l0Y2ggKCBvYmplY3QuZHJhd01vZGUgKSB7XG5cblx0XHRcdFx0XHRjYXNlIFRyaWFuZ2xlc0RyYXdNb2RlOlxuXHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlRSSUFOR0xFUyApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlIFRyaWFuZ2xlU3RyaXBEcmF3TW9kZTpcblx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5UUklBTkdMRV9TVFJJUCApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlIFRyaWFuZ2xlRmFuRHJhd01vZGU6XG5cdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVfRkFOICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXG5cdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGluZSApIHtcblxuXHRcdFx0dmFyIGxpbmVXaWR0aCA9IG1hdGVyaWFsLmxpbmV3aWR0aDtcblxuXHRcdFx0aWYgKCBsaW5lV2lkdGggPT09IHVuZGVmaW5lZCApIGxpbmVXaWR0aCA9IDE7IC8vIE5vdCB1c2luZyBMaW5lKk1hdGVyaWFsXG5cblx0XHRcdHN0YXRlLnNldExpbmVXaWR0aCggbGluZVdpZHRoICogZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpICk7XG5cblx0XHRcdGlmICggb2JqZWN0LmlzTGluZVNlZ21lbnRzICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FUyApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNMaW5lTG9vcCApIHtcblxuXHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORV9MT09QICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVfU1RSSVAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzUG9pbnRzICkge1xuXG5cdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuUE9JTlRTICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPiAwICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlckluc3RhbmNlcyggZ2VvbWV0cnksIGRyYXdTdGFydCwgZHJhd0NvdW50ICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlcmVyLnJlbmRlciggZHJhd1N0YXJ0LCBkcmF3Q291bnQgKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdGZ1bmN0aW9uIHNldHVwVmVydGV4QXR0cmlidXRlcyggbWF0ZXJpYWwsIHByb2dyYW0sIGdlb21ldHJ5ICkge1xuXG5cdFx0aWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKSA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5zZXR1cFZlcnRleEF0dHJpYnV0ZXM6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5pbml0QXR0cmlidXRlcygpO1xuXG5cdFx0dmFyIGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cblx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTtcblxuXHRcdHZhciBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgPSBtYXRlcmlhbC5kZWZhdWx0QXR0cmlidXRlVmFsdWVzO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gcHJvZ3JhbUF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBwcm9ncmFtQXR0cmlidXRlID0gcHJvZ3JhbUF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0aWYgKCBwcm9ncmFtQXR0cmlidXRlID49IDAgKSB7XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5QXR0cmlidXRlID0gZ2VvbWV0cnlBdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dmFyIG5vcm1hbGl6ZWQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5ub3JtYWxpemVkO1xuXHRcdFx0XHRcdHZhciBzaXplID0gZ2VvbWV0cnlBdHRyaWJ1dGUuaXRlbVNpemU7XG5cblx0XHRcdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXQoIGdlb21ldHJ5QXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHQvLyBUT0RPIEF0dHJpYnV0ZSBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBjb250ZXh0IHJlc3RvcmVcblxuXHRcdFx0XHRcdGlmICggYXR0cmlidXRlID09PSB1bmRlZmluZWQgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdHZhciBidWZmZXIgPSBhdHRyaWJ1dGUuYnVmZmVyO1xuXHRcdFx0XHRcdHZhciB0eXBlID0gYXR0cmlidXRlLnR5cGU7XG5cdFx0XHRcdFx0dmFyIGJ5dGVzUGVyRWxlbWVudCA9IGF0dHJpYnV0ZS5ieXRlc1BlckVsZW1lbnQ7XG5cblx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5QXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBkYXRhID0gZ2VvbWV0cnlBdHRyaWJ1dGUuZGF0YTtcblx0XHRcdFx0XHRcdHZhciBzdHJpZGUgPSBkYXRhLnN0cmlkZTtcblx0XHRcdFx0XHRcdHZhciBvZmZzZXQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5vZmZzZXQ7XG5cblx0XHRcdFx0XHRcdGlmICggZGF0YSAmJiBkYXRhLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgKSB7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggcHJvZ3JhbUF0dHJpYnV0ZSwgZGF0YS5tZXNoUGVyQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPSBkYXRhLm1lc2hQZXJBdHRyaWJ1dGUgKiBkYXRhLmNvdW50O1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVyICk7XG5cdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgc3RyaWRlICogYnl0ZXNQZXJFbGVtZW50LCBvZmZzZXQgKiBieXRlc1BlckVsZW1lbnQgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggcHJvZ3JhbUF0dHJpYnV0ZSwgZ2VvbWV0cnlBdHRyaWJ1dGUubWVzaFBlckF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID0gZ2VvbWV0cnlBdHRyaWJ1dGUubWVzaFBlckF0dHJpYnV0ZSAqIGdlb21ldHJ5QXR0cmlidXRlLmNvdW50O1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVyICk7XG5cdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgMCwgMCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dmFyIHZhbHVlID0gbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzWyBuYW1lIF07XG5cblx0XHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdHN3aXRjaCAoIHZhbHVlLmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdFx0XHRjYXNlIDI6XG5cdFx0XHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYjJmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIDM6XG5cdFx0XHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYjNmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIDQ6XG5cdFx0XHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYjRmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWIxZnYoIHByb2dyYW1BdHRyaWJ1dGUsIHZhbHVlICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7XG5cblx0fVxuXG5cdC8vIENvbXBpbGVcblxuXHR0aGlzLmNvbXBpbGUgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSwgY2FtZXJhICk7XG5cdFx0Y3VycmVudFJlbmRlclN0YXRlLmluaXQoKTtcblxuXHRcdHNjZW5lLnRyYXZlcnNlKCBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdFx0aWYgKCBvYmplY3QuaXNMaWdodCApIHtcblxuXHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaExpZ2h0KCBvYmplY3QgKTtcblxuXHRcdFx0XHRpZiAoIG9iamVjdC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnB1c2hTaGFkb3coIG9iamVjdCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSApO1xuXG5cdFx0Y3VycmVudFJlbmRlclN0YXRlLnNldHVwTGlnaHRzKCBjYW1lcmEgKTtcblxuXHRcdHNjZW5lLnRyYXZlcnNlKCBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdFx0aWYgKCBvYmplY3QubWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBvYmplY3QubWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG9iamVjdC5tYXRlcmlhbC5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGluaXRNYXRlcmlhbCggb2JqZWN0Lm1hdGVyaWFsWyBpIF0sIHNjZW5lLmZvZywgb2JqZWN0ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGluaXRNYXRlcmlhbCggb2JqZWN0Lm1hdGVyaWFsLCBzY2VuZS5mb2csIG9iamVjdCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSApO1xuXG5cdH07XG5cblx0Ly8gQW5pbWF0aW9uIExvb3BcblxuXHR2YXIgaXNBbmltYXRpbmcgPSBmYWxzZTtcblx0dmFyIG9uQW5pbWF0aW9uRnJhbWUgPSBudWxsO1xuXG5cdGZ1bmN0aW9uIHN0YXJ0QW5pbWF0aW9uKCkge1xuXG5cdFx0aWYgKCBpc0FuaW1hdGluZyApIHJldHVybjtcblxuXHRcdHJlcXVlc3RBbmltYXRpb25Mb29wRnJhbWUoKTtcblxuXHRcdGlzQW5pbWF0aW5nID0gdHJ1ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc3RvcEFuaW1hdGlvbigpIHtcblxuXHRcdGlzQW5pbWF0aW5nID0gZmFsc2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlcXVlc3RBbmltYXRpb25Mb29wRnJhbWUoKSB7XG5cblx0XHR2YXIgZGV2aWNlID0gdnIuZ2V0RGV2aWNlKCk7XG5cblx0XHRpZiAoIGRldmljZSAmJiBkZXZpY2UuaXNQcmVzZW50aW5nICkge1xuXG5cdFx0XHRkZXZpY2UucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBhbmltYXRpb25Mb29wICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBhbmltYXRpb25Mb29wICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFuaW1hdGlvbkxvb3AoIHRpbWUgKSB7XG5cblx0XHRpZiAoIGlzQW5pbWF0aW5nID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdG9uQW5pbWF0aW9uRnJhbWUoIHRpbWUgKTtcblxuXHRcdHJlcXVlc3RBbmltYXRpb25Mb29wRnJhbWUoKTtcblxuXHR9XG5cblx0dGhpcy5hbmltYXRlID0gZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdG9uQW5pbWF0aW9uRnJhbWUgPSBjYWxsYmFjaztcblx0XHRvbkFuaW1hdGlvbkZyYW1lICE9PSBudWxsID8gc3RhcnRBbmltYXRpb24oKSA6IHN0b3BBbmltYXRpb24oKTtcblxuXHR9O1xuXG5cdC8vIFJlbmRlcmluZ1xuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXQsIGZvcmNlQ2xlYXIgKSB7XG5cblx0XHRpZiAoICEgKCBjYW1lcmEgJiYgY2FtZXJhLmlzQ2FtZXJhICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcjogY2FtZXJhIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5DYW1lcmEuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBfaXNDb250ZXh0TG9zdCApIHJldHVybjtcblxuXHRcdC8vIHJlc2V0IGNhY2hpbmcgZm9yIHRoaXMgZnJhbWVcblxuXHRcdF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtID0gJyc7XG5cdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gLSAxO1xuXHRcdF9jdXJyZW50Q2FtZXJhID0gbnVsbDtcblxuXHRcdC8vIHVwZGF0ZSBzY2VuZSBncmFwaFxuXG5cdFx0aWYgKCBzY2VuZS5hdXRvVXBkYXRlID09PSB0cnVlICkgc2NlbmUudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdC8vIHVwZGF0ZSBjYW1lcmEgbWF0cmljZXMgYW5kIGZydXN0dW1cblxuXHRcdGlmICggY2FtZXJhLnBhcmVudCA9PT0gbnVsbCApIGNhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0aWYgKCB2ci5lbmFibGVkICkge1xuXG5cdFx0XHRjYW1lcmEgPSB2ci5nZXRDYW1lcmEoIGNhbWVyYSApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlcy5nZXQoIHNjZW5lLCBjYW1lcmEgKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuaW5pdCgpO1xuXG5cdFx0c2NlbmUub25CZWZvcmVSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdF9wcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0X2ZydXN0dW0uc2V0RnJvbU1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdF9sb2NhbENsaXBwaW5nRW5hYmxlZCA9IHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQ7XG5cdFx0X2NsaXBwaW5nRW5hYmxlZCA9IF9jbGlwcGluZy5pbml0KCB0aGlzLmNsaXBwaW5nUGxhbmVzLCBfbG9jYWxDbGlwcGluZ0VuYWJsZWQsIGNhbWVyYSApO1xuXG5cdFx0Y3VycmVudFJlbmRlckxpc3QgPSByZW5kZXJMaXN0cy5nZXQoIHNjZW5lLCBjYW1lcmEgKTtcblx0XHRjdXJyZW50UmVuZGVyTGlzdC5pbml0KCk7XG5cblx0XHRwcm9qZWN0T2JqZWN0KCBzY2VuZSwgY2FtZXJhLCBfdGhpcy5zb3J0T2JqZWN0cyApO1xuXG5cdFx0aWYgKCBfdGhpcy5zb3J0T2JqZWN0cyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Y3VycmVudFJlbmRlckxpc3Quc29ydCgpO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggX2NsaXBwaW5nRW5hYmxlZCApIF9jbGlwcGluZy5iZWdpblNoYWRvd3MoKTtcblxuXHRcdHZhciBzaGFkb3dzQXJyYXkgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUuc2hhZG93c0FycmF5O1xuXG5cdFx0c2hhZG93TWFwLnJlbmRlciggc2hhZG93c0FycmF5LCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHMoIGNhbWVyYSApO1xuXG5cdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkICkgX2NsaXBwaW5nLmVuZFNoYWRvd3MoKTtcblxuXHRcdC8vXG5cblx0XHRpZiAoIHRoaXMuaW5mby5hdXRvUmVzZXQgKSB0aGlzLmluZm8ucmVzZXQoKTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldCA9IG51bGw7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHQvL1xuXG5cdFx0YmFja2dyb3VuZC5yZW5kZXIoIGN1cnJlbnRSZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhLCBmb3JjZUNsZWFyICk7XG5cblx0XHQvLyByZW5kZXIgc2NlbmVcblxuXHRcdHZhciBvcGFxdWVPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3Qub3BhcXVlO1xuXHRcdHZhciB0cmFuc3BhcmVudE9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC50cmFuc3BhcmVudDtcblxuXHRcdGlmICggc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCApIHtcblxuXHRcdFx0dmFyIG92ZXJyaWRlTWF0ZXJpYWwgPSBzY2VuZS5vdmVycmlkZU1hdGVyaWFsO1xuXG5cdFx0XHRpZiAoIG9wYXF1ZU9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggb3BhcXVlT2JqZWN0cywgc2NlbmUsIGNhbWVyYSwgb3ZlcnJpZGVNYXRlcmlhbCApO1xuXHRcdFx0aWYgKCB0cmFuc3BhcmVudE9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggdHJhbnNwYXJlbnRPYmplY3RzLCBzY2VuZSwgY2FtZXJhLCBvdmVycmlkZU1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBvcGFxdWUgcGFzcyAoZnJvbnQtdG8tYmFjayBvcmRlcilcblxuXHRcdFx0aWYgKCBvcGFxdWVPYmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIG9wYXF1ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdFx0Ly8gdHJhbnNwYXJlbnQgcGFzcyAoYmFjay10by1mcm9udCBvcmRlcilcblxuXHRcdFx0aWYgKCB0cmFuc3BhcmVudE9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggdHJhbnNwYXJlbnRPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHR9XG5cblx0XHQvLyBjdXN0b20gcmVuZGVyZXJzXG5cblx0XHR2YXIgc3ByaXRlc0FycmF5ID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnNwcml0ZXNBcnJheTtcblxuXHRcdHNwcml0ZVJlbmRlcmVyLnJlbmRlciggc3ByaXRlc0FycmF5LCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHQvLyBHZW5lcmF0ZSBtaXBtYXAgaWYgd2UncmUgdXNpbmcgYW55IGtpbmQgb2YgbWlwbWFwIGZpbHRlcmluZ1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdHRleHR1cmVzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHQvLyBFbnN1cmUgZGVwdGggYnVmZmVyIHdyaXRpbmcgaXMgZW5hYmxlZCBzbyBpdCBjYW4gYmUgY2xlYXJlZCBvbiBuZXh0IHJlbmRlclxuXG5cdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCB0cnVlICk7XG5cdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCB0cnVlICk7XG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRNYXNrKCB0cnVlICk7XG5cblx0XHRzdGF0ZS5zZXRQb2x5Z29uT2Zmc2V0KCBmYWxzZSApO1xuXG5cdFx0c2NlbmUub25BZnRlclJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdGlmICggdnIuZW5hYmxlZCApIHtcblxuXHRcdFx0dnIuc3VibWl0RnJhbWUoKTtcblxuXHRcdH1cblxuXHRcdC8vIF9nbC5maW5pc2goKTtcblxuXHRcdGN1cnJlbnRSZW5kZXJMaXN0ID0gbnVsbDtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSBudWxsO1xuXG5cdH07XG5cblx0Lypcblx0Ly8gVE9ETyBEdXBsaWNhdGVkIGNvZGUgKEZydXN0dW0pXG5cblx0dmFyIF9zcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0ZnVuY3Rpb24gaXNPYmplY3RWaWV3YWJsZSggb2JqZWN0ICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApXG5cdFx0XHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdF9zcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKS5cblx0XHRhcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0cmV0dXJuIGlzU3BoZXJlVmlld2FibGUoIF9zcGhlcmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gaXNTcHJpdGVWaWV3YWJsZSggc3ByaXRlICkge1xuXG5cdFx0X3NwaGVyZS5jZW50ZXIuc2V0KCAwLCAwLCAwICk7XG5cdFx0X3NwaGVyZS5yYWRpdXMgPSAwLjcwNzEwNjc4MTE4NjU0NzY7XG5cdFx0X3NwaGVyZS5hcHBseU1hdHJpeDQoIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0cmV0dXJuIGlzU3BoZXJlVmlld2FibGUoIF9zcGhlcmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gaXNTcGhlcmVWaWV3YWJsZSggc3BoZXJlICkge1xuXG5cdFx0aWYgKCAhIF9mcnVzdHVtLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0dmFyIG51bVBsYW5lcyA9IF9jbGlwcGluZy5udW1QbGFuZXM7XG5cblx0XHRpZiAoIG51bVBsYW5lcyA9PT0gMCApIHJldHVybiB0cnVlO1xuXG5cdFx0dmFyIHBsYW5lcyA9IF90aGlzLmNsaXBwaW5nUGxhbmVzLFxuXG5cdFx0XHRjZW50ZXIgPSBzcGhlcmUuY2VudGVyLFxuXHRcdFx0bmVnUmFkID0gLSBzcGhlcmUucmFkaXVzLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRkbyB7XG5cblx0XHRcdC8vIG91dCB3aGVuIGRlZXBlciB0aGFuIHJhZGl1cyBpbiB0aGUgbmVnYXRpdmUgaGFsZnNwYWNlXG5cdFx0XHRpZiAoIHBsYW5lc1sgaSBdLmRpc3RhbmNlVG9Qb2ludCggY2VudGVyICkgPCBuZWdSYWQgKSByZXR1cm4gZmFsc2U7XG5cblx0XHR9IHdoaWxlICggKysgaSAhPT0gbnVtUGxhbmVzICk7XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9XG5cdCovXG5cblx0ZnVuY3Rpb24gcHJvamVjdE9iamVjdCggb2JqZWN0LCBjYW1lcmEsIHNvcnRPYmplY3RzICkge1xuXG5cdFx0aWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHR2YXIgdmlzaWJsZSA9IG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApO1xuXG5cdFx0aWYgKCB2aXNpYmxlICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc0xpZ2h0ICkge1xuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoTGlnaHQoIG9iamVjdCApO1xuXG5cdFx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNoYWRvdyggb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNTcHJpdGUgKSB7XG5cblx0XHRcdFx0aWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNTcHJpdGUoIG9iamVjdCApICkge1xuXG5cdFx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnB1c2hTcHJpdGUoIG9iamVjdCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ICkge1xuXG5cdFx0XHRcdGlmICggc29ydE9iamVjdHMgKSB7XG5cblx0XHRcdFx0XHRfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApXG5cdFx0XHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5wdXNoKCBvYmplY3QsIG51bGwsIG9iamVjdC5tYXRlcmlhbCwgX3ZlY3RvcjMueiwgbnVsbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc0xpbmUgfHwgb2JqZWN0LmlzUG9pbnRzICkge1xuXG5cdFx0XHRcdGlmICggb2JqZWN0LmlzU2tpbm5lZE1lc2ggKSB7XG5cblx0XHRcdFx0XHRvYmplY3Quc2tlbGV0b24udXBkYXRlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggISBvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bS5pbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSApIHtcblxuXHRcdFx0XHRcdGlmICggc29ydE9iamVjdHMgKSB7XG5cblx0XHRcdFx0XHRcdF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkIClcblx0XHRcdFx0XHRcdFx0LmFwcGx5TWF0cml4NCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdHMudXBkYXRlKCBvYmplY3QgKTtcblx0XHRcdFx0XHR2YXIgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7XG5cblx0XHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXHRcdFx0XHRcdFx0XHR2YXIgZ3JvdXBNYXRlcmlhbCA9IG1hdGVyaWFsWyBncm91cC5tYXRlcmlhbEluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBncm91cE1hdGVyaWFsICYmIGdyb3VwTWF0ZXJpYWwudmlzaWJsZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIGdyb3VwTWF0ZXJpYWwsIF92ZWN0b3IzLnosIGdyb3VwICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5wdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgX3ZlY3RvcjMueiwgbnVsbCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGNoaWxkcmVuID0gb2JqZWN0LmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0cHJvamVjdE9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBzb3J0T2JqZWN0cyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3RzKCByZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhLCBvdmVycmlkZU1hdGVyaWFsICkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcmVuZGVyTGlzdC5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcmVuZGVySXRlbSA9IHJlbmRlckxpc3RbIGkgXTtcblxuXHRcdFx0dmFyIG9iamVjdCA9IHJlbmRlckl0ZW0ub2JqZWN0O1xuXHRcdFx0dmFyIGdlb21ldHJ5ID0gcmVuZGVySXRlbS5nZW9tZXRyeTtcblx0XHRcdHZhciBtYXRlcmlhbCA9IG92ZXJyaWRlTWF0ZXJpYWwgPT09IHVuZGVmaW5lZCA/IHJlbmRlckl0ZW0ubWF0ZXJpYWwgOiBvdmVycmlkZU1hdGVyaWFsO1xuXHRcdFx0dmFyIGdyb3VwID0gcmVuZGVySXRlbS5ncm91cDtcblxuXHRcdFx0aWYgKCBjYW1lcmEuaXNBcnJheUNhbWVyYSApIHtcblxuXHRcdFx0XHRfY3VycmVudEFycmF5Q2FtZXJhID0gY2FtZXJhO1xuXG5cdFx0XHRcdHZhciBjYW1lcmFzID0gY2FtZXJhLmNhbWVyYXM7XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGNhbWVyYXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgY2FtZXJhMiA9IGNhbWVyYXNbIGogXTtcblxuXHRcdFx0XHRcdGlmICggb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEyLmxheWVycyApICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYm91bmRzID0gY2FtZXJhMi5ib3VuZHM7XG5cblx0XHRcdFx0XHRcdHZhciB4ID0gYm91bmRzLnggKiBfd2lkdGg7XG5cdFx0XHRcdFx0XHR2YXIgeSA9IGJvdW5kcy55ICogX2hlaWdodDtcblx0XHRcdFx0XHRcdHZhciB3aWR0aCA9IGJvdW5kcy56ICogX3dpZHRoO1xuXHRcdFx0XHRcdFx0dmFyIGhlaWdodCA9IGJvdW5kcy53ICogX2hlaWdodDtcblxuXHRcdFx0XHRcdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblxuXHRcdFx0XHRcdFx0cmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEyLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdF9jdXJyZW50QXJyYXlDYW1lcmEgPSBudWxsO1xuXG5cdFx0XHRcdHJlbmRlck9iamVjdCggb2JqZWN0LCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKSB7XG5cblx0XHRvYmplY3Qub25CZWZvcmVSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XG5cdFx0Y3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUsIF9jdXJyZW50QXJyYXlDYW1lcmEgfHwgY2FtZXJhICk7XG5cblx0XHRvYmplY3QubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXHRcdG9iamVjdC5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCBvYmplY3QubW9kZWxWaWV3TWF0cml4ICk7XG5cblx0XHRpZiAoIG9iamVjdC5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdCApIHtcblxuXHRcdFx0dmFyIGZyb250RmFjZUNXID0gKCBvYmplY3QuaXNNZXNoICYmIG9iamVjdC5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpIDwgMCApO1xuXG5cdFx0XHRzdGF0ZS5zZXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZyb250RmFjZUNXICk7XG5cblx0XHRcdHZhciBwcm9ncmFtID0gc2V0UHJvZ3JhbSggY2FtZXJhLCBzY2VuZS5mb2csIG1hdGVyaWFsLCBvYmplY3QgKTtcblxuXHRcdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSAnJztcblxuXHRcdFx0cmVuZGVyT2JqZWN0SW1tZWRpYXRlKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QoIGNhbWVyYSwgc2NlbmUuZm9nLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTtcblxuXHRcdH1cblxuXHRcdG9iamVjdC5vbkFmdGVyUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlcy5nZXQoIHNjZW5lLCBfY3VycmVudEFycmF5Q2FtZXJhIHx8IGNhbWVyYSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpbml0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmb2csIG9iamVjdCApIHtcblxuXHRcdHZhciBtYXRlcmlhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwgKTtcblxuXHRcdHZhciBsaWdodHMgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUubGlnaHRzO1xuXHRcdHZhciBzaGFkb3dzQXJyYXkgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUuc2hhZG93c0FycmF5O1xuXG5cdFx0dmFyIHBhcmFtZXRlcnMgPSBwcm9ncmFtQ2FjaGUuZ2V0UGFyYW1ldGVycyhcblx0XHRcdG1hdGVyaWFsLCBsaWdodHMuc3RhdGUsIHNoYWRvd3NBcnJheSwgZm9nLCBfY2xpcHBpbmcubnVtUGxhbmVzLCBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uLCBvYmplY3QgKTtcblxuXHRcdHZhciBjb2RlID0gcHJvZ3JhbUNhY2hlLmdldFByb2dyYW1Db2RlKCBtYXRlcmlhbCwgcGFyYW1ldGVycyApO1xuXG5cdFx0dmFyIHByb2dyYW0gPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbTtcblx0XHR2YXIgcHJvZ3JhbUNoYW5nZSA9IHRydWU7XG5cblx0XHRpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gbmV3IG1hdGVyaWFsXG5cdFx0XHRtYXRlcmlhbC5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7XG5cblx0XHR9IGVsc2UgaWYgKCBwcm9ncmFtLmNvZGUgIT09IGNvZGUgKSB7XG5cblx0XHRcdC8vIGNoYW5nZWQgZ2xzbCBvciBwYXJhbWV0ZXJzXG5cdFx0XHRyZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlKCBtYXRlcmlhbCApO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c0hhc2ggIT09IGxpZ2h0cy5zdGF0ZS5oYXNoICkge1xuXG5cdFx0XHRwcm9wZXJ0aWVzLnVwZGF0ZSggbWF0ZXJpYWwsICdsaWdodHNIYXNoJywgbGlnaHRzLnN0YXRlLmhhc2ggKTtcblx0XHRcdHByb2dyYW1DaGFuZ2UgPSBmYWxzZTtcblxuXHRcdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMuc2hhZGVySUQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gc2FtZSBnbHNsIGFuZCB1bmlmb3JtIGxpc3Rcblx0XHRcdHJldHVybjtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG9ubHkgcmVidWlsZCB1bmlmb3JtIGxpc3Rcblx0XHRcdHByb2dyYW1DaGFuZ2UgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggcHJvZ3JhbUNoYW5nZSApIHtcblxuXHRcdFx0aWYgKCBwYXJhbWV0ZXJzLnNoYWRlcklEICkge1xuXG5cdFx0XHRcdHZhciBzaGFkZXIgPSBTaGFkZXJMaWJbIHBhcmFtZXRlcnMuc2hhZGVySUQgXTtcblxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyID0ge1xuXHRcdFx0XHRcdG5hbWU6IG1hdGVyaWFsLnR5cGUsXG5cdFx0XHRcdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMuY2xvbmUoIHNoYWRlci51bmlmb3JtcyApLFxuXHRcdFx0XHRcdHZlcnRleFNoYWRlcjogc2hhZGVyLnZlcnRleFNoYWRlcixcblx0XHRcdFx0XHRmcmFnbWVudFNoYWRlcjogc2hhZGVyLmZyYWdtZW50U2hhZGVyXG5cdFx0XHRcdH07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlciA9IHtcblx0XHRcdFx0XHRuYW1lOiBtYXRlcmlhbC50eXBlLFxuXHRcdFx0XHRcdHVuaWZvcm1zOiBtYXRlcmlhbC51bmlmb3Jtcyxcblx0XHRcdFx0XHR2ZXJ0ZXhTaGFkZXI6IG1hdGVyaWFsLnZlcnRleFNoYWRlcixcblx0XHRcdFx0XHRmcmFnbWVudFNoYWRlcjogbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXJcblx0XHRcdFx0fTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtYXRlcmlhbC5vbkJlZm9yZUNvbXBpbGUoIG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIsIF90aGlzICk7XG5cblx0XHRcdHByb2dyYW0gPSBwcm9ncmFtQ2FjaGUuYWNxdWlyZVByb2dyYW0oIG1hdGVyaWFsLCBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyLCBwYXJhbWV0ZXJzLCBjb2RlICk7XG5cblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtID0gcHJvZ3JhbTtcblx0XHRcdG1hdGVyaWFsLnByb2dyYW0gPSBwcm9ncmFtO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHByb2dyYW1BdHRyaWJ1dGVzID0gcHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0bWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhUYXJnZXRzID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgX3RoaXMubWF4TW9ycGhUYXJnZXRzOyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggcHJvZ3JhbUF0dHJpYnV0ZXNbICdtb3JwaFRhcmdldCcgKyBpIF0gPj0gMCApIHtcblxuXHRcdFx0XHRcdG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cyArKztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubW9ycGhOb3JtYWxzICkge1xuXG5cdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBfdGhpcy5tYXhNb3JwaE5vcm1hbHM7IGkgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBwcm9ncmFtQXR0cmlidXRlc1sgJ21vcnBoTm9ybWFsJyArIGkgXSA+PSAwICkge1xuXG5cdFx0XHRcdFx0bWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhOb3JtYWxzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIHVuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlci51bmlmb3JtcztcblxuXHRcdGlmICggISBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICYmXG5cdFx0XHQhIG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgfHxcblx0XHRcdG1hdGVyaWFsLmNsaXBwaW5nID09PSB0cnVlICkge1xuXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgPSBfY2xpcHBpbmcubnVtUGxhbmVzO1xuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUludGVyc2VjdGlvbiA9IF9jbGlwcGluZy5udW1JbnRlcnNlY3Rpb247XG5cdFx0XHR1bmlmb3Jtcy5jbGlwcGluZ1BsYW5lcyA9IF9jbGlwcGluZy51bmlmb3JtO1xuXG5cdFx0fVxuXG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmZvZyA9IGZvZztcblxuXHRcdC8vIHN0b3JlIHRoZSBsaWdodCBzZXR1cCBpdCB3YXMgY3JlYXRlZCBmb3JcblxuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5saWdodHNIYXNoID0gbGlnaHRzLnN0YXRlLmhhc2g7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmxpZ2h0cyApIHtcblxuXHRcdFx0Ly8gd2lyZSB1cCB0aGUgbWF0ZXJpYWwgdG8gdGhpcyByZW5kZXJlcidzIGxpZ2h0aW5nIHN0YXRlXG5cblx0XHRcdHVuaWZvcm1zLmFtYmllbnRMaWdodENvbG9yLnZhbHVlID0gbGlnaHRzLnN0YXRlLmFtYmllbnQ7XG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbDtcblx0XHRcdHVuaWZvcm1zLnNwb3RMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUuc3BvdDtcblx0XHRcdHVuaWZvcm1zLnJlY3RBcmVhTGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLnJlY3RBcmVhO1xuXHRcdFx0dW5pZm9ybXMucG9pbnRMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnQ7XG5cdFx0XHR1bmlmb3Jtcy5oZW1pc3BoZXJlTGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLmhlbWk7XG5cblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsU2hhZG93TWFwLnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgudmFsdWUgPSBsaWdodHMuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg7XG5cdFx0XHR1bmlmb3Jtcy5zcG90U2hhZG93TWFwLnZhbHVlID0gbGlnaHRzLnN0YXRlLnNwb3RTaGFkb3dNYXA7XG5cdFx0XHR1bmlmb3Jtcy5zcG90U2hhZG93TWF0cml4LnZhbHVlID0gbGlnaHRzLnN0YXRlLnNwb3RTaGFkb3dNYXRyaXg7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludFNoYWRvd01hcDtcblx0XHRcdHVuaWZvcm1zLnBvaW50U2hhZG93TWF0cml4LnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50U2hhZG93TWF0cml4O1xuXHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IGFkZCBhcmVhIGxpZ2h0cyBzaGFkb3cgaW5mbyB0byB1bmlmb3Jtc1xuXG5cdFx0fVxuXG5cdFx0dmFyIHByb2dVbmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtLmdldFVuaWZvcm1zKCksXG5cdFx0XHR1bmlmb3Jtc0xpc3QgPVxuXHRcdFx0XHRXZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1ZSggcHJvZ1VuaWZvcm1zLnNlcSwgdW5pZm9ybXMgKTtcblxuXHRcdG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QgPSB1bmlmb3Jtc0xpc3Q7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFByb2dyYW0oIGNhbWVyYSwgZm9nLCBtYXRlcmlhbCwgb2JqZWN0ICkge1xuXG5cdFx0X3VzZWRUZXh0dXJlVW5pdHMgPSAwO1xuXG5cdFx0dmFyIG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xuXHRcdHZhciBsaWdodHMgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUubGlnaHRzO1xuXG5cdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkICkge1xuXG5cdFx0XHRpZiAoIF9sb2NhbENsaXBwaW5nRW5hYmxlZCB8fCBjYW1lcmEgIT09IF9jdXJyZW50Q2FtZXJhICkge1xuXG5cdFx0XHRcdHZhciB1c2VDYWNoZSA9XG5cdFx0XHRcdFx0Y2FtZXJhID09PSBfY3VycmVudENhbWVyYSAmJlxuXHRcdFx0XHRcdG1hdGVyaWFsLmlkID09PSBfY3VycmVudE1hdGVyaWFsSWQ7XG5cblx0XHRcdFx0Ly8gd2UgbWlnaHQgd2FudCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBzb21lIENsaXBwaW5nR3JvdXBcblx0XHRcdFx0Ly8gb2JqZWN0IGluc3RlYWQgb2YgdGhlIG1hdGVyaWFsLCBvbmNlIGl0IGJlY29tZXMgZmVhc2libGVcblx0XHRcdFx0Ly8gKCM4NDY1LCAjODM3OSlcblx0XHRcdFx0X2NsaXBwaW5nLnNldFN0YXRlKFxuXHRcdFx0XHRcdG1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzLCBtYXRlcmlhbC5jbGlwSW50ZXJzZWN0aW9uLCBtYXRlcmlhbC5jbGlwU2hhZG93cyxcblx0XHRcdFx0XHRjYW1lcmEsIG1hdGVyaWFsUHJvcGVydGllcywgdXNlQ2FjaGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmZvZyAmJiBtYXRlcmlhbFByb3BlcnRpZXMuZm9nICE9PSBmb2cgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5saWdodHMgJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c0hhc2ggIT09IGxpZ2h0cy5zdGF0ZS5oYXNoICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0KCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgIT09IF9jbGlwcGluZy5udW1QbGFuZXMgfHxcblx0XHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUludGVyc2VjdGlvbiAhPT0gX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbiApICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5uZWVkc1VwZGF0ZSApIHtcblxuXHRcdFx0aW5pdE1hdGVyaWFsKCBtYXRlcmlhbCwgZm9nLCBvYmplY3QgKTtcblx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHR2YXIgcmVmcmVzaFByb2dyYW0gPSBmYWxzZTtcblx0XHR2YXIgcmVmcmVzaE1hdGVyaWFsID0gZmFsc2U7XG5cdFx0dmFyIHJlZnJlc2hMaWdodHMgPSBmYWxzZTtcblxuXHRcdHZhciBwcm9ncmFtID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0sXG5cdFx0XHRwX3VuaWZvcm1zID0gcHJvZ3JhbS5nZXRVbmlmb3JtcygpLFxuXHRcdFx0bV91bmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIudW5pZm9ybXM7XG5cblx0XHRpZiAoIHN0YXRlLnVzZVByb2dyYW0oIHByb2dyYW0ucHJvZ3JhbSApICkge1xuXG5cdFx0XHRyZWZyZXNoUHJvZ3JhbSA9IHRydWU7XG5cdFx0XHRyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlO1xuXHRcdFx0cmVmcmVzaExpZ2h0cyA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmlkICE9PSBfY3VycmVudE1hdGVyaWFsSWQgKSB7XG5cblx0XHRcdF9jdXJyZW50TWF0ZXJpYWxJZCA9IG1hdGVyaWFsLmlkO1xuXG5cdFx0XHRyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCByZWZyZXNoUHJvZ3JhbSB8fCBjYW1lcmEgIT09IF9jdXJyZW50Q2FtZXJhICkge1xuXG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdwcm9qZWN0aW9uTWF0cml4JywgY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciApIHtcblxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdsb2dEZXB0aEJ1ZkZDJyxcblx0XHRcdFx0XHQyLjAgLyAoIE1hdGgubG9nKCBjYW1lcmEuZmFyICsgMS4wICkgLyBNYXRoLkxOMiApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gQXZvaWQgdW5uZWVkZWQgdW5pZm9ybSB1cGRhdGVzIHBlciBBcnJheUNhbWVyYSdzIHN1Yi1jYW1lcmFcblxuXHRcdFx0aWYgKCBfY3VycmVudENhbWVyYSAhPT0gKCBfY3VycmVudEFycmF5Q2FtZXJhIHx8IGNhbWVyYSApICkge1xuXG5cdFx0XHRcdF9jdXJyZW50Q2FtZXJhID0gKCBfY3VycmVudEFycmF5Q2FtZXJhIHx8IGNhbWVyYSApO1xuXG5cdFx0XHRcdC8vIGxpZ2h0aW5nIHVuaWZvcm1zIGRlcGVuZCBvbiB0aGUgY2FtZXJhIHNvIGVuZm9yY2UgYW4gdXBkYXRlXG5cdFx0XHRcdC8vIG5vdywgaW4gY2FzZSB0aGlzIG1hdGVyaWFsIHN1cHBvcnRzIGxpZ2h0cyAtIG9yIGxhdGVyLCB3aGVuXG5cdFx0XHRcdC8vIHRoZSBuZXh0IG1hdGVyaWFsIHRoYXQgZG9lcyBnZXRzIGFjdGl2YXRlZDpcblxuXHRcdFx0XHRyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlO1x0XHQvLyBzZXQgdG8gdHJ1ZSBvbiBtYXRlcmlhbCBjaGFuZ2Vcblx0XHRcdFx0cmVmcmVzaExpZ2h0cyA9IHRydWU7XHRcdC8vIHJlbWFpbnMgc2V0IHVudGlsIHVwZGF0ZSBkb25lXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbG9hZCBtYXRlcmlhbCBzcGVjaWZpYyB1bmlmb3Jtc1xuXHRcdFx0Ly8gKHNoYWRlciBtYXRlcmlhbCBhbHNvIGdldHMgdGhlbSBmb3IgdGhlIHNha2Ugb2YgZ2VuZXJpY2l0eSlcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5lbnZNYXAgKSB7XG5cblx0XHRcdFx0dmFyIHVDYW1Qb3MgPSBwX3VuaWZvcm1zLm1hcC5jYW1lcmFQb3NpdGlvbjtcblxuXHRcdFx0XHRpZiAoIHVDYW1Qb3MgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHVDYW1Qb3Muc2V0VmFsdWUoIF9nbCxcblx0XHRcdFx0XHRcdF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaExhbWJlcnRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5za2lubmluZyApIHtcblxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd2aWV3TWF0cml4JywgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBza2lubmluZyB1bmlmb3JtcyBtdXN0IGJlIHNldCBldmVuIGlmIG1hdGVyaWFsIGRpZG4ndCBjaGFuZ2Vcblx0XHQvLyBhdXRvLXNldHRpbmcgb2YgdGV4dHVyZSB1bml0IGZvciBib25lIHRleHR1cmUgbXVzdCBnbyBiZWZvcmUgb3RoZXIgdGV4dHVyZXNcblx0XHQvLyBub3Qgc3VyZSB3aHksIGJ1dCBvdGhlcndpc2Ugd2VpcmQgdGhpbmdzIGhhcHBlblxuXG5cdFx0aWYgKCBtYXRlcmlhbC5za2lubmluZyApIHtcblxuXHRcdFx0cF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2dsLCBvYmplY3QsICdiaW5kTWF0cml4JyApO1xuXHRcdFx0cF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2dsLCBvYmplY3QsICdiaW5kTWF0cml4SW52ZXJzZScgKTtcblxuXHRcdFx0dmFyIHNrZWxldG9uID0gb2JqZWN0LnNrZWxldG9uO1xuXG5cdFx0XHRpZiAoIHNrZWxldG9uICkge1xuXG5cdFx0XHRcdHZhciBib25lcyA9IHNrZWxldG9uLmJvbmVzO1xuXG5cdFx0XHRcdGlmICggY2FwYWJpbGl0aWVzLmZsb2F0VmVydGV4VGV4dHVyZXMgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHNrZWxldG9uLmJvbmVUZXh0dXJlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGxheW91dCAoMSBtYXRyaXggPSA0IHBpeGVscylcblx0XHRcdFx0XHRcdC8vICAgICAgUkdCQSBSR0JBIFJHQkEgUkdCQSAoPT4gY29sdW1uMSwgY29sdW1uMiwgY29sdW1uMywgY29sdW1uNClcblx0XHRcdFx0XHRcdC8vICB3aXRoICA4eDggIHBpeGVsIHRleHR1cmUgbWF4ICAgMTYgYm9uZXMgKiA0IHBpeGVscyA9ICAoOCAqIDgpXG5cdFx0XHRcdFx0XHQvLyAgICAgICAxNngxNiBwaXhlbCB0ZXh0dXJlIG1heCAgIDY0IGJvbmVzICogNCBwaXhlbHMgPSAoMTYgKiAxNilcblx0XHRcdFx0XHRcdC8vICAgICAgIDMyeDMyIHBpeGVsIHRleHR1cmUgbWF4ICAyNTYgYm9uZXMgKiA0IHBpeGVscyA9ICgzMiAqIDMyKVxuXHRcdFx0XHRcdFx0Ly8gICAgICAgNjR4NjQgcGl4ZWwgdGV4dHVyZSBtYXggMTAyNCBib25lcyAqIDQgcGl4ZWxzID0gKDY0ICogNjQpXG5cblxuXHRcdFx0XHRcdFx0dmFyIHNpemUgPSBNYXRoLnNxcnQoIGJvbmVzLmxlbmd0aCAqIDQgKTsgLy8gNCBwaXhlbHMgbmVlZGVkIGZvciAxIG1hdHJpeFxuXHRcdFx0XHRcdFx0c2l6ZSA9IF9NYXRoLmNlaWxQb3dlck9mVHdvKCBzaXplICk7XG5cdFx0XHRcdFx0XHRzaXplID0gTWF0aC5tYXgoIHNpemUsIDQgKTtcblxuXHRcdFx0XHRcdFx0dmFyIGJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIHNpemUgKiBzaXplICogNCApOyAvLyA0IGZsb2F0cyBwZXIgUkdCQSBwaXhlbFxuXHRcdFx0XHRcdFx0Ym9uZU1hdHJpY2VzLnNldCggc2tlbGV0b24uYm9uZU1hdHJpY2VzICk7IC8vIGNvcHkgY3VycmVudCB2YWx1ZXNcblxuXHRcdFx0XHRcdFx0dmFyIGJvbmVUZXh0dXJlID0gbmV3IERhdGFUZXh0dXJlKCBib25lTWF0cmljZXMsIHNpemUsIHNpemUsIFJHQkFGb3JtYXQsIEZsb2F0VHlwZSApO1xuXHRcdFx0XHRcdFx0Ym9uZVRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHRza2VsZXRvbi5ib25lTWF0cmljZXMgPSBib25lTWF0cmljZXM7XG5cdFx0XHRcdFx0XHRza2VsZXRvbi5ib25lVGV4dHVyZSA9IGJvbmVUZXh0dXJlO1xuXHRcdFx0XHRcdFx0c2tlbGV0b24uYm9uZVRleHR1cmVTaXplID0gc2l6ZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2JvbmVUZXh0dXJlJywgc2tlbGV0b24uYm9uZVRleHR1cmUgKTtcblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdib25lVGV4dHVyZVNpemUnLCBza2VsZXRvbi5ib25lVGV4dHVyZVNpemUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2dsLCBza2VsZXRvbiwgJ2JvbmVNYXRyaWNlcycgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcmVmcmVzaE1hdGVyaWFsICkge1xuXG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd0b25lTWFwcGluZ0V4cG9zdXJlJywgX3RoaXMudG9uZU1hcHBpbmdFeHBvc3VyZSApO1xuXHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndG9uZU1hcHBpbmdXaGl0ZVBvaW50JywgX3RoaXMudG9uZU1hcHBpbmdXaGl0ZVBvaW50ICk7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwubGlnaHRzICkge1xuXG5cdFx0XHRcdC8vIHRoZSBjdXJyZW50IG1hdGVyaWFsIHJlcXVpcmVzIGxpZ2h0aW5nIGluZm9cblxuXHRcdFx0XHQvLyBub3RlOiBhbGwgbGlnaHRpbmcgdW5pZm9ybXMgYXJlIGFsd2F5cyBzZXQgY29ycmVjdGx5XG5cdFx0XHRcdC8vIHRoZXkgc2ltcGx5IHJlZmVyZW5jZSB0aGUgcmVuZGVyZXIncyBzdGF0ZSBmb3IgdGhlaXJcblx0XHRcdFx0Ly8gdmFsdWVzXG5cdFx0XHRcdC8vXG5cdFx0XHRcdC8vIHVzZSB0aGUgY3VycmVudCBtYXRlcmlhbCdzIC5uZWVkc1VwZGF0ZSBmbGFncyB0byBzZXRcblx0XHRcdFx0Ly8gdGhlIEdMIHN0YXRlIHdoZW4gcmVxdWlyZWRcblxuXHRcdFx0XHRtYXJrVW5pZm9ybXNMaWdodHNOZWVkc1VwZGF0ZSggbV91bmlmb3JtcywgcmVmcmVzaExpZ2h0cyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlZnJlc2ggdW5pZm9ybXMgY29tbW9uIHRvIHNldmVyYWwgbWF0ZXJpYWxzXG5cblx0XHRcdGlmICggZm9nICYmIG1hdGVyaWFsLmZvZyApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNGb2coIG1fdW5pZm9ybXMsIGZvZyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoQmFzaWNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaExhbWJlcnRNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0xhbWJlcnQoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoVG9vbk1hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zVG9vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zUGhvbmcoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNQaHlzaWNhbCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zU3RhbmRhcmQoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hEZXB0aE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zRGVwdGgoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNEaXN0YW5jZSggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTm9ybWFsTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNOb3JtYWwoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTGluZUJhc2ljTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zTGluZSggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsLmlzTGluZURhc2hlZE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zRGFzaCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzUG9pbnRzTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zUG9pbnRzKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1NoYWRvd01hdGVyaWFsICkge1xuXG5cdFx0XHRcdG1fdW5pZm9ybXMuY29sb3IudmFsdWUgPSBtYXRlcmlhbC5jb2xvcjtcblx0XHRcdFx0bV91bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZWN0QXJlYUxpZ2h0IFRleHR1cmVcblx0XHRcdC8vIFRPRE8gKG1yZG9vYik6IEZpbmQgYSBuaWNlciBpbXBsZW1lbnRhdGlvblxuXG5cdFx0XHRpZiAoIG1fdW5pZm9ybXMubHRjXzEgIT09IHVuZGVmaW5lZCApIG1fdW5pZm9ybXMubHRjXzEudmFsdWUgPSBVbmlmb3Jtc0xpYi5MVENfMTtcblx0XHRcdGlmICggbV91bmlmb3Jtcy5sdGNfMiAhPT0gdW5kZWZpbmVkICkgbV91bmlmb3Jtcy5sdGNfMi52YWx1ZSA9IFVuaWZvcm1zTGliLkxUQ18yO1xuXG5cdFx0XHRXZWJHTFVuaWZvcm1zLnVwbG9hZCggX2dsLCBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0LCBtX3VuaWZvcm1zLCBfdGhpcyApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICYmIG1hdGVyaWFsLnVuaWZvcm1zTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0V2ViR0xVbmlmb3Jtcy51cGxvYWQoIF9nbCwgbWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCwgbV91bmlmb3JtcywgX3RoaXMgKTtcblx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gY29tbW9uIG1hdHJpY2VzXG5cblx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdtb2RlbFZpZXdNYXRyaXgnLCBvYmplY3QubW9kZWxWaWV3TWF0cml4ICk7XG5cdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbm9ybWFsTWF0cml4Jywgb2JqZWN0Lm5vcm1hbE1hdHJpeCApO1xuXHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ21vZGVsTWF0cml4Jywgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRyZXR1cm4gcHJvZ3JhbTtcblxuXHR9XG5cblx0Ly8gVW5pZm9ybXMgKHJlZnJlc2ggdW5pZm9ybXMgb2JqZWN0cylcblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5jb2xvciApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZSApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmUudmFsdWUuY29weSggbWF0ZXJpYWwuZW1pc3NpdmUgKS5tdWx0aXBseVNjYWxhciggbWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5tYXAudmFsdWUgPSBtYXRlcmlhbC5tYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmFscGhhTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5hbHBoYU1hcC52YWx1ZSA9IG1hdGVyaWFsLmFscGhhTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5zcGVjdWxhck1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuc3BlY3VsYXJNYXAudmFsdWUgPSBtYXRlcmlhbC5zcGVjdWxhck1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZW52TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXA7XG5cblx0XHRcdC8vIGRvbid0IGZsaXAgQ3ViZVRleHR1cmUgZW52TWFwcywgZmxpcCBldmVyeXRoaW5nIGVsc2U6XG5cdFx0XHQvLyAgV2ViR0xSZW5kZXJUYXJnZXRDdWJlIHdpbGwgYmUgZmxpcHBlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0XHRcdC8vICBXZWJHTFJlbmRlclRhcmdldEN1YmUudGV4dHVyZSB3aWxsIGJlIGZsaXBwZWQgYmVjYXVzZSBpdCdzIGEgVGV4dHVyZSBhbmQgTk9UIGEgQ3ViZVRleHR1cmVcblx0XHRcdC8vIHRoaXMgY2hlY2sgbXVzdCBiZSBoYW5kbGVkIGRpZmZlcmVudGx5LCBvciByZW1vdmVkIGVudGlyZWx5LCBpZiBXZWJHTFJlbmRlclRhcmdldEN1YmUgdXNlcyBhIEN1YmVUZXh0dXJlIGluIHRoZSBmdXR1cmVcblx0XHRcdHVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWUgPSAoICEgKCBtYXRlcmlhbC5lbnZNYXAgJiYgbWF0ZXJpYWwuZW52TWFwLmlzQ3ViZVRleHR1cmUgKSApID8gMSA6IC0gMTtcblxuXHRcdFx0dW5pZm9ybXMucmVmbGVjdGl2aXR5LnZhbHVlID0gbWF0ZXJpYWwucmVmbGVjdGl2aXR5O1xuXHRcdFx0dW5pZm9ybXMucmVmcmFjdGlvblJhdGlvLnZhbHVlID0gbWF0ZXJpYWwucmVmcmFjdGlvblJhdGlvO1xuXG5cdFx0XHR1bmlmb3Jtcy5tYXhNaXBMZXZlbC52YWx1ZSA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbC5lbnZNYXAgKS5fX21heE1pcExldmVsO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5saWdodE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubGlnaHRNYXAudmFsdWUgPSBtYXRlcmlhbC5saWdodE1hcDtcblx0XHRcdHVuaWZvcm1zLmxpZ2h0TWFwSW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmFvTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5hb01hcC52YWx1ZSA9IG1hdGVyaWFsLmFvTWFwO1xuXHRcdFx0dW5pZm9ybXMuYW9NYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5hb01hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHRcdC8vIHV2IHJlcGVhdCBhbmQgb2Zmc2V0IHNldHRpbmcgcHJpb3JpdGllc1xuXHRcdC8vIDEuIGNvbG9yIG1hcFxuXHRcdC8vIDIuIHNwZWN1bGFyIG1hcFxuXHRcdC8vIDMuIG5vcm1hbCBtYXBcblx0XHQvLyA0LiBidW1wIG1hcFxuXHRcdC8vIDUuIGFscGhhIG1hcFxuXHRcdC8vIDYuIGVtaXNzaXZlIG1hcFxuXG5cdFx0dmFyIHV2U2NhbGVNYXA7XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnNwZWN1bGFyTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuc3BlY3VsYXJNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuYnVtcE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnJvdWdobmVzc01hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLnJvdWdobmVzc01hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLm1ldGFsbmVzc01hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm1ldGFsbmVzc01hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmFscGhhTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB1dlNjYWxlTWFwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0XHRpZiAoIHV2U2NhbGVNYXAuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHR1dlNjYWxlTWFwID0gdXZTY2FsZU1hcC50ZXh0dXJlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXZTY2FsZU1hcC5tYXRyaXhBdXRvVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHV2U2NhbGVNYXAudXBkYXRlTWF0cml4KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weSggdXZTY2FsZU1hcC5tYXRyaXggKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTGluZSggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yO1xuXHRcdHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNEYXNoKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5kYXNoU2l6ZS52YWx1ZSA9IG1hdGVyaWFsLmRhc2hTaXplO1xuXHRcdHVuaWZvcm1zLnRvdGFsU2l6ZS52YWx1ZSA9IG1hdGVyaWFsLmRhc2hTaXplICsgbWF0ZXJpYWwuZ2FwU2l6ZTtcblx0XHR1bmlmb3Jtcy5zY2FsZS52YWx1ZSA9IG1hdGVyaWFsLnNjYWxlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNQb2ludHMoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmRpZmZ1c2UudmFsdWUgPSBtYXRlcmlhbC5jb2xvcjtcblx0XHR1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcblx0XHR1bmlmb3Jtcy5zaXplLnZhbHVlID0gbWF0ZXJpYWwuc2l6ZSAqIF9waXhlbFJhdGlvO1xuXHRcdHVuaWZvcm1zLnNjYWxlLnZhbHVlID0gX2hlaWdodCAqIDAuNTtcblxuXHRcdHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdGlmICggbWF0ZXJpYWwubWFwICE9PSBudWxsICkge1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLm1hcC5tYXRyaXhBdXRvVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsLm1hcC51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5tYXAubWF0cml4ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0ZvZyggdW5pZm9ybXMsIGZvZyApIHtcblxuXHRcdHVuaWZvcm1zLmZvZ0NvbG9yLnZhbHVlID0gZm9nLmNvbG9yO1xuXG5cdFx0aWYgKCBmb2cuaXNGb2cgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmZvZ05lYXIudmFsdWUgPSBmb2cubmVhcjtcblx0XHRcdHVuaWZvcm1zLmZvZ0Zhci52YWx1ZSA9IGZvZy5mYXI7XG5cblx0XHR9IGVsc2UgaWYgKCBmb2cuaXNGb2dFeHAyICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5mb2dEZW5zaXR5LnZhbHVlID0gZm9nLmRlbnNpdHk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0xhbWJlcnQoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Bob25nKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5zcGVjdWxhci52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyO1xuXHRcdHVuaWZvcm1zLnNoaW5pbmVzcy52YWx1ZSA9IE1hdGgubWF4KCBtYXRlcmlhbC5zaGluaW5lc3MsIDFlLTQgKTsgLy8gdG8gcHJldmVudCBwb3coIDAuMCwgMC4wIClcblxuXHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5idW1wTWFwO1xuXHRcdFx0dW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuYnVtcFNjYWxlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblx0XHRcdHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNUb29uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRyZWZyZXNoVW5pZm9ybXNQaG9uZyggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmdyYWRpZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ncmFkaWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmdyYWRpZW50TWFwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMucm91Z2huZXNzLnZhbHVlID0gbWF0ZXJpYWwucm91Z2huZXNzO1xuXHRcdHVuaWZvcm1zLm1ldGFsbmVzcy52YWx1ZSA9IG1hdGVyaWFsLm1ldGFsbmVzcztcblxuXHRcdGlmICggbWF0ZXJpYWwucm91Z2huZXNzTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5yb3VnaG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5yb3VnaG5lc3NNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1ldGFsbmVzc01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubWV0YWxuZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwubWV0YWxuZXNzTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVudk1hcCApIHtcblxuXHRcdFx0Ly91bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXA7IC8vIHBhcnQgb2YgdW5pZm9ybXMgY29tbW9uXG5cdFx0XHR1bmlmb3Jtcy5lbnZNYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1BoeXNpY2FsKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5jbGVhckNvYXQudmFsdWUgPSBtYXRlcmlhbC5jbGVhckNvYXQ7XG5cdFx0dW5pZm9ybXMuY2xlYXJDb2F0Um91Z2huZXNzLnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzO1xuXG5cdFx0cmVmcmVzaFVuaWZvcm1zU3RhbmRhcmQoIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNEZXB0aCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRGlzdGFuY2UoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0XHR1bmlmb3Jtcy5yZWZlcmVuY2VQb3NpdGlvbi52YWx1ZS5jb3B5KCBtYXRlcmlhbC5yZWZlcmVuY2VQb3NpdGlvbiApO1xuXHRcdHVuaWZvcm1zLm5lYXJEaXN0YW5jZS52YWx1ZSA9IG1hdGVyaWFsLm5lYXJEaXN0YW5jZTtcblx0XHR1bmlmb3Jtcy5mYXJEaXN0YW5jZS52YWx1ZSA9IG1hdGVyaWFsLmZhckRpc3RhbmNlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNOb3JtYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIElmIHVuaWZvcm1zIGFyZSBtYXJrZWQgYXMgY2xlYW4sIHRoZXkgZG9uJ3QgbmVlZCB0byBiZSBsb2FkZWQgdG8gdGhlIEdQVS5cblxuXHRmdW5jdGlvbiBtYXJrVW5pZm9ybXNMaWdodHNOZWVkc1VwZGF0ZSggdW5pZm9ybXMsIHZhbHVlICkge1xuXG5cdFx0dW5pZm9ybXMuYW1iaWVudExpZ2h0Q29sb3IubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblxuXHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMucG9pbnRMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5zcG90TGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cblx0fVxuXG5cdC8vIFRleHR1cmVzXG5cblx0ZnVuY3Rpb24gYWxsb2NUZXh0dXJlVW5pdCgpIHtcblxuXHRcdHZhciB0ZXh0dXJlVW5pdCA9IF91c2VkVGV4dHVyZVVuaXRzO1xuXG5cdFx0aWYgKCB0ZXh0dXJlVW5pdCA+PSBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZXMgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRyeWluZyB0byB1c2UgJyArIHRleHR1cmVVbml0ICsgJyB0ZXh0dXJlIHVuaXRzIHdoaWxlIHRoaXMgR1BVIHN1cHBvcnRzIG9ubHkgJyArIGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlcyApO1xuXG5cdFx0fVxuXG5cdFx0X3VzZWRUZXh0dXJlVW5pdHMgKz0gMTtcblxuXHRcdHJldHVybiB0ZXh0dXJlVW5pdDtcblxuXHR9XG5cblx0dGhpcy5hbGxvY1RleHR1cmVVbml0ID0gYWxsb2NUZXh0dXJlVW5pdDtcblxuXHQvLyB0aGlzLnNldFRleHR1cmUyRCA9IHNldFRleHR1cmUyRDtcblx0dGhpcy5zZXRUZXh0dXJlMkQgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB3YXJuZWQgPSBmYWxzZTtcblxuXHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OiBwZWVsIHRleHR1cmUudGV4dHVyZVxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRcdGlmICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzV2ViR0xSZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdFx0aWYgKCAhIHdhcm5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5XZWJHTFJlbmRlcmVyLnNldFRleHR1cmUyRDogZG9uJ3QgdXNlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC5cIiApO1xuXHRcdFx0XHRcdHdhcm5lZCA9IHRydWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmUgPSB0ZXh0dXJlLnRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICk7XG5cblx0XHR9O1xuXG5cdH0oKSApO1xuXG5cdHRoaXMuc2V0VGV4dHVyZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHdhcm5lZCA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmUoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRcdGlmICggISB3YXJuZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlIGlzIGRlcHJlY2F0ZWQsIHVzZSBzZXRUZXh0dXJlMkQgaW5zdGVhZC5cIiApO1xuXHRcdFx0XHR3YXJuZWQgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmVzLnNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApO1xuXG5cdFx0fTtcblxuXHR9KCkgKTtcblxuXHR0aGlzLnNldFRleHR1cmVDdWJlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgd2FybmVkID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OiBwZWVsIHRleHR1cmUudGV4dHVyZVxuXHRcdFx0aWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKSB7XG5cblx0XHRcdFx0aWYgKCAhIHdhcm5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5XZWJHTFJlbmRlcmVyLnNldFRleHR1cmVDdWJlOiBkb24ndCB1c2UgY3ViZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuXCIgKTtcblx0XHRcdFx0XHR3YXJuZWQgPSB0cnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlID0gdGV4dHVyZS50ZXh0dXJlO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGN1cnJlbnRseSByZWx5aW5nIG9uIHRoZSBmYWN0IHRoYXQgV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnRleHR1cmUgaXMgYSBUZXh0dXJlIGFuZCBOT1QgYSBDdWJlVGV4dHVyZVxuXHRcdFx0Ly8gVE9ETzogdW5pZnkgdGhlc2UgY29kZSBwYXRoc1xuXHRcdFx0aWYgKCAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc0N1YmVUZXh0dXJlICkgfHxcblx0XHRcdFx0KCBBcnJheS5pc0FycmF5KCB0ZXh0dXJlLmltYWdlICkgJiYgdGV4dHVyZS5pbWFnZS5sZW5ndGggPT09IDYgKSApIHtcblxuXHRcdFx0XHQvLyBDb21wcmVzc2VkVGV4dHVyZSBjYW4gaGF2ZSBBcnJheSBpbiBpbWFnZSA6L1xuXG5cdFx0XHRcdC8vIHRoaXMgZnVuY3Rpb24gYWxvbmUgc2hvdWxkIHRha2UgY2FyZSBvZiBjdWJlIHRleHR1cmVzXG5cdFx0XHRcdHRleHR1cmVzLnNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gYXNzdW1lZDogdGV4dHVyZSBwcm9wZXJ0eSBvZiBUSFJFRS5XZWJHTFJlbmRlclRhcmdldEN1YmVcblxuXHRcdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlQ3ViZUR5bmFtaWMoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCkgKTtcblxuXHR0aGlzLmdldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfY3VycmVudFJlbmRlclRhcmdldDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0UmVuZGVyVGFyZ2V0ID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRfY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICYmIHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGV4dHVyZXMuc2V0dXBSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGZyYW1lYnVmZmVyID0gbnVsbDtcblx0XHR2YXIgaXNDdWJlID0gZmFsc2U7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0dmFyIF9fd2ViZ2xGcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXI7XG5cblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICkge1xuXG5cdFx0XHRcdGZyYW1lYnVmZmVyID0gX193ZWJnbEZyYW1lYnVmZmVyWyByZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgXTtcblx0XHRcdFx0aXNDdWJlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmcmFtZWJ1ZmZlciA9IF9fd2ViZ2xGcmFtZWJ1ZmZlcjtcblxuXHRcdFx0fVxuXG5cdFx0XHRfY3VycmVudFZpZXdwb3J0LmNvcHkoIHJlbmRlclRhcmdldC52aWV3cG9ydCApO1xuXHRcdFx0X2N1cnJlbnRTY2lzc29yLmNvcHkoIHJlbmRlclRhcmdldC5zY2lzc29yICk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gcmVuZGVyVGFyZ2V0LnNjaXNzb3JUZXN0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKTtcblx0XHRcdF9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApO1xuXHRcdFx0X2N1cnJlbnRTY2lzc29yVGVzdCA9IF9zY2lzc29yVGVzdDtcblxuXHRcdH1cblxuXHRcdGlmICggX2N1cnJlbnRGcmFtZWJ1ZmZlciAhPT0gZnJhbWVidWZmZXIgKSB7XG5cblx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTtcblx0XHRcdF9jdXJyZW50RnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlcjtcblxuXHRcdH1cblxuXHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0ICk7XG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yICk7XG5cdFx0c3RhdGUuc2V0U2Npc3NvclRlc3QoIF9jdXJyZW50U2Npc3NvclRlc3QgKTtcblxuXHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyByZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCByZW5kZXJUYXJnZXQuYWN0aXZlTWlwTWFwTGV2ZWwgKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscyA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBidWZmZXIgKSB7XG5cblx0XHRpZiAoICEgKCByZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXQgKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBUSFJFRS5XZWJHTFJlbmRlclRhcmdldC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR2YXIgZnJhbWVidWZmZXIgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyO1xuXG5cdFx0aWYgKCBmcmFtZWJ1ZmZlciApIHtcblxuXHRcdFx0dmFyIHJlc3RvcmUgPSBmYWxzZTtcblxuXHRcdFx0aWYgKCBmcmFtZWJ1ZmZlciAhPT0gX2N1cnJlbnRGcmFtZWJ1ZmZlciApIHtcblxuXHRcdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XG5cblx0XHRcdFx0cmVzdG9yZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHR2YXIgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuXHRcdFx0XHR2YXIgdGV4dHVyZUZvcm1hdCA9IHRleHR1cmUuZm9ybWF0O1xuXHRcdFx0XHR2YXIgdGV4dHVyZVR5cGUgPSB0ZXh0dXJlLnR5cGU7XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlRm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVGb3JtYXQgKSAhPT0gX2dsLmdldFBhcmFtZXRlciggX2dsLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUICkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFJHQkEgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBmb3JtYXQuJyApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlVHlwZSAhPT0gVW5zaWduZWRCeXRlVHlwZSAmJiB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlVHlwZSApICE9PSBfZ2wuZ2V0UGFyYW1ldGVyKCBfZ2wuSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFICkgJiYgLy8gSUUxMSwgRWRnZSBhbmQgQ2hyb21lIE1hYyA8IDUyICgjOTUxMylcblx0XHRcdFx0XHQhICggdGV4dHVyZVR5cGUgPT09IEZsb2F0VHlwZSAmJiAoIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICkgfHwgZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXQnICkgKSApICYmIC8vIENocm9tZSBNYWMgPj0gNTIgYW5kIEZpcmVmb3hcblx0XHRcdFx0XHQhICggdGV4dHVyZVR5cGUgPT09IEhhbGZGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5nZXQoICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnICkgKSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gVW5zaWduZWRCeXRlVHlwZSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHR5cGUuJyApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBfZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyggX2dsLkZSQU1FQlVGRkVSICkgPT09IF9nbC5GUkFNRUJVRkZFUl9DT01QTEVURSApIHtcblxuXHRcdFx0XHRcdC8vIHRoZSBmb2xsb3dpbmcgaWYgc3RhdGVtZW50IGVuc3VyZXMgdmFsaWQgcmVhZCByZXF1ZXN0cyAobm8gb3V0LW9mLWJvdW5kcyBwaXhlbHMsIHNlZSAjODYwNClcblxuXHRcdFx0XHRcdGlmICggKCB4ID49IDAgJiYgeCA8PSAoIHJlbmRlclRhcmdldC53aWR0aCAtIHdpZHRoICkgKSAmJiAoIHkgPj0gMCAmJiB5IDw9ICggcmVuZGVyVGFyZ2V0LmhlaWdodCAtIGhlaWdodCApICkgKSB7XG5cblx0XHRcdFx0XHRcdF9nbC5yZWFkUGl4ZWxzKCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlRm9ybWF0ICksIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVUeXBlICksIGJ1ZmZlciApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFkUGl4ZWxzIGZyb20gcmVuZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRlLicgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZmluYWxseSB7XG5cblx0XHRcdFx0aWYgKCByZXN0b3JlICkge1xuXG5cdFx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBfY3VycmVudEZyYW1lYnVmZmVyICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZSA9IGZ1bmN0aW9uICggcG9zaXRpb24sIHRleHR1cmUsIGxldmVsICkge1xuXG5cdFx0dmFyIHdpZHRoID0gdGV4dHVyZS5pbWFnZS53aWR0aDtcblx0XHR2YXIgaGVpZ2h0ID0gdGV4dHVyZS5pbWFnZS5oZWlnaHQ7XG5cdFx0dmFyIGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQgKTtcblxuXHRcdHRoaXMuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCAwICk7XG5cblx0XHRfZ2wuY29weVRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBsZXZlbCB8fCAwLCBnbEZvcm1hdCwgcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgd2lkdGgsIGhlaWdodCwgMCApO1xuXG5cdH07XG5cblx0dGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZSA9IGZ1bmN0aW9uICggcG9zaXRpb24sIHNyY1RleHR1cmUsIGRzdFRleHR1cmUsIGxldmVsICkge1xuXG5cdFx0dmFyIHdpZHRoID0gc3JjVGV4dHVyZS5pbWFnZS53aWR0aDtcblx0XHR2YXIgaGVpZ2h0ID0gc3JjVGV4dHVyZS5pbWFnZS5oZWlnaHQ7XG5cdFx0dmFyIGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggZHN0VGV4dHVyZS5mb3JtYXQgKTtcblx0XHR2YXIgZ2xUeXBlID0gdXRpbHMuY29udmVydCggZHN0VGV4dHVyZS50eXBlICk7XG5cdFx0dmFyIHBpeGVscyA9IHNyY1RleHR1cmUuaXNEYXRhVGV4dHVyZSA/IHNyY1RleHR1cmUuaW1hZ2UuZGF0YSA6IHNyY1RleHR1cmUuaW1hZ2U7XG5cblx0XHR0aGlzLnNldFRleHR1cmUyRCggZHN0VGV4dHVyZSwgMCApO1xuXG5cdFx0X2dsLnRleFN1YkltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBsZXZlbCB8fCAwLCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB3aWR0aCwgaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlLCBwaXhlbHMgKTtcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gRm9nRXhwMiggY29sb3IsIGRlbnNpdHkgKSB7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29sb3IgKTtcblx0dGhpcy5kZW5zaXR5ID0gKCBkZW5zaXR5ICE9PSB1bmRlZmluZWQgKSA/IGRlbnNpdHkgOiAwLjAwMDI1O1xuXG59XG5cbkZvZ0V4cDIucHJvdG90eXBlLmlzRm9nRXhwMiA9IHRydWU7XG5cbkZvZ0V4cDIucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuXG5cdHJldHVybiBuZXcgRm9nRXhwMiggdGhpcy5jb2xvci5nZXRIZXgoKSwgdGhpcy5kZW5zaXR5ICk7XG5cbn07XG5cbkZvZ0V4cDIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICggLyogbWV0YSAqLyApIHtcblxuXHRyZXR1cm4ge1xuXHRcdHR5cGU6ICdGb2dFeHAyJyxcblx0XHRjb2xvcjogdGhpcy5jb2xvci5nZXRIZXgoKSxcblx0XHRkZW5zaXR5OiB0aGlzLmRlbnNpdHlcblx0fTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGb2coIGNvbG9yLCBuZWFyLCBmYXIgKSB7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29sb3IgKTtcblxuXHR0aGlzLm5lYXIgPSAoIG5lYXIgIT09IHVuZGVmaW5lZCApID8gbmVhciA6IDE7XG5cdHRoaXMuZmFyID0gKCBmYXIgIT09IHVuZGVmaW5lZCApID8gZmFyIDogMTAwMDtcblxufVxuXG5Gb2cucHJvdG90eXBlLmlzRm9nID0gdHJ1ZTtcblxuRm9nLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRyZXR1cm4gbmV3IEZvZyggdGhpcy5jb2xvci5nZXRIZXgoKSwgdGhpcy5uZWFyLCB0aGlzLmZhciApO1xuXG59O1xuXG5Gb2cucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICggLyogbWV0YSAqLyApIHtcblxuXHRyZXR1cm4ge1xuXHRcdHR5cGU6ICdGb2cnLFxuXHRcdGNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLFxuXHRcdG5lYXI6IHRoaXMubmVhcixcblx0XHRmYXI6IHRoaXMuZmFyXG5cdH07XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTY2VuZSgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NjZW5lJztcblxuXHR0aGlzLmJhY2tncm91bmQgPSBudWxsO1xuXHR0aGlzLmZvZyA9IG51bGw7XG5cdHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IG51bGw7XG5cblx0dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTsgLy8gY2hlY2tlZCBieSB0aGUgcmVuZGVyZXJcblxufVxuXG5TY2VuZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTY2VuZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdGlmICggc291cmNlLmJhY2tncm91bmQgIT09IG51bGwgKSB0aGlzLmJhY2tncm91bmQgPSBzb3VyY2UuYmFja2dyb3VuZC5jbG9uZSgpO1xuXHRcdGlmICggc291cmNlLmZvZyAhPT0gbnVsbCApIHRoaXMuZm9nID0gc291cmNlLmZvZy5jbG9uZSgpO1xuXHRcdGlmICggc291cmNlLm92ZXJyaWRlTWF0ZXJpYWwgIT09IG51bGwgKSB0aGlzLm92ZXJyaWRlTWF0ZXJpYWwgPSBzb3VyY2Uub3ZlcnJpZGVNYXRlcmlhbC5jbG9uZSgpO1xuXG5cdFx0dGhpcy5hdXRvVXBkYXRlID0gc291cmNlLmF1dG9VcGRhdGU7XG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGlmICggdGhpcy5iYWNrZ3JvdW5kICE9PSBudWxsICkgZGF0YS5vYmplY3QuYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZC50b0pTT04oIG1ldGEgKTtcblx0XHRpZiAoIHRoaXMuZm9nICE9PSBudWxsICkgZGF0YS5vYmplY3QuZm9nID0gdGhpcy5mb2cudG9KU09OKCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqXHR1dk9mZnNldDogbmV3IFRIUkVFLlZlY3RvcjIoKSxcbiAqXHR1dlNjYWxlOiBuZXcgVEhSRUUuVmVjdG9yMigpXG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gU3ByaXRlTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcHJpdGVNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMucm90YXRpb24gPSAwO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7XG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5TcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwcml0ZU1hdGVyaWFsO1xuU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmlzU3ByaXRlTWF0ZXJpYWwgPSB0cnVlO1xuXG5TcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNwcml0ZSggbWF0ZXJpYWwgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcHJpdGUnO1xuXG5cdHRoaXMubWF0ZXJpYWwgPSAoIG1hdGVyaWFsICE9PSB1bmRlZmluZWQgKSA/IG1hdGVyaWFsIDogbmV3IFNwcml0ZU1hdGVyaWFsKCk7XG5cblx0dGhpcy5jZW50ZXIgPSBuZXcgVmVjdG9yMiggMC41LCAwLjUgKTtcblxufVxuXG5TcHJpdGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU3ByaXRlLFxuXG5cdGlzU3ByaXRlOiB0cnVlLFxuXG5cdHJheWNhc3Q6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGludGVyc2VjdFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgd29ybGRQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHdvcmxkU2NhbGUgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0d29ybGRQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblx0XHRcdHJheWNhc3Rlci5yYXkuY2xvc2VzdFBvaW50VG9Qb2ludCggd29ybGRQb3NpdGlvbiwgaW50ZXJzZWN0UG9pbnQgKTtcblxuXHRcdFx0d29ybGRTY2FsZS5zZXRGcm9tTWF0cml4U2NhbGUoIHRoaXMubWF0cml4V29ybGQgKTtcblx0XHRcdHZhciBndWVzc1NpemVTcSA9IHdvcmxkU2NhbGUueCAqIHdvcmxkU2NhbGUueSAvIDQ7XG5cblx0XHRcdGlmICggd29ybGRQb3NpdGlvbi5kaXN0YW5jZVRvU3F1YXJlZCggaW50ZXJzZWN0UG9pbnQgKSA+IGd1ZXNzU2l6ZVNxICkgcmV0dXJuO1xuXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlcnNlY3RQb2ludCApO1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuO1xuXG5cdFx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRcdHBvaW50OiBpbnRlcnNlY3RQb2ludC5jbG9uZSgpLFxuXHRcdFx0XHRmYWNlOiBudWxsLFxuXHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0fSApO1xuXG5cdFx0fTtcblxuXHR9KCkgKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdGlmICggc291cmNlLmNlbnRlciAhPT0gdW5kZWZpbmVkICkgdGhpcy5jZW50ZXIuY29weSggc291cmNlLmNlbnRlciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTE9EKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTE9EJztcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywge1xuXHRcdGxldmVsczoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBbXVxuXHRcdH1cblx0fSApO1xuXG59XG5cbkxPRC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMT0QsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIGZhbHNlICk7XG5cblx0XHR2YXIgbGV2ZWxzID0gc291cmNlLmxldmVscztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbGV2ZWwgPSBsZXZlbHNbIGkgXTtcblxuXHRcdFx0dGhpcy5hZGRMZXZlbCggbGV2ZWwub2JqZWN0LmNsb25lKCksIGxldmVsLmRpc3RhbmNlICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZExldmVsOiBmdW5jdGlvbiAoIG9iamVjdCwgZGlzdGFuY2UgKSB7XG5cblx0XHRpZiAoIGRpc3RhbmNlID09PSB1bmRlZmluZWQgKSBkaXN0YW5jZSA9IDA7XG5cblx0XHRkaXN0YW5jZSA9IE1hdGguYWJzKCBkaXN0YW5jZSApO1xuXG5cdFx0dmFyIGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGwgPSAwOyBsIDwgbGV2ZWxzLmxlbmd0aDsgbCArKyApIHtcblxuXHRcdFx0aWYgKCBkaXN0YW5jZSA8IGxldmVsc1sgbCBdLmRpc3RhbmNlICkge1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRsZXZlbHMuc3BsaWNlKCBsLCAwLCB7IGRpc3RhbmNlOiBkaXN0YW5jZSwgb2JqZWN0OiBvYmplY3QgfSApO1xuXG5cdFx0dGhpcy5hZGQoIG9iamVjdCApO1xuXG5cdH0sXG5cblx0Z2V0T2JqZWN0Rm9yRGlzdGFuY2U6IGZ1bmN0aW9uICggZGlzdGFuY2UgKSB7XG5cblx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBkaXN0YW5jZSA8IGxldmVsc1sgaSBdLmRpc3RhbmNlICkge1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbGV2ZWxzWyBpIC0gMSBdLm9iamVjdDtcblxuXHR9LFxuXG5cdHJheWNhc3Q6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRcdG1hdHJpeFBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBtYXRyaXhQb3NpdGlvbiApO1xuXG5cdFx0XHR0aGlzLmdldE9iamVjdEZvckRpc3RhbmNlKCBkaXN0YW5jZSApLnJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApO1xuXG5cdFx0fTtcblxuXHR9KCkgKSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoIGNhbWVyYSApIHtcblxuXHRcdFx0dmFyIGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0XHRpZiAoIGxldmVscy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRcdHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHYyLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdHZhciBkaXN0YW5jZSA9IHYxLmRpc3RhbmNlVG8oIHYyICk7XG5cblx0XHRcdFx0bGV2ZWxzWyAwIF0ub2JqZWN0LnZpc2libGUgPSB0cnVlO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMSwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA+PSBsZXZlbHNbIGkgXS5kaXN0YW5jZSApIHtcblxuXHRcdFx0XHRcdFx0bGV2ZWxzWyBpIC0gMSBdLm9iamVjdC52aXNpYmxlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRsZXZlbHNbIGkgXS5vYmplY3QudmlzaWJsZSA9IHRydWU7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlID0gZmFsc2U7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC5sZXZlbHMgPSBbXTtcblxuXHRcdHZhciBsZXZlbHMgPSB0aGlzLmxldmVscztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbGV2ZWwgPSBsZXZlbHNbIGkgXTtcblxuXHRcdFx0ZGF0YS5vYmplY3QubGV2ZWxzLnB1c2goIHtcblx0XHRcdFx0b2JqZWN0OiBsZXZlbC5vYmplY3QudXVpZCxcblx0XHRcdFx0ZGlzdGFuY2U6IGxldmVsLmRpc3RhbmNlXG5cdFx0XHR9ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWljaGFlbCBndWVycmVybyAvIGh0dHA6Ly9yZWFsaXR5bWVsdGRvd24uY29tXG4gKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb21cbiAqL1xuXG5mdW5jdGlvbiBTa2VsZXRvbiggYm9uZXMsIGJvbmVJbnZlcnNlcyApIHtcblxuXHQvLyBjb3B5IHRoZSBib25lIGFycmF5XG5cblx0Ym9uZXMgPSBib25lcyB8fCBbXTtcblxuXHR0aGlzLmJvbmVzID0gYm9uZXMuc2xpY2UoIDAgKTtcblx0dGhpcy5ib25lTWF0cmljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCB0aGlzLmJvbmVzLmxlbmd0aCAqIDE2ICk7XG5cblx0Ly8gdXNlIHRoZSBzdXBwbGllZCBib25lIGludmVyc2VzIG9yIGNhbGN1bGF0ZSB0aGUgaW52ZXJzZXNcblxuXHRpZiAoIGJvbmVJbnZlcnNlcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0dGhpcy5jYWxjdWxhdGVJbnZlcnNlcygpO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRpZiAoIHRoaXMuYm9uZXMubGVuZ3RoID09PSBib25lSW52ZXJzZXMubGVuZ3RoICkge1xuXG5cdFx0XHR0aGlzLmJvbmVJbnZlcnNlcyA9IGJvbmVJbnZlcnNlcy5zbGljZSggMCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b24gYm9uZUludmVyc2VzIGlzIHRoZSB3cm9uZyBsZW5ndGguJyApO1xuXG5cdFx0XHR0aGlzLmJvbmVJbnZlcnNlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKCBuZXcgTWF0cml4NCgpICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggU2tlbGV0b24ucHJvdG90eXBlLCB7XG5cblx0Y2FsY3VsYXRlSW52ZXJzZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuYm9uZUludmVyc2VzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0XHRpZiAoIHRoaXMuYm9uZXNbIGkgXSApIHtcblxuXHRcdFx0XHRpbnZlcnNlLmdldEludmVyc2UoIHRoaXMuYm9uZXNbIGkgXS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzLnB1c2goIGludmVyc2UgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHBvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBib25lLCBpLCBpbDtcblxuXHRcdC8vIHJlY292ZXIgdGhlIGJpbmQtdGltZSB3b3JsZCBtYXRyaWNlc1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0Ym9uZSA9IHRoaXMuYm9uZXNbIGkgXTtcblxuXHRcdFx0aWYgKCBib25lICkge1xuXG5cdFx0XHRcdGJvbmUubWF0cml4V29ybGQuZ2V0SW52ZXJzZSggdGhpcy5ib25lSW52ZXJzZXNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBjb21wdXRlIHRoZSBsb2NhbCBtYXRyaWNlcywgcG9zaXRpb25zLCByb3RhdGlvbnMgYW5kIHNjYWxlc1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0Ym9uZSA9IHRoaXMuYm9uZXNbIGkgXTtcblxuXHRcdFx0aWYgKCBib25lICkge1xuXG5cdFx0XHRcdGlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkge1xuXG5cdFx0XHRcdFx0Ym9uZS5tYXRyaXguZ2V0SW52ZXJzZSggYm9uZS5wYXJlbnQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0XHRib25lLm1hdHJpeC5tdWx0aXBseSggYm9uZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRib25lLm1hdHJpeC5jb3B5KCBib25lLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJvbmUubWF0cml4LmRlY29tcG9zZSggYm9uZS5wb3NpdGlvbiwgYm9uZS5xdWF0ZXJuaW9uLCBib25lLnNjYWxlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2Zmc2V0TWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgaWRlbnRpdHlNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdFx0dmFyIGJvbmVzID0gdGhpcy5ib25lcztcblx0XHRcdHZhciBib25lSW52ZXJzZXMgPSB0aGlzLmJvbmVJbnZlcnNlcztcblx0XHRcdHZhciBib25lTWF0cmljZXMgPSB0aGlzLmJvbmVNYXRyaWNlcztcblx0XHRcdHZhciBib25lVGV4dHVyZSA9IHRoaXMuYm9uZVRleHR1cmU7XG5cblx0XHRcdC8vIGZsYXR0ZW4gYm9uZSBtYXRyaWNlcyB0byBhcnJheVxuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0Ly8gY29tcHV0ZSB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIGN1cnJlbnQgYW5kIHRoZSBvcmlnaW5hbCB0cmFuc2Zvcm1cblxuXHRcdFx0XHR2YXIgbWF0cml4ID0gYm9uZXNbIGkgXSA/IGJvbmVzWyBpIF0ubWF0cml4V29ybGQgOiBpZGVudGl0eU1hdHJpeDtcblxuXHRcdFx0XHRvZmZzZXRNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4LCBib25lSW52ZXJzZXNbIGkgXSApO1xuXHRcdFx0XHRvZmZzZXRNYXRyaXgudG9BcnJheSggYm9uZU1hdHJpY2VzLCBpICogMTYgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJvbmVUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ym9uZVRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0gKSgpLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IFNrZWxldG9uKCB0aGlzLmJvbmVzLCB0aGlzLmJvbmVJbnZlcnNlcyApO1xuXG5cdH0sXG5cblx0Z2V0Qm9uZUJ5TmFtZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUubmFtZSA9PT0gbmFtZSApIHtcblxuXHRcdFx0XHRyZXR1cm4gYm9uZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbVxuICovXG5cbmZ1bmN0aW9uIEJvbmUoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdCb25lJztcblxufVxuXG5Cb25lLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJvbmUsXG5cblx0aXNCb25lOiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbVxuICovXG5cbmZ1bmN0aW9uIFNraW5uZWRNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0TWVzaC5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2tpbm5lZE1lc2gnO1xuXG5cdHRoaXMuYmluZE1vZGUgPSAnYXR0YWNoZWQnO1xuXHR0aGlzLmJpbmRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblxuXHR2YXIgYm9uZXMgPSB0aGlzLmluaXRCb25lcygpO1xuXHR2YXIgc2tlbGV0b24gPSBuZXcgU2tlbGV0b24oIGJvbmVzICk7XG5cblx0dGhpcy5iaW5kKCBza2VsZXRvbiwgdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdHRoaXMubm9ybWFsaXplU2tpbldlaWdodHMoKTtcblxufVxuXG5Ta2lubmVkTWVzaC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBNZXNoLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNraW5uZWRNZXNoLFxuXG5cdGlzU2tpbm5lZE1lc2g6IHRydWUsXG5cblx0aW5pdEJvbmVzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYm9uZXMgPSBbXSwgYm9uZSwgZ2JvbmU7XG5cdFx0dmFyIGksIGlsO1xuXG5cdFx0aWYgKCB0aGlzLmdlb21ldHJ5ICYmIHRoaXMuZ2VvbWV0cnkuYm9uZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gZmlyc3QsIGNyZWF0ZSBhcnJheSBvZiAnQm9uZScgb2JqZWN0cyBmcm9tIGdlb21ldHJ5IGRhdGFcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5nZW9tZXRyeS5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRnYm9uZSA9IHRoaXMuZ2VvbWV0cnkuYm9uZXNbIGkgXTtcblxuXHRcdFx0XHQvLyBjcmVhdGUgbmV3ICdCb25lJyBvYmplY3RcblxuXHRcdFx0XHRib25lID0gbmV3IEJvbmUoKTtcblx0XHRcdFx0Ym9uZXMucHVzaCggYm9uZSApO1xuXG5cdFx0XHRcdC8vIGFwcGx5IHZhbHVlc1xuXG5cdFx0XHRcdGJvbmUubmFtZSA9IGdib25lLm5hbWU7XG5cdFx0XHRcdGJvbmUucG9zaXRpb24uZnJvbUFycmF5KCBnYm9uZS5wb3MgKTtcblx0XHRcdFx0Ym9uZS5xdWF0ZXJuaW9uLmZyb21BcnJheSggZ2JvbmUucm90cSApO1xuXHRcdFx0XHRpZiAoIGdib25lLnNjbCAhPT0gdW5kZWZpbmVkICkgYm9uZS5zY2FsZS5mcm9tQXJyYXkoIGdib25lLnNjbCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHNlY29uZCwgY3JlYXRlIGJvbmUgaGllcmFyY2h5XG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMuZ2VvbWV0cnkuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0Z2JvbmUgPSB0aGlzLmdlb21ldHJ5LmJvbmVzWyBpIF07XG5cblx0XHRcdFx0aWYgKCAoIGdib25lLnBhcmVudCAhPT0gLSAxICkgJiYgKCBnYm9uZS5wYXJlbnQgIT09IG51bGwgKSAmJiAoIGJvbmVzWyBnYm9uZS5wYXJlbnQgXSAhPT0gdW5kZWZpbmVkICkgKSB7XG5cblx0XHRcdFx0XHQvLyBzdWJzZXF1ZW50IGJvbmVzIGluIHRoZSBoaWVyYXJjaHlcblxuXHRcdFx0XHRcdGJvbmVzWyBnYm9uZS5wYXJlbnQgXS5hZGQoIGJvbmVzWyBpIF0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gdG9wbW9zdCBib25lLCBpbW1lZGlhdGUgY2hpbGQgb2YgdGhlIHNraW5uZWQgbWVzaFxuXG5cdFx0XHRcdFx0dGhpcy5hZGQoIGJvbmVzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIG5vdyB0aGUgYm9uZXMgYXJlIHBhcnQgb2YgdGhlIHNjZW5lIGdyYXBoIGFuZCBjaGlsZHJlbiBvZiB0aGUgc2tpbm5lZCBtZXNoLlxuXHRcdC8vIGxldCdzIHVwZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBtYXRyaWNlc1xuXG5cdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0cmV0dXJuIGJvbmVzO1xuXG5cdH0sXG5cblx0YmluZDogZnVuY3Rpb24gKCBza2VsZXRvbiwgYmluZE1hdHJpeCApIHtcblxuXHRcdHRoaXMuc2tlbGV0b24gPSBza2VsZXRvbjtcblxuXHRcdGlmICggYmluZE1hdHJpeCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRcdHRoaXMuc2tlbGV0b24uY2FsY3VsYXRlSW52ZXJzZXMoKTtcblxuXHRcdFx0YmluZE1hdHJpeCA9IHRoaXMubWF0cml4V29ybGQ7XG5cblx0XHR9XG5cblx0XHR0aGlzLmJpbmRNYXRyaXguY29weSggYmluZE1hdHJpeCApO1xuXHRcdHRoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSggYmluZE1hdHJpeCApO1xuXG5cdH0sXG5cblx0cG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5za2VsZXRvbi5wb3NlKCk7XG5cblx0fSxcblxuXHRub3JtYWxpemVTa2luV2VpZ2h0czogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHNjYWxlLCBpO1xuXG5cdFx0aWYgKCB0aGlzLmdlb21ldHJ5ICYmIHRoaXMuZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCB0aGlzLmdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgc3cgPSB0aGlzLmdlb21ldHJ5LnNraW5XZWlnaHRzWyBpIF07XG5cblx0XHRcdFx0c2NhbGUgPSAxLjAgLyBzdy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHRcdFx0XHRpZiAoIHNjYWxlICE9PSBJbmZpbml0eSApIHtcblxuXHRcdFx0XHRcdHN3Lm11bHRpcGx5U2NhbGFyKCBzY2FsZSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzdy5zZXQoIDEsIDAsIDAsIDAgKTsgLy8gZG8gc29tZXRoaW5nIHJlYXNvbmFibGVcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgdmVjID0gbmV3IFZlY3RvcjQoKTtcblxuXHRcdFx0dmFyIHNraW5XZWlnaHQgPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMuc2tpbldlaWdodDtcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBza2luV2VpZ2h0LmNvdW50OyBpICsrICkge1xuXG5cdFx0XHRcdHZlYy54ID0gc2tpbldlaWdodC5nZXRYKCBpICk7XG5cdFx0XHRcdHZlYy55ID0gc2tpbldlaWdodC5nZXRZKCBpICk7XG5cdFx0XHRcdHZlYy56ID0gc2tpbldlaWdodC5nZXRaKCBpICk7XG5cdFx0XHRcdHZlYy53ID0gc2tpbldlaWdodC5nZXRXKCBpICk7XG5cblx0XHRcdFx0c2NhbGUgPSAxLjAgLyB2ZWMubWFuaGF0dGFuTGVuZ3RoKCk7XG5cblx0XHRcdFx0aWYgKCBzY2FsZSAhPT0gSW5maW5pdHkgKSB7XG5cblx0XHRcdFx0XHR2ZWMubXVsdGlwbHlTY2FsYXIoIHNjYWxlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHZlYy5zZXQoIDEsIDAsIDAsIDAgKTsgLy8gZG8gc29tZXRoaW5nIHJlYXNvbmFibGVcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2tpbldlaWdodC5zZXRYWVpXKCBpLCB2ZWMueCwgdmVjLnksIHZlYy56LCB2ZWMudyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHRcdE1lc2gucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cblx0XHRpZiAoIHRoaXMuYmluZE1vZGUgPT09ICdhdHRhY2hlZCcgKSB7XG5cblx0XHRcdHRoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdFx0fSBlbHNlIGlmICggdGhpcy5iaW5kTW9kZSA9PT0gJ2RldGFjaGVkJyApIHtcblxuXHRcdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLmJpbmRNYXRyaXggKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1vZGU6ICcgKyB0aGlzLmJpbmRNb2RlICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIGxpbmV3aWR0aDogPGZsb2F0PixcbiAqICBsaW5lY2FwOiBcInJvdW5kXCIsXG4gKiAgbGluZWpvaW46IFwicm91bmRcIlxuICogfVxuICovXG5cbmZ1bmN0aW9uIExpbmVCYXNpY01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZUJhc2ljTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cblx0dGhpcy5saW5ld2lkdGggPSAxO1xuXHR0aGlzLmxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLmxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lQmFzaWNNYXRlcmlhbDtcblxuTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmlzTGluZUJhc2ljTWF0ZXJpYWwgPSB0cnVlO1xuXG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0dGhpcy5saW5ld2lkdGggPSBzb3VyY2UubGluZXdpZHRoO1xuXHR0aGlzLmxpbmVjYXAgPSBzb3VyY2UubGluZWNhcDtcblx0dGhpcy5saW5lam9pbiA9IHNvdXJjZS5saW5lam9pbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCwgbW9kZSApIHtcblxuXHRpZiAoIG1vZGUgPT09IDEgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lOiBwYXJhbWV0ZXIgVEhSRUUuTGluZVBpZWNlcyBubyBsb25nZXIgc3VwcG9ydGVkLiBDcmVhdGVkIFRIUkVFLkxpbmVTZWdtZW50cyBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gbmV3IExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0fVxuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZSc7XG5cblx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgPyBnZW9tZXRyeSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApO1xuXG59XG5cbkxpbmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZSxcblxuXHRpc0xpbmU6IHRydWUsXG5cblx0Y29tcHV0ZUxpbmVEaXN0YW5jZXM6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHN0YXJ0ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZW5kID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjb21wdXRlTGluZURpc3RhbmNlcygpIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdC8vIHdlIGFzc3VtZSBub24taW5kZXhlZCBnZW9tZXRyeVxuXG5cdFx0XHRcdGlmICggZ2VvbWV0cnkuaW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR2YXIgcG9zaXRpb25BdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdFx0XHRcdHZhciBsaW5lRGlzdGFuY2VzID0gWyAwIF07XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHN0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpIC0gMSApO1xuXHRcdFx0XHRcdFx0ZW5kLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICk7XG5cblx0XHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSA9IGxpbmVEaXN0YW5jZXNbIGkgLSAxIF07XG5cdFx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpIF0gKz0gc3RhcnQuZGlzdGFuY2VUbyggZW5kICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbGluZURpc3RhbmNlcywgMSApICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTogQ29tcHV0YXRpb24gb25seSBwb3NzaWJsZSB3aXRoIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5LicgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0XHRcdHZhciBsaW5lRGlzdGFuY2VzID0gZ2VvbWV0cnkubGluZURpc3RhbmNlcztcblxuXHRcdFx0XHRsaW5lRGlzdGFuY2VzWyAwIF0gPSAwO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMSwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpIF0gPSBsaW5lRGlzdGFuY2VzWyBpIC0gMSBdO1xuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSArPSB2ZXJ0aWNlc1sgaSAtIDEgXS5kaXN0YW5jZVRvKCB2ZXJ0aWNlc1sgaSBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCkgKSxcblxuXHRyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgcmF5ID0gbmV3IFJheSgpO1xuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR2YXIgcHJlY2lzaW9uID0gcmF5Y2FzdGVyLmxpbmVQcmVjaXNpb247XG5cdFx0XHR2YXIgcHJlY2lzaW9uU3EgPSBwcmVjaXNpb24gKiBwcmVjaXNpb247XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0XHR2YXIgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xuXG5cdFx0XHQvLyBDaGVja2luZyBib3VuZGluZ1NwaGVyZSBkaXN0YW5jZSB0byByYXlcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0XHRzcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKTtcblx0XHRcdHNwaGVyZS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdGlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRcdC8vXG5cblx0XHRcdGludmVyc2VNYXRyaXguZ2V0SW52ZXJzZSggbWF0cml4V29ybGQgKTtcblx0XHRcdHJheS5jb3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBpbnZlcnNlTWF0cml4ICk7XG5cblx0XHRcdHZhciB2U3RhcnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dmFyIHZFbmQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dmFyIGludGVyU2VnbWVudCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgaW50ZXJSYXkgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dmFyIHN0ZXAgPSAoIHRoaXMgJiYgdGhpcy5pc0xpbmVTZWdtZW50cyApID8gMiA6IDE7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHRcdFx0dmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXHRcdFx0XHR2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtcblxuXHRcdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0dmFyIGluZGljZXMgPSBpbmRleC5hcnJheTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoIC0gMTsgaSA8IGw7IGkgKz0gc3RlcCApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGEgPSBpbmRpY2VzWyBpIF07XG5cdFx0XHRcdFx0XHR2YXIgYiA9IGluZGljZXNbIGkgKyAxIF07XG5cblx0XHRcdFx0XHRcdHZTdGFydC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgYSAqIDMgKTtcblx0XHRcdFx0XHRcdHZFbmQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGIgKiAzICk7XG5cblx0XHRcdFx0XHRcdHZhciBkaXN0U3EgPSByYXkuZGlzdGFuY2VTcVRvU2VnbWVudCggdlN0YXJ0LCB2RW5kLCBpbnRlclJheSwgaW50ZXJTZWdtZW50ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdFNxID4gcHJlY2lzaW9uU3EgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJSYXkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5jZSBjYWxjdWxhdGlvblxuXG5cdFx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgY29udGludWU7XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdFx0Ly8gV2hhdCBkbyB3ZSB3YW50PyBpbnRlcnNlY3Rpb24gcG9pbnQgb24gdGhlIHJheSBvciBvbiB0aGUgc2VnbWVudD8/XG5cdFx0XHRcdFx0XHRcdC8vIHBvaW50OiByYXljYXN0ZXIucmF5LmF0KCBkaXN0YW5jZSApLFxuXHRcdFx0XHRcdFx0XHRwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksXG5cdFx0XHRcdFx0XHRcdGluZGV4OiBpLFxuXHRcdFx0XHRcdFx0XHRmYWNlOiBudWxsLFxuXHRcdFx0XHRcdFx0XHRmYWNlSW5kZXg6IG51bGwsXG5cdFx0XHRcdFx0XHRcdG9iamVjdDogdGhpc1xuXG5cdFx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvc2l0aW9ucy5sZW5ndGggLyAzIC0gMTsgaSA8IGw7IGkgKz0gc3RlcCApIHtcblxuXHRcdFx0XHRcdFx0dlN0YXJ0LmZyb21BcnJheSggcG9zaXRpb25zLCAzICogaSApO1xuXHRcdFx0XHRcdFx0dkVuZC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgMyAqIGkgKyAzICk7XG5cblx0XHRcdFx0XHRcdHZhciBkaXN0U3EgPSByYXkuZGlzdGFuY2VTcVRvU2VnbWVudCggdlN0YXJ0LCB2RW5kLCBpbnRlclJheSwgaW50ZXJTZWdtZW50ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdFNxID4gcHJlY2lzaW9uU3EgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJSYXkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5jZSBjYWxjdWxhdGlvblxuXG5cdFx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgY29udGludWU7XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdFx0Ly8gV2hhdCBkbyB3ZSB3YW50PyBpbnRlcnNlY3Rpb24gcG9pbnQgb24gdGhlIHJheSBvciBvbiB0aGUgc2VnbWVudD8/XG5cdFx0XHRcdFx0XHRcdC8vIHBvaW50OiByYXljYXN0ZXIucmF5LmF0KCBkaXN0YW5jZSApLFxuXHRcdFx0XHRcdFx0XHRwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksXG5cdFx0XHRcdFx0XHRcdGluZGV4OiBpLFxuXHRcdFx0XHRcdFx0XHRmYWNlOiBudWxsLFxuXHRcdFx0XHRcdFx0XHRmYWNlSW5kZXg6IG51bGwsXG5cdFx0XHRcdFx0XHRcdG9iamVjdDogdGhpc1xuXG5cdFx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXHRcdFx0XHR2YXIgbmJWZXJ0aWNlcyA9IHZlcnRpY2VzLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBuYlZlcnRpY2VzIC0gMTsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0dmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc1sgaSArIDEgXSwgaW50ZXJSYXksIGludGVyU2VnbWVudCApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJSYXkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5jZSBjYWxjdWxhdGlvblxuXG5cdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJSYXkgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRcdFx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cblx0XHRcdFx0XHRcdC8vIHBvaW50OiByYXljYXN0ZXIucmF5LmF0KCBkaXN0YW5jZSApLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IGludGVyU2VnbWVudC5jbG9uZSgpLmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApLFxuXHRcdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0XHRmYWNlOiBudWxsLFxuXHRcdFx0XHRcdFx0ZmFjZUluZGV4OiBudWxsLFxuXHRcdFx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMaW5lU2VnbWVudHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRMaW5lLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lU2VnbWVudHMnO1xuXG59XG5cbkxpbmVTZWdtZW50cy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVTZWdtZW50cyxcblxuXHRpc0xpbmVTZWdtZW50czogdHJ1ZSxcblxuXHRjb21wdXRlTGluZURpc3RhbmNlczogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3RhcnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBlbmQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNvbXB1dGVMaW5lRGlzdGFuY2VzKCkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0Ly8gd2UgYXNzdW1lIG5vbi1pbmRleGVkIGdlb21ldHJ5XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyeS5pbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHZhciBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArPSAyICkge1xuXG5cdFx0XHRcdFx0XHRzdGFydC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSApO1xuXHRcdFx0XHRcdFx0ZW5kLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICsgMSApO1xuXG5cdFx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpIF0gPSAoIGkgPT09IDAgKSA/IDAgOiBsaW5lRGlzdGFuY2VzWyBpIC0gMSBdO1xuXHRcdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSArIDEgXSA9IGxpbmVEaXN0YW5jZXNbIGkgXSArIHN0YXJ0LmRpc3RhbmNlVG8oIGVuZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnbGluZURpc3RhbmNlJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGxpbmVEaXN0YW5jZXMsIDEgKSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lU2VnbWVudHMuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTogQ29tcHV0YXRpb24gb25seSBwb3NzaWJsZSB3aXRoIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5LicgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0XHRcdHZhciBsaW5lRGlzdGFuY2VzID0gZ2VvbWV0cnkubGluZURpc3RhbmNlcztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICs9IDIgKSB7XG5cblx0XHRcdFx0XHRzdGFydC5jb3B5KCB2ZXJ0aWNlc1sgaSBdICk7XG5cdFx0XHRcdFx0ZW5kLmNvcHkoIHZlcnRpY2VzWyBpICsgMSBdICk7XG5cblx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpIF0gPSAoIGkgPT09IDAgKSA/IDAgOiBsaW5lRGlzdGFuY2VzWyBpIC0gMSBdO1xuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgKyAxIF0gPSBsaW5lRGlzdGFuY2VzWyBpIF0gKyBzdGFydC5kaXN0YW5jZVRvKCBlbmQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSApXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1ncmV0ZXIgLyBodHRwOi8vZ2l0aHViLmNvbS9tZ3JldGVyXG4gKi9cblxuZnVuY3Rpb24gTGluZUxvb3AoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRMaW5lLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lTG9vcCc7XG5cbn1cblxuTGluZUxvb3AucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGluZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lTG9vcCxcblxuXHRpc0xpbmVMb29wOiB0cnVlLFxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIHNpemU6IDxmbG9hdD4sXG4gKiAgc2l6ZUF0dGVudWF0aW9uOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BvaW50c01hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLnNpemUgPSAxO1xuXHR0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHRydWU7XG5cblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cblBvaW50c01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9pbnRzTWF0ZXJpYWw7XG5cblBvaW50c01hdGVyaWFsLnByb3RvdHlwZS5pc1BvaW50c01hdGVyaWFsID0gdHJ1ZTtcblxuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLnNpemUgPSBzb3VyY2Uuc2l6ZTtcblx0dGhpcy5zaXplQXR0ZW51YXRpb24gPSBzb3VyY2Uuc2l6ZUF0dGVudWF0aW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gUG9pbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQb2ludHMnO1xuXG5cdHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkID8gZ2VvbWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBQb2ludHNNYXRlcmlhbCggeyBjb2xvcjogTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmIH0gKTtcblxufVxuXG5Qb2ludHMucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUG9pbnRzLFxuXG5cdGlzUG9pbnRzOiB0cnVlLFxuXG5cdHJheWNhc3Q6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciByYXkgPSBuZXcgUmF5KCk7XG5cdFx0dmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRcdHZhciBvYmplY3QgPSB0aGlzO1xuXHRcdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cdFx0XHR2YXIgdGhyZXNob2xkID0gcmF5Y2FzdGVyLnBhcmFtcy5Qb2ludHMudGhyZXNob2xkO1xuXG5cdFx0XHQvLyBDaGVja2luZyBib3VuZGluZ1NwaGVyZSBkaXN0YW5jZSB0byByYXlcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0XHRzcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKTtcblx0XHRcdHNwaGVyZS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cdFx0XHRzcGhlcmUucmFkaXVzICs9IHRocmVzaG9sZDtcblxuXHRcdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdFx0Ly9cblxuXHRcdFx0aW52ZXJzZU1hdHJpeC5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApO1xuXHRcdFx0cmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIGludmVyc2VNYXRyaXggKTtcblxuXHRcdFx0dmFyIGxvY2FsVGhyZXNob2xkID0gdGhyZXNob2xkIC8gKCAoIHRoaXMuc2NhbGUueCArIHRoaXMuc2NhbGUueSArIHRoaXMuc2NhbGUueiApIC8gMyApO1xuXHRcdFx0dmFyIGxvY2FsVGhyZXNob2xkU3EgPSBsb2NhbFRocmVzaG9sZCAqIGxvY2FsVGhyZXNob2xkO1xuXHRcdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBpbnRlcnNlY3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdGZ1bmN0aW9uIHRlc3RQb2ludCggcG9pbnQsIGluZGV4ICkge1xuXG5cdFx0XHRcdHZhciByYXlQb2ludERpc3RhbmNlU3EgPSByYXkuZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICk7XG5cblx0XHRcdFx0aWYgKCByYXlQb2ludERpc3RhbmNlU3EgPCBsb2NhbFRocmVzaG9sZFNxICkge1xuXG5cdFx0XHRcdFx0cmF5LmNsb3Nlc3RQb2ludFRvUG9pbnQoIHBvaW50LCBpbnRlcnNlY3RQb2ludCApO1xuXHRcdFx0XHRcdGludGVyc2VjdFBvaW50LmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyc2VjdFBvaW50ICk7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdGRpc3RhbmNlVG9SYXk6IE1hdGguc3FydCggcmF5UG9pbnREaXN0YW5jZVNxICksXG5cdFx0XHRcdFx0XHRwb2ludDogaW50ZXJzZWN0UG9pbnQuY2xvbmUoKSxcblx0XHRcdFx0XHRcdGluZGV4OiBpbmRleCxcblx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRvYmplY3Q6IG9iamVjdFxuXG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRcdHZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblx0XHRcdFx0dmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XG5cblx0XHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHZhciBpbmRpY2VzID0gaW5kZXguYXJyYXk7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gaW5kaWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGEgPSBpbmRpY2VzWyBpIF07XG5cblx0XHRcdFx0XHRcdHBvc2l0aW9uLmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApO1xuXG5cdFx0XHRcdFx0XHR0ZXN0UG9pbnQoIHBvc2l0aW9uLCBhICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvc2l0aW9ucy5sZW5ndGggLyAzOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0cG9zaXRpb24uZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKiAzICk7XG5cblx0XHRcdFx0XHRcdHRlc3RQb2ludCggcG9zaXRpb24sIGkgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHRlc3RQb2ludCggdmVydGljZXNbIGkgXSwgaSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCkgKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gR3JvdXAoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdHcm91cCc7XG5cbn1cblxuR3JvdXAucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogR3JvdXAsXG5cblx0aXNHcm91cDogdHJ1ZVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBWaWRlb1RleHR1cmUoIHZpZGVvLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKSB7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCB2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7XG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblxufVxuXG5WaWRlb1RleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBWaWRlb1RleHR1cmUsXG5cblx0aXNWaWRlb1RleHR1cmU6IHRydWUsXG5cblx0dXBkYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmlkZW8gPSB0aGlzLmltYWdlO1xuXG5cdFx0aWYgKCB2aWRlby5yZWFkeVN0YXRlID49IHZpZGVvLkhBVkVfQ1VSUkVOVF9EQVRBICkge1xuXG5cdFx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIENvbXByZXNzZWRUZXh0dXJlKCBtaXBtYXBzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdHRoaXMuaW1hZ2UgPSB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcblx0dGhpcy5taXBtYXBzID0gbWlwbWFwcztcblxuXHQvLyBubyBmbGlwcGluZyBmb3IgY3ViZSB0ZXh0dXJlc1xuXHQvLyAoYWxzbyBmbGlwcGluZyBkb2Vzbid0IHdvcmsgZm9yIGNvbXByZXNzZWQgdGV4dHVyZXMgKVxuXG5cdHRoaXMuZmxpcFkgPSBmYWxzZTtcblxuXHQvLyBjYW4ndCBnZW5lcmF0ZSBtaXBtYXBzIGZvciBjb21wcmVzc2VkIHRleHR1cmVzXG5cdC8vIG1pcHMgbXVzdCBiZSBlbWJlZGRlZCBpbiBERFMgZmlsZXNcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG59XG5cbkNvbXByZXNzZWRUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5Db21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb21wcmVzc2VkVGV4dHVyZTtcblxuQ29tcHJlc3NlZFRleHR1cmUucHJvdG90eXBlLmlzQ29tcHJlc3NlZFRleHR1cmUgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3IgTWF0dCBEZXNMYXVyaWVycyAvIEBtYXR0ZGVzbFxuICogQGF1dGhvciBhdGl4IC8gYXJ0aHVyc2lsYmVyLmRlXG4gKi9cblxuZnVuY3Rpb24gRGVwdGhUZXh0dXJlKCB3aWR0aCwgaGVpZ2h0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBmb3JtYXQgKSB7XG5cblx0Zm9ybWF0ID0gZm9ybWF0ICE9PSB1bmRlZmluZWQgPyBmb3JtYXQgOiBEZXB0aEZvcm1hdDtcblxuXHRpZiAoIGZvcm1hdCAhPT0gRGVwdGhGb3JtYXQgJiYgZm9ybWF0ICE9PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB7XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoICdEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCcgKTtcblxuXHR9XG5cblx0aWYgKCB0eXBlID09PSB1bmRlZmluZWQgJiYgZm9ybWF0ID09PSBEZXB0aEZvcm1hdCApIHR5cGUgPSBVbnNpZ25lZFNob3J0VHlwZTtcblx0aWYgKCB0eXBlID09PSB1bmRlZmluZWQgJiYgZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB0eXBlID0gVW5zaWduZWRJbnQyNDhUeXBlO1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7XG5cblx0dGhpcy5pbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuXG5cdHRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBOZWFyZXN0RmlsdGVyO1xuXHR0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcblxuXHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzXHQ9IGZhbHNlO1xuXG59XG5cbkRlcHRoVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuRGVwdGhUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERlcHRoVGV4dHVyZTtcbkRlcHRoVGV4dHVyZS5wcm90b3R5cGUuaXNEZXB0aFRleHR1cmUgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmZ1bmN0aW9uIFdpcmVmcmFtZUdlb21ldHJ5KCBnZW9tZXRyeSApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1dpcmVmcmFtZUdlb21ldHJ5JztcblxuXHQvLyBidWZmZXJcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGksIGosIGwsIG8sIG9sO1xuXHR2YXIgZWRnZSA9IFsgMCwgMCBdLCBlZGdlcyA9IHt9LCBlLCBlZGdlMSwgZWRnZTI7XG5cdHZhciBrZXksIGtleXMgPSBbICdhJywgJ2InLCAnYycgXTtcblx0dmFyIHZlcnRleDtcblxuXHQvLyBkaWZmZXJlbnQgbG9naWMgZm9yIEdlb21ldHJ5IGFuZCBCdWZmZXJHZW9tZXRyeVxuXG5cdGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdC8vIGNyZWF0ZSBhIGRhdGEgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgYWxsIGVkZ2VzIHdpdGhvdXQgZHVwbGljYXRlc1xuXG5cdFx0dmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdGVkZ2UxID0gZmFjZVsga2V5c1sgaiBdIF07XG5cdFx0XHRcdGVkZ2UyID0gZmFjZVsga2V5c1sgKCBqICsgMSApICUgMyBdIF07XG5cdFx0XHRcdGVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTsgLy8gc29ydGluZyBwcmV2ZW50cyBkdXBsaWNhdGVzXG5cdFx0XHRcdGVkZ2VbIDEgXSA9IE1hdGgubWF4KCBlZGdlMSwgZWRnZTIgKTtcblxuXHRcdFx0XHRrZXkgPSBlZGdlWyAwIF0gKyAnLCcgKyBlZGdlWyAxIF07XG5cblx0XHRcdFx0aWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGVkZ2VzWyBrZXkgXSA9IHsgaW5kZXgxOiBlZGdlWyAwIF0sIGluZGV4MjogZWRnZVsgMSBdIH07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlc1xuXG5cdFx0Zm9yICgga2V5IGluIGVkZ2VzICkge1xuXG5cdFx0XHRlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0XHR2ZXJ0ZXggPSBnZW9tZXRyeS52ZXJ0aWNlc1sgZS5pbmRleDEgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0dmVydGV4ID0gZ2VvbWV0cnkudmVydGljZXNbIGUuaW5kZXgyIF07XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHR9XG5cblx0fSBlbHNlIGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdHZhciBwb3NpdGlvbiwgaW5kaWNlcywgZ3JvdXBzO1xuXHRcdHZhciBncm91cCwgc3RhcnQsIGNvdW50O1xuXHRcdHZhciBpbmRleDEsIGluZGV4MjtcblxuXHRcdHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHQvLyBpbmRleGVkIEJ1ZmZlckdlb21ldHJ5XG5cblx0XHRcdHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHRcdGluZGljZXMgPSBnZW9tZXRyeS5pbmRleDtcblx0XHRcdGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0aWYgKCBncm91cHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRcdGdyb3VwcyA9IFsgeyBzdGFydDogMCwgY291bnQ6IGluZGljZXMuY291bnQsIG1hdGVyaWFsSW5kZXg6IDAgfSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGNyZWF0ZSBhIGRhdGEgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgYWxsIGVnZXMgd2l0aG91dCBkdXBsaWNhdGVzXG5cblx0XHRcdGZvciAoIG8gPSAwLCBvbCA9IGdyb3Vwcy5sZW5ndGg7IG8gPCBvbDsgKysgbyApIHtcblxuXHRcdFx0XHRncm91cCA9IGdyb3Vwc1sgbyBdO1xuXG5cdFx0XHRcdHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdGNvdW50ID0gZ3JvdXAuY291bnQ7XG5cblx0XHRcdFx0Zm9yICggaSA9IHN0YXJ0LCBsID0gKCBzdGFydCArIGNvdW50ICk7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdGVkZ2UxID0gaW5kaWNlcy5nZXRYKCBpICsgaiApO1xuXHRcdFx0XHRcdFx0ZWRnZTIgPSBpbmRpY2VzLmdldFgoIGkgKyAoIGogKyAxICkgJSAzICk7XG5cdFx0XHRcdFx0XHRlZGdlWyAwIF0gPSBNYXRoLm1pbiggZWRnZTEsIGVkZ2UyICk7IC8vIHNvcnRpbmcgcHJldmVudHMgZHVwbGljYXRlc1xuXHRcdFx0XHRcdFx0ZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHRcdFx0XHRrZXkgPSBlZGdlWyAwIF0gKyAnLCcgKyBlZGdlWyAxIF07XG5cblx0XHRcdFx0XHRcdGlmICggZWRnZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0ZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0gfTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlc1xuXG5cdFx0XHRmb3IgKCBrZXkgaW4gZWRnZXMgKSB7XG5cblx0XHRcdFx0ZSA9IGVkZ2VzWyBrZXkgXTtcblxuXHRcdFx0XHR2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGUuaW5kZXgxICk7XG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHR2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGUuaW5kZXgyICk7XG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnlcblxuXHRcdFx0cG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9ICggcG9zaXRpb24uY291bnQgLyAzICk7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRcdC8vIHRocmVlIGVkZ2VzIHBlciB0cmlhbmdsZSwgYW4gZWRnZSBpcyByZXByZXNlbnRlZCBhcyAoaW5kZXgxLCBpbmRleDIpXG5cdFx0XHRcdFx0Ly8gZS5nLiB0aGUgZmlyc3QgdHJpYW5nbGUgaGFzIHRoZSBmb2xsb3dpbmcgZWRnZXM6ICgwLDEpLCgxLDIpLCgyLDApXG5cblx0XHRcdFx0XHRpbmRleDEgPSAzICogaSArIGo7XG5cdFx0XHRcdFx0dmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpbmRleDEgKTtcblx0XHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0XHRpbmRleDIgPSAzICogaSArICggKCBqICsgMSApICUgMyApO1xuXHRcdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaW5kZXgyICk7XG5cdFx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXG59XG5cbldpcmVmcmFtZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuV2lyZWZyYW1lR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gV2lyZWZyYW1lR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cHM6Ly9naXRodWIuY29tL3p6ODVcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICogUGFyYW1ldHJpYyBTdXJmYWNlcyBHZW9tZXRyeVxuICogYmFzZWQgb24gdGhlIGJyaWxsaWFudCBhcnRpY2xlIGJ5IEBwcmlkZW91dCBodHRwOi8vcHJpZGVvdXQubmV0L2Jsb2cvP3A9NDRcbiAqL1xuXG4vLyBQYXJhbWV0cmljR2VvbWV0cnlcblxuZnVuY3Rpb24gUGFyYW1ldHJpY0dlb21ldHJ5KCBmdW5jLCBzbGljZXMsIHN0YWNrcyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BhcmFtZXRyaWNHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdGZ1bmM6IGZ1bmMsXG5cdFx0c2xpY2VzOiBzbGljZXMsXG5cdFx0c3RhY2tzOiBzdGFja3Ncblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSggZnVuYywgc2xpY2VzLCBzdGFja3MgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5QYXJhbWV0cmljR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5QYXJhbWV0cmljR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGFyYW1ldHJpY0dlb21ldHJ5O1xuXG4vLyBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5KCBmdW5jLCBzbGljZXMsIHN0YWNrcyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdGZ1bmM6IGZ1bmMsXG5cdFx0c2xpY2VzOiBzbGljZXMsXG5cdFx0c3RhY2tzOiBzdGFja3Ncblx0fTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHR2YXIgRVBTID0gMC4wMDAwMTtcblxuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgcDAgPSBuZXcgVmVjdG9yMygpLCBwMSA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBwdSA9IG5ldyBWZWN0b3IzKCksIHB2ID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgaSwgajtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0dmFyIHNsaWNlQ291bnQgPSBzbGljZXMgKyAxO1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHN0YWNrczsgaSArKyApIHtcblxuXHRcdHZhciB2ID0gaSAvIHN0YWNrcztcblxuXHRcdGZvciAoIGogPSAwOyBqIDw9IHNsaWNlczsgaiArKyApIHtcblxuXHRcdFx0dmFyIHUgPSBqIC8gc2xpY2VzO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0ZnVuYyggdSwgdiwgcDAgKTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHAwLngsIHAwLnksIHAwLnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdC8vIGFwcHJveGltYXRlIHRhbmdlbnQgdmVjdG9ycyB2aWEgZmluaXRlIGRpZmZlcmVuY2VzXG5cblx0XHRcdGlmICggdSAtIEVQUyA+PSAwICkge1xuXG5cdFx0XHRcdGZ1bmMoIHUgLSBFUFMsIHYsIHAxICk7XG5cdFx0XHRcdHB1LnN1YlZlY3RvcnMoIHAwLCBwMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZ1bmMoIHUgKyBFUFMsIHYsIHAxICk7XG5cdFx0XHRcdHB1LnN1YlZlY3RvcnMoIHAxLCBwMCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdiAtIEVQUyA+PSAwICkge1xuXG5cdFx0XHRcdGZ1bmMoIHUsIHYgLSBFUFMsIHAxICk7XG5cdFx0XHRcdHB2LnN1YlZlY3RvcnMoIHAwLCBwMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZ1bmMoIHUsIHYgKyBFUFMsIHAxICk7XG5cdFx0XHRcdHB2LnN1YlZlY3RvcnMoIHAxLCBwMCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGNyb3NzIHByb2R1Y3Qgb2YgdGFuZ2VudCB2ZWN0b3JzIHJldHVybnMgc3VyZmFjZSBub3JtYWxcblxuXHRcdFx0bm9ybWFsLmNyb3NzVmVjdG9ycyggcHUsIHB2ICkubm9ybWFsaXplKCk7XG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIHUsIHYgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdGZvciAoIGkgPSAwOyBpIDwgc3RhY2tzOyBpICsrICkge1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPCBzbGljZXM7IGogKysgKSB7XG5cblx0XHRcdHZhciBhID0gaSAqIHNsaWNlQ291bnQgKyBqO1xuXHRcdFx0dmFyIGIgPSBpICogc2xpY2VDb3VudCArIGogKyAxO1xuXHRcdFx0dmFyIGMgPSAoIGkgKyAxICkgKiBzbGljZUNvdW50ICsgaiArIDE7XG5cdFx0XHR2YXIgZCA9ICggaSArIDEgKSAqIHNsaWNlQ291bnQgKyBqO1xuXG5cdFx0XHQvLyBmYWNlcyBvbmUgYW5kIHR3b1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGNsb2Nrd29ya2dlZWsgLyBodHRwczovL2dpdGh1Yi5jb20vY2xvY2t3b3JrZ2Vla1xuICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleVxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFBvbHloZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBQb2x5aGVkcm9uR2VvbWV0cnkoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BvbHloZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHZlcnRpY2VzOiB2ZXJ0aWNlcyxcblx0XHRpbmRpY2VzOiBpbmRpY2VzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblBvbHloZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBvbHloZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2x5aGVkcm9uR2VvbWV0cnk7XG5cbi8vIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BvbHloZWRyb25CdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHZlcnRpY2VzOiB2ZXJ0aWNlcyxcblx0XHRpbmRpY2VzOiBpbmRpY2VzLFxuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdGRldGFpbCA9IGRldGFpbCB8fCAwO1xuXG5cdC8vIGRlZmF1bHQgYnVmZmVyIGRhdGFcblxuXHR2YXIgdmVydGV4QnVmZmVyID0gW107XG5cdHZhciB1dkJ1ZmZlciA9IFtdO1xuXG5cdC8vIHRoZSBzdWJkaXZpc2lvbiBjcmVhdGVzIHRoZSB2ZXJ0ZXggYnVmZmVyIGRhdGFcblxuXHRzdWJkaXZpZGUoIGRldGFpbCApO1xuXG5cdC8vIGFsbCB2ZXJ0aWNlcyBzaG91bGQgbGllIG9uIGEgY29uY2VwdHVhbCBzcGhlcmUgd2l0aCBhIGdpdmVuIHJhZGl1c1xuXG5cdGFwcHBseVJhZGl1cyggcmFkaXVzICk7XG5cblx0Ly8gZmluYWxseSwgY3JlYXRlIHRoZSB1diBkYXRhXG5cblx0Z2VuZXJhdGVVVnMoKTtcblxuXHQvLyBidWlsZCBub24taW5kZXhlZCBnZW9tZXRyeVxuXG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGV4QnVmZmVyLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGV4QnVmZmVyLnNsaWNlKCksIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2QnVmZmVyLCAyICkgKTtcblxuXHRpZiAoIGRldGFpbCA9PT0gMCApIHtcblxuXHRcdHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTsgLy8gZmxhdCBub3JtYWxzXG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMubm9ybWFsaXplTm9ybWFscygpOyAvLyBzbW9vdGggbm9ybWFsc1xuXG5cdH1cblxuXHQvLyBoZWxwZXIgZnVuY3Rpb25zXG5cblx0ZnVuY3Rpb24gc3ViZGl2aWRlKCBkZXRhaWwgKSB7XG5cblx0XHR2YXIgYSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBjID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIGl0ZXJhdGUgb3ZlciBhbGwgZmFjZXMgYW5kIGFwcGx5IGEgc3ViZGl2aXNvbiB3aXRoIHRoZSBnaXZlbiBkZXRhaWwgdmFsdWVcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdC8vIGdldCB0aGUgdmVydGljZXMgb2YgdGhlIGZhY2VcblxuXHRcdFx0Z2V0VmVydGV4QnlJbmRleCggaW5kaWNlc1sgaSArIDAgXSwgYSApO1xuXHRcdFx0Z2V0VmVydGV4QnlJbmRleCggaW5kaWNlc1sgaSArIDEgXSwgYiApO1xuXHRcdFx0Z2V0VmVydGV4QnlJbmRleCggaW5kaWNlc1sgaSArIDIgXSwgYyApO1xuXG5cdFx0XHQvLyBwZXJmb3JtIHN1YmRpdmlzaW9uXG5cblx0XHRcdHN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzdWJkaXZpZGVGYWNlKCBhLCBiLCBjLCBkZXRhaWwgKSB7XG5cblx0XHR2YXIgY29scyA9IE1hdGgucG93KCAyLCBkZXRhaWwgKTtcblxuXHRcdC8vIHdlIHVzZSB0aGlzIG11bHRpZGltZW5zaW9uYWwgYXJyYXkgYXMgYSBkYXRhIHN0cnVjdHVyZSBmb3IgY3JlYXRpbmcgdGhlIHN1YmRpdmlzaW9uXG5cblx0XHR2YXIgdiA9IFtdO1xuXG5cdFx0dmFyIGksIGo7XG5cblx0XHQvLyBjb25zdHJ1Y3QgYWxsIG9mIHRoZSB2ZXJ0aWNlcyBmb3IgdGhpcyBzdWJkaXZpc2lvblxuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gY29sczsgaSArKyApIHtcblxuXHRcdFx0dlsgaSBdID0gW107XG5cblx0XHRcdHZhciBhaiA9IGEuY2xvbmUoKS5sZXJwKCBjLCBpIC8gY29scyApO1xuXHRcdFx0dmFyIGJqID0gYi5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7XG5cblx0XHRcdHZhciByb3dzID0gY29scyAtIGk7XG5cblx0XHRcdGZvciAoIGogPSAwOyBqIDw9IHJvd3M7IGogKysgKSB7XG5cblx0XHRcdFx0aWYgKCBqID09PSAwICYmIGkgPT09IGNvbHMgKSB7XG5cblx0XHRcdFx0XHR2WyBpIF1bIGogXSA9IGFqO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR2WyBpIF1bIGogXSA9IGFqLmNsb25lKCkubGVycCggYmosIGogLyByb3dzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBjb25zdHJ1Y3QgYWxsIG9mIHRoZSBmYWNlc1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBjb2xzOyBpICsrICkge1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8IDIgKiAoIGNvbHMgLSBpICkgLSAxOyBqICsrICkge1xuXG5cdFx0XHRcdHZhciBrID0gTWF0aC5mbG9vciggaiAvIDIgKTtcblxuXHRcdFx0XHRpZiAoIGogJSAyID09PSAwICkge1xuXG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSBdWyBrICsgMSBdICk7XG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSArIDEgXVsgayBdICk7XG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSBdWyBrIF0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSBdWyBrICsgMSBdICk7XG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSArIDEgXVsgayArIDEgXSApO1xuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBhcHBwbHlSYWRpdXMoIHJhZGl1cyApIHtcblxuXHRcdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gaXRlcmF0ZSBvdmVyIHRoZSBlbnRpcmUgYnVmZmVyIGFuZCBhcHBseSB0aGUgcmFkaXVzIHRvIGVhY2ggdmVydGV4XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdHZlcnRleC54ID0gdmVydGV4QnVmZmVyWyBpICsgMCBdO1xuXHRcdFx0dmVydGV4LnkgPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF07XG5cdFx0XHR2ZXJ0ZXgueiA9IHZlcnRleEJ1ZmZlclsgaSArIDIgXTtcblxuXHRcdFx0dmVydGV4Lm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCByYWRpdXMgKTtcblxuXHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMCBdID0gdmVydGV4Lng7XG5cdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF0gPSB2ZXJ0ZXgueTtcblx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDIgXSA9IHZlcnRleC56O1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVVWcygpIHtcblxuXHRcdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSAzICkge1xuXG5cdFx0XHR2ZXJ0ZXgueCA9IHZlcnRleEJ1ZmZlclsgaSArIDAgXTtcblx0XHRcdHZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdO1xuXHRcdFx0dmVydGV4LnogPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF07XG5cblx0XHRcdHZhciB1ID0gYXppbXV0aCggdmVydGV4ICkgLyAyIC8gTWF0aC5QSSArIDAuNTtcblx0XHRcdHZhciB2ID0gaW5jbGluYXRpb24oIHZlcnRleCApIC8gTWF0aC5QSSArIDAuNTtcblx0XHRcdHV2QnVmZmVyLnB1c2goIHUsIDEgLSB2ICk7XG5cblx0XHR9XG5cblx0XHRjb3JyZWN0VVZzKCk7XG5cblx0XHRjb3JyZWN0U2VhbSgpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBjb3JyZWN0U2VhbSgpIHtcblxuXHRcdC8vIGhhbmRsZSBjYXNlIHdoZW4gZmFjZSBzdHJhZGRsZXMgdGhlIHNlYW0sIHNlZSAjMzI2OVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdXZCdWZmZXIubGVuZ3RoOyBpICs9IDYgKSB7XG5cblx0XHRcdC8vIHV2IGRhdGEgb2YgYSBzaW5nbGUgZmFjZVxuXG5cdFx0XHR2YXIgeDAgPSB1dkJ1ZmZlclsgaSArIDAgXTtcblx0XHRcdHZhciB4MSA9IHV2QnVmZmVyWyBpICsgMiBdO1xuXHRcdFx0dmFyIHgyID0gdXZCdWZmZXJbIGkgKyA0IF07XG5cblx0XHRcdHZhciBtYXggPSBNYXRoLm1heCggeDAsIHgxLCB4MiApO1xuXHRcdFx0dmFyIG1pbiA9IE1hdGgubWluKCB4MCwgeDEsIHgyICk7XG5cblx0XHRcdC8vIDAuOSBpcyBzb21ld2hhdCBhcmJpdHJhcnlcblxuXHRcdFx0aWYgKCBtYXggPiAwLjkgJiYgbWluIDwgMC4xICkge1xuXG5cdFx0XHRcdGlmICggeDAgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDAgXSArPSAxO1xuXHRcdFx0XHRpZiAoIHgxIDwgMC4yICkgdXZCdWZmZXJbIGkgKyAyIF0gKz0gMTtcblx0XHRcdFx0aWYgKCB4MiA8IDAuMiApIHV2QnVmZmVyWyBpICsgNCBdICs9IDE7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaFZlcnRleCggdmVydGV4ICkge1xuXG5cdFx0dmVydGV4QnVmZmVyLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0VmVydGV4QnlJbmRleCggaW5kZXgsIHZlcnRleCApIHtcblxuXHRcdHZhciBzdHJpZGUgPSBpbmRleCAqIDM7XG5cblx0XHR2ZXJ0ZXgueCA9IHZlcnRpY2VzWyBzdHJpZGUgKyAwIF07XG5cdFx0dmVydGV4LnkgPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMSBdO1xuXHRcdHZlcnRleC56ID0gdmVydGljZXNbIHN0cmlkZSArIDIgXTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gY29ycmVjdFVWcygpIHtcblxuXHRcdHZhciBhID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIGNlbnRyb2lkID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB1dkEgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB1dkIgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB1dkMgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gOSwgaiArPSA2ICkge1xuXG5cdFx0XHRhLnNldCggdmVydGV4QnVmZmVyWyBpICsgMCBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF0sIHZlcnRleEJ1ZmZlclsgaSArIDIgXSApO1xuXHRcdFx0Yi5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDMgXSwgdmVydGV4QnVmZmVyWyBpICsgNCBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA1IF0gKTtcblx0XHRcdGMuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyA2IF0sIHZlcnRleEJ1ZmZlclsgaSArIDcgXSwgdmVydGV4QnVmZmVyWyBpICsgOCBdICk7XG5cblx0XHRcdHV2QS5zZXQoIHV2QnVmZmVyWyBqICsgMCBdLCB1dkJ1ZmZlclsgaiArIDEgXSApO1xuXHRcdFx0dXZCLnNldCggdXZCdWZmZXJbIGogKyAyIF0sIHV2QnVmZmVyWyBqICsgMyBdICk7XG5cdFx0XHR1dkMuc2V0KCB1dkJ1ZmZlclsgaiArIDQgXSwgdXZCdWZmZXJbIGogKyA1IF0gKTtcblxuXHRcdFx0Y2VudHJvaWQuY29weSggYSApLmFkZCggYiApLmFkZCggYyApLmRpdmlkZVNjYWxhciggMyApO1xuXG5cdFx0XHR2YXIgYXppID0gYXppbXV0aCggY2VudHJvaWQgKTtcblxuXHRcdFx0Y29ycmVjdFVWKCB1dkEsIGogKyAwLCBhLCBhemkgKTtcblx0XHRcdGNvcnJlY3RVViggdXZCLCBqICsgMiwgYiwgYXppICk7XG5cdFx0XHRjb3JyZWN0VVYoIHV2QywgaiArIDQsIGMsIGF6aSApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjb3JyZWN0VVYoIHV2LCBzdHJpZGUsIHZlY3RvciwgYXppbXV0aCApIHtcblxuXHRcdGlmICggKCBhemltdXRoIDwgMCApICYmICggdXYueCA9PT0gMSApICkge1xuXG5cdFx0XHR1dkJ1ZmZlclsgc3RyaWRlIF0gPSB1di54IC0gMTtcblxuXHRcdH1cblxuXHRcdGlmICggKCB2ZWN0b3IueCA9PT0gMCApICYmICggdmVjdG9yLnogPT09IDAgKSApIHtcblxuXHRcdFx0dXZCdWZmZXJbIHN0cmlkZSBdID0gYXppbXV0aCAvIDIgLyBNYXRoLlBJICsgMC41O1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBBbmdsZSBhcm91bmQgdGhlIFkgYXhpcywgY291bnRlci1jbG9ja3dpc2Ugd2hlbiBsb29raW5nIGZyb20gYWJvdmUuXG5cblx0ZnVuY3Rpb24gYXppbXV0aCggdmVjdG9yICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYXRhbjIoIHZlY3Rvci56LCAtIHZlY3Rvci54ICk7XG5cblx0fVxuXG5cblx0Ly8gQW5nbGUgYWJvdmUgdGhlIFhaIHBsYW5lLlxuXG5cdGZ1bmN0aW9uIGluY2xpbmF0aW9uKCB2ZWN0b3IgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hdGFuMiggLSB2ZWN0b3IueSwgTWF0aC5zcXJ0KCAoIHZlY3Rvci54ICogdmVjdG9yLnggKSArICggdmVjdG9yLnogKiB2ZWN0b3IueiApICkgKTtcblxuXHR9XG5cbn1cblxuUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFRldHJhaGVkcm9uR2VvbWV0cnlcblxuZnVuY3Rpb24gVGV0cmFoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUZXRyYWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVGV0cmFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRldHJhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV0cmFoZWRyb25HZW9tZXRyeTtcblxuLy8gVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cdFx0MSwgMSwgMSwgXHQtIDEsIC0gMSwgMSwgXHQtIDEsIDEsIC0gMSwgXHQxLCAtIDEsIC0gMVxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdDIsIDEsIDAsIFx0MCwgMywgMixcdDEsIDMsIDAsXHQyLCAzLCAxXG5cdF07XG5cblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdHRoaXMudHlwZSA9ICdUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5UZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIE9jdGFoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBPY3RhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnT2N0YWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5PY3RhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5PY3RhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT2N0YWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cdFx0MSwgMCwgMCwgXHQtIDEsIDAsIDAsXHQwLCAxLCAwLFxuXHRcdDAsIC0gMSwgMCwgXHQwLCAwLCAxLFx0MCwgMCwgLSAxXG5cdF07XG5cblx0dmFyIGluZGljZXMgPSBbXG5cdFx0MCwgMiwgNCxcdDAsIDQsIDMsXHQwLCAzLCA1LFxuXHRcdDAsIDUsIDIsXHQxLCAyLCA1LFx0MSwgNSwgMyxcblx0XHQxLCAzLCA0LFx0MSwgNCwgMlxuXHRdO1xuXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5PY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIEljb3NhaGVkcm9uR2VvbWV0cnlcblxuZnVuY3Rpb24gSWNvc2FoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdJY29zYWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuSWNvc2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkljb3NhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSWNvc2FoZWRyb25HZW9tZXRyeTtcblxuLy8gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHR2YXIgdCA9ICggMSArIE1hdGguc3FydCggNSApICkgLyAyO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQtIDEsIHQsIDAsIFx0MSwgdCwgMCwgXHQtIDEsIC0gdCwgMCwgXHQxLCAtIHQsIDAsXG5cdFx0IDAsIC0gMSwgdCwgXHQwLCAxLCB0LFx0MCwgLSAxLCAtIHQsIFx0MCwgMSwgLSB0LFxuXHRcdCB0LCAwLCAtIDEsIFx0dCwgMCwgMSwgXHQtIHQsIDAsIC0gMSwgXHQtIHQsIDAsIDFcblx0XTtcblxuXHR2YXIgaW5kaWNlcyA9IFtcblx0XHQgMCwgMTEsIDUsIFx0MCwgNSwgMSwgXHQwLCAxLCA3LCBcdDAsIDcsIDEwLCBcdDAsIDEwLCAxMSxcblx0XHQgMSwgNSwgOSwgXHQ1LCAxMSwgNCxcdDExLCAxMCwgMixcdDEwLCA3LCA2LFx0NywgMSwgOCxcblx0XHQgMywgOSwgNCwgXHQzLCA0LCAyLFx0MywgMiwgNixcdDMsIDYsIDgsXHQzLCA4LCA5LFxuXHRcdCA0LCA5LCA1LCBcdDIsIDQsIDExLFx0NiwgMiwgMTAsXHQ4LCA2LCA3LFx0OSwgOCwgMVxuXHRdO1xuXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cbn1cblxuSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5JY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBBYmUgUGF6b3MgLyBodHRwczovL2hhbW9pZC5jb21cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gRG9kZWNhaGVkcm9uR2VvbWV0cnlcblxuZnVuY3Rpb24gRG9kZWNhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnRG9kZWNhaGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuRG9kZWNhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Eb2RlY2FoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEb2RlY2FoZWRyb25HZW9tZXRyeTtcblxuLy8gRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdHZhciB0ID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7XG5cdHZhciByID0gMSAvIHQ7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXG5cdFx0Ly8gKMKxMSwgwrExLCDCsTEpXG5cdFx0LSAxLCAtIDEsIC0gMSxcdC0gMSwgLSAxLCAxLFxuXHRcdC0gMSwgMSwgLSAxLCAtIDEsIDEsIDEsXG5cdFx0MSwgLSAxLCAtIDEsIDEsIC0gMSwgMSxcblx0XHQxLCAxLCAtIDEsIDEsIDEsIDEsXG5cblx0XHQvLyAoMCwgwrExL8+GLCDCsc+GKVxuXHRcdCAwLCAtIHIsIC0gdCwgMCwgLSByLCB0LFxuXHRcdCAwLCByLCAtIHQsIDAsIHIsIHQsXG5cblx0XHQvLyAowrExL8+GLCDCsc+GLCAwKVxuXHRcdC0gciwgLSB0LCAwLCAtIHIsIHQsIDAsXG5cdFx0IHIsIC0gdCwgMCwgciwgdCwgMCxcblxuXHRcdC8vICjCsc+GLCAwLCDCsTEvz4YpXG5cdFx0LSB0LCAwLCAtIHIsIHQsIDAsIC0gcixcblx0XHQtIHQsIDAsIHIsIHQsIDAsIHJcblx0XTtcblxuXHR2YXIgaW5kaWNlcyA9IFtcblx0XHQzLCAxMSwgNywgXHQzLCA3LCAxNSwgXHQzLCAxNSwgMTMsXG5cdFx0NywgMTksIDE3LCBcdDcsIDE3LCA2LCBcdDcsIDYsIDE1LFxuXHRcdDE3LCA0LCA4LCBcdDE3LCA4LCAxMCwgXHQxNywgMTAsIDYsXG5cdFx0OCwgMCwgMTYsIFx0OCwgMTYsIDIsIFx0OCwgMiwgMTAsXG5cdFx0MCwgMTIsIDEsIFx0MCwgMSwgMTgsIFx0MCwgMTgsIDE2LFxuXHRcdDYsIDEwLCAyLCBcdDYsIDIsIDEzLCBcdDYsIDEzLCAxNSxcblx0XHQyLCAxNiwgMTgsIFx0MiwgMTgsIDMsIFx0MiwgMywgMTMsXG5cdFx0MTgsIDEsIDksIFx0MTgsIDksIDExLCBcdDE4LCAxMSwgMyxcblx0XHQ0LCAxNCwgMTIsIFx0NCwgMTIsIDAsIFx0NCwgMCwgOCxcblx0XHQxMSwgOSwgNSwgXHQxMSwgNSwgMTksIFx0MTEsIDE5LCA3LFxuXHRcdDE5LCA1LCAxNCwgXHQxOSwgMTQsIDQsIFx0MTksIDQsIDE3LFxuXHRcdDEsIDEyLCAxNCwgXHQxLCAxNCwgNSwgXHQxLCA1LCA5XG5cdF07XG5cblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdHRoaXMudHlwZSA9ICdEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cbn1cblxuRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBvb3Ntb3hpZWNvZGUgLyBodHRwczovL2dpdGh1Yi5jb20vb29zbW94aWVjb2RlXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBtaW5pbmdvbGQgLyBodHRwczovL2dpdGh1Yi5jb20vbWluaW5nb2xkXG4gKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwczovL2dpdGh1Yi5jb20vam9ub2JyMVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKi9cblxuLy8gVHViZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIFR1YmVHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQsIHRhcGVyICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVHViZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cGF0aDogcGF0aCxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0Y2xvc2VkOiBjbG9zZWRcblx0fTtcblxuXHRpZiAoIHRhcGVyICE9PSB1bmRlZmluZWQgKSBjb25zb2xlLndhcm4oICdUSFJFRS5UdWJlR2VvbWV0cnk6IHRhcGVyIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdHZhciBidWZmZXJHZW9tZXRyeSA9IG5ldyBUdWJlQnVmZmVyR2VvbWV0cnkoIHBhdGgsIHR1YnVsYXJTZWdtZW50cywgcmFkaXVzLCByYWRpYWxTZWdtZW50cywgY2xvc2VkICk7XG5cblx0Ly8gZXhwb3NlIGludGVybmFsc1xuXG5cdHRoaXMudGFuZ2VudHMgPSBidWZmZXJHZW9tZXRyeS50YW5nZW50cztcblx0dGhpcy5ub3JtYWxzID0gYnVmZmVyR2VvbWV0cnkubm9ybWFscztcblx0dGhpcy5iaW5vcm1hbHMgPSBidWZmZXJHZW9tZXRyeS5iaW5vcm1hbHM7XG5cblx0Ly8gY3JlYXRlIGdlb21ldHJ5XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIGJ1ZmZlckdlb21ldHJ5ICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblR1YmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblR1YmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUdWJlR2VvbWV0cnk7XG5cbi8vIFR1YmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBUdWJlQnVmZmVyR2VvbWV0cnkoIHBhdGgsIHR1YnVsYXJTZWdtZW50cywgcmFkaXVzLCByYWRpYWxTZWdtZW50cywgY2xvc2VkICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVHViZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cGF0aDogcGF0aCxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0Y2xvc2VkOiBjbG9zZWRcblx0fTtcblxuXHR0dWJ1bGFyU2VnbWVudHMgPSB0dWJ1bGFyU2VnbWVudHMgfHwgNjQ7XG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuXHRyYWRpYWxTZWdtZW50cyA9IHJhZGlhbFNlZ21lbnRzIHx8IDg7XG5cdGNsb3NlZCA9IGNsb3NlZCB8fCBmYWxzZTtcblxuXHR2YXIgZnJhbWVzID0gcGF0aC5jb21wdXRlRnJlbmV0RnJhbWVzKCB0dWJ1bGFyU2VnbWVudHMsIGNsb3NlZCApO1xuXG5cdC8vIGV4cG9zZSBpbnRlcm5hbHNcblxuXHR0aGlzLnRhbmdlbnRzID0gZnJhbWVzLnRhbmdlbnRzO1xuXHR0aGlzLm5vcm1hbHMgPSBmcmFtZXMubm9ybWFscztcblx0dGhpcy5iaW5vcm1hbHMgPSBmcmFtZXMuYmlub3JtYWxzO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cdHZhciBQID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgaSwgajtcblxuXHQvLyBidWZmZXJcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXG5cdC8vIGNyZWF0ZSBidWZmZXIgZGF0YVxuXG5cdGdlbmVyYXRlQnVmZmVyRGF0YSgpO1xuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHQvLyBmdW5jdGlvbnNcblxuXHRmdW5jdGlvbiBnZW5lcmF0ZUJ1ZmZlckRhdGEoKSB7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Z2VuZXJhdGVTZWdtZW50KCBpICk7XG5cblx0XHR9XG5cblx0XHQvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgbm90IGNsb3NlZCwgZ2VuZXJhdGUgdGhlIGxhc3Qgcm93IG9mIHZlcnRpY2VzIGFuZCBub3JtYWxzXG5cdFx0Ly8gYXQgdGhlIHJlZ3VsYXIgcG9zaXRpb24gb24gdGhlIGdpdmVuIHBhdGhcblx0XHQvL1xuXHRcdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBjbG9zZWQsIGR1cGxpY2F0ZSB0aGUgZmlyc3Qgcm93IG9mIHZlcnRpY2VzIGFuZCBub3JtYWxzICh1dnMgd2lsbCBkaWZmZXIpXG5cblx0XHRnZW5lcmF0ZVNlZ21lbnQoICggY2xvc2VkID09PSBmYWxzZSApID8gdHVidWxhclNlZ21lbnRzIDogMCApO1xuXG5cdFx0Ly8gdXZzIGFyZSBnZW5lcmF0ZWQgaW4gYSBzZXBhcmF0ZSBmdW5jdGlvbi5cblx0XHQvLyB0aGlzIG1ha2VzIGl0IGVhc3kgY29tcHV0ZSBjb3JyZWN0IHZhbHVlcyBmb3IgY2xvc2VkIGdlb21ldHJpZXNcblxuXHRcdGdlbmVyYXRlVVZzKCk7XG5cblx0XHQvLyBmaW5hbGx5IGNyZWF0ZSBmYWNlc1xuXG5cdFx0Z2VuZXJhdGVJbmRpY2VzKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlU2VnbWVudCggaSApIHtcblxuXHRcdC8vIHdlIHVzZSBnZXRQb2ludEF0IHRvIHNhbXBsZSBldmVubHkgZGlzdHJpYnV0ZWQgcG9pbnRzIGZyb20gdGhlIGdpdmVuIHBhdGhcblxuXHRcdFAgPSBwYXRoLmdldFBvaW50QXQoIGkgLyB0dWJ1bGFyU2VnbWVudHMsIFAgKTtcblxuXHRcdC8vIHJldHJpZXZlIGNvcnJlc3BvbmRpbmcgbm9ybWFsIGFuZCBiaW5vcm1hbFxuXG5cdFx0dmFyIE4gPSBmcmFtZXMubm9ybWFsc1sgaSBdO1xuXHRcdHZhciBCID0gZnJhbWVzLmJpbm9ybWFsc1sgaSBdO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgbm9ybWFscyBhbmQgdmVydGljZXMgZm9yIHRoZSBjdXJyZW50IHNlZ21lbnRcblxuXHRcdGZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHR2YXIgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyO1xuXG5cdFx0XHR2YXIgc2luID0gTWF0aC5zaW4oIHYgKTtcblx0XHRcdHZhciBjb3MgPSAtIE1hdGguY29zKCB2ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRub3JtYWwueCA9ICggY29zICogTi54ICsgc2luICogQi54ICk7XG5cdFx0XHRub3JtYWwueSA9ICggY29zICogTi55ICsgc2luICogQi55ICk7XG5cdFx0XHRub3JtYWwueiA9ICggY29zICogTi56ICsgc2luICogQi56ICk7XG5cdFx0XHRub3JtYWwubm9ybWFsaXplKCk7XG5cblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSBQLnggKyByYWRpdXMgKiBub3JtYWwueDtcblx0XHRcdHZlcnRleC55ID0gUC55ICsgcmFkaXVzICogbm9ybWFsLnk7XG5cdFx0XHR2ZXJ0ZXgueiA9IFAueiArIHJhZGl1cyAqIG5vcm1hbC56O1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlSW5kaWNlcygpIHtcblxuXHRcdGZvciAoIGogPSAxOyBqIDw9IHR1YnVsYXJTZWdtZW50czsgaiArKyApIHtcblxuXHRcdFx0Zm9yICggaSA9IDE7IGkgPD0gcmFkaWFsU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApO1xuXHRcdFx0XHR2YXIgYiA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgKCBpIC0gMSApO1xuXHRcdFx0XHR2YXIgYyA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgaTtcblx0XHRcdFx0dmFyIGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcblxuXHRcdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVVWcygpIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRcdFx0dXYueCA9IGkgLyB0dWJ1bGFyU2VnbWVudHM7XG5cdFx0XHRcdHV2LnkgPSBqIC8gcmFkaWFsU2VnbWVudHM7XG5cblx0XHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5UdWJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5UdWJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHViZUJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3Igb29zbW94aWVjb2RlXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqIGJhc2VkIG9uIGh0dHA6Ly93d3cuYmxhY2twYXduLmNvbS90ZXh0cy9wcXRvcnVzL1xuICovXG5cbi8vIFRvcnVzS25vdEdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRvcnVzS25vdEdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHR1YnVsYXJTZWdtZW50cywgcmFkaWFsU2VnbWVudHMsIHAsIHEsIGhlaWdodFNjYWxlICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVG9ydXNLbm90R2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR0dWJlOiB0dWJlLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRwOiBwLFxuXHRcdHE6IHFcblx0fTtcblxuXHRpZiAoIGhlaWdodFNjYWxlICE9PSB1bmRlZmluZWQgKSBjb25zb2xlLndhcm4oICdUSFJFRS5Ub3J1c0tub3RHZW9tZXRyeTogaGVpZ2h0U2NhbGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5zY2FsZSggeCwgeSwgeiApIGluc3RlYWQuJyApO1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgdHVidWxhclNlZ21lbnRzLCByYWRpYWxTZWdtZW50cywgcCwgcSApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblRvcnVzS25vdEdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVG9ydXNLbm90R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9ydXNLbm90R2VvbWV0cnk7XG5cbi8vIFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHR1YnVsYXJTZWdtZW50cywgcmFkaWFsU2VnbWVudHMsIHAsIHEgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHR1YmU6IHR1YmUsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdHA6IHAsXG5cdFx0cTogcVxuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuXHR0dWJlID0gdHViZSB8fCAwLjQ7XG5cdHR1YnVsYXJTZWdtZW50cyA9IE1hdGguZmxvb3IoIHR1YnVsYXJTZWdtZW50cyApIHx8IDY0O1xuXHRyYWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICkgfHwgODtcblx0cCA9IHAgfHwgMjtcblx0cSA9IHEgfHwgMztcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGksIGo7XG5cblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBQMSA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBQMiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIEIgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgVCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBOID0gbmV3IFZlY3RvcjMoKTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyArKyBpICkge1xuXG5cdFx0Ly8gdGhlIHJhZGlhbiBcInVcIiBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb24gdGhlIHRvcnVzIGN1cnZlIG9mIHRoZSBjdXJyZW50IHR1YnVsYXIgc2VnZW1lbnRcblxuXHRcdHZhciB1ID0gaSAvIHR1YnVsYXJTZWdtZW50cyAqIHAgKiBNYXRoLlBJICogMjtcblxuXHRcdC8vIG5vdyB3ZSBjYWxjdWxhdGUgdHdvIHBvaW50cy4gUDEgaXMgb3VyIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGN1cnZlLCBQMiBpcyBhIGxpdHRsZSBmYXJ0aGVyIGFoZWFkLlxuXHRcdC8vIHRoZXNlIHBvaW50cyBhcmUgdXNlZCB0byBjcmVhdGUgYSBzcGVjaWFsIFwiY29vcmRpbmF0ZSBzcGFjZVwiLCB3aGljaCBpcyBuZWNlc3NhcnkgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHZlcnRleCBwb3NpdGlvbnNcblxuXHRcdGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSggdSwgcCwgcSwgcmFkaXVzLCBQMSApO1xuXHRcdGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSggdSArIDAuMDEsIHAsIHEsIHJhZGl1cywgUDIgKTtcblxuXHRcdC8vIGNhbGN1bGF0ZSBvcnRob25vcm1hbCBiYXNpc1xuXG5cdFx0VC5zdWJWZWN0b3JzKCBQMiwgUDEgKTtcblx0XHROLmFkZFZlY3RvcnMoIFAyLCBQMSApO1xuXHRcdEIuY3Jvc3NWZWN0b3JzKCBULCBOICk7XG5cdFx0Ti5jcm9zc1ZlY3RvcnMoIEIsIFQgKTtcblxuXHRcdC8vIG5vcm1hbGl6ZSBCLCBOLiBUIGNhbiBiZSBpZ25vcmVkLCB3ZSBkb24ndCB1c2UgaXRcblxuXHRcdEIubm9ybWFsaXplKCk7XG5cdFx0Ti5ub3JtYWxpemUoKTtcblxuXHRcdGZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyArKyBqICkge1xuXG5cdFx0XHQvLyBub3cgY2FsY3VsYXRlIHRoZSB2ZXJ0aWNlcy4gdGhleSBhcmUgbm90aGluZyBtb3JlIHRoYW4gYW4gZXh0cnVzaW9uIG9mIHRoZSB0b3J1cyBjdXJ2ZS5cblx0XHRcdC8vIGJlY2F1c2Ugd2UgZXh0cnVkZSBhIHNoYXBlIGluIHRoZSB4eS1wbGFuZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxjdWxhdGUgYSB6LXZhbHVlLlxuXG5cdFx0XHR2YXIgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyO1xuXHRcdFx0dmFyIGN4ID0gLSB0dWJlICogTWF0aC5jb3MoIHYgKTtcblx0XHRcdHZhciBjeSA9IHR1YmUgKiBNYXRoLnNpbiggdiApO1xuXG5cdFx0XHQvLyBub3cgY2FsY3VsYXRlIHRoZSBmaW5hbCB2ZXJ0ZXggcG9zaXRpb24uXG5cdFx0XHQvLyBmaXJzdCB3ZSBvcmllbnQgdGhlIGV4dHJ1c2lvbiB3aXRoIG91ciBiYXNpcyB2ZWN0b3MsIHRoZW4gd2UgYWRkIGl0IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZVxuXG5cdFx0XHR2ZXJ0ZXgueCA9IFAxLnggKyAoIGN4ICogTi54ICsgY3kgKiBCLnggKTtcblx0XHRcdHZlcnRleC55ID0gUDEueSArICggY3ggKiBOLnkgKyBjeSAqIEIueSApO1xuXHRcdFx0dmVydGV4LnogPSBQMS56ICsgKCBjeCAqIE4ueiArIGN5ICogQi56ICk7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsIChQMSBpcyBhbHdheXMgdGhlIGNlbnRlci9vcmlnaW4gb2YgdGhlIGV4dHJ1c2lvbiwgdGh1cyB3ZSBjYW4gdXNlIGl0IHRvIGNhbGN1bGF0ZSB0aGUgbm9ybWFsKVxuXG5cdFx0XHRub3JtYWwuc3ViVmVjdG9ycyggdmVydGV4LCBQMSApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIGkgLyB0dWJ1bGFyU2VnbWVudHMgKTtcblx0XHRcdHV2cy5wdXNoKCBqIC8gcmFkaWFsU2VnbWVudHMgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdGZvciAoIGogPSAxOyBqIDw9IHR1YnVsYXJTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDw9IHJhZGlhbFNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHQvLyBpbmRpY2VzXG5cblx0XHRcdHZhciBhID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArICggaSAtIDEgKTtcblx0XHRcdHZhciBiID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyAoIGkgLSAxICk7XG5cdFx0XHR2YXIgYyA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgaTtcblx0XHRcdHZhciBkID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHQvLyB0aGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIHRvcnVzIGN1cnZlXG5cblx0ZnVuY3Rpb24gY2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1LCBwLCBxLCByYWRpdXMsIHBvc2l0aW9uICkge1xuXG5cdFx0dmFyIGN1ID0gTWF0aC5jb3MoIHUgKTtcblx0XHR2YXIgc3UgPSBNYXRoLnNpbiggdSApO1xuXHRcdHZhciBxdU92ZXJQID0gcSAvIHAgKiB1O1xuXHRcdHZhciBjcyA9IE1hdGguY29zKCBxdU92ZXJQICk7XG5cblx0XHRwb3NpdGlvbi54ID0gcmFkaXVzICogKCAyICsgY3MgKSAqIDAuNSAqIGN1O1xuXHRcdHBvc2l0aW9uLnkgPSByYWRpdXMgKiAoIDIgKyBjcyApICogc3UgKiAwLjU7XG5cdFx0cG9zaXRpb24ueiA9IHJhZGl1cyAqIE1hdGguc2luKCBxdU92ZXJQICkgKiAwLjU7XG5cblx0fVxuXG59XG5cblRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBvb3Ntb3hpZWNvZGVcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFRvcnVzR2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxhclNlZ21lbnRzLCBhcmMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUb3J1c0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0dHViZTogdHViZSxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0YXJjOiBhcmNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFRvcnVzQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgcmFkaWFsU2VnbWVudHMsIHR1YnVsYXJTZWdtZW50cywgYXJjICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVG9ydXNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRvcnVzR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9ydXNHZW9tZXRyeTtcblxuLy8gVG9ydXNCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0J1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHJhZGlhbFNlZ21lbnRzLCB0dWJ1bGFyU2VnbWVudHMsIGFyYyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR0dWJlOiB0dWJlLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRhcmM6IGFyY1xuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuXHR0dWJlID0gdHViZSB8fCAwLjQ7XG5cdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4O1xuXHR0dWJ1bGFyU2VnbWVudHMgPSBNYXRoLmZsb29yKCB0dWJ1bGFyU2VnbWVudHMgKSB8fCA2O1xuXHRhcmMgPSBhcmMgfHwgTWF0aC5QSSAqIDI7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGosIGk7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBhcmM7XG5cdFx0XHR2YXIgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSAoIHJhZGl1cyArIHR1YmUgKiBNYXRoLmNvcyggdiApICkgKiBNYXRoLmNvcyggdSApO1xuXHRcdFx0dmVydGV4LnkgPSAoIHJhZGl1cyArIHR1YmUgKiBNYXRoLmNvcyggdiApICkgKiBNYXRoLnNpbiggdSApO1xuXHRcdFx0dmVydGV4LnogPSB0dWJlICogTWF0aC5zaW4oIHYgKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0Y2VudGVyLnggPSByYWRpdXMgKiBNYXRoLmNvcyggdSApO1xuXHRcdFx0Y2VudGVyLnkgPSByYWRpdXMgKiBNYXRoLnNpbiggdSApO1xuXHRcdFx0bm9ybWFsLnN1YlZlY3RvcnMoIHZlcnRleCwgY2VudGVyICkubm9ybWFsaXplKCk7XG5cblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggaSAvIHR1YnVsYXJTZWdtZW50cyApO1xuXHRcdFx0dXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0Zm9yICggaiA9IDE7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRmb3IgKCBpID0gMTsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdC8vIGluZGljZXNcblxuXHRcdFx0dmFyIGEgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqIGogKyBpIC0gMTtcblx0XHRcdHZhciBiID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpIC0gMTtcblx0XHRcdHZhciBjID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpO1xuXHRcdFx0dmFyIGQgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXG5cdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuVG9ydXNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRvcnVzQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9ydXNCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICogUG9ydCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvZWFyY3V0ICh2Mi4xLjIpXG4gKi9cblxudmFyIEVhcmN1dCA9IHtcblxuXHR0cmlhbmd1bGF0ZTogZnVuY3Rpb24gKCBkYXRhLCBob2xlSW5kaWNlcywgZGltICkge1xuXG5cdFx0ZGltID0gZGltIHx8IDI7XG5cblx0XHR2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGgsXG5cdFx0XHRvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbIDAgXSAqIGRpbSA6IGRhdGEubGVuZ3RoLFxuXHRcdFx0b3V0ZXJOb2RlID0gbGlua2VkTGlzdCggZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSwgdHJ1ZSApLFxuXHRcdFx0dHJpYW5nbGVzID0gW107XG5cblx0XHRpZiAoICEgb3V0ZXJOb2RlICkgcmV0dXJuIHRyaWFuZ2xlcztcblxuXHRcdHZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBpbnZTaXplO1xuXG5cdFx0aWYgKCBoYXNIb2xlcyApIG91dGVyTm9kZSA9IGVsaW1pbmF0ZUhvbGVzKCBkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0gKTtcblxuXHRcdC8vIGlmIHRoZSBzaGFwZSBpcyBub3QgdG9vIHNpbXBsZSwgd2UnbGwgdXNlIHotb3JkZXIgY3VydmUgaGFzaCBsYXRlcjsgY2FsY3VsYXRlIHBvbHlnb24gYmJveFxuXG5cdFx0aWYgKCBkYXRhLmxlbmd0aCA+IDgwICogZGltICkge1xuXG5cdFx0XHRtaW5YID0gbWF4WCA9IGRhdGFbIDAgXTtcblx0XHRcdG1pblkgPSBtYXhZID0gZGF0YVsgMSBdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSApIHtcblxuXHRcdFx0XHR4ID0gZGF0YVsgaSBdO1xuXHRcdFx0XHR5ID0gZGF0YVsgaSArIDEgXTtcblx0XHRcdFx0aWYgKCB4IDwgbWluWCApIG1pblggPSB4O1xuXHRcdFx0XHRpZiAoIHkgPCBtaW5ZICkgbWluWSA9IHk7XG5cdFx0XHRcdGlmICggeCA+IG1heFggKSBtYXhYID0geDtcblx0XHRcdFx0aWYgKCB5ID4gbWF4WSApIG1heFkgPSB5O1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG1pblgsIG1pblkgYW5kIGludlNpemUgYXJlIGxhdGVyIHVzZWQgdG8gdHJhbnNmb3JtIGNvb3JkcyBpbnRvIGludGVnZXJzIGZvciB6LW9yZGVyIGNhbGN1bGF0aW9uXG5cblx0XHRcdGludlNpemUgPSBNYXRoLm1heCggbWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZICk7XG5cdFx0XHRpbnZTaXplID0gaW52U2l6ZSAhPT0gMCA/IDEgLyBpbnZTaXplIDogMDtcblxuXHRcdH1cblxuXHRcdGVhcmN1dExpbmtlZCggb3V0ZXJOb2RlLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSApO1xuXG5cdFx0cmV0dXJuIHRyaWFuZ2xlcztcblxuXHR9XG5cbn07XG5cbi8vIGNyZWF0ZSBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBmcm9tIHBvbHlnb24gcG9pbnRzIGluIHRoZSBzcGVjaWZpZWQgd2luZGluZyBvcmRlclxuXG5mdW5jdGlvbiBsaW5rZWRMaXN0KCBkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGNsb2Nrd2lzZSApIHtcblxuXHR2YXIgaSwgbGFzdDtcblxuXHRpZiAoIGNsb2Nrd2lzZSA9PT0gKCBzaWduZWRBcmVhKCBkYXRhLCBzdGFydCwgZW5kLCBkaW0gKSA+IDAgKSApIHtcblxuXHRcdGZvciAoIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSBkaW0gKSBsYXN0ID0gaW5zZXJ0Tm9kZSggaSwgZGF0YVsgaSBdLCBkYXRhWyBpICsgMSBdLCBsYXN0ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGZvciAoIGkgPSBlbmQgLSBkaW07IGkgPj0gc3RhcnQ7IGkgLT0gZGltICkgbGFzdCA9IGluc2VydE5vZGUoIGksIGRhdGFbIGkgXSwgZGF0YVsgaSArIDEgXSwgbGFzdCApO1xuXG5cdH1cblxuXHRpZiAoIGxhc3QgJiYgZXF1YWxzKCBsYXN0LCBsYXN0Lm5leHQgKSApIHtcblxuXHRcdHJlbW92ZU5vZGUoIGxhc3QgKTtcblx0XHRsYXN0ID0gbGFzdC5uZXh0O1xuXG5cdH1cblxuXHRyZXR1cm4gbGFzdDtcblxufVxuXG4vLyBlbGltaW5hdGUgY29saW5lYXIgb3IgZHVwbGljYXRlIHBvaW50c1xuXG5mdW5jdGlvbiBmaWx0ZXJQb2ludHMoIHN0YXJ0LCBlbmQgKSB7XG5cblx0aWYgKCAhIHN0YXJ0ICkgcmV0dXJuIHN0YXJ0O1xuXHRpZiAoICEgZW5kICkgZW5kID0gc3RhcnQ7XG5cblx0dmFyIHAgPSBzdGFydCwgYWdhaW47XG5cblx0ZG8ge1xuXG5cdFx0YWdhaW4gPSBmYWxzZTtcblxuXHRcdGlmICggISBwLnN0ZWluZXIgJiYgKCBlcXVhbHMoIHAsIHAubmV4dCApIHx8IGFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPT09IDAgKSApIHtcblxuXHRcdFx0cmVtb3ZlTm9kZSggcCApO1xuXHRcdFx0cCA9IGVuZCA9IHAucHJldjtcblx0XHRcdGlmICggcCA9PT0gcC5uZXh0ICkgYnJlYWs7XG5cdFx0XHRhZ2FpbiA9IHRydWU7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRwID0gcC5uZXh0O1xuXG5cdFx0fVxuXG5cdH0gd2hpbGUgKCBhZ2FpbiB8fCBwICE9PSBlbmQgKTtcblxuXHRyZXR1cm4gZW5kO1xuXG59XG5cbi8vIG1haW4gZWFyIHNsaWNpbmcgbG9vcCB3aGljaCB0cmlhbmd1bGF0ZXMgYSBwb2x5Z29uIChnaXZlbiBhcyBhIGxpbmtlZCBsaXN0KVxuXG5mdW5jdGlvbiBlYXJjdXRMaW5rZWQoIGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIHBhc3MgKSB7XG5cblx0aWYgKCAhIGVhciApIHJldHVybjtcblxuXHQvLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG5cblx0aWYgKCAhIHBhc3MgJiYgaW52U2l6ZSApIGluZGV4Q3VydmUoIGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSApO1xuXG5cdHZhciBzdG9wID0gZWFyLCBwcmV2LCBuZXh0O1xuXG5cdC8vIGl0ZXJhdGUgdGhyb3VnaCBlYXJzLCBzbGljaW5nIHRoZW0gb25lIGJ5IG9uZVxuXG5cdHdoaWxlICggZWFyLnByZXYgIT09IGVhci5uZXh0ICkge1xuXG5cdFx0cHJldiA9IGVhci5wcmV2O1xuXHRcdG5leHQgPSBlYXIubmV4dDtcblxuXHRcdGlmICggaW52U2l6ZSA/IGlzRWFySGFzaGVkKCBlYXIsIG1pblgsIG1pblksIGludlNpemUgKSA6IGlzRWFyKCBlYXIgKSApIHtcblxuXHRcdFx0Ly8gY3V0IG9mZiB0aGUgdHJpYW5nbGVcblx0XHRcdHRyaWFuZ2xlcy5wdXNoKCBwcmV2LmkgLyBkaW0gKTtcblx0XHRcdHRyaWFuZ2xlcy5wdXNoKCBlYXIuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIG5leHQuaSAvIGRpbSApO1xuXG5cdFx0XHRyZW1vdmVOb2RlKCBlYXIgKTtcblxuXHRcdFx0Ly8gc2tpcHBpbmcgdGhlIG5leHQgdmVydGljZSBsZWFkcyB0byBsZXNzIHNsaXZlciB0cmlhbmdsZXNcblx0XHRcdGVhciA9IG5leHQubmV4dDtcblx0XHRcdHN0b3AgPSBuZXh0Lm5leHQ7XG5cblx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0fVxuXG5cdFx0ZWFyID0gbmV4dDtcblxuXHRcdC8vIGlmIHdlIGxvb3BlZCB0aHJvdWdoIHRoZSB3aG9sZSByZW1haW5pbmcgcG9seWdvbiBhbmQgY2FuJ3QgZmluZCBhbnkgbW9yZSBlYXJzXG5cblx0XHRpZiAoIGVhciA9PT0gc3RvcCApIHtcblxuXHRcdFx0Ly8gdHJ5IGZpbHRlcmluZyBwb2ludHMgYW5kIHNsaWNpbmcgYWdhaW5cblxuXHRcdFx0aWYgKCAhIHBhc3MgKSB7XG5cblx0XHRcdFx0ZWFyY3V0TGlua2VkKCBmaWx0ZXJQb2ludHMoIGVhciApLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMSApO1xuXG5cdFx0XHRcdC8vIGlmIHRoaXMgZGlkbid0IHdvcmssIHRyeSBjdXJpbmcgYWxsIHNtYWxsIHNlbGYtaW50ZXJzZWN0aW9ucyBsb2NhbGx5XG5cblx0XHRcdH0gZWxzZSBpZiAoIHBhc3MgPT09IDEgKSB7XG5cblx0XHRcdFx0ZWFyID0gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyggZWFyLCB0cmlhbmdsZXMsIGRpbSApO1xuXHRcdFx0XHRlYXJjdXRMaW5rZWQoIGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDIgKTtcblxuXHRcdFx0Ly8gYXMgYSBsYXN0IHJlc29ydCwgdHJ5IHNwbGl0dGluZyB0aGUgcmVtYWluaW5nIHBvbHlnb24gaW50byB0d29cblxuXHRcdFx0fSBlbHNlIGlmICggcGFzcyA9PT0gMiApIHtcblxuXHRcdFx0XHRzcGxpdEVhcmN1dCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG4vLyBjaGVjayB3aGV0aGVyIGEgcG9seWdvbiBub2RlIGZvcm1zIGEgdmFsaWQgZWFyIHdpdGggYWRqYWNlbnQgbm9kZXNcblxuZnVuY3Rpb24gaXNFYXIoIGVhciApIHtcblxuXHR2YXIgYSA9IGVhci5wcmV2LFxuXHRcdGIgPSBlYXIsXG5cdFx0YyA9IGVhci5uZXh0O1xuXG5cdGlmICggYXJlYSggYSwgYiwgYyApID49IDAgKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyXG5cblx0Ly8gbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIG90aGVyIHBvaW50cyBpbnNpZGUgdGhlIHBvdGVudGlhbCBlYXJcblx0dmFyIHAgPSBlYXIubmV4dC5uZXh0O1xuXG5cdHdoaWxlICggcCAhPT0gZWFyLnByZXYgKSB7XG5cblx0XHRpZiAoIHBvaW50SW5UcmlhbmdsZSggYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkgKSAmJiBhcmVhKCBwLnByZXYsIHAsIHAubmV4dCApID49IDAgKSB7XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHAgPSBwLm5leHQ7XG5cblx0fVxuXG5cdHJldHVybiB0cnVlO1xuXG59XG5cbmZ1bmN0aW9uIGlzRWFySGFzaGVkKCBlYXIsIG1pblgsIG1pblksIGludlNpemUgKSB7XG5cblx0dmFyIGEgPSBlYXIucHJldixcblx0XHRiID0gZWFyLFxuXHRcdGMgPSBlYXIubmV4dDtcblxuXHRpZiAoIGFyZWEoIGEsIGIsIGMgKSA+PSAwICkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG5cdC8vIHRyaWFuZ2xlIGJib3g7IG1pbiAmIG1heCBhcmUgY2FsY3VsYXRlZCBsaWtlIHRoaXMgZm9yIHNwZWVkXG5cblx0dmFyIG1pblRYID0gYS54IDwgYi54ID8gKCBhLnggPCBjLnggPyBhLnggOiBjLnggKSA6ICggYi54IDwgYy54ID8gYi54IDogYy54ICksXG5cdFx0bWluVFkgPSBhLnkgPCBiLnkgPyAoIGEueSA8IGMueSA/IGEueSA6IGMueSApIDogKCBiLnkgPCBjLnkgPyBiLnkgOiBjLnkgKSxcblx0XHRtYXhUWCA9IGEueCA+IGIueCA/ICggYS54ID4gYy54ID8gYS54IDogYy54ICkgOiAoIGIueCA+IGMueCA/IGIueCA6IGMueCApLFxuXHRcdG1heFRZID0gYS55ID4gYi55ID8gKCBhLnkgPiBjLnkgPyBhLnkgOiBjLnkgKSA6ICggYi55ID4gYy55ID8gYi55IDogYy55ICk7XG5cblx0Ly8gei1vcmRlciByYW5nZSBmb3IgdGhlIGN1cnJlbnQgdHJpYW5nbGUgYmJveDtcblxuXHR2YXIgbWluWiA9IHpPcmRlciggbWluVFgsIG1pblRZLCBtaW5YLCBtaW5ZLCBpbnZTaXplICksXG5cdFx0bWF4WiA9IHpPcmRlciggbWF4VFgsIG1heFRZLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0Ly8gZmlyc3QgbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgaW4gaW5jcmVhc2luZyB6LW9yZGVyXG5cblx0dmFyIHAgPSBlYXIubmV4dFo7XG5cblx0d2hpbGUgKCBwICYmIHAueiA8PSBtYXhaICkge1xuXG5cdFx0aWYgKCBwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuXHRcdFx0XHRwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiZcblx0XHRcdFx0YXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA+PSAwICkgcmV0dXJuIGZhbHNlO1xuXHRcdHAgPSBwLm5leHRaO1xuXG5cdH1cblxuXHQvLyB0aGVuIGxvb2sgZm9yIHBvaW50cyBpbiBkZWNyZWFzaW5nIHotb3JkZXJcblxuXHRwID0gZWFyLnByZXZaO1xuXG5cdHdoaWxlICggcCAmJiBwLnogPj0gbWluWiApIHtcblxuXHRcdGlmICggcCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcblx0XHRcdFx0cG9pbnRJblRyaWFuZ2xlKCBhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSApICYmXG5cdFx0XHRcdGFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPj0gMCApIHJldHVybiBmYWxzZTtcblxuXHRcdHAgPSBwLnByZXZaO1xuXG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcblxufVxuXG4vLyBnbyB0aHJvdWdoIGFsbCBwb2x5Z29uIG5vZGVzIGFuZCBjdXJlIHNtYWxsIGxvY2FsIHNlbGYtaW50ZXJzZWN0aW9uc1xuXG5mdW5jdGlvbiBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKCBzdGFydCwgdHJpYW5nbGVzLCBkaW0gKSB7XG5cblx0dmFyIHAgPSBzdGFydDtcblxuXHRkbyB7XG5cblx0XHR2YXIgYSA9IHAucHJldiwgYiA9IHAubmV4dC5uZXh0O1xuXG5cdFx0aWYgKCAhIGVxdWFscyggYSwgYiApICYmIGludGVyc2VjdHMoIGEsIHAsIHAubmV4dCwgYiApICYmIGxvY2FsbHlJbnNpZGUoIGEsIGIgKSAmJiBsb2NhbGx5SW5zaWRlKCBiLCBhICkgKSB7XG5cblx0XHRcdHRyaWFuZ2xlcy5wdXNoKCBhLmkgLyBkaW0gKTtcblx0XHRcdHRyaWFuZ2xlcy5wdXNoKCBwLmkgLyBkaW0gKTtcblx0XHRcdHRyaWFuZ2xlcy5wdXNoKCBiLmkgLyBkaW0gKTtcblxuXHRcdFx0Ly8gcmVtb3ZlIHR3byBub2RlcyBpbnZvbHZlZFxuXG5cdFx0XHRyZW1vdmVOb2RlKCBwICk7XG5cdFx0XHRyZW1vdmVOb2RlKCBwLm5leHQgKTtcblxuXHRcdFx0cCA9IHN0YXJ0ID0gYjtcblxuXHRcdH1cblxuXHRcdHAgPSBwLm5leHQ7XG5cblx0fSB3aGlsZSAoIHAgIT09IHN0YXJ0ICk7XG5cblx0cmV0dXJuIHA7XG5cbn1cblxuLy8gdHJ5IHNwbGl0dGluZyBwb2x5Z29uIGludG8gdHdvIGFuZCB0cmlhbmd1bGF0ZSB0aGVtIGluZGVwZW5kZW50bHlcblxuZnVuY3Rpb24gc3BsaXRFYXJjdXQoIHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSApIHtcblxuXHQvLyBsb29rIGZvciBhIHZhbGlkIGRpYWdvbmFsIHRoYXQgZGl2aWRlcyB0aGUgcG9seWdvbiBpbnRvIHR3b1xuXG5cdHZhciBhID0gc3RhcnQ7XG5cblx0ZG8ge1xuXG5cdFx0dmFyIGIgPSBhLm5leHQubmV4dDtcblxuXHRcdHdoaWxlICggYiAhPT0gYS5wcmV2ICkge1xuXG5cdFx0XHRpZiAoIGEuaSAhPT0gYi5pICYmIGlzVmFsaWREaWFnb25hbCggYSwgYiApICkge1xuXG5cdFx0XHRcdC8vIHNwbGl0IHRoZSBwb2x5Z29uIGluIHR3byBieSB0aGUgZGlhZ29uYWxcblxuXHRcdFx0XHR2YXIgYyA9IHNwbGl0UG9seWdvbiggYSwgYiApO1xuXG5cdFx0XHRcdC8vIGZpbHRlciBjb2xpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzXG5cblx0XHRcdFx0YSA9IGZpbHRlclBvaW50cyggYSwgYS5uZXh0ICk7XG5cdFx0XHRcdGMgPSBmaWx0ZXJQb2ludHMoIGMsIGMubmV4dCApO1xuXG5cdFx0XHRcdC8vIHJ1biBlYXJjdXQgb24gZWFjaCBoYWxmXG5cblx0XHRcdFx0ZWFyY3V0TGlua2VkKCBhLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSApO1xuXHRcdFx0XHRlYXJjdXRMaW5rZWQoIGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0XHRiID0gYi5uZXh0O1xuXG5cdFx0fVxuXG5cdFx0YSA9IGEubmV4dDtcblxuXHR9IHdoaWxlICggYSAhPT0gc3RhcnQgKTtcblxufVxuXG4vLyBsaW5rIGV2ZXJ5IGhvbGUgaW50byB0aGUgb3V0ZXIgbG9vcCwgcHJvZHVjaW5nIGEgc2luZ2xlLXJpbmcgcG9seWdvbiB3aXRob3V0IGhvbGVzXG5cbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGVzKCBkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0gKSB7XG5cblx0dmFyIHF1ZXVlID0gW10sIGksIGxlbiwgc3RhcnQsIGVuZCwgbGlzdDtcblxuXHRmb3IgKCBpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpICsrICkge1xuXG5cdFx0c3RhcnQgPSBob2xlSW5kaWNlc1sgaSBdICogZGltO1xuXHRcdGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbIGkgKyAxIF0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcblx0XHRsaXN0ID0gbGlua2VkTGlzdCggZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBmYWxzZSApO1xuXHRcdGlmICggbGlzdCA9PT0gbGlzdC5uZXh0ICkgbGlzdC5zdGVpbmVyID0gdHJ1ZTtcblx0XHRxdWV1ZS5wdXNoKCBnZXRMZWZ0bW9zdCggbGlzdCApICk7XG5cblx0fVxuXG5cdHF1ZXVlLnNvcnQoIGNvbXBhcmVYICk7XG5cblx0Ly8gcHJvY2VzcyBob2xlcyBmcm9tIGxlZnQgdG8gcmlnaHRcblxuXHRmb3IgKCBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdGVsaW1pbmF0ZUhvbGUoIHF1ZXVlWyBpIF0sIG91dGVyTm9kZSApO1xuXHRcdG91dGVyTm9kZSA9IGZpbHRlclBvaW50cyggb3V0ZXJOb2RlLCBvdXRlck5vZGUubmV4dCApO1xuXG5cdH1cblxuXHRyZXR1cm4gb3V0ZXJOb2RlO1xuXG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVYKCBhLCBiICkge1xuXG5cdHJldHVybiBhLnggLSBiLng7XG5cbn1cblxuLy8gZmluZCBhIGJyaWRnZSBiZXR3ZWVuIHZlcnRpY2VzIHRoYXQgY29ubmVjdHMgaG9sZSB3aXRoIGFuIG91dGVyIHJpbmcgYW5kIGFuZCBsaW5rIGl0XG5cbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGUoIGhvbGUsIG91dGVyTm9kZSApIHtcblxuXHRvdXRlck5vZGUgPSBmaW5kSG9sZUJyaWRnZSggaG9sZSwgb3V0ZXJOb2RlICk7XG5cblx0aWYgKCBvdXRlck5vZGUgKSB7XG5cblx0XHR2YXIgYiA9IHNwbGl0UG9seWdvbiggb3V0ZXJOb2RlLCBob2xlICk7XG5cblx0XHRmaWx0ZXJQb2ludHMoIGIsIGIubmV4dCApO1xuXG5cdH1cblxufVxuXG4vLyBEYXZpZCBFYmVybHkncyBhbGdvcml0aG0gZm9yIGZpbmRpbmcgYSBicmlkZ2UgYmV0d2VlbiBob2xlIGFuZCBvdXRlciBwb2x5Z29uXG5cbmZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKCBob2xlLCBvdXRlck5vZGUgKSB7XG5cblx0dmFyIHAgPSBvdXRlck5vZGUsXG5cdFx0aHggPSBob2xlLngsXG5cdFx0aHkgPSBob2xlLnksXG5cdFx0cXggPSAtIEluZmluaXR5LFxuXHRcdG07XG5cblx0Ly8gZmluZCBhIHNlZ21lbnQgaW50ZXJzZWN0ZWQgYnkgYSByYXkgZnJvbSB0aGUgaG9sZSdzIGxlZnRtb3N0IHBvaW50IHRvIHRoZSBsZWZ0O1xuXHQvLyBzZWdtZW50J3MgZW5kcG9pbnQgd2l0aCBsZXNzZXIgeCB3aWxsIGJlIHBvdGVudGlhbCBjb25uZWN0aW9uIHBvaW50XG5cblx0ZG8ge1xuXG5cdFx0aWYgKCBoeSA8PSBwLnkgJiYgaHkgPj0gcC5uZXh0LnkgJiYgcC5uZXh0LnkgIT09IHAueSApIHtcblxuXHRcdFx0dmFyIHggPSBwLnggKyAoIGh5IC0gcC55ICkgKiAoIHAubmV4dC54IC0gcC54ICkgLyAoIHAubmV4dC55IC0gcC55ICk7XG5cblx0XHRcdGlmICggeCA8PSBoeCAmJiB4ID4gcXggKSB7XG5cblx0XHRcdFx0cXggPSB4O1xuXG5cdFx0XHRcdGlmICggeCA9PT0gaHggKSB7XG5cblx0XHRcdFx0XHRpZiAoIGh5ID09PSBwLnkgKSByZXR1cm4gcDtcblx0XHRcdFx0XHRpZiAoIGh5ID09PSBwLm5leHQueSApIHJldHVybiBwLm5leHQ7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdG0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHAgPSBwLm5leHQ7XG5cblx0fSB3aGlsZSAoIHAgIT09IG91dGVyTm9kZSApO1xuXG5cdGlmICggISBtICkgcmV0dXJuIG51bGw7XG5cblx0aWYgKCBoeCA9PT0gcXggKSByZXR1cm4gbS5wcmV2OyAvLyBob2xlIHRvdWNoZXMgb3V0ZXIgc2VnbWVudDsgcGljayBsb3dlciBlbmRwb2ludFxuXG5cdC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIG9mIGhvbGUgcG9pbnQsIHNlZ21lbnQgaW50ZXJzZWN0aW9uIGFuZCBlbmRwb2ludDtcblx0Ly8gaWYgdGhlcmUgYXJlIG5vIHBvaW50cyBmb3VuZCwgd2UgaGF2ZSBhIHZhbGlkIGNvbm5lY3Rpb247XG5cdC8vIG90aGVyd2lzZSBjaG9vc2UgdGhlIHBvaW50IG9mIHRoZSBtaW5pbXVtIGFuZ2xlIHdpdGggdGhlIHJheSBhcyBjb25uZWN0aW9uIHBvaW50XG5cblx0dmFyIHN0b3AgPSBtLFxuXHRcdG14ID0gbS54LFxuXHRcdG15ID0gbS55LFxuXHRcdHRhbk1pbiA9IEluZmluaXR5LFxuXHRcdHRhbjtcblxuXHRwID0gbS5uZXh0O1xuXG5cdHdoaWxlICggcCAhPT0gc3RvcCApIHtcblxuXHRcdGlmICggaHggPj0gcC54ICYmIHAueCA+PSBteCAmJiBoeCAhPT0gcC54ICYmXG5cdFx0XHRcdFx0XHRwb2ludEluVHJpYW5nbGUoIGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55ICkgKSB7XG5cblx0XHRcdHRhbiA9IE1hdGguYWJzKCBoeSAtIHAueSApIC8gKCBoeCAtIHAueCApOyAvLyB0YW5nZW50aWFsXG5cblx0XHRcdGlmICggKCB0YW4gPCB0YW5NaW4gfHwgKCB0YW4gPT09IHRhbk1pbiAmJiBwLnggPiBtLnggKSApICYmIGxvY2FsbHlJbnNpZGUoIHAsIGhvbGUgKSApIHtcblxuXHRcdFx0XHRtID0gcDtcblx0XHRcdFx0dGFuTWluID0gdGFuO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRwID0gcC5uZXh0O1xuXG5cdH1cblxuXHRyZXR1cm4gbTtcblxufVxuXG4vLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG5cbmZ1bmN0aW9uIGluZGV4Q3VydmUoIHN0YXJ0LCBtaW5YLCBtaW5ZLCBpbnZTaXplICkge1xuXG5cdHZhciBwID0gc3RhcnQ7XG5cblx0ZG8ge1xuXG5cdFx0aWYgKCBwLnogPT09IG51bGwgKSBwLnogPSB6T3JkZXIoIHAueCwgcC55LCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cdFx0cC5wcmV2WiA9IHAucHJldjtcblx0XHRwLm5leHRaID0gcC5uZXh0O1xuXHRcdHAgPSBwLm5leHQ7XG5cblx0fSB3aGlsZSAoIHAgIT09IHN0YXJ0ICk7XG5cblx0cC5wcmV2Wi5uZXh0WiA9IG51bGw7XG5cdHAucHJldlogPSBudWxsO1xuXG5cdHNvcnRMaW5rZWQoIHAgKTtcblxufVxuXG4vLyBTaW1vbiBUYXRoYW0ncyBsaW5rZWQgbGlzdCBtZXJnZSBzb3J0IGFsZ29yaXRobVxuLy8gaHR0cDovL3d3dy5jaGlhcmsuZ3JlZW5lbmQub3JnLnVrL35zZ3RhdGhhbS9hbGdvcml0aG1zL2xpc3Rzb3J0Lmh0bWxcblxuZnVuY3Rpb24gc29ydExpbmtlZCggbGlzdCApIHtcblxuXHR2YXIgaSwgcCwgcSwgZSwgdGFpbCwgbnVtTWVyZ2VzLCBwU2l6ZSwgcVNpemUsIGluU2l6ZSA9IDE7XG5cblx0ZG8ge1xuXG5cdFx0cCA9IGxpc3Q7XG5cdFx0bGlzdCA9IG51bGw7XG5cdFx0dGFpbCA9IG51bGw7XG5cdFx0bnVtTWVyZ2VzID0gMDtcblxuXHRcdHdoaWxlICggcCApIHtcblxuXHRcdFx0bnVtTWVyZ2VzICsrO1xuXHRcdFx0cSA9IHA7XG5cdFx0XHRwU2l6ZSA9IDA7XG5cblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgaW5TaXplOyBpICsrICkge1xuXG5cdFx0XHRcdHBTaXplICsrO1xuXHRcdFx0XHRxID0gcS5uZXh0Wjtcblx0XHRcdFx0aWYgKCAhIHEgKSBicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0XHRxU2l6ZSA9IGluU2l6ZTtcblxuXHRcdFx0d2hpbGUgKCBwU2l6ZSA+IDAgfHwgKCBxU2l6ZSA+IDAgJiYgcSApICkge1xuXG5cdFx0XHRcdGlmICggcFNpemUgIT09IDAgJiYgKCBxU2l6ZSA9PT0gMCB8fCAhIHEgfHwgcC56IDw9IHEueiApICkge1xuXG5cdFx0XHRcdFx0ZSA9IHA7XG5cdFx0XHRcdFx0cCA9IHAubmV4dFo7XG5cdFx0XHRcdFx0cFNpemUgLS07XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGUgPSBxO1xuXHRcdFx0XHRcdHEgPSBxLm5leHRaO1xuXHRcdFx0XHRcdHFTaXplIC0tO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRhaWwgKSB0YWlsLm5leHRaID0gZTtcblx0XHRcdFx0ZWxzZSBsaXN0ID0gZTtcblxuXHRcdFx0XHRlLnByZXZaID0gdGFpbDtcblx0XHRcdFx0dGFpbCA9IGU7XG5cblx0XHRcdH1cblxuXHRcdFx0cCA9IHE7XG5cblx0XHR9XG5cblx0XHR0YWlsLm5leHRaID0gbnVsbDtcblx0XHRpblNpemUgKj0gMjtcblxuXHR9IHdoaWxlICggbnVtTWVyZ2VzID4gMSApO1xuXG5cdHJldHVybiBsaXN0O1xuXG59XG5cbi8vIHotb3JkZXIgb2YgYSBwb2ludCBnaXZlbiBjb29yZHMgYW5kIGludmVyc2Ugb2YgdGhlIGxvbmdlciBzaWRlIG9mIGRhdGEgYmJveFxuXG5mdW5jdGlvbiB6T3JkZXIoIHgsIHksIG1pblgsIG1pblksIGludlNpemUgKSB7XG5cblx0Ly8gY29vcmRzIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIG5vbi1uZWdhdGl2ZSAxNS1iaXQgaW50ZWdlciByYW5nZVxuXG5cdHggPSAzMjc2NyAqICggeCAtIG1pblggKSAqIGludlNpemU7XG5cdHkgPSAzMjc2NyAqICggeSAtIG1pblkgKSAqIGludlNpemU7XG5cblx0eCA9ICggeCB8ICggeCA8PCA4ICkgKSAmIDB4MDBGRjAwRkY7XG5cdHggPSAoIHggfCAoIHggPDwgNCApICkgJiAweDBGMEYwRjBGO1xuXHR4ID0gKCB4IHwgKCB4IDw8IDIgKSApICYgMHgzMzMzMzMzMztcblx0eCA9ICggeCB8ICggeCA8PCAxICkgKSAmIDB4NTU1NTU1NTU7XG5cblx0eSA9ICggeSB8ICggeSA8PCA4ICkgKSAmIDB4MDBGRjAwRkY7XG5cdHkgPSAoIHkgfCAoIHkgPDwgNCApICkgJiAweDBGMEYwRjBGO1xuXHR5ID0gKCB5IHwgKCB5IDw8IDIgKSApICYgMHgzMzMzMzMzMztcblx0eSA9ICggeSB8ICggeSA8PCAxICkgKSAmIDB4NTU1NTU1NTU7XG5cblx0cmV0dXJuIHggfCAoIHkgPDwgMSApO1xuXG59XG5cbi8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmdcblxuZnVuY3Rpb24gZ2V0TGVmdG1vc3QoIHN0YXJ0ICkge1xuXG5cdHZhciBwID0gc3RhcnQsIGxlZnRtb3N0ID0gc3RhcnQ7XG5cblx0ZG8ge1xuXG5cdFx0aWYgKCBwLnggPCBsZWZ0bW9zdC54ICkgbGVmdG1vc3QgPSBwO1xuXHRcdHAgPSBwLm5leHQ7XG5cblx0fSB3aGlsZSAoIHAgIT09IHN0YXJ0ICk7XG5cblx0cmV0dXJuIGxlZnRtb3N0O1xuXG59XG5cbi8vIGNoZWNrIGlmIGEgcG9pbnQgbGllcyB3aXRoaW4gYSBjb252ZXggdHJpYW5nbGVcblxuZnVuY3Rpb24gcG9pbnRJblRyaWFuZ2xlKCBheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBweCwgcHkgKSB7XG5cblx0cmV0dXJuICggY3ggLSBweCApICogKCBheSAtIHB5ICkgLSAoIGF4IC0gcHggKSAqICggY3kgLSBweSApID49IDAgJiZcblx0ICggYXggLSBweCApICogKCBieSAtIHB5ICkgLSAoIGJ4IC0gcHggKSAqICggYXkgLSBweSApID49IDAgJiZcblx0ICggYnggLSBweCApICogKCBjeSAtIHB5ICkgLSAoIGN4IC0gcHggKSAqICggYnkgLSBweSApID49IDA7XG5cbn1cblxuLy8gY2hlY2sgaWYgYSBkaWFnb25hbCBiZXR3ZWVuIHR3byBwb2x5Z29uIG5vZGVzIGlzIHZhbGlkIChsaWVzIGluIHBvbHlnb24gaW50ZXJpb3IpXG5cbmZ1bmN0aW9uIGlzVmFsaWREaWFnb25hbCggYSwgYiApIHtcblxuXHRyZXR1cm4gYS5uZXh0LmkgIT09IGIuaSAmJiBhLnByZXYuaSAhPT0gYi5pICYmICEgaW50ZXJzZWN0c1BvbHlnb24oIGEsIGIgKSAmJlxuXHRcdGxvY2FsbHlJbnNpZGUoIGEsIGIgKSAmJiBsb2NhbGx5SW5zaWRlKCBiLCBhICkgJiYgbWlkZGxlSW5zaWRlKCBhLCBiICk7XG5cbn1cblxuLy8gc2lnbmVkIGFyZWEgb2YgYSB0cmlhbmdsZVxuXG5mdW5jdGlvbiBhcmVhKCBwLCBxLCByICkge1xuXG5cdHJldHVybiAoIHEueSAtIHAueSApICogKCByLnggLSBxLnggKSAtICggcS54IC0gcC54ICkgKiAoIHIueSAtIHEueSApO1xuXG59XG5cbi8vIGNoZWNrIGlmIHR3byBwb2ludHMgYXJlIGVxdWFsXG5cbmZ1bmN0aW9uIGVxdWFscyggcDEsIHAyICkge1xuXG5cdHJldHVybiBwMS54ID09PSBwMi54ICYmIHAxLnkgPT09IHAyLnk7XG5cbn1cblxuLy8gY2hlY2sgaWYgdHdvIHNlZ21lbnRzIGludGVyc2VjdFxuXG5mdW5jdGlvbiBpbnRlcnNlY3RzKCBwMSwgcTEsIHAyLCBxMiApIHtcblxuXHRpZiAoICggZXF1YWxzKCBwMSwgcTEgKSAmJiBlcXVhbHMoIHAyLCBxMiApICkgfHxcblx0XHRcdCggZXF1YWxzKCBwMSwgcTIgKSAmJiBlcXVhbHMoIHAyLCBxMSApICkgKSByZXR1cm4gdHJ1ZTtcblxuXHRyZXR1cm4gYXJlYSggcDEsIHExLCBwMiApID4gMCAhPT0gYXJlYSggcDEsIHExLCBxMiApID4gMCAmJlxuXHRcdFx0XHQgYXJlYSggcDIsIHEyLCBwMSApID4gMCAhPT0gYXJlYSggcDIsIHEyLCBxMSApID4gMDtcblxufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaW50ZXJzZWN0cyBhbnkgcG9seWdvbiBzZWdtZW50c1xuXG5mdW5jdGlvbiBpbnRlcnNlY3RzUG9seWdvbiggYSwgYiApIHtcblxuXHR2YXIgcCA9IGE7XG5cblx0ZG8ge1xuXG5cdFx0aWYgKCBwLmkgIT09IGEuaSAmJiBwLm5leHQuaSAhPT0gYS5pICYmIHAuaSAhPT0gYi5pICYmIHAubmV4dC5pICE9PSBiLmkgJiZcblx0XHRcdFx0XHRcdGludGVyc2VjdHMoIHAsIHAubmV4dCwgYSwgYiApICkge1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHAgPSBwLm5leHQ7XG5cblx0fSB3aGlsZSAoIHAgIT09IGEgKTtcblxuXHRyZXR1cm4gZmFsc2U7XG5cbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGxvY2FsbHkgaW5zaWRlIHRoZSBwb2x5Z29uXG5cbmZ1bmN0aW9uIGxvY2FsbHlJbnNpZGUoIGEsIGIgKSB7XG5cblx0cmV0dXJuIGFyZWEoIGEucHJldiwgYSwgYS5uZXh0ICkgPCAwID9cblx0XHRhcmVhKCBhLCBiLCBhLm5leHQgKSA+PSAwICYmIGFyZWEoIGEsIGEucHJldiwgYiApID49IDAgOlxuXHRcdGFyZWEoIGEsIGIsIGEucHJldiApIDwgMCB8fCBhcmVhKCBhLCBhLm5leHQsIGIgKSA8IDA7XG5cbn1cblxuLy8gY2hlY2sgaWYgdGhlIG1pZGRsZSBwb2ludCBvZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgaW5zaWRlIHRoZSBwb2x5Z29uXG5cbmZ1bmN0aW9uIG1pZGRsZUluc2lkZSggYSwgYiApIHtcblxuXHR2YXIgcCA9IGEsXG5cdFx0aW5zaWRlID0gZmFsc2UsXG5cdFx0cHggPSAoIGEueCArIGIueCApIC8gMixcblx0XHRweSA9ICggYS55ICsgYi55ICkgLyAyO1xuXG5cdGRvIHtcblxuXHRcdGlmICggKCAoIHAueSA+IHB5ICkgIT09ICggcC5uZXh0LnkgPiBweSApICkgJiYgcC5uZXh0LnkgIT09IHAueSAmJlxuXHRcdFx0XHRcdFx0KCBweCA8ICggcC5uZXh0LnggLSBwLnggKSAqICggcHkgLSBwLnkgKSAvICggcC5uZXh0LnkgLSBwLnkgKSArIHAueCApICkge1xuXG5cdFx0XHRpbnNpZGUgPSAhIGluc2lkZTtcblxuXHRcdH1cblxuXHRcdHAgPSBwLm5leHQ7XG5cblx0fSB3aGlsZSAoIHAgIT09IGEgKTtcblxuXHRyZXR1cm4gaW5zaWRlO1xuXG59XG5cbi8vIGxpbmsgdHdvIHBvbHlnb24gdmVydGljZXMgd2l0aCBhIGJyaWRnZTsgaWYgdGhlIHZlcnRpY2VzIGJlbG9uZyB0byB0aGUgc2FtZSByaW5nLCBpdCBzcGxpdHMgcG9seWdvbiBpbnRvIHR3bztcbi8vIGlmIG9uZSBiZWxvbmdzIHRvIHRoZSBvdXRlciByaW5nIGFuZCBhbm90aGVyIHRvIGEgaG9sZSwgaXQgbWVyZ2VzIGl0IGludG8gYSBzaW5nbGUgcmluZ1xuXG5mdW5jdGlvbiBzcGxpdFBvbHlnb24oIGEsIGIgKSB7XG5cblx0dmFyIGEyID0gbmV3IE5vZGUoIGEuaSwgYS54LCBhLnkgKSxcblx0XHRiMiA9IG5ldyBOb2RlKCBiLmksIGIueCwgYi55ICksXG5cdFx0YW4gPSBhLm5leHQsXG5cdFx0YnAgPSBiLnByZXY7XG5cblx0YS5uZXh0ID0gYjtcblx0Yi5wcmV2ID0gYTtcblxuXHRhMi5uZXh0ID0gYW47XG5cdGFuLnByZXYgPSBhMjtcblxuXHRiMi5uZXh0ID0gYTI7XG5cdGEyLnByZXYgPSBiMjtcblxuXHRicC5uZXh0ID0gYjI7XG5cdGIyLnByZXYgPSBicDtcblxuXHRyZXR1cm4gYjI7XG5cbn1cblxuLy8gY3JlYXRlIGEgbm9kZSBhbmQgb3B0aW9uYWxseSBsaW5rIGl0IHdpdGggcHJldmlvdXMgb25lIChpbiBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdClcblxuZnVuY3Rpb24gaW5zZXJ0Tm9kZSggaSwgeCwgeSwgbGFzdCApIHtcblxuXHR2YXIgcCA9IG5ldyBOb2RlKCBpLCB4LCB5ICk7XG5cblx0aWYgKCAhIGxhc3QgKSB7XG5cblx0XHRwLnByZXYgPSBwO1xuXHRcdHAubmV4dCA9IHA7XG5cblx0fSBlbHNlIHtcblxuXHRcdHAubmV4dCA9IGxhc3QubmV4dDtcblx0XHRwLnByZXYgPSBsYXN0O1xuXHRcdGxhc3QubmV4dC5wcmV2ID0gcDtcblx0XHRsYXN0Lm5leHQgPSBwO1xuXG5cdH1cblxuXHRyZXR1cm4gcDtcblxufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlKCBwICkge1xuXG5cdHAubmV4dC5wcmV2ID0gcC5wcmV2O1xuXHRwLnByZXYubmV4dCA9IHAubmV4dDtcblxuXHRpZiAoIHAucHJldlogKSBwLnByZXZaLm5leHRaID0gcC5uZXh0Wjtcblx0aWYgKCBwLm5leHRaICkgcC5uZXh0Wi5wcmV2WiA9IHAucHJldlo7XG5cbn1cblxuZnVuY3Rpb24gTm9kZSggaSwgeCwgeSApIHtcblxuXHQvLyB2ZXJ0aWNlIGluZGV4IGluIGNvb3JkaW5hdGVzIGFycmF5XG5cdHRoaXMuaSA9IGk7XG5cblx0Ly8gdmVydGV4IGNvb3JkaW5hdGVzXG5cdHRoaXMueCA9IHg7XG5cdHRoaXMueSA9IHk7XG5cblx0Ly8gcHJldmlvdXMgYW5kIG5leHQgdmVydGljZSBub2RlcyBpbiBhIHBvbHlnb24gcmluZ1xuXHR0aGlzLnByZXYgPSBudWxsO1xuXHR0aGlzLm5leHQgPSBudWxsO1xuXG5cdC8vIHotb3JkZXIgY3VydmUgdmFsdWVcblx0dGhpcy56ID0gbnVsbDtcblxuXHQvLyBwcmV2aW91cyBhbmQgbmV4dCBub2RlcyBpbiB6LW9yZGVyXG5cdHRoaXMucHJldlogPSBudWxsO1xuXHR0aGlzLm5leHRaID0gbnVsbDtcblxuXHQvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgc3RlaW5lciBwb2ludFxuXHR0aGlzLnN0ZWluZXIgPSBmYWxzZTtcblxufVxuXG5mdW5jdGlvbiBzaWduZWRBcmVhKCBkYXRhLCBzdGFydCwgZW5kLCBkaW0gKSB7XG5cblx0dmFyIHN1bSA9IDA7XG5cblx0Zm9yICggdmFyIGkgPSBzdGFydCwgaiA9IGVuZCAtIGRpbTsgaSA8IGVuZDsgaSArPSBkaW0gKSB7XG5cblx0XHRzdW0gKz0gKCBkYXRhWyBqIF0gLSBkYXRhWyBpIF0gKSAqICggZGF0YVsgaSArIDEgXSArIGRhdGFbIGogKyAxIF0gKTtcblx0XHRqID0gaTtcblxuXHR9XG5cblx0cmV0dXJuIHN1bTtcblxufVxuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqL1xuXG52YXIgU2hhcGVVdGlscyA9IHtcblxuXHQvLyBjYWxjdWxhdGUgYXJlYSBvZiB0aGUgY29udG91ciBwb2x5Z29uXG5cblx0YXJlYTogZnVuY3Rpb24gKCBjb250b3VyICkge1xuXG5cdFx0dmFyIG4gPSBjb250b3VyLmxlbmd0aDtcblx0XHR2YXIgYSA9IDAuMDtcblxuXHRcdGZvciAoIHZhciBwID0gbiAtIDEsIHEgPSAwOyBxIDwgbjsgcCA9IHEgKysgKSB7XG5cblx0XHRcdGEgKz0gY29udG91clsgcCBdLnggKiBjb250b3VyWyBxIF0ueSAtIGNvbnRvdXJbIHEgXS54ICogY29udG91clsgcCBdLnk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYSAqIDAuNTtcblxuXHR9LFxuXG5cdGlzQ2xvY2tXaXNlOiBmdW5jdGlvbiAoIHB0cyApIHtcblxuXHRcdHJldHVybiBTaGFwZVV0aWxzLmFyZWEoIHB0cyApIDwgMDtcblxuXHR9LFxuXG5cdHRyaWFuZ3VsYXRlU2hhcGU6IGZ1bmN0aW9uICggY29udG91ciwgaG9sZXMgKSB7XG5cblx0XHR2YXIgdmVydGljZXMgPSBbXTsgLy8gZmxhdCBhcnJheSBvZiB2ZXJ0aWNlcyBsaWtlIFsgeDAseTAsIHgxLHkxLCB4Mix5MiwgLi4uIF1cblx0XHR2YXIgaG9sZUluZGljZXMgPSBbXTsgLy8gYXJyYXkgb2YgaG9sZSBpbmRpY2VzXG5cdFx0dmFyIGZhY2VzID0gW107IC8vIGZpbmFsIGFycmF5IG9mIHZlcnRleCBpbmRpY2VzIGxpa2UgWyBbIGEsYixkIF0sIFsgYixjLGQgXSBdXG5cblx0XHRyZW1vdmVEdXBFbmRQdHMoIGNvbnRvdXIgKTtcblx0XHRhZGRDb250b3VyKCB2ZXJ0aWNlcywgY29udG91ciApO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBob2xlSW5kZXggPSBjb250b3VyLmxlbmd0aDtcblxuXHRcdGhvbGVzLmZvckVhY2goIHJlbW92ZUR1cEVuZFB0cyApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgaG9sZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRob2xlSW5kaWNlcy5wdXNoKCBob2xlSW5kZXggKTtcblx0XHRcdGhvbGVJbmRleCArPSBob2xlc1sgaSBdLmxlbmd0aDtcblx0XHRcdGFkZENvbnRvdXIoIHZlcnRpY2VzLCBob2xlc1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0dmFyIHRyaWFuZ2xlcyA9IEVhcmN1dC50cmlhbmd1bGF0ZSggdmVydGljZXMsIGhvbGVJbmRpY2VzICk7XG5cblx0XHQvL1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzICkge1xuXG5cdFx0XHRmYWNlcy5wdXNoKCB0cmlhbmdsZXMuc2xpY2UoIGksIGkgKyAzICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmYWNlcztcblxuXHR9XG5cbn07XG5cbmZ1bmN0aW9uIHJlbW92ZUR1cEVuZFB0cyggcG9pbnRzICkge1xuXG5cdHZhciBsID0gcG9pbnRzLmxlbmd0aDtcblxuXHRpZiAoIGwgPiAyICYmIHBvaW50c1sgbCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7XG5cblx0XHRwb2ludHMucG9wKCk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIGFkZENvbnRvdXIoIHZlcnRpY2VzLCBjb250b3VyICkge1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IGNvbnRvdXIubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0dmVydGljZXMucHVzaCggY29udG91clsgaSBdLnggKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCBjb250b3VyWyBpIF0ueSApO1xuXG5cdH1cblxufVxuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqXG4gKiBDcmVhdGVzIGV4dHJ1ZGVkIGdlb21ldHJ5IGZyb20gYSBwYXRoIHNoYXBlLlxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKlxuICogIGN1cnZlU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIG9uIHRoZSBjdXJ2ZXNcbiAqICBzdGVwczogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgZm9yIHotc2lkZSBleHRydXNpb25zIC8gdXNlZCBmb3Igc3ViZGl2aWRpbmcgc2VnbWVudHMgb2YgZXh0cnVkZSBzcGxpbmUgdG9vXG4gKiAgYW1vdW50OiA8aW50PiwgLy8gRGVwdGggdG8gZXh0cnVkZSB0aGUgc2hhcGVcbiAqXG4gKiAgYmV2ZWxFbmFibGVkOiA8Ym9vbD4sIC8vIHR1cm4gb24gYmV2ZWxcbiAqICBiZXZlbFRoaWNrbmVzczogPGZsb2F0PiwgLy8gaG93IGRlZXAgaW50byB0aGUgb3JpZ2luYWwgc2hhcGUgYmV2ZWwgZ29lc1xuICogIGJldmVsU2l6ZTogPGZsb2F0PiwgLy8gaG93IGZhciBmcm9tIHNoYXBlIG91dGxpbmUgaXMgYmV2ZWxcbiAqICBiZXZlbFNlZ21lbnRzOiA8aW50PiwgLy8gbnVtYmVyIG9mIGJldmVsIGxheWVyc1xuICpcbiAqICBleHRydWRlUGF0aDogPFRIUkVFLkN1cnZlPiAvLyBjdXJ2ZSB0byBleHRydWRlIHNoYXBlIGFsb25nXG4gKlxuICogIFVWR2VuZXJhdG9yOiA8T2JqZWN0PiAvLyBvYmplY3QgdGhhdCBwcm92aWRlcyBVViBnZW5lcmF0b3IgZnVuY3Rpb25zXG4gKlxuICogfVxuICovXG5cbi8vIEV4dHJ1ZGVHZW9tZXRyeVxuXG5mdW5jdGlvbiBFeHRydWRlR2VvbWV0cnkoIHNoYXBlcywgb3B0aW9ucyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0V4dHJ1ZGVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHNoYXBlczogc2hhcGVzLFxuXHRcdG9wdGlvbnM6IG9wdGlvbnNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuRXh0cnVkZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuRXh0cnVkZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEV4dHJ1ZGVHZW9tZXRyeTtcblxuLy8gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnRXh0cnVkZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0c2hhcGVzOiBzaGFwZXMsXG5cdFx0b3B0aW9uczogb3B0aW9uc1xuXHR9O1xuXG5cdHNoYXBlcyA9IEFycmF5LmlzQXJyYXkoIHNoYXBlcyApID8gc2hhcGVzIDogWyBzaGFwZXMgXTtcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHZhciB2ZXJ0aWNlc0FycmF5ID0gW107XG5cdHZhciB1dkFycmF5ID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgc2hhcGUgPSBzaGFwZXNbIGkgXTtcblx0XHRhZGRTaGFwZSggc2hhcGUsIG9wdGlvbnMgKTtcblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzQXJyYXksIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2QXJyYXksIDIgKSApO1xuXG5cdHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHQvLyBmdW5jdGlvbnNcblxuXHRmdW5jdGlvbiBhZGRTaGFwZSggc2hhcGUgKSB7XG5cblx0XHR2YXIgcGxhY2Vob2xkZXIgPSBbXTtcblxuXHRcdC8vIG9wdGlvbnNcblxuXHRcdHZhciBjdXJ2ZVNlZ21lbnRzID0gb3B0aW9ucy5jdXJ2ZVNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmN1cnZlU2VnbWVudHMgOiAxMjtcblx0XHR2YXIgc3RlcHMgPSBvcHRpb25zLnN0ZXBzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0ZXBzIDogMTtcblx0XHR2YXIgYW1vdW50ID0gb3B0aW9ucy5hbW91bnQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYW1vdW50IDogMTAwO1xuXG5cdFx0dmFyIGJldmVsRW5hYmxlZCA9IG9wdGlvbnMuYmV2ZWxFbmFibGVkICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsRW5hYmxlZCA6IHRydWU7XG5cdFx0dmFyIGJldmVsVGhpY2tuZXNzID0gb3B0aW9ucy5iZXZlbFRoaWNrbmVzcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFRoaWNrbmVzcyA6IDY7XG5cdFx0dmFyIGJldmVsU2l6ZSA9IG9wdGlvbnMuYmV2ZWxTaXplICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2l6ZSA6IGJldmVsVGhpY2tuZXNzIC0gMjtcblx0XHR2YXIgYmV2ZWxTZWdtZW50cyA9IG9wdGlvbnMuYmV2ZWxTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFNlZ21lbnRzIDogMztcblxuXHRcdHZhciBleHRydWRlUGF0aCA9IG9wdGlvbnMuZXh0cnVkZVBhdGg7XG5cblx0XHR2YXIgdXZnZW4gPSBvcHRpb25zLlVWR2VuZXJhdG9yICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLlVWR2VuZXJhdG9yIDogV29ybGRVVkdlbmVyYXRvcjtcblxuXHRcdC8vXG5cblx0XHR2YXIgZXh0cnVkZVB0cywgZXh0cnVkZUJ5UGF0aCA9IGZhbHNlO1xuXHRcdHZhciBzcGxpbmVUdWJlLCBiaW5vcm1hbCwgbm9ybWFsLCBwb3NpdGlvbjI7XG5cblx0XHRpZiAoIGV4dHJ1ZGVQYXRoICkge1xuXG5cdFx0XHRleHRydWRlUHRzID0gZXh0cnVkZVBhdGguZ2V0U3BhY2VkUG9pbnRzKCBzdGVwcyApO1xuXG5cdFx0XHRleHRydWRlQnlQYXRoID0gdHJ1ZTtcblx0XHRcdGJldmVsRW5hYmxlZCA9IGZhbHNlOyAvLyBiZXZlbHMgbm90IHN1cHBvcnRlZCBmb3IgcGF0aCBleHRydXNpb25cblxuXHRcdFx0Ly8gU0VUVVAgVE5CIHZhcmlhYmxlc1xuXG5cdFx0XHQvLyBUT0RPMSAtIGhhdmUgYSAuaXNDbG9zZWQgaW4gc3BsaW5lP1xuXG5cdFx0XHRzcGxpbmVUdWJlID0gZXh0cnVkZVBhdGguY29tcHV0ZUZyZW5ldEZyYW1lcyggc3RlcHMsIGZhbHNlICk7XG5cblx0XHRcdC8vIGNvbnNvbGUubG9nKHNwbGluZVR1YmUsICdzcGxpbmVUdWJlJywgc3BsaW5lVHViZS5ub3JtYWxzLmxlbmd0aCwgJ3N0ZXBzJywgc3RlcHMsICdleHRydWRlUHRzJywgZXh0cnVkZVB0cy5sZW5ndGgpO1xuXG5cdFx0XHRiaW5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0cG9zaXRpb24yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdC8vIFNhZmVndWFyZHMgaWYgYmV2ZWxzIGFyZSBub3QgZW5hYmxlZFxuXG5cdFx0aWYgKCAhIGJldmVsRW5hYmxlZCApIHtcblxuXHRcdFx0YmV2ZWxTZWdtZW50cyA9IDA7XG5cdFx0XHRiZXZlbFRoaWNrbmVzcyA9IDA7XG5cdFx0XHRiZXZlbFNpemUgPSAwO1xuXG5cdFx0fVxuXG5cdFx0Ly8gVmFyaWFibGVzIGluaXRpYWxpemF0aW9uXG5cblx0XHR2YXIgYWhvbGUsIGgsIGhsOyAvLyBsb29waW5nIG9mIGhvbGVzXG5cblx0XHR2YXIgc2hhcGVQb2ludHMgPSBzaGFwZS5leHRyYWN0UG9pbnRzKCBjdXJ2ZVNlZ21lbnRzICk7XG5cblx0XHR2YXIgdmVydGljZXMgPSBzaGFwZVBvaW50cy5zaGFwZTtcblx0XHR2YXIgaG9sZXMgPSBzaGFwZVBvaW50cy5ob2xlcztcblxuXHRcdHZhciByZXZlcnNlID0gISBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCB2ZXJ0aWNlcyApO1xuXG5cdFx0aWYgKCByZXZlcnNlICkge1xuXG5cdFx0XHR2ZXJ0aWNlcyA9IHZlcnRpY2VzLnJldmVyc2UoKTtcblxuXHRcdFx0Ly8gTWF5YmUgd2Ugc2hvdWxkIGFsc28gY2hlY2sgaWYgaG9sZXMgYXJlIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24sIGp1c3QgdG8gYmUgc2FmZSAuLi5cblxuXHRcdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXG5cdFx0XHRcdGlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggYWhvbGUgKSApIHtcblxuXHRcdFx0XHRcdGhvbGVzWyBoIF0gPSBhaG9sZS5yZXZlcnNlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblxuXHRcdHZhciBmYWNlcyA9IFNoYXBlVXRpbHMudHJpYW5ndWxhdGVTaGFwZSggdmVydGljZXMsIGhvbGVzICk7XG5cblx0XHQvKiBWZXJ0aWNlcyAqL1xuXG5cdFx0dmFyIGNvbnRvdXIgPSB2ZXJ0aWNlczsgLy8gdmVydGljZXMgaGFzIGFsbCBwb2ludHMgYnV0IGNvbnRvdXIgaGFzIG9ubHkgcG9pbnRzIG9mIGNpcmN1bWZlcmVuY2VcblxuXHRcdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cblx0XHRcdHZlcnRpY2VzID0gdmVydGljZXMuY29uY2F0KCBhaG9sZSApO1xuXG5cdFx0fVxuXG5cblx0XHRmdW5jdGlvbiBzY2FsZVB0MiggcHQsIHZlYywgc2l6ZSApIHtcblxuXHRcdFx0aWYgKCAhIHZlYyApIGNvbnNvbGUuZXJyb3IoIFwiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3RcIiApO1xuXG5cdFx0XHRyZXR1cm4gdmVjLmNsb25lKCkubXVsdGlwbHlTY2FsYXIoIHNpemUgKS5hZGQoIHB0ICk7XG5cblx0XHR9XG5cblx0XHR2YXIgYiwgYnMsIHQsIHosXG5cdFx0XHR2ZXJ0LCB2bGVuID0gdmVydGljZXMubGVuZ3RoLFxuXHRcdFx0ZmFjZSwgZmxlbiA9IGZhY2VzLmxlbmd0aDtcblxuXG5cdFx0Ly8gRmluZCBkaXJlY3Rpb25zIGZvciBwb2ludCBtb3ZlbWVudFxuXG5cblx0XHRmdW5jdGlvbiBnZXRCZXZlbFZlYyggaW5QdCwgaW5QcmV2LCBpbk5leHQgKSB7XG5cblx0XHRcdC8vIGNvbXB1dGVzIGZvciBpblB0IHRoZSBjb3JyZXNwb25kaW5nIHBvaW50IGluUHQnIG9uIGEgbmV3IGNvbnRvdXJcblx0XHRcdC8vICAgc2hpZnRlZCBieSAxIHVuaXQgKGxlbmd0aCBvZiBub3JtYWxpemVkIHZlY3RvcikgdG8gdGhlIGxlZnRcblx0XHRcdC8vIGlmIHdlIHdhbGsgYWxvbmcgY29udG91ciBjbG9ja3dpc2UsIHRoaXMgbmV3IGNvbnRvdXIgaXMgb3V0c2lkZSB0aGUgb2xkIG9uZVxuXHRcdFx0Ly9cblx0XHRcdC8vIGluUHQnIGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBsaW5lcyBwYXJhbGxlbCB0byB0aGUgdHdvXG5cdFx0XHQvLyAgYWRqYWNlbnQgZWRnZXMgb2YgaW5QdCBhdCBhIGRpc3RhbmNlIG9mIDEgdW5pdCBvbiB0aGUgbGVmdCBzaWRlLlxuXG5cdFx0XHR2YXIgdl90cmFuc194LCB2X3RyYW5zX3ksIHNocmlua19ieTsgLy8gcmVzdWx0aW5nIHRyYW5zbGF0aW9uIHZlY3RvciBmb3IgaW5QdFxuXG5cdFx0XHQvLyBnb29kIHJlYWRpbmcgZm9yIGdlb21ldHJ5IGFsZ29yaXRobXMgKGhlcmU6IGxpbmUtbGluZSBpbnRlcnNlY3Rpb24pXG5cdFx0XHQvLyBodHRwOi8vZ2VvbWFsZ29yaXRobXMuY29tL2EwNS1faW50ZXJzZWN0LTEuaHRtbFxuXG5cdFx0XHR2YXIgdl9wcmV2X3ggPSBpblB0LnggLSBpblByZXYueCxcblx0XHRcdFx0dl9wcmV2X3kgPSBpblB0LnkgLSBpblByZXYueTtcblx0XHRcdHZhciB2X25leHRfeCA9IGluTmV4dC54IC0gaW5QdC54LFxuXHRcdFx0XHR2X25leHRfeSA9IGluTmV4dC55IC0gaW5QdC55O1xuXG5cdFx0XHR2YXIgdl9wcmV2X2xlbnNxID0gKCB2X3ByZXZfeCAqIHZfcHJldl94ICsgdl9wcmV2X3kgKiB2X3ByZXZfeSApO1xuXG5cdFx0XHQvLyBjaGVjayBmb3IgY29sbGluZWFyIGVkZ2VzXG5cdFx0XHR2YXIgY29sbGluZWFyMCA9ICggdl9wcmV2X3ggKiB2X25leHRfeSAtIHZfcHJldl95ICogdl9uZXh0X3ggKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggY29sbGluZWFyMCApID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0Ly8gbm90IGNvbGxpbmVhclxuXG5cdFx0XHRcdC8vIGxlbmd0aCBvZiB2ZWN0b3JzIGZvciBub3JtYWxpemluZ1xuXG5cdFx0XHRcdHZhciB2X3ByZXZfbGVuID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgKTtcblx0XHRcdFx0dmFyIHZfbmV4dF9sZW4gPSBNYXRoLnNxcnQoIHZfbmV4dF94ICogdl9uZXh0X3ggKyB2X25leHRfeSAqIHZfbmV4dF95ICk7XG5cblx0XHRcdFx0Ly8gc2hpZnQgYWRqYWNlbnQgcG9pbnRzIGJ5IHVuaXQgdmVjdG9ycyB0byB0aGUgbGVmdFxuXG5cdFx0XHRcdHZhciBwdFByZXZTaGlmdF94ID0gKCBpblByZXYueCAtIHZfcHJldl95IC8gdl9wcmV2X2xlbiApO1xuXHRcdFx0XHR2YXIgcHRQcmV2U2hpZnRfeSA9ICggaW5QcmV2LnkgKyB2X3ByZXZfeCAvIHZfcHJldl9sZW4gKTtcblxuXHRcdFx0XHR2YXIgcHROZXh0U2hpZnRfeCA9ICggaW5OZXh0LnggLSB2X25leHRfeSAvIHZfbmV4dF9sZW4gKTtcblx0XHRcdFx0dmFyIHB0TmV4dFNoaWZ0X3kgPSAoIGluTmV4dC55ICsgdl9uZXh0X3ggLyB2X25leHRfbGVuICk7XG5cblx0XHRcdFx0Ly8gc2NhbGluZyBmYWN0b3IgZm9yIHZfcHJldiB0byBpbnRlcnNlY3Rpb24gcG9pbnRcblxuXHRcdFx0XHR2YXIgc2YgPSAoICggcHROZXh0U2hpZnRfeCAtIHB0UHJldlNoaWZ0X3ggKSAqIHZfbmV4dF95IC1cblx0XHRcdFx0XHRcdCggcHROZXh0U2hpZnRfeSAtIHB0UHJldlNoaWZ0X3kgKSAqIHZfbmV4dF94ICkgL1xuXHRcdFx0XHRcdCggdl9wcmV2X3ggKiB2X25leHRfeSAtIHZfcHJldl95ICogdl9uZXh0X3ggKTtcblxuXHRcdFx0XHQvLyB2ZWN0b3IgZnJvbSBpblB0IHRvIGludGVyc2VjdGlvbiBwb2ludFxuXG5cdFx0XHRcdHZfdHJhbnNfeCA9ICggcHRQcmV2U2hpZnRfeCArIHZfcHJldl94ICogc2YgLSBpblB0LnggKTtcblx0XHRcdFx0dl90cmFuc195ID0gKCBwdFByZXZTaGlmdF95ICsgdl9wcmV2X3kgKiBzZiAtIGluUHQueSApO1xuXG5cdFx0XHRcdC8vIERvbid0IG5vcm1hbGl6ZSEsIG90aGVyd2lzZSBzaGFycCBjb3JuZXJzIGJlY29tZSB1Z2x5XG5cdFx0XHRcdC8vICBidXQgcHJldmVudCBjcmF6eSBzcGlrZXNcblx0XHRcdFx0dmFyIHZfdHJhbnNfbGVuc3EgPSAoIHZfdHJhbnNfeCAqIHZfdHJhbnNfeCArIHZfdHJhbnNfeSAqIHZfdHJhbnNfeSApO1xuXHRcdFx0XHRpZiAoIHZfdHJhbnNfbGVuc3EgPD0gMiApIHtcblxuXHRcdFx0XHRcdHJldHVybiBuZXcgVmVjdG9yMiggdl90cmFuc194LCB2X3RyYW5zX3kgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0c2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3RyYW5zX2xlbnNxIC8gMiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGNvbGxpbmVhciBlZGdlc1xuXG5cdFx0XHRcdHZhciBkaXJlY3Rpb25fZXEgPSBmYWxzZTsgLy8gYXNzdW1lczogb3Bwb3NpdGVcblx0XHRcdFx0aWYgKCB2X3ByZXZfeCA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0aWYgKCB2X25leHRfeCA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoIHZfcHJldl94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCB2X25leHRfeCA8IC0gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRcdFx0ZGlyZWN0aW9uX2VxID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBNYXRoLnNpZ24oIHZfcHJldl95ICkgPT09IE1hdGguc2lnbiggdl9uZXh0X3kgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggZGlyZWN0aW9uX2VxICkge1xuXG5cdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJXYXJuaW5nOiBsaW5lcyBhcmUgYSBzdHJhaWdodCBzZXF1ZW5jZVwiKTtcblx0XHRcdFx0XHR2X3RyYW5zX3ggPSAtIHZfcHJldl95O1xuXHRcdFx0XHRcdHZfdHJhbnNfeSA9IHZfcHJldl94O1xuXHRcdFx0XHRcdHNocmlua19ieSA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwiV2FybmluZzogbGluZXMgYXJlIGEgc3RyYWlnaHQgc3Bpa2VcIik7XG5cdFx0XHRcdFx0dl90cmFuc194ID0gdl9wcmV2X3g7XG5cdFx0XHRcdFx0dl90cmFuc195ID0gdl9wcmV2X3k7XG5cdFx0XHRcdFx0c2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgLyAyICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBuZXcgVmVjdG9yMiggdl90cmFuc194IC8gc2hyaW5rX2J5LCB2X3RyYW5zX3kgLyBzaHJpbmtfYnkgKTtcblxuXHRcdH1cblxuXG5cdFx0dmFyIGNvbnRvdXJNb3ZlbWVudHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aCwgaiA9IGlsIC0gMSwgayA9IGkgKyAxOyBpIDwgaWw7IGkgKyssIGogKyssIGsgKysgKSB7XG5cblx0XHRcdGlmICggaiA9PT0gaWwgKSBqID0gMDtcblx0XHRcdGlmICggayA9PT0gaWwgKSBrID0gMDtcblxuXHRcdFx0Ly8gIChqKS0tLShpKS0tLShrKVxuXHRcdFx0Ly8gY29uc29sZS5sb2coJ2ksaixrJywgaSwgaiAsIGspXG5cblx0XHRcdGNvbnRvdXJNb3ZlbWVudHNbIGkgXSA9IGdldEJldmVsVmVjKCBjb250b3VyWyBpIF0sIGNvbnRvdXJbIGogXSwgY29udG91clsgayBdICk7XG5cblx0XHR9XG5cblx0XHR2YXIgaG9sZXNNb3ZlbWVudHMgPSBbXSxcblx0XHRcdG9uZUhvbGVNb3ZlbWVudHMsIHZlcnRpY2VzTW92ZW1lbnRzID0gY29udG91ck1vdmVtZW50cy5jb25jYXQoKTtcblxuXHRcdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cblx0XHRcdG9uZUhvbGVNb3ZlbWVudHMgPSBbXTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoLCBqID0gaWwgLSAxLCBrID0gaSArIDE7IGkgPCBpbDsgaSArKywgaiArKywgayArKyApIHtcblxuXHRcdFx0XHRpZiAoIGogPT09IGlsICkgaiA9IDA7XG5cdFx0XHRcdGlmICggayA9PT0gaWwgKSBrID0gMDtcblxuXHRcdFx0XHQvLyAgKGopLS0tKGkpLS0tKGspXG5cdFx0XHRcdG9uZUhvbGVNb3ZlbWVudHNbIGkgXSA9IGdldEJldmVsVmVjKCBhaG9sZVsgaSBdLCBhaG9sZVsgaiBdLCBhaG9sZVsgayBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aG9sZXNNb3ZlbWVudHMucHVzaCggb25lSG9sZU1vdmVtZW50cyApO1xuXHRcdFx0dmVydGljZXNNb3ZlbWVudHMgPSB2ZXJ0aWNlc01vdmVtZW50cy5jb25jYXQoIG9uZUhvbGVNb3ZlbWVudHMgKTtcblxuXHRcdH1cblxuXG5cdFx0Ly8gTG9vcCBiZXZlbFNlZ21lbnRzLCAxIGZvciB0aGUgZnJvbnQsIDEgZm9yIHRoZSBiYWNrXG5cblx0XHRmb3IgKCBiID0gMDsgYiA8IGJldmVsU2VnbWVudHM7IGIgKysgKSB7XG5cblx0XHRcdC8vZm9yICggYiA9IGJldmVsU2VnbWVudHM7IGIgPiAwOyBiIC0tICkge1xuXG5cdFx0XHR0ID0gYiAvIGJldmVsU2VnbWVudHM7XG5cdFx0XHR6ID0gYmV2ZWxUaGlja25lc3MgKiBNYXRoLmNvcyggdCAqIE1hdGguUEkgLyAyICk7XG5cdFx0XHRicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICogTWF0aC5QSSAvIDIgKTtcblxuXHRcdFx0Ly8gY29udHJhY3Qgc2hhcGVcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHR2ZXJ0ID0gc2NhbGVQdDIoIGNvbnRvdXJbIGkgXSwgY29udG91ck1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAtIHogKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBleHBhbmQgaG9sZXNcblxuXHRcdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gaG9sZXNNb3ZlbWVudHNbIGggXTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggYWhvbGVbIGkgXSwgb25lSG9sZU1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIC0geiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0YnMgPSBiZXZlbFNpemU7XG5cblx0XHQvLyBCYWNrIGZhY2luZyB2ZXJ0aWNlc1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCB2bGVuOyBpICsrICkge1xuXG5cdFx0XHR2ZXJ0ID0gYmV2ZWxFbmFibGVkID8gc2NhbGVQdDIoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzTW92ZW1lbnRzWyBpIF0sIGJzICkgOiB2ZXJ0aWNlc1sgaSBdO1xuXG5cdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcblxuXHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIHYoIHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1sgMCBdLnksIGV4dHJ1ZGVQdHNbIDAgXS54ICk7XG5cblx0XHRcdFx0bm9ybWFsLmNvcHkoIHNwbGluZVR1YmUubm9ybWFsc1sgMCBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueCApO1xuXHRcdFx0XHRiaW5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLmJpbm9ybWFsc1sgMCBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueSApO1xuXG5cdFx0XHRcdHBvc2l0aW9uMi5jb3B5KCBleHRydWRlUHRzWyAwIF0gKS5hZGQoIG5vcm1hbCApLmFkZCggYmlub3JtYWwgKTtcblxuXHRcdFx0XHR2KCBwb3NpdGlvbjIueCwgcG9zaXRpb24yLnksIHBvc2l0aW9uMi56ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIEFkZCBzdGVwcGVkIHZlcnRpY2VzLi4uXG5cdFx0Ly8gSW5jbHVkaW5nIGZyb250IGZhY2luZyB2ZXJ0aWNlc1xuXG5cdFx0dmFyIHM7XG5cblx0XHRmb3IgKCBzID0gMTsgcyA8PSBzdGVwczsgcyArKyApIHtcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCB2bGVuOyBpICsrICkge1xuXG5cdFx0XHRcdHZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2FsZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6IHZlcnRpY2VzWyBpIF07XG5cblx0XHRcdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XG5cblx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgYW1vdW50IC8gc3RlcHMgKiBzICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHYoIHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1sgcyAtIDEgXS55LCBleHRydWRlUHRzWyBzIC0gMSBdLnggKTtcblxuXHRcdFx0XHRcdG5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLm5vcm1hbHNbIHMgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnggKTtcblx0XHRcdFx0XHRiaW5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLmJpbm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueSApO1xuXG5cdFx0XHRcdFx0cG9zaXRpb24yLmNvcHkoIGV4dHJ1ZGVQdHNbIHMgXSApLmFkZCggbm9ybWFsICkuYWRkKCBiaW5vcm1hbCApO1xuXG5cdFx0XHRcdFx0diggcG9zaXRpb24yLngsIHBvc2l0aW9uMi55LCBwb3NpdGlvbjIueiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cblx0XHQvLyBBZGQgYmV2ZWwgc2VnbWVudHMgcGxhbmVzXG5cblx0XHQvL2ZvciAoIGIgPSAxOyBiIDw9IGJldmVsU2VnbWVudHM7IGIgKysgKSB7XG5cdFx0Zm9yICggYiA9IGJldmVsU2VnbWVudHMgLSAxOyBiID49IDA7IGIgLS0gKSB7XG5cblx0XHRcdHQgPSBiIC8gYmV2ZWxTZWdtZW50cztcblx0XHRcdHogPSBiZXZlbFRoaWNrbmVzcyAqIE1hdGguY29zKCB0ICogTWF0aC5QSSAvIDIgKTtcblx0XHRcdGJzID0gYmV2ZWxTaXplICogTWF0aC5zaW4oIHQgKiBNYXRoLlBJIC8gMiApO1xuXG5cdFx0XHQvLyBjb250cmFjdCBzaGFwZVxuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHZlcnQgPSBzY2FsZVB0MiggY29udG91clsgaSBdLCBjb250b3VyTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgKyB6ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZXhwYW5kIGhvbGVzXG5cblx0XHRcdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblx0XHRcdFx0b25lSG9sZU1vdmVtZW50cyA9IGhvbGVzTW92ZW1lbnRzWyBoIF07XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2ZXJ0ID0gc2NhbGVQdDIoIGFob2xlWyBpIF0sIG9uZUhvbGVNb3ZlbWVudHNbIGkgXSwgYnMgKTtcblxuXHRcdFx0XHRcdGlmICggISBleHRydWRlQnlQYXRoICkge1xuXG5cdFx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgYW1vdW50ICsgeiApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzdGVwcyAtIDEgXS55LCBleHRydWRlUHRzWyBzdGVwcyAtIDEgXS54ICsgeiApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0LyogRmFjZXMgKi9cblxuXHRcdC8vIFRvcCBhbmQgYm90dG9tIGZhY2VzXG5cblx0XHRidWlsZExpZEZhY2VzKCk7XG5cblx0XHQvLyBTaWRlcyBmYWNlc1xuXG5cdFx0YnVpbGRTaWRlRmFjZXMoKTtcblxuXG5cdFx0Ly8vLy8gIEludGVybmFsIGZ1bmN0aW9uc1xuXG5cdFx0ZnVuY3Rpb24gYnVpbGRMaWRGYWNlcygpIHtcblxuXHRcdFx0dmFyIHN0YXJ0ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXG5cdFx0XHRpZiAoIGJldmVsRW5hYmxlZCApIHtcblxuXHRcdFx0XHR2YXIgbGF5ZXIgPSAwOyAvLyBzdGVwcyArIDFcblx0XHRcdFx0dmFyIG9mZnNldCA9IHZsZW4gKiBsYXllcjtcblxuXHRcdFx0XHQvLyBCb3R0b20gZmFjZXNcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlID0gZmFjZXNbIGkgXTtcblx0XHRcdFx0XHRmMyggZmFjZVsgMiBdICsgb2Zmc2V0LCBmYWNlWyAxIF0gKyBvZmZzZXQsIGZhY2VbIDAgXSArIG9mZnNldCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsYXllciA9IHN0ZXBzICsgYmV2ZWxTZWdtZW50cyAqIDI7XG5cdFx0XHRcdG9mZnNldCA9IHZsZW4gKiBsYXllcjtcblxuXHRcdFx0XHQvLyBUb3AgZmFjZXNcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlID0gZmFjZXNbIGkgXTtcblx0XHRcdFx0XHRmMyggZmFjZVsgMCBdICsgb2Zmc2V0LCBmYWNlWyAxIF0gKyBvZmZzZXQsIGZhY2VbIDIgXSArIG9mZnNldCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBCb3R0b20gZmFjZXNcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlID0gZmFjZXNbIGkgXTtcblx0XHRcdFx0XHRmMyggZmFjZVsgMiBdLCBmYWNlWyAxIF0sIGZhY2VbIDAgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUb3AgZmFjZXNcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlID0gZmFjZXNbIGkgXTtcblx0XHRcdFx0XHRmMyggZmFjZVsgMCBdICsgdmxlbiAqIHN0ZXBzLCBmYWNlWyAxIF0gKyB2bGVuICogc3RlcHMsIGZhY2VbIDIgXSArIHZsZW4gKiBzdGVwcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRzY29wZS5hZGRHcm91cCggc3RhcnQsIHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMyAtIHN0YXJ0LCAwICk7XG5cblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgZmFjZXMgZm9yIHRoZSB6LXNpZGVzIG9mIHRoZSBzaGFwZVxuXG5cdFx0ZnVuY3Rpb24gYnVpbGRTaWRlRmFjZXMoKSB7XG5cblx0XHRcdHZhciBzdGFydCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcblx0XHRcdHZhciBsYXllcm9mZnNldCA9IDA7XG5cdFx0XHRzaWRld2FsbHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICk7XG5cdFx0XHRsYXllcm9mZnNldCArPSBjb250b3VyLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXHRcdFx0XHRzaWRld2FsbHMoIGFob2xlLCBsYXllcm9mZnNldCApO1xuXG5cdFx0XHRcdC8vLCB0cnVlXG5cdFx0XHRcdGxheWVyb2Zmc2V0ICs9IGFob2xlLmxlbmd0aDtcblxuXHRcdFx0fVxuXG5cblx0XHRcdHNjb3BlLmFkZEdyb3VwKCBzdGFydCwgdmVydGljZXNBcnJheS5sZW5ndGggLyAzIC0gc3RhcnQsIDEgKTtcblxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gc2lkZXdhbGxzKCBjb250b3VyLCBsYXllcm9mZnNldCApIHtcblxuXHRcdFx0dmFyIGosIGs7XG5cdFx0XHRpID0gY29udG91ci5sZW5ndGg7XG5cblx0XHRcdHdoaWxlICggLS0gaSA+PSAwICkge1xuXG5cdFx0XHRcdGogPSBpO1xuXHRcdFx0XHRrID0gaSAtIDE7XG5cdFx0XHRcdGlmICggayA8IDAgKSBrID0gY29udG91ci5sZW5ndGggLSAxO1xuXG5cdFx0XHRcdC8vY29uc29sZS5sb2coJ2InLCBpLGosIGktMSwgayx2ZXJ0aWNlcy5sZW5ndGgpO1xuXG5cdFx0XHRcdHZhciBzID0gMCxcblx0XHRcdFx0XHRzbCA9IHN0ZXBzICsgYmV2ZWxTZWdtZW50cyAqIDI7XG5cblx0XHRcdFx0Zm9yICggcyA9IDA7IHMgPCBzbDsgcyArKyApIHtcblxuXHRcdFx0XHRcdHZhciBzbGVuMSA9IHZsZW4gKiBzO1xuXHRcdFx0XHRcdHZhciBzbGVuMiA9IHZsZW4gKiAoIHMgKyAxICk7XG5cblx0XHRcdFx0XHR2YXIgYSA9IGxheWVyb2Zmc2V0ICsgaiArIHNsZW4xLFxuXHRcdFx0XHRcdFx0YiA9IGxheWVyb2Zmc2V0ICsgayArIHNsZW4xLFxuXHRcdFx0XHRcdFx0YyA9IGxheWVyb2Zmc2V0ICsgayArIHNsZW4yLFxuXHRcdFx0XHRcdFx0ZCA9IGxheWVyb2Zmc2V0ICsgaiArIHNsZW4yO1xuXG5cdFx0XHRcdFx0ZjQoIGEsIGIsIGMsIGQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHYoIHgsIHksIHogKSB7XG5cblx0XHRcdHBsYWNlaG9sZGVyLnB1c2goIHggKTtcblx0XHRcdHBsYWNlaG9sZGVyLnB1c2goIHkgKTtcblx0XHRcdHBsYWNlaG9sZGVyLnB1c2goIHogKTtcblxuXHRcdH1cblxuXG5cdFx0ZnVuY3Rpb24gZjMoIGEsIGIsIGMgKSB7XG5cblx0XHRcdGFkZFZlcnRleCggYSApO1xuXHRcdFx0YWRkVmVydGV4KCBiICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGMgKTtcblxuXHRcdFx0dmFyIG5leHRJbmRleCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcblx0XHRcdHZhciB1dnMgPSB1dmdlbi5nZW5lcmF0ZVRvcFVWKCBzY29wZSwgdmVydGljZXNBcnJheSwgbmV4dEluZGV4IC0gMywgbmV4dEluZGV4IC0gMiwgbmV4dEluZGV4IC0gMSApO1xuXG5cdFx0XHRhZGRVViggdXZzWyAwIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDEgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMiBdICk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBmNCggYSwgYiwgYywgZCApIHtcblxuXHRcdFx0YWRkVmVydGV4KCBhICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGIgKTtcblx0XHRcdGFkZFZlcnRleCggZCApO1xuXG5cdFx0XHRhZGRWZXJ0ZXgoIGIgKTtcblx0XHRcdGFkZFZlcnRleCggYyApO1xuXHRcdFx0YWRkVmVydGV4KCBkICk7XG5cblxuXHRcdFx0dmFyIG5leHRJbmRleCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcblx0XHRcdHZhciB1dnMgPSB1dmdlbi5nZW5lcmF0ZVNpZGVXYWxsVVYoIHNjb3BlLCB2ZXJ0aWNlc0FycmF5LCBuZXh0SW5kZXggLSA2LCBuZXh0SW5kZXggLSAzLCBuZXh0SW5kZXggLSAyLCBuZXh0SW5kZXggLSAxICk7XG5cblx0XHRcdGFkZFVWKCB1dnNbIDAgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMSBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAzIF0gKTtcblxuXHRcdFx0YWRkVVYoIHV2c1sgMSBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAyIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDMgXSApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gYWRkVmVydGV4KCBpbmRleCApIHtcblxuXHRcdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMCBdICk7XG5cdFx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAxIF0gKTtcblx0XHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDIgXSApO1xuXG5cdFx0fVxuXG5cblx0XHRmdW5jdGlvbiBhZGRVViggdmVjdG9yMiApIHtcblxuXHRcdFx0dXZBcnJheS5wdXNoKCB2ZWN0b3IyLnggKTtcblx0XHRcdHV2QXJyYXkucHVzaCggdmVjdG9yMi55ICk7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFeHRydWRlQnVmZmVyR2VvbWV0cnk7XG5cbnZhciBXb3JsZFVWR2VuZXJhdG9yID0ge1xuXG5cdGdlbmVyYXRlVG9wVVY6IGZ1bmN0aW9uICggZ2VvbWV0cnksIHZlcnRpY2VzLCBpbmRleEEsIGluZGV4QiwgaW5kZXhDICkge1xuXG5cdFx0dmFyIGFfeCA9IHZlcnRpY2VzWyBpbmRleEEgKiAzIF07XG5cdFx0dmFyIGFfeSA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMSBdO1xuXHRcdHZhciBiX3ggPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyBdO1xuXHRcdHZhciBiX3kgPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyArIDEgXTtcblx0XHR2YXIgY194ID0gdmVydGljZXNbIGluZGV4QyAqIDMgXTtcblx0XHR2YXIgY195ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAxIF07XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0bmV3IFZlY3RvcjIoIGFfeCwgYV95ICksXG5cdFx0XHRuZXcgVmVjdG9yMiggYl94LCBiX3kgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBjX3gsIGNfeSApXG5cdFx0XTtcblxuXHR9LFxuXG5cdGdlbmVyYXRlU2lkZVdhbGxVVjogZnVuY3Rpb24gKCBnZW9tZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMsIGluZGV4RCApIHtcblxuXHRcdHZhciBhX3ggPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyBdO1xuXHRcdHZhciBhX3kgPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDEgXTtcblx0XHR2YXIgYV96ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAyIF07XG5cdFx0dmFyIGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07XG5cdFx0dmFyIGJfeSA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMSBdO1xuXHRcdHZhciBiX3ogPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyArIDIgXTtcblx0XHR2YXIgY194ID0gdmVydGljZXNbIGluZGV4QyAqIDMgXTtcblx0XHR2YXIgY195ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAxIF07XG5cdFx0dmFyIGNfeiA9IHZlcnRpY2VzWyBpbmRleEMgKiAzICsgMiBdO1xuXHRcdHZhciBkX3ggPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyBdO1xuXHRcdHZhciBkX3kgPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDEgXTtcblx0XHR2YXIgZF96ID0gdmVydGljZXNbIGluZGV4RCAqIDMgKyAyIF07XG5cblx0XHRpZiAoIE1hdGguYWJzKCBhX3kgLSBiX3kgKSA8IDAuMDEgKSB7XG5cblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBhX3gsIDEgLSBhX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGJfeCwgMSAtIGJfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggY194LCAxIC0gY196ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBkX3gsIDEgLSBkX3ogKVxuXHRcdFx0XTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBhX3ksIDEgLSBhX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGJfeSwgMSAtIGJfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggY195LCAxIC0gY196ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBkX3ksIDEgLSBkX3ogKVxuXHRcdFx0XTtcblxuXHRcdH1cblxuXHR9XG59O1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogVGV4dCA9IDNEIFRleHRcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGZvbnQ6IDxUSFJFRS5Gb250PiwgLy8gZm9udFxuICpcbiAqICBzaXplOiA8ZmxvYXQ+LCAvLyBzaXplIG9mIHRoZSB0ZXh0XG4gKiAgaGVpZ2h0OiA8ZmxvYXQ+LCAvLyB0aGlja25lc3MgdG8gZXh0cnVkZSB0ZXh0XG4gKiAgY3VydmVTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgb24gdGhlIGN1cnZlc1xuICpcbiAqICBiZXZlbEVuYWJsZWQ6IDxib29sPiwgLy8gdHVybiBvbiBiZXZlbFxuICogIGJldmVsVGhpY2tuZXNzOiA8ZmxvYXQ+LCAvLyBob3cgZGVlcCBpbnRvIHRleHQgYmV2ZWwgZ29lc1xuICogIGJldmVsU2l6ZTogPGZsb2F0PiAvLyBob3cgZmFyIGZyb20gdGV4dCBvdXRsaW5lIGlzIGJldmVsXG4gKiB9XG4gKi9cblxuLy8gVGV4dEdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRleHRHZW9tZXRyeSggdGV4dCwgcGFyYW1ldGVycyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RleHRHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHRleHQ6IHRleHQsXG5cdFx0cGFyYW1ldGVyczogcGFyYW1ldGVyc1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVGV4dEJ1ZmZlckdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVGV4dEdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVGV4dEdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRleHRHZW9tZXRyeTtcblxuLy8gVGV4dEJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRleHRCdWZmZXJHZW9tZXRyeSggdGV4dCwgcGFyYW1ldGVycyApIHtcblxuXHRwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyB8fCB7fTtcblxuXHR2YXIgZm9udCA9IHBhcmFtZXRlcnMuZm9udDtcblxuXHRpZiAoICEgKCBmb250ICYmIGZvbnQuaXNGb250ICkgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVGV4dEdlb21ldHJ5OiBmb250IHBhcmFtZXRlciBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuRm9udC4nICk7XG5cdFx0cmV0dXJuIG5ldyBHZW9tZXRyeSgpO1xuXG5cdH1cblxuXHR2YXIgc2hhcGVzID0gZm9udC5nZW5lcmF0ZVNoYXBlcyggdGV4dCwgcGFyYW1ldGVycy5zaXplLCBwYXJhbWV0ZXJzLmN1cnZlU2VnbWVudHMgKTtcblxuXHQvLyB0cmFuc2xhdGUgcGFyYW1ldGVycyB0byBFeHRydWRlR2VvbWV0cnkgQVBJXG5cblx0cGFyYW1ldGVycy5hbW91bnQgPSBwYXJhbWV0ZXJzLmhlaWdodCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5oZWlnaHQgOiA1MDtcblxuXHQvLyBkZWZhdWx0c1xuXG5cdGlmICggcGFyYW1ldGVycy5iZXZlbFRoaWNrbmVzcyA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbFRoaWNrbmVzcyA9IDEwO1xuXHRpZiAoIHBhcmFtZXRlcnMuYmV2ZWxTaXplID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsU2l6ZSA9IDg7XG5cdGlmICggcGFyYW1ldGVycy5iZXZlbEVuYWJsZWQgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxFbmFibGVkID0gZmFsc2U7XG5cblx0RXh0cnVkZUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHNoYXBlcywgcGFyYW1ldGVycyApO1xuXG5cdHRoaXMudHlwZSA9ICdUZXh0QnVmZmVyR2VvbWV0cnknO1xuXG59XG5cblRleHRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXh0QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV4dEJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gU3BoZXJlR2VvbWV0cnlcblxuZnVuY3Rpb24gU3BoZXJlR2VvbWV0cnkoIHJhZGl1cywgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGgsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BoZXJlR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0cGhpTGVuZ3RoOiBwaGlMZW5ndGgsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFNwaGVyZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblNwaGVyZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuU3BoZXJlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BoZXJlR2VvbWV0cnk7XG5cbi8vIFNwaGVyZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFNwaGVyZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NwaGVyZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0cGhpU3RhcnQ6IHBoaVN0YXJ0LFxuXHRcdHBoaUxlbmd0aDogcGhpTGVuZ3RoLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cblx0d2lkdGhTZWdtZW50cyA9IE1hdGgubWF4KCAzLCBNYXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICkgfHwgOCApO1xuXHRoZWlnaHRTZWdtZW50cyA9IE1hdGgubWF4KCAyLCBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDYgKTtcblxuXHRwaGlTdGFydCA9IHBoaVN0YXJ0ICE9PSB1bmRlZmluZWQgPyBwaGlTdGFydCA6IDA7XG5cdHBoaUxlbmd0aCA9IHBoaUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gcGhpTGVuZ3RoIDogTWF0aC5QSSAqIDI7XG5cblx0dGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwO1xuXHR0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0aCA6IE1hdGguUEk7XG5cblx0dmFyIHRoZXRhRW5kID0gdGhldGFTdGFydCArIHRoZXRhTGVuZ3RoO1xuXG5cdHZhciBpeCwgaXk7XG5cblx0dmFyIGluZGV4ID0gMDtcblx0dmFyIGdyaWQgPSBbXTtcblxuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGl5ID0gMDsgaXkgPD0gaGVpZ2h0U2VnbWVudHM7IGl5ICsrICkge1xuXG5cdFx0dmFyIHZlcnRpY2VzUm93ID0gW107XG5cblx0XHR2YXIgdiA9IGl5IC8gaGVpZ2h0U2VnbWVudHM7XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDw9IHdpZHRoU2VnbWVudHM7IGl4ICsrICkge1xuXG5cdFx0XHR2YXIgdSA9IGl4IC8gd2lkdGhTZWdtZW50cztcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gLSByYWRpdXMgKiBNYXRoLmNvcyggcGhpU3RhcnQgKyB1ICogcGhpTGVuZ3RoICkgKiBNYXRoLnNpbiggdGhldGFTdGFydCArIHYgKiB0aGV0YUxlbmd0aCApO1xuXHRcdFx0dmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLmNvcyggdGhldGFTdGFydCArIHYgKiB0aGV0YUxlbmd0aCApO1xuXHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBNYXRoLnNpbiggcGhpU3RhcnQgKyB1ICogcGhpTGVuZ3RoICkgKiBNYXRoLnNpbiggdGhldGFTdGFydCArIHYgKiB0aGV0YUxlbmd0aCApO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRub3JtYWwuc2V0KCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICkubm9ybWFsaXplKCk7XG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIHUsIDEgLSB2ICk7XG5cblx0XHRcdHZlcnRpY2VzUm93LnB1c2goIGluZGV4ICsrICk7XG5cblx0XHR9XG5cblx0XHRncmlkLnB1c2goIHZlcnRpY2VzUm93ICk7XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBpeSA9IDA7IGl5IDwgaGVpZ2h0U2VnbWVudHM7IGl5ICsrICkge1xuXG5cdFx0Zm9yICggaXggPSAwOyBpeCA8IHdpZHRoU2VnbWVudHM7IGl4ICsrICkge1xuXG5cdFx0XHR2YXIgYSA9IGdyaWRbIGl5IF1bIGl4ICsgMSBdO1xuXHRcdFx0dmFyIGIgPSBncmlkWyBpeSBdWyBpeCBdO1xuXHRcdFx0dmFyIGMgPSBncmlkWyBpeSArIDEgXVsgaXggXTtcblx0XHRcdHZhciBkID0gZ3JpZFsgaXkgKyAxIF1bIGl4ICsgMSBdO1xuXG5cdFx0XHRpZiAoIGl5ICE9PSAwIHx8IHRoZXRhU3RhcnQgPiAwICkgaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpZiAoIGl5ICE9PSBoZWlnaHRTZWdtZW50cyAtIDEgfHwgdGhldGFFbmQgPCBNYXRoLlBJICkgaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5TcGhlcmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblNwaGVyZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwaGVyZUJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgS2FsZWIgTXVycGh5XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFJpbmdHZW9tZXRyeVxuXG5mdW5jdGlvbiBSaW5nR2VvbWV0cnkoIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgdGhldGFTZWdtZW50cywgcGhpU2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUmluZ0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0aW5uZXJSYWRpdXM6IGlubmVyUmFkaXVzLFxuXHRcdG91dGVyUmFkaXVzOiBvdXRlclJhZGl1cyxcblx0XHR0aGV0YVNlZ21lbnRzOiB0aGV0YVNlZ21lbnRzLFxuXHRcdHBoaVNlZ21lbnRzOiBwaGlTZWdtZW50cyxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUmluZ0J1ZmZlckdlb21ldHJ5KCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIHRoZXRhU2VnbWVudHMsIHBoaVNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblJpbmdHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblJpbmdHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSaW5nR2VvbWV0cnk7XG5cbi8vIFJpbmdCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBSaW5nQnVmZmVyR2VvbWV0cnkoIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgdGhldGFTZWdtZW50cywgcGhpU2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUmluZ0J1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0aW5uZXJSYWRpdXM6IGlubmVyUmFkaXVzLFxuXHRcdG91dGVyUmFkaXVzOiBvdXRlclJhZGl1cyxcblx0XHR0aGV0YVNlZ21lbnRzOiB0aGV0YVNlZ21lbnRzLFxuXHRcdHBoaVNlZ21lbnRzOiBwaGlTZWdtZW50cyxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdGlubmVyUmFkaXVzID0gaW5uZXJSYWRpdXMgfHwgMC41O1xuXHRvdXRlclJhZGl1cyA9IG91dGVyUmFkaXVzIHx8IDE7XG5cblx0dGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwO1xuXHR0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0aCA6IE1hdGguUEkgKiAyO1xuXG5cdHRoZXRhU2VnbWVudHMgPSB0aGV0YVNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCggMywgdGhldGFTZWdtZW50cyApIDogODtcblx0cGhpU2VnbWVudHMgPSBwaGlTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgoIDEsIHBoaVNlZ21lbnRzICkgOiAxO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIHNvbWUgaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBzZWdtZW50O1xuXHR2YXIgcmFkaXVzID0gaW5uZXJSYWRpdXM7XG5cdHZhciByYWRpdXNTdGVwID0gKCAoIG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXMgKSAvIHBoaVNlZ21lbnRzICk7XG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXHR2YXIgaiwgaTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaiA9IDA7IGogPD0gcGhpU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSB0aGV0YVNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHQvLyB2YWx1ZXMgYXJlIGdlbmVyYXRlIGZyb20gdGhlIGluc2lkZSBvZiB0aGUgcmluZyB0byB0aGUgb3V0c2lkZVxuXG5cdFx0XHRzZWdtZW50ID0gdGhldGFTdGFydCArIGkgLyB0aGV0YVNlZ21lbnRzICogdGhldGFMZW5ndGg7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIE1hdGguY29zKCBzZWdtZW50ICk7XG5cdFx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguc2luKCBzZWdtZW50ICk7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1di54ID0gKCB2ZXJ0ZXgueCAvIG91dGVyUmFkaXVzICsgMSApIC8gMjtcblx0XHRcdHV2LnkgPSAoIHZlcnRleC55IC8gb3V0ZXJSYWRpdXMgKyAxICkgLyAyO1xuXG5cdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gaW5jcmVhc2UgdGhlIHJhZGl1cyBmb3IgbmV4dCByb3cgb2YgdmVydGljZXNcblxuXHRcdHJhZGl1cyArPSByYWRpdXNTdGVwO1xuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaiA9IDA7IGogPCBwaGlTZWdtZW50czsgaiArKyApIHtcblxuXHRcdHZhciB0aGV0YVNlZ21lbnRMZXZlbCA9IGogKiAoIHRoZXRhU2VnbWVudHMgKyAxICk7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IHRoZXRhU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdHNlZ21lbnQgPSBpICsgdGhldGFTZWdtZW50TGV2ZWw7XG5cblx0XHRcdHZhciBhID0gc2VnbWVudDtcblx0XHRcdHZhciBiID0gc2VnbWVudCArIHRoZXRhU2VnbWVudHMgKyAxO1xuXHRcdFx0dmFyIGMgPSBzZWdtZW50ICsgdGhldGFTZWdtZW50cyArIDI7XG5cdFx0XHR2YXIgZCA9IHNlZ21lbnQgKyAxO1xuXG5cdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuUmluZ0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuUmluZ0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJpbmdCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGFzdHJvZHVkIC8gaHR0cDovL2FzdHJvZHVkLmlzZ3JlYXQub3JnL1xuICogQGF1dGhvciB6ejg1IC8gaHR0cHM6Ly9naXRodWIuY29tL3p6ODVcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gTGF0aGVHZW9tZXRyeVxuXG5mdW5jdGlvbiBMYXRoZUdlb21ldHJ5KCBwb2ludHMsIHNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGF0aGVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHBvaW50czogcG9pbnRzLFxuXHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0cGhpTGVuZ3RoOiBwaGlMZW5ndGhcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IExhdGhlQnVmZmVyR2VvbWV0cnkoIHBvaW50cywgc2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5MYXRoZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuTGF0aGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXRoZUdlb21ldHJ5O1xuXG4vLyBMYXRoZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIExhdGhlQnVmZmVyR2VvbWV0cnkoIHBvaW50cywgc2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMYXRoZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cG9pbnRzOiBwb2ludHMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aFxuXHR9O1xuXG5cdHNlZ21lbnRzID0gTWF0aC5mbG9vciggc2VnbWVudHMgKSB8fCAxMjtcblx0cGhpU3RhcnQgPSBwaGlTdGFydCB8fCAwO1xuXHRwaGlMZW5ndGggPSBwaGlMZW5ndGggfHwgTWF0aC5QSSAqIDI7XG5cblx0Ly8gY2xhbXAgcGhpTGVuZ3RoIHNvIGl0J3MgaW4gcmFuZ2Ugb2YgWyAwLCAyUEkgXVxuXG5cdHBoaUxlbmd0aCA9IF9NYXRoLmNsYW1wKCBwaGlMZW5ndGgsIDAsIE1hdGguUEkgKiAyICk7XG5cblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGJhc2U7XG5cdHZhciBpbnZlcnNlU2VnbWVudHMgPSAxLjAgLyBzZWdtZW50cztcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cdHZhciBpLCBqO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzIGFuZCB1dnNcblxuXHRmb3IgKCBpID0gMDsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdHZhciBwaGkgPSBwaGlTdGFydCArIGkgKiBpbnZlcnNlU2VnbWVudHMgKiBwaGlMZW5ndGg7XG5cblx0XHR2YXIgc2luID0gTWF0aC5zaW4oIHBoaSApO1xuXHRcdHZhciBjb3MgPSBNYXRoLmNvcyggcGhpICk7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8PSAoIHBvaW50cy5sZW5ndGggLSAxICk7IGogKysgKSB7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IHBvaW50c1sgaiBdLnggKiBzaW47XG5cdFx0XHR2ZXJ0ZXgueSA9IHBvaW50c1sgaiBdLnk7XG5cdFx0XHR2ZXJ0ZXgueiA9IHBvaW50c1sgaiBdLnggKiBjb3M7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXYueCA9IGkgLyBzZWdtZW50cztcblx0XHRcdHV2LnkgPSBqIC8gKCBwb2ludHMubGVuZ3RoIC0gMSApO1xuXG5cdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBpID0gMDsgaSA8IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPCAoIHBvaW50cy5sZW5ndGggLSAxICk7IGogKysgKSB7XG5cblx0XHRcdGJhc2UgPSBqICsgaSAqIHBvaW50cy5sZW5ndGg7XG5cblx0XHRcdHZhciBhID0gYmFzZTtcblx0XHRcdHZhciBiID0gYmFzZSArIHBvaW50cy5sZW5ndGg7XG5cdFx0XHR2YXIgYyA9IGJhc2UgKyBwb2ludHMubGVuZ3RoICsgMTtcblx0XHRcdHZhciBkID0gYmFzZSArIDE7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdC8vIGdlbmVyYXRlIG5vcm1hbHNcblxuXHR0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XG5cblx0Ly8gaWYgdGhlIGdlb21ldHJ5IGlzIGNsb3NlZCwgd2UgbmVlZCB0byBhdmVyYWdlIHRoZSBub3JtYWxzIGFsb25nIHRoZSBzZWFtLlxuXHQvLyBiZWNhdXNlIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRpY2VzIGFyZSBpZGVudGljYWwgKGJ1dCBzdGlsbCBoYXZlIGRpZmZlcmVudCBVVnMpLlxuXG5cdGlmICggcGhpTGVuZ3RoID09PSBNYXRoLlBJICogMiApIHtcblxuXHRcdHZhciBub3JtYWxzID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblx0XHR2YXIgbjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBuMiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG4gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gdGhpcyBpcyB0aGUgYnVmZmVyIG9mZnNldCBmb3IgdGhlIGxhc3QgbGluZSBvZiB2ZXJ0aWNlc1xuXG5cdFx0YmFzZSA9IHNlZ21lbnRzICogcG9pbnRzLmxlbmd0aCAqIDM7XG5cblx0XHRmb3IgKCBpID0gMCwgaiA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpICsrLCBqICs9IDMgKSB7XG5cblx0XHRcdC8vIHNlbGVjdCB0aGUgbm9ybWFsIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIGZpcnN0IGxpbmVcblxuXHRcdFx0bjEueCA9IG5vcm1hbHNbIGogKyAwIF07XG5cdFx0XHRuMS55ID0gbm9ybWFsc1sgaiArIDEgXTtcblx0XHRcdG4xLnogPSBub3JtYWxzWyBqICsgMiBdO1xuXG5cdFx0XHQvLyBzZWxlY3QgdGhlIG5vcm1hbCBvZiB0aGUgdmVydGV4IGluIHRoZSBsYXN0IGxpbmVcblxuXHRcdFx0bjIueCA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMCBdO1xuXHRcdFx0bjIueSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMSBdO1xuXHRcdFx0bjIueiA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMiBdO1xuXG5cdFx0XHQvLyBhdmVyYWdlIG5vcm1hbHNcblxuXHRcdFx0bi5hZGRWZWN0b3JzKCBuMSwgbjIgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0Ly8gYXNzaWduIHRoZSBuZXcgdmFsdWVzIHRvIGJvdGggbm9ybWFsc1xuXG5cdFx0XHRub3JtYWxzWyBqICsgMCBdID0gbm9ybWFsc1sgYmFzZSArIGogKyAwIF0gPSBuLng7XG5cdFx0XHRub3JtYWxzWyBqICsgMSBdID0gbm9ybWFsc1sgYmFzZSArIGogKyAxIF0gPSBuLnk7XG5cdFx0XHRub3JtYWxzWyBqICsgMiBdID0gbm9ybWFsc1sgYmFzZSArIGogKyAyIF0gPSBuLno7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbkxhdGhlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5MYXRoZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExhdGhlQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBqb25vYnIxIC8gaHR0cDovL2pvbm9icjEuY29tXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFNoYXBlR2VvbWV0cnlcblxuZnVuY3Rpb24gU2hhcGVHZW9tZXRyeSggc2hhcGVzLCBjdXJ2ZVNlZ21lbnRzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhcGVHZW9tZXRyeSc7XG5cblx0aWYgKCB0eXBlb2YgY3VydmVTZWdtZW50cyA9PT0gJ29iamVjdCcgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZUdlb21ldHJ5OiBPcHRpb25zIHBhcmFtZXRlciBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdGN1cnZlU2VnbWVudHMgPSBjdXJ2ZVNlZ21lbnRzLmN1cnZlU2VnbWVudHM7XG5cblx0fVxuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRjdXJ2ZVNlZ21lbnRzOiBjdXJ2ZVNlZ21lbnRzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBTaGFwZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5TaGFwZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuU2hhcGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFwZUdlb21ldHJ5O1xuXG5TaGFwZUdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHR2YXIgc2hhcGVzID0gdGhpcy5wYXJhbWV0ZXJzLnNoYXBlcztcblxuXHRyZXR1cm4gdG9KU09OKCBzaGFwZXMsIGRhdGEgKTtcblxufTtcblxuLy8gU2hhcGVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBTaGFwZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTaGFwZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0c2hhcGVzOiBzaGFwZXMsXG5cdFx0Y3VydmVTZWdtZW50czogY3VydmVTZWdtZW50c1xuXHR9O1xuXG5cdGN1cnZlU2VnbWVudHMgPSBjdXJ2ZVNlZ21lbnRzIHx8IDEyO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgZ3JvdXBTdGFydCA9IDA7XG5cdHZhciBncm91cENvdW50ID0gMDtcblxuXHQvLyBhbGxvdyBzaW5nbGUgYW5kIGFycmF5IHZhbHVlcyBmb3IgXCJzaGFwZXNcIiBwYXJhbWV0ZXJcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApID09PSBmYWxzZSApIHtcblxuXHRcdGFkZFNoYXBlKCBzaGFwZXMgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgc2hhcGVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0YWRkU2hhcGUoIHNoYXBlc1sgaSBdICk7XG5cblx0XHRcdHRoaXMuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIGkgKTsgLy8gZW5hYmxlcyBNdWx0aU1hdGVyaWFsIHN1cHBvcnRcblxuXHRcdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXHRcdFx0Z3JvdXBDb3VudCA9IDA7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXG5cdC8vIGhlbHBlciBmdW5jdGlvbnNcblxuXHRmdW5jdGlvbiBhZGRTaGFwZSggc2hhcGUgKSB7XG5cblx0XHR2YXIgaSwgbCwgc2hhcGVIb2xlO1xuXG5cdFx0dmFyIGluZGV4T2Zmc2V0ID0gdmVydGljZXMubGVuZ3RoIC8gMztcblx0XHR2YXIgcG9pbnRzID0gc2hhcGUuZXh0cmFjdFBvaW50cyggY3VydmVTZWdtZW50cyApO1xuXG5cdFx0dmFyIHNoYXBlVmVydGljZXMgPSBwb2ludHMuc2hhcGU7XG5cdFx0dmFyIHNoYXBlSG9sZXMgPSBwb2ludHMuaG9sZXM7XG5cblx0XHQvLyBjaGVjayBkaXJlY3Rpb24gb2YgdmVydGljZXNcblxuXHRcdGlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggc2hhcGVWZXJ0aWNlcyApID09PSBmYWxzZSApIHtcblxuXHRcdFx0c2hhcGVWZXJ0aWNlcyA9IHNoYXBlVmVydGljZXMucmV2ZXJzZSgpO1xuXG5cdFx0XHQvLyBhbHNvIGNoZWNrIGlmIGhvbGVzIGFyZSBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uXG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gc2hhcGVIb2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHNoYXBlSG9sZSA9IHNoYXBlSG9sZXNbIGkgXTtcblxuXHRcdFx0XHRpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHNoYXBlSG9sZSApID09PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0c2hhcGVIb2xlc1sgaSBdID0gc2hhcGVIb2xlLnJldmVyc2UoKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBmYWNlcyA9IFNoYXBlVXRpbHMudHJpYW5ndWxhdGVTaGFwZSggc2hhcGVWZXJ0aWNlcywgc2hhcGVIb2xlcyApO1xuXG5cdFx0Ly8gam9pbiB2ZXJ0aWNlcyBvZiBpbm5lciBhbmQgb3V0ZXIgcGF0aHMgdG8gYSBzaW5nbGUgYXJyYXlcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gc2hhcGVIb2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRzaGFwZUhvbGUgPSBzaGFwZUhvbGVzWyBpIF07XG5cdFx0XHRzaGFwZVZlcnRpY2VzID0gc2hhcGVWZXJ0aWNlcy5jb25jYXQoIHNoYXBlSG9sZSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdmVydGljZXMsIG5vcm1hbHMsIHV2c1xuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBzaGFwZVZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXggPSBzaGFwZVZlcnRpY2VzWyBpIF07XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgMCApO1xuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cdFx0XHR1dnMucHVzaCggdmVydGV4LngsIHZlcnRleC55ICk7IC8vIHdvcmxkIHV2c1xuXG5cdFx0fVxuXG5cdFx0Ly8gaW5jaWRlc1xuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdHZhciBhID0gZmFjZVsgMCBdICsgaW5kZXhPZmZzZXQ7XG5cdFx0XHR2YXIgYiA9IGZhY2VbIDEgXSArIGluZGV4T2Zmc2V0O1xuXHRcdFx0dmFyIGMgPSBmYWNlWyAyIF0gKyBpbmRleE9mZnNldDtcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBjICk7XG5cdFx0XHRncm91cENvdW50ICs9IDM7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cblNoYXBlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5TaGFwZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYXBlQnVmZmVyR2VvbWV0cnk7XG5cblNoYXBlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdHZhciBzaGFwZXMgPSB0aGlzLnBhcmFtZXRlcnMuc2hhcGVzO1xuXG5cdHJldHVybiB0b0pTT04oIHNoYXBlcywgZGF0YSApO1xuXG59O1xuXG4vL1xuXG5mdW5jdGlvbiB0b0pTT04oIHNoYXBlcywgZGF0YSApIHtcblxuXHRkYXRhLnNoYXBlcyA9IFtdO1xuXG5cdGlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHNoYXBlID0gc2hhcGVzWyBpIF07XG5cblx0XHRcdGRhdGEuc2hhcGVzLnB1c2goIHNoYXBlLnV1aWQgKTtcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGVzLnV1aWQgKTtcblxuXHR9XG5cblx0cmV0dXJuIGRhdGE7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gRWRnZXNHZW9tZXRyeSggZ2VvbWV0cnksIHRocmVzaG9sZEFuZ2xlICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnRWRnZXNHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHRocmVzaG9sZEFuZ2xlOiB0aHJlc2hvbGRBbmdsZVxuXHR9O1xuXG5cdHRocmVzaG9sZEFuZ2xlID0gKCB0aHJlc2hvbGRBbmdsZSAhPT0gdW5kZWZpbmVkICkgPyB0aHJlc2hvbGRBbmdsZSA6IDE7XG5cblx0Ly8gYnVmZmVyXG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciB0aHJlc2hvbGREb3QgPSBNYXRoLmNvcyggX01hdGguREVHMlJBRCAqIHRocmVzaG9sZEFuZ2xlICk7XG5cdHZhciBlZGdlID0gWyAwLCAwIF0sIGVkZ2VzID0ge30sIGVkZ2UxLCBlZGdlMjtcblx0dmFyIGtleSwga2V5cyA9IFsgJ2EnLCAnYicsICdjJyBdO1xuXG5cdC8vIHByZXBhcmUgc291cmNlIGdlb21ldHJ5XG5cblx0dmFyIGdlb21ldHJ5MjtcblxuXHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRnZW9tZXRyeTIgPSBuZXcgR2VvbWV0cnkoKTtcblx0XHRnZW9tZXRyeTIuZnJvbUJ1ZmZlckdlb21ldHJ5KCBnZW9tZXRyeSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRnZW9tZXRyeTIgPSBnZW9tZXRyeS5jbG9uZSgpO1xuXG5cdH1cblxuXHRnZW9tZXRyeTIubWVyZ2VWZXJ0aWNlcygpO1xuXHRnZW9tZXRyeTIuY29tcHV0ZUZhY2VOb3JtYWxzKCk7XG5cblx0dmFyIHNvdXJjZVZlcnRpY2VzID0gZ2VvbWV0cnkyLnZlcnRpY2VzO1xuXHR2YXIgZmFjZXMgPSBnZW9tZXRyeTIuZmFjZXM7XG5cblx0Ly8gbm93IGNyZWF0ZSBhIGRhdGEgc3RydWN0dXJlIHdoZXJlIGVhY2ggZW50cnkgcmVwcmVzZW50cyBhbiBlZGdlIHdpdGggaXRzIGFkam9pbmluZyBmYWNlc1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRlZGdlMSA9IGZhY2VbIGtleXNbIGogXSBdO1xuXHRcdFx0ZWRnZTIgPSBmYWNlWyBrZXlzWyAoIGogKyAxICkgJSAzIF0gXTtcblx0XHRcdGVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTtcblx0XHRcdGVkZ2VbIDEgXSA9IE1hdGgubWF4KCBlZGdlMSwgZWRnZTIgKTtcblxuXHRcdFx0a2V5ID0gZWRnZVsgMCBdICsgJywnICsgZWRnZVsgMSBdO1xuXG5cdFx0XHRpZiAoIGVkZ2VzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGVkZ2VzWyBrZXkgXSA9IHsgaW5kZXgxOiBlZGdlWyAwIF0sIGluZGV4MjogZWRnZVsgMSBdLCBmYWNlMTogaSwgZmFjZTI6IHVuZGVmaW5lZCB9O1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGVkZ2VzWyBrZXkgXS5mYWNlMiA9IGk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXNcblxuXHRmb3IgKCBrZXkgaW4gZWRnZXMgKSB7XG5cblx0XHR2YXIgZSA9IGVkZ2VzWyBrZXkgXTtcblxuXHRcdC8vIGFuIGVkZ2UgaXMgb25seSByZW5kZXJlZCBpZiB0aGUgYW5nbGUgKGluIGRlZ3JlZXMpIGJldHdlZW4gdGhlIGZhY2Ugbm9ybWFscyBvZiB0aGUgYWRqb2luaW5nIGZhY2VzIGV4Y2VlZHMgdGhpcyB2YWx1ZS4gZGVmYXVsdCA9IDEgZGVncmVlLlxuXG5cdFx0aWYgKCBlLmZhY2UyID09PSB1bmRlZmluZWQgfHwgZmFjZXNbIGUuZmFjZTEgXS5ub3JtYWwuZG90KCBmYWNlc1sgZS5mYWNlMiBdLm5vcm1hbCApIDw9IHRocmVzaG9sZERvdCApIHtcblxuXHRcdFx0dmFyIHZlcnRleCA9IHNvdXJjZVZlcnRpY2VzWyBlLmluZGV4MSBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR2ZXJ0ZXggPSBzb3VyY2VWZXJ0aWNlc1sgZS5pbmRleDIgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblxufVxuXG5FZGdlc0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuRWRnZXNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFZGdlc0dlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIEN5bGluZGVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQ3lsaW5kZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3lsaW5kZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1c1RvcDogcmFkaXVzVG9wLFxuXHRcdHJhZGl1c0JvdHRvbTogcmFkaXVzQm90dG9tLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEN5bGluZGVyQnVmZmVyR2VvbWV0cnkoIHJhZGl1c1RvcCwgcmFkaXVzQm90dG9tLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkN5bGluZGVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5DeWxpbmRlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN5bGluZGVyR2VvbWV0cnk7XG5cbi8vIEN5bGluZGVyQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1c1RvcDogcmFkaXVzVG9wLFxuXHRcdHJhZGl1c0JvdHRvbTogcmFkaXVzQm90dG9tLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHJhZGl1c1RvcCA9IHJhZGl1c1RvcCAhPT0gdW5kZWZpbmVkID8gcmFkaXVzVG9wIDogMTtcblx0cmFkaXVzQm90dG9tID0gcmFkaXVzQm90dG9tICE9PSB1bmRlZmluZWQgPyByYWRpdXNCb3R0b20gOiAxO1xuXHRoZWlnaHQgPSBoZWlnaHQgfHwgMTtcblxuXHRyYWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICkgfHwgODtcblx0aGVpZ2h0U2VnbWVudHMgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7XG5cblx0b3BlbkVuZGVkID0gb3BlbkVuZGVkICE9PSB1bmRlZmluZWQgPyBvcGVuRW5kZWQgOiBmYWxzZTtcblx0dGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwLjA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSSAqIDI7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBpbmRleCA9IDA7XG5cdHZhciBpbmRleEFycmF5ID0gW107XG5cdHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcblx0dmFyIGdyb3VwU3RhcnQgPSAwO1xuXG5cdC8vIGdlbmVyYXRlIGdlb21ldHJ5XG5cblx0Z2VuZXJhdGVUb3JzbygpO1xuXG5cdGlmICggb3BlbkVuZGVkID09PSBmYWxzZSApIHtcblxuXHRcdGlmICggcmFkaXVzVG9wID4gMCApIGdlbmVyYXRlQ2FwKCB0cnVlICk7XG5cdFx0aWYgKCByYWRpdXNCb3R0b20gPiAwICkgZ2VuZXJhdGVDYXAoIGZhbHNlICk7XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVRvcnNvKCkge1xuXG5cdFx0dmFyIHgsIHk7XG5cdFx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgZ3JvdXBDb3VudCA9IDA7XG5cblx0XHQvLyB0aGlzIHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbFxuXHRcdHZhciBzbG9wZSA9ICggcmFkaXVzQm90dG9tIC0gcmFkaXVzVG9wICkgLyBoZWlnaHQ7XG5cblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0XHRmb3IgKCB5ID0gMDsgeSA8PSBoZWlnaHRTZWdtZW50czsgeSArKyApIHtcblxuXHRcdFx0dmFyIGluZGV4Um93ID0gW107XG5cblx0XHRcdHZhciB2ID0geSAvIGhlaWdodFNlZ21lbnRzO1xuXG5cdFx0XHQvLyBjYWxjdWxhdGUgdGhlIHJhZGl1cyBvZiB0aGUgY3VycmVudCByb3dcblxuXHRcdFx0dmFyIHJhZGl1cyA9IHYgKiAoIHJhZGl1c0JvdHRvbSAtIHJhZGl1c1RvcCApICsgcmFkaXVzVG9wO1xuXG5cdFx0XHRmb3IgKCB4ID0gMDsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0XHR2YXIgdSA9IHggLyByYWRpYWxTZWdtZW50cztcblxuXHRcdFx0XHR2YXIgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0O1xuXG5cdFx0XHRcdHZhciBzaW5UaGV0YSA9IE1hdGguc2luKCB0aGV0YSApO1xuXHRcdFx0XHR2YXIgY29zVGhldGEgPSBNYXRoLmNvcyggdGhldGEgKTtcblxuXHRcdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIHNpblRoZXRhO1xuXHRcdFx0XHR2ZXJ0ZXgueSA9IC0gdiAqIGhlaWdodCArIGhhbGZIZWlnaHQ7XG5cdFx0XHRcdHZlcnRleC56ID0gcmFkaXVzICogY29zVGhldGE7XG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0XHRub3JtYWwuc2V0KCBzaW5UaGV0YSwgc2xvcGUsIGNvc1RoZXRhICkubm9ybWFsaXplKCk7XG5cdFx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHRcdC8vIHV2XG5cblx0XHRcdFx0dXZzLnB1c2goIHUsIDEgLSB2ICk7XG5cblx0XHRcdFx0Ly8gc2F2ZSBpbmRleCBvZiB2ZXJ0ZXggaW4gcmVzcGVjdGl2ZSByb3dcblxuXHRcdFx0XHRpbmRleFJvdy5wdXNoKCBpbmRleCArKyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG5vdyBzYXZlIHZlcnRpY2VzIG9mIHRoZSByb3cgaW4gb3VyIGluZGV4IGFycmF5XG5cblx0XHRcdGluZGV4QXJyYXkucHVzaCggaW5kZXhSb3cgKTtcblxuXHRcdH1cblxuXHRcdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRcdGZvciAoIHggPSAwOyB4IDwgcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdGZvciAoIHkgPSAwOyB5IDwgaGVpZ2h0U2VnbWVudHM7IHkgKysgKSB7XG5cblx0XHRcdFx0Ly8gd2UgdXNlIHRoZSBpbmRleCBhcnJheSB0byBhY2Nlc3MgdGhlIGNvcnJlY3QgaW5kaWNlc1xuXG5cdFx0XHRcdHZhciBhID0gaW5kZXhBcnJheVsgeSBdWyB4IF07XG5cdFx0XHRcdHZhciBiID0gaW5kZXhBcnJheVsgeSArIDEgXVsgeCBdO1xuXHRcdFx0XHR2YXIgYyA9IGluZGV4QXJyYXlbIHkgKyAxIF1bIHggKyAxIF07XG5cdFx0XHRcdHZhciBkID0gaW5kZXhBcnJheVsgeSBdWyB4ICsgMSBdO1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHRcdC8vIHVwZGF0ZSBncm91cCBjb3VudGVyXG5cblx0XHRcdFx0Z3JvdXBDb3VudCArPSA2O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0c2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIDAgKTtcblxuXHRcdC8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgdmFsdWUgZm9yIGdyb3Vwc1xuXG5cdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZUNhcCggdG9wICkge1xuXG5cdFx0dmFyIHgsIGNlbnRlckluZGV4U3RhcnQsIGNlbnRlckluZGV4RW5kO1xuXG5cdFx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBncm91cENvdW50ID0gMDtcblxuXHRcdHZhciByYWRpdXMgPSAoIHRvcCA9PT0gdHJ1ZSApID8gcmFkaXVzVG9wIDogcmFkaXVzQm90dG9tO1xuXHRcdHZhciBzaWduID0gKCB0b3AgPT09IHRydWUgKSA/IDEgOiAtIDE7XG5cblx0XHQvLyBzYXZlIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2VudGVyIHZlcnRleFxuXHRcdGNlbnRlckluZGV4U3RhcnQgPSBpbmRleDtcblxuXHRcdC8vIGZpcnN0IHdlIGdlbmVyYXRlIHRoZSBjZW50ZXIgdmVydGV4IGRhdGEgb2YgdGhlIGNhcC5cblx0XHQvLyBiZWNhdXNlIHRoZSBnZW9tZXRyeSBuZWVkcyBvbmUgc2V0IG9mIHV2cyBwZXIgZmFjZSxcblx0XHQvLyB3ZSBtdXN0IGdlbmVyYXRlIGEgY2VudGVyIHZlcnRleCBwZXIgZmFjZS9zZWdtZW50XG5cblx0XHRmb3IgKCB4ID0gMTsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIGhhbGZIZWlnaHQgKiBzaWduLCAwICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIHNpZ24sIDAgKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIDAuNSwgMC41ICk7XG5cblx0XHRcdC8vIGluY3JlYXNlIGluZGV4XG5cblx0XHRcdGluZGV4ICsrO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2F2ZSB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2VudGVyIHZlcnRleFxuXG5cdFx0Y2VudGVySW5kZXhFbmQgPSBpbmRleDtcblxuXHRcdC8vIG5vdyB3ZSBnZW5lcmF0ZSB0aGUgc3Vycm91bmRpbmcgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0Zm9yICggeCA9IDA7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdHZhciB1ID0geCAvIHJhZGlhbFNlZ21lbnRzO1xuXHRcdFx0dmFyIHRoZXRhID0gdSAqIHRoZXRhTGVuZ3RoICsgdGhldGFTdGFydDtcblxuXHRcdFx0dmFyIGNvc1RoZXRhID0gTWF0aC5jb3MoIHRoZXRhICk7XG5cdFx0XHR2YXIgc2luVGhldGEgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7XG5cdFx0XHR2ZXJ0ZXgueSA9IGhhbGZIZWlnaHQgKiBzaWduO1xuXHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbHMucHVzaCggMCwgc2lnbiwgMCApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1di54ID0gKCBjb3NUaGV0YSAqIDAuNSApICsgMC41O1xuXHRcdFx0dXYueSA9ICggc2luVGhldGEgKiAwLjUgKiBzaWduICkgKyAwLjU7XG5cdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdFx0XHQvLyBpbmNyZWFzZSBpbmRleFxuXG5cdFx0XHRpbmRleCArKztcblxuXHRcdH1cblxuXHRcdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRcdGZvciAoIHggPSAwOyB4IDwgcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdHZhciBjID0gY2VudGVySW5kZXhTdGFydCArIHg7XG5cdFx0XHR2YXIgaSA9IGNlbnRlckluZGV4RW5kICsgeDtcblxuXHRcdFx0aWYgKCB0b3AgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0Ly8gZmFjZSB0b3BcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGksIGkgKyAxLCBjICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gZmFjZSBib3R0b21cblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGkgKyAxLCBpLCBjICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Z3JvdXBDb3VudCArPSAzO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYWRkIGEgZ3JvdXAgdG8gdGhlIGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnRcblxuXHRcdHNjb3BlLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCB0b3AgPT09IHRydWUgPyAxIDogMiApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cblx0fVxuXG59XG5cbkN5bGluZGVyQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5DeWxpbmRlckJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN5bGluZGVyQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBhYmVsbmF0aW9uIC8gaHR0cDovL2dpdGh1Yi5jb20vYWJlbG5hdGlvblxuICovXG5cbi8vIENvbmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBDb25lR2VvbWV0cnkoIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0Q3lsaW5kZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCAwLCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICk7XG5cblx0dGhpcy50eXBlID0gJ0NvbmVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxufVxuXG5Db25lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNvbmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25lR2VvbWV0cnk7XG5cbi8vIENvbmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDb25lQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0Q3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCAwLCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICk7XG5cblx0dGhpcy50eXBlID0gJ0NvbmVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxufVxuXG5Db25lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNvbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25lQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICogQGF1dGhvciBodWdoZXNcbiAqL1xuXG4vLyBDaXJjbGVHZW9tZXRyeVxuXG5mdW5jdGlvbiBDaXJjbGVHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDaXJjbGVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQ2lyY2xlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgc2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuQ2lyY2xlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5DaXJjbGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDaXJjbGVHZW9tZXRyeTtcblxuLy8gQ2lyY2xlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQ2lyY2xlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgc2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ2lyY2xlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0c2VnbWVudHMgPSBzZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgoIDMsIHNlZ21lbnRzICkgOiA4O1xuXG5cdHRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMDtcblx0dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGksIHM7XG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXG5cdC8vIGNlbnRlciBwb2ludFxuXG5cdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cdHV2cy5wdXNoKCAwLjUsIDAuNSApO1xuXG5cdGZvciAoIHMgPSAwLCBpID0gMzsgcyA8PSBzZWdtZW50czsgcyArKywgaSArPSAzICkge1xuXG5cdFx0dmFyIHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgcyAvIHNlZ21lbnRzICogdGhldGFMZW5ndGg7XG5cblx0XHQvLyB2ZXJ0ZXhcblxuXHRcdHZlcnRleC54ID0gcmFkaXVzICogTWF0aC5jb3MoIHNlZ21lbnQgKTtcblx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguc2luKCBzZWdtZW50ICk7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHQvLyBub3JtYWxcblxuXHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXG5cdFx0Ly8gdXZzXG5cblx0XHR1di54ID0gKCB2ZXJ0aWNlc1sgaSBdIC8gcmFkaXVzICsgMSApIC8gMjtcblx0XHR1di55ID0gKCB2ZXJ0aWNlc1sgaSArIDEgXSAvIHJhZGl1cyArIDEgKSAvIDI7XG5cblx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRpbmRpY2VzLnB1c2goIGksIGkgKyAxLCAwICk7XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5DaXJjbGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNpcmNsZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENpcmNsZUJ1ZmZlckdlb21ldHJ5O1xuXG5cblxudmFyIEdlb21ldHJpZXMgPSBPYmplY3QuZnJlZXplKHtcblx0V2lyZWZyYW1lR2VvbWV0cnk6IFdpcmVmcmFtZUdlb21ldHJ5LFxuXHRQYXJhbWV0cmljR2VvbWV0cnk6IFBhcmFtZXRyaWNHZW9tZXRyeSxcblx0UGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5OiBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnksXG5cdFRldHJhaGVkcm9uR2VvbWV0cnk6IFRldHJhaGVkcm9uR2VvbWV0cnksXG5cdFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG5cdE9jdGFoZWRyb25HZW9tZXRyeTogT2N0YWhlZHJvbkdlb21ldHJ5LFxuXHRPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0SWNvc2FoZWRyb25HZW9tZXRyeTogSWNvc2FoZWRyb25HZW9tZXRyeSxcblx0SWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeTogSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0RG9kZWNhaGVkcm9uR2VvbWV0cnk6IERvZGVjYWhlZHJvbkdlb21ldHJ5LFxuXHREb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTogRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG5cdFBvbHloZWRyb25HZW9tZXRyeTogUG9seWhlZHJvbkdlb21ldHJ5LFxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnk6IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSxcblx0VHViZUdlb21ldHJ5OiBUdWJlR2VvbWV0cnksXG5cdFR1YmVCdWZmZXJHZW9tZXRyeTogVHViZUJ1ZmZlckdlb21ldHJ5LFxuXHRUb3J1c0tub3RHZW9tZXRyeTogVG9ydXNLbm90R2VvbWV0cnksXG5cdFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5OiBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSxcblx0VG9ydXNHZW9tZXRyeTogVG9ydXNHZW9tZXRyeSxcblx0VG9ydXNCdWZmZXJHZW9tZXRyeTogVG9ydXNCdWZmZXJHZW9tZXRyeSxcblx0VGV4dEdlb21ldHJ5OiBUZXh0R2VvbWV0cnksXG5cdFRleHRCdWZmZXJHZW9tZXRyeTogVGV4dEJ1ZmZlckdlb21ldHJ5LFxuXHRTcGhlcmVHZW9tZXRyeTogU3BoZXJlR2VvbWV0cnksXG5cdFNwaGVyZUJ1ZmZlckdlb21ldHJ5OiBTcGhlcmVCdWZmZXJHZW9tZXRyeSxcblx0UmluZ0dlb21ldHJ5OiBSaW5nR2VvbWV0cnksXG5cdFJpbmdCdWZmZXJHZW9tZXRyeTogUmluZ0J1ZmZlckdlb21ldHJ5LFxuXHRQbGFuZUdlb21ldHJ5OiBQbGFuZUdlb21ldHJ5LFxuXHRQbGFuZUJ1ZmZlckdlb21ldHJ5OiBQbGFuZUJ1ZmZlckdlb21ldHJ5LFxuXHRMYXRoZUdlb21ldHJ5OiBMYXRoZUdlb21ldHJ5LFxuXHRMYXRoZUJ1ZmZlckdlb21ldHJ5OiBMYXRoZUJ1ZmZlckdlb21ldHJ5LFxuXHRTaGFwZUdlb21ldHJ5OiBTaGFwZUdlb21ldHJ5LFxuXHRTaGFwZUJ1ZmZlckdlb21ldHJ5OiBTaGFwZUJ1ZmZlckdlb21ldHJ5LFxuXHRFeHRydWRlR2VvbWV0cnk6IEV4dHJ1ZGVHZW9tZXRyeSxcblx0RXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiBFeHRydWRlQnVmZmVyR2VvbWV0cnksXG5cdEVkZ2VzR2VvbWV0cnk6IEVkZ2VzR2VvbWV0cnksXG5cdENvbmVHZW9tZXRyeTogQ29uZUdlb21ldHJ5LFxuXHRDb25lQnVmZmVyR2VvbWV0cnk6IENvbmVCdWZmZXJHZW9tZXRyeSxcblx0Q3lsaW5kZXJHZW9tZXRyeTogQ3lsaW5kZXJHZW9tZXRyeSxcblx0Q3lsaW5kZXJCdWZmZXJHZW9tZXRyeTogQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSxcblx0Q2lyY2xlR2VvbWV0cnk6IENpcmNsZUdlb21ldHJ5LFxuXHRDaXJjbGVCdWZmZXJHZW9tZXRyeTogQ2lyY2xlQnVmZmVyR2VvbWV0cnksXG5cdEJveEdlb21ldHJ5OiBCb3hHZW9tZXRyeSxcblx0Qm94QnVmZmVyR2VvbWV0cnk6IEJveEJ1ZmZlckdlb21ldHJ5XG59KTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxUSFJFRS5Db2xvcj5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBTaGFkb3dNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYWRvd01hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHR0aGlzLnRyYW5zcGFyZW50ID0gdHJ1ZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cblNoYWRvd01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhZG93TWF0ZXJpYWw7XG5cblNoYWRvd01hdGVyaWFsLnByb3RvdHlwZS5pc1NoYWRvd01hdGVyaWFsID0gdHJ1ZTtcblxuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gUmF3U2hhZGVyTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0U2hhZGVyTWF0ZXJpYWwuY2FsbCggdGhpcywgcGFyYW1ldGVycyApO1xuXG5cdHRoaXMudHlwZSA9ICdSYXdTaGFkZXJNYXRlcmlhbCc7XG5cbn1cblxuUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlICk7XG5SYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSYXdTaGFkZXJNYXRlcmlhbDtcblxuUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmlzUmF3U2hhZGVyTWF0ZXJpYWwgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIHJvdWdobmVzczogPGZsb2F0PixcbiAqICBtZXRhbG5lc3M6IDxmbG9hdD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBlbWlzc2l2ZTogPGhleD4sXG4gKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD5cbiAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgcm91Z2huZXNzTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBtZXRhbG5lc3NNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgZW52TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFN0YW5kYXJkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1NUQU5EQVJEJzogJycgfTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaFN0YW5kYXJkTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2Vcblx0dGhpcy5yb3VnaG5lc3MgPSAwLjU7XG5cdHRoaXMubWV0YWxuZXNzID0gMC41O1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmFvTWFwID0gbnVsbDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDtcblxuXHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xuXHR0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMucm91Z2huZXNzTWFwID0gbnVsbDtcblxuXHR0aGlzLm1ldGFsbmVzc01hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmVudk1hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hTdGFuZGFyZE1hdGVyaWFsO1xuXG5NZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnU1RBTkRBUkQnOiAnJyB9O1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cdHRoaXMucm91Z2huZXNzID0gc291cmNlLnJvdWdobmVzcztcblx0dGhpcy5tZXRhbG5lc3MgPSBzb3VyY2UubWV0YWxuZXNzO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcblx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcblx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHRoaXMucm91Z2huZXNzTWFwID0gc291cmNlLnJvdWdobmVzc01hcDtcblxuXHR0aGlzLm1ldGFsbmVzc01hcCA9IHNvdXJjZS5tZXRhbG5lc3NNYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XG5cdHRoaXMuZW52TWFwSW50ZW5zaXR5ID0gc291cmNlLmVudk1hcEludGVuc2l0eTtcblxuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFBoeXNpY2FsTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWVzaFN0YW5kYXJkTWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1BIWVNJQ0FMJzogJycgfTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaFBoeXNpY2FsTWF0ZXJpYWwnO1xuXG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gMC41OyAvLyBtYXBzIHRvIEYwID0gMC4wNFxuXG5cdHRoaXMuY2xlYXJDb2F0ID0gMC4wO1xuXHR0aGlzLmNsZWFyQ29hdFJvdWdobmVzcyA9IDAuMDtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFBoeXNpY2FsTWF0ZXJpYWw7XG5cbk1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hQaHlzaWNhbE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdQSFlTSUNBTCc6ICcnIH07XG5cblx0dGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5O1xuXG5cdHRoaXMuY2xlYXJDb2F0ID0gc291cmNlLmNsZWFyQ29hdDtcblx0dGhpcy5jbGVhckNvYXRSb3VnaG5lc3MgPSBzb3VyY2UuY2xlYXJDb2F0Um91Z2huZXNzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIHNwZWN1bGFyOiA8aGV4PixcbiAqICBzaGluaW5lc3M6IDxmbG9hdD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBlbWlzc2l2ZTogPGhleD4sXG4gKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD5cbiAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgc3BlY3VsYXJNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgY29tYmluZTogVEhSRUUuTXVsdGlwbHksXG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+LFxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFBob25nTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoUGhvbmdNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxuXHR0aGlzLnNwZWN1bGFyID0gbmV3IENvbG9yKCAweDExMTExMSApO1xuXHR0aGlzLnNoaW5pbmVzcyA9IDMwO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmFvTWFwID0gbnVsbDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDtcblxuXHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xuXHR0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMuZW52TWFwID0gbnVsbDtcblx0dGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gMTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4O1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGhvbmdNYXRlcmlhbDtcblxuTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFBob25nTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cdHRoaXMuc3BlY3VsYXIuY29weSggc291cmNlLnNwZWN1bGFyICk7XG5cdHRoaXMuc2hpbmluZXNzID0gc291cmNlLnNoaW5pbmVzcztcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XG5cdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHR0aGlzLnNwZWN1bGFyTWFwID0gc291cmNlLnNwZWN1bGFyTWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xuXHR0aGlzLmNvbWJpbmUgPSBzb3VyY2UuY29tYmluZTtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5O1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgdGFrYWhpcm94IC8gaHR0cDovL2dpdGh1Yi5jb20vdGFrYWhpcm94XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBncmFkaWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKVxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hUb29uTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWVzaFBob25nTWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1RPT04nOiAnJyB9O1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoVG9vbk1hdGVyaWFsJztcblxuXHR0aGlzLmdyYWRpZW50TWFwID0gbnVsbDtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoVG9vbk1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hUb29uTWF0ZXJpYWw7XG5cbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFRvb25NYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmdyYWRpZW50TWFwID0gc291cmNlLmdyYWRpZW50TWFwO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIGJ1bXBNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYnVtcFNjYWxlOiA8ZmxvYXQ+LFxuICpcbiAqICBub3JtYWxNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPixcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PlxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaE5vcm1hbE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaE5vcm1hbE1hdGVyaWFsJztcblxuXHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xuXHR0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblxuXHR0aGlzLmZvZyA9IGZhbHNlO1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoTm9ybWFsTWF0ZXJpYWw7XG5cbk1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoTm9ybWFsTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcblx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcblx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgbGlnaHRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbGlnaHRNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYW9NYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgZW1pc3NpdmU6IDxoZXg+LFxuICogIGVtaXNzaXZlSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKiAgZW1pc3NpdmVNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZW52TWFwOiBuZXcgVEhSRUUuQ3ViZVRleHR1cmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLFxuICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LFxuICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PixcbiAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hMYW1iZXJ0TWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoTGFtYmVydE1hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlXG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuYW9NYXAgPSBudWxsO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMuZW52TWFwID0gbnVsbDtcblx0dGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gMTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4O1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hMYW1iZXJ0TWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaExhbWJlcnRNYXRlcmlhbDtcblxuTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoTGFtYmVydE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcblxuXHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XG5cdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBsaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNjYWxlOiA8ZmxvYXQ+LFxuICogIGRhc2hTaXplOiA8ZmxvYXQ+LFxuICogIGdhcFNpemU6IDxmbG9hdD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBMaW5lRGFzaGVkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TGluZUJhc2ljTWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lRGFzaGVkTWF0ZXJpYWwnO1xuXG5cdHRoaXMuc2NhbGUgPSAxO1xuXHR0aGlzLmRhc2hTaXplID0gMztcblx0dGhpcy5nYXBTaXplID0gMTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbkxpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUgKTtcbkxpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lRGFzaGVkTWF0ZXJpYWw7XG5cbkxpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUuaXNMaW5lRGFzaGVkTWF0ZXJpYWwgPSB0cnVlO1xuXG5MaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRMaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnNjYWxlID0gc291cmNlLnNjYWxlO1xuXHR0aGlzLmRhc2hTaXplID0gc291cmNlLmRhc2hTaXplO1xuXHR0aGlzLmdhcFNpemUgPSBzb3VyY2UuZ2FwU2l6ZTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuXG5cbnZhciBNYXRlcmlhbHMgPSBPYmplY3QuZnJlZXplKHtcblx0U2hhZG93TWF0ZXJpYWw6IFNoYWRvd01hdGVyaWFsLFxuXHRTcHJpdGVNYXRlcmlhbDogU3ByaXRlTWF0ZXJpYWwsXG5cdFJhd1NoYWRlck1hdGVyaWFsOiBSYXdTaGFkZXJNYXRlcmlhbCxcblx0U2hhZGVyTWF0ZXJpYWw6IFNoYWRlck1hdGVyaWFsLFxuXHRQb2ludHNNYXRlcmlhbDogUG9pbnRzTWF0ZXJpYWwsXG5cdE1lc2hQaHlzaWNhbE1hdGVyaWFsOiBNZXNoUGh5c2ljYWxNYXRlcmlhbCxcblx0TWVzaFN0YW5kYXJkTWF0ZXJpYWw6IE1lc2hTdGFuZGFyZE1hdGVyaWFsLFxuXHRNZXNoUGhvbmdNYXRlcmlhbDogTWVzaFBob25nTWF0ZXJpYWwsXG5cdE1lc2hUb29uTWF0ZXJpYWw6IE1lc2hUb29uTWF0ZXJpYWwsXG5cdE1lc2hOb3JtYWxNYXRlcmlhbDogTWVzaE5vcm1hbE1hdGVyaWFsLFxuXHRNZXNoTGFtYmVydE1hdGVyaWFsOiBNZXNoTGFtYmVydE1hdGVyaWFsLFxuXHRNZXNoRGVwdGhNYXRlcmlhbDogTWVzaERlcHRoTWF0ZXJpYWwsXG5cdE1lc2hEaXN0YW5jZU1hdGVyaWFsOiBNZXNoRGlzdGFuY2VNYXRlcmlhbCxcblx0TWVzaEJhc2ljTWF0ZXJpYWw6IE1lc2hCYXNpY01hdGVyaWFsLFxuXHRMaW5lRGFzaGVkTWF0ZXJpYWw6IExpbmVEYXNoZWRNYXRlcmlhbCxcblx0TGluZUJhc2ljTWF0ZXJpYWw6IExpbmVCYXNpY01hdGVyaWFsLFxuXHRNYXRlcmlhbDogTWF0ZXJpYWxcbn0pO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIENhY2hlID0ge1xuXG5cdGVuYWJsZWQ6IGZhbHNlLFxuXG5cdGZpbGVzOiB7fSxcblxuXHRhZGQ6IGZ1bmN0aW9uICgga2V5LCBmaWxlICkge1xuXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5DYWNoZScsICdBZGRpbmcga2V5OicsIGtleSApO1xuXG5cdFx0dGhpcy5maWxlc1sga2V5IF0gPSBmaWxlO1xuXG5cdH0sXG5cblx0Z2V0OiBmdW5jdGlvbiAoIGtleSApIHtcblxuXHRcdGlmICggdGhpcy5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQ2FjaGUnLCAnQ2hlY2tpbmcga2V5OicsIGtleSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsZXNbIGtleSBdO1xuXG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiAoIGtleSApIHtcblxuXHRcdGRlbGV0ZSB0aGlzLmZpbGVzWyBrZXkgXTtcblxuXHR9LFxuXG5cdGNsZWFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmZpbGVzID0ge307XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTG9hZGluZ01hbmFnZXIoIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHZhciBpc0xvYWRpbmcgPSBmYWxzZTtcblx0dmFyIGl0ZW1zTG9hZGVkID0gMDtcblx0dmFyIGl0ZW1zVG90YWwgPSAwO1xuXHR2YXIgdXJsTW9kaWZpZXIgPSB1bmRlZmluZWQ7XG5cblx0dGhpcy5vblN0YXJ0ID0gdW5kZWZpbmVkO1xuXHR0aGlzLm9uTG9hZCA9IG9uTG9hZDtcblx0dGhpcy5vblByb2dyZXNzID0gb25Qcm9ncmVzcztcblx0dGhpcy5vbkVycm9yID0gb25FcnJvcjtcblxuXHR0aGlzLml0ZW1TdGFydCA9IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0aXRlbXNUb3RhbCArKztcblxuXHRcdGlmICggaXNMb2FkaW5nID09PSBmYWxzZSApIHtcblxuXHRcdFx0aWYgKCBzY29wZS5vblN0YXJ0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUub25TdGFydCggdXJsLCBpdGVtc0xvYWRlZCwgaXRlbXNUb3RhbCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpc0xvYWRpbmcgPSB0cnVlO1xuXG5cdH07XG5cblx0dGhpcy5pdGVtRW5kID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpdGVtc0xvYWRlZCArKztcblxuXHRcdGlmICggc2NvcGUub25Qcm9ncmVzcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5vblByb2dyZXNzKCB1cmwsIGl0ZW1zTG9hZGVkLCBpdGVtc1RvdGFsICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGl0ZW1zTG9hZGVkID09PSBpdGVtc1RvdGFsICkge1xuXG5cdFx0XHRpc0xvYWRpbmcgPSBmYWxzZTtcblxuXHRcdFx0aWYgKCBzY29wZS5vbkxvYWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5vbkxvYWQoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5pdGVtRXJyb3IgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGlmICggc2NvcGUub25FcnJvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5vbkVycm9yKCB1cmwgKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMucmVzb2x2ZVVSTCA9IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0aWYgKCB1cmxNb2RpZmllciApIHtcblxuXHRcdFx0cmV0dXJuIHVybE1vZGlmaWVyKCB1cmwgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB1cmw7XG5cblx0fTtcblxuXHR0aGlzLnNldFVSTE1vZGlmaWVyID0gZnVuY3Rpb24gKCB0cmFuc2Zvcm0gKSB7XG5cblx0XHR1cmxNb2RpZmllciA9IHRyYW5zZm9ybTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9O1xuXG59XG5cbnZhciBEZWZhdWx0TG9hZGluZ01hbmFnZXIgPSBuZXcgTG9hZGluZ01hbmFnZXIoKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBsb2FkaW5nID0ge307XG5cbmZ1bmN0aW9uIEZpbGVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRmlsZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0aWYgKCB1cmwgPT09IHVuZGVmaW5lZCApIHVybCA9ICcnO1xuXG5cdFx0aWYgKCB0aGlzLnBhdGggIT09IHVuZGVmaW5lZCApIHVybCA9IHRoaXMucGF0aCArIHVybDtcblxuXHRcdHVybCA9IHRoaXMubWFuYWdlci5yZXNvbHZlVVJMKCB1cmwgKTtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgY2FjaGVkID0gQ2FjaGUuZ2V0KCB1cmwgKTtcblxuXHRcdGlmICggY2FjaGVkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdFx0c2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBjYWNoZWQgKTtcblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHR9LCAwICk7XG5cblx0XHRcdHJldHVybiBjYWNoZWQ7XG5cblx0XHR9XG5cblx0XHQvLyBDaGVjayBpZiByZXF1ZXN0IGlzIGR1cGxpY2F0ZVxuXG5cdFx0aWYgKCBsb2FkaW5nWyB1cmwgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRsb2FkaW5nWyB1cmwgXS5wdXNoKCB7XG5cblx0XHRcdFx0b25Mb2FkOiBvbkxvYWQsXG5cdFx0XHRcdG9uUHJvZ3Jlc3M6IG9uUHJvZ3Jlc3MsXG5cdFx0XHRcdG9uRXJyb3I6IG9uRXJyb3JcblxuXHRcdFx0fSApO1xuXG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHQvLyBDaGVjayBmb3IgZGF0YTogVVJJXG5cdFx0dmFyIGRhdGFVcmlSZWdleCA9IC9eZGF0YTooLio/KSg7YmFzZTY0KT8sKC4qKSQvO1xuXHRcdHZhciBkYXRhVXJpUmVnZXhSZXN1bHQgPSB1cmwubWF0Y2goIGRhdGFVcmlSZWdleCApO1xuXG5cdFx0Ly8gU2FmYXJpIGNhbiBub3QgaGFuZGxlIERhdGEgVVJJcyB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0IHNvIHByb2Nlc3MgbWFudWFsbHlcblx0XHRpZiAoIGRhdGFVcmlSZWdleFJlc3VsdCApIHtcblxuXHRcdFx0dmFyIG1pbWVUeXBlID0gZGF0YVVyaVJlZ2V4UmVzdWx0WyAxIF07XG5cdFx0XHR2YXIgaXNCYXNlNjQgPSAhISBkYXRhVXJpUmVnZXhSZXN1bHRbIDIgXTtcblx0XHRcdHZhciBkYXRhID0gZGF0YVVyaVJlZ2V4UmVzdWx0WyAzIF07XG5cblx0XHRcdGRhdGEgPSB3aW5kb3cuZGVjb2RlVVJJQ29tcG9uZW50KCBkYXRhICk7XG5cblx0XHRcdGlmICggaXNCYXNlNjQgKSBkYXRhID0gd2luZG93LmF0b2IoIGRhdGEgKTtcblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHR2YXIgcmVzcG9uc2U7XG5cdFx0XHRcdHZhciByZXNwb25zZVR5cGUgPSAoIHRoaXMucmVzcG9uc2VUeXBlIHx8ICcnICkudG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0XHRzd2l0Y2ggKCByZXNwb25zZVR5cGUgKSB7XG5cblx0XHRcdFx0XHRjYXNlICdhcnJheWJ1ZmZlcic6XG5cdFx0XHRcdFx0Y2FzZSAnYmxvYic6XG5cblx0XHRcdFx0XHRcdHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoIGRhdGEubGVuZ3RoICk7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHZpZXdbIGkgXSA9IGRhdGEuY2hhckNvZGVBdCggaSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICggcmVzcG9uc2VUeXBlID09PSAnYmxvYicgKSB7XG5cblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBuZXcgQmxvYiggWyB2aWV3LmJ1ZmZlciBdLCB7IHR5cGU6IG1pbWVUeXBlIH0gKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IHZpZXcuYnVmZmVyO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnZG9jdW1lbnQnOlxuXG5cdFx0XHRcdFx0XHR2YXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCBtaW1lVHlwZSApO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ2pzb24nOlxuXG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IEpTT04ucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OiAvLyAndGV4dCcgb3Igb3RoZXJcblxuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBkYXRhO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2FpdCBmb3IgbmV4dCBicm93c2VyIHRpY2sgbGlrZSBzdGFuZGFyZCBYTUxIdHRwUmVxdWVzdCBldmVudCBkaXNwYXRjaGluZyBkb2VzXG5cdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdFx0fSwgMCApO1xuXG5cdFx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdFx0Ly8gV2FpdCBmb3IgbmV4dCBicm93c2VyIHRpY2sgbGlrZSBzdGFuZGFyZCBYTUxIdHRwUmVxdWVzdCBldmVudCBkaXNwYXRjaGluZyBkb2VzXG5cdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBlcnJvciApO1xuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHRcdFx0fSwgMCApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBJbml0aWFsaXNlIGFycmF5IGZvciBkdXBsaWNhdGUgcmVxdWVzdHNcblxuXHRcdFx0bG9hZGluZ1sgdXJsIF0gPSBbXTtcblxuXHRcdFx0bG9hZGluZ1sgdXJsIF0ucHVzaCgge1xuXG5cdFx0XHRcdG9uTG9hZDogb25Mb2FkLFxuXHRcdFx0XHRvblByb2dyZXNzOiBvblByb2dyZXNzLFxuXHRcdFx0XHRvbkVycm9yOiBvbkVycm9yXG5cblx0XHRcdH0gKTtcblxuXHRcdFx0dmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuXHRcdFx0cmVxdWVzdC5vcGVuKCAnR0VUJywgdXJsLCB0cnVlICk7XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRcdHZhciByZXNwb25zZSA9IHRoaXMucmVzcG9uc2U7XG5cblx0XHRcdFx0Q2FjaGUuYWRkKCB1cmwsIHJlc3BvbnNlICk7XG5cblx0XHRcdFx0dmFyIGNhbGxiYWNrcyA9IGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGRlbGV0ZSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRpZiAoIHRoaXMuc3RhdHVzID09PSAyMDAgKSB7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTtcblx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sub25Mb2FkICkgY2FsbGJhY2sub25Mb2FkKCByZXNwb25zZSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0aGlzLnN0YXR1cyA9PT0gMCApIHtcblxuXHRcdFx0XHRcdC8vIFNvbWUgYnJvd3NlcnMgcmV0dXJuIEhUVFAgU3RhdHVzIDAgd2hlbiB1c2luZyBub24taHR0cCBwcm90b2NvbFxuXHRcdFx0XHRcdC8vIGUuZy4gJ2ZpbGU6Ly8nIG9yICdkYXRhOi8vJy4gSGFuZGxlIGFzIHN1Y2Nlc3MuXG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLicgKTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkxvYWQgKSBjYWxsYmFjay5vbkxvYWQoIHJlc3BvbnNlICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTtcblx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sub25FcnJvciApIGNhbGxiYWNrLm9uRXJyb3IoIGV2ZW50ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ3Byb2dyZXNzJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sub25Qcm9ncmVzcyApIGNhbGxiYWNrLm9uUHJvZ3Jlc3MoIGV2ZW50ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LCBmYWxzZSApO1xuXG5cdFx0XHRyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdFx0dmFyIGNhbGxiYWNrcyA9IGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGRlbGV0ZSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkVycm9yICkgY2FsbGJhY2sub25FcnJvciggZXZlbnQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHR9LCBmYWxzZSApO1xuXG5cdFx0XHRpZiAoIHRoaXMucmVzcG9uc2VUeXBlICE9PSB1bmRlZmluZWQgKSByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IHRoaXMucmVzcG9uc2VUeXBlO1xuXHRcdFx0aWYgKCB0aGlzLndpdGhDcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkICkgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSB0aGlzLndpdGhDcmVkZW50aWFscztcblxuXHRcdFx0aWYgKCByZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUgKSByZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUoIHRoaXMubWltZVR5cGUgIT09IHVuZGVmaW5lZCA/IHRoaXMubWltZVR5cGUgOiAndGV4dC9wbGFpbicgKTtcblxuXHRcdFx0Zm9yICggdmFyIGhlYWRlciBpbiB0aGlzLnJlcXVlc3RIZWFkZXIgKSB7XG5cblx0XHRcdFx0cmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCBoZWFkZXIsIHRoaXMucmVxdWVzdEhlYWRlclsgaGVhZGVyIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXF1ZXN0LnNlbmQoIG51bGwgKTtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdHJldHVybiByZXF1ZXN0O1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UmVzcG9uc2VUeXBlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5yZXNwb25zZVR5cGUgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFdpdGhDcmVkZW50aWFsczogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMud2l0aENyZWRlbnRpYWxzID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRNaW1lVHlwZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMubWltZVR5cGUgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnJlcXVlc3RIZWFkZXIgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICpcbiAqIEFic3RyYWN0IEJhc2UgY2xhc3MgdG8gYmxvY2sgYmFzZWQgdGV4dHVyZXMgbG9hZGVyIChkZHMsIHB2ciwgLi4uKVxuICovXG5cbmZ1bmN0aW9uIENvbXByZXNzZWRUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG5cdC8vIG92ZXJyaWRlIGluIHN1YiBjbGFzc2VzXG5cdHRoaXMuX3BhcnNlciA9IG51bGw7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgaW1hZ2VzID0gW107XG5cblx0XHR2YXIgdGV4dHVyZSA9IG5ldyBDb21wcmVzc2VkVGV4dHVyZSgpO1xuXHRcdHRleHR1cmUuaW1hZ2UgPSBpbWFnZXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcblx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7XG5cblx0XHRmdW5jdGlvbiBsb2FkVGV4dHVyZSggaSApIHtcblxuXHRcdFx0bG9hZGVyLmxvYWQoIHVybFsgaSBdLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdFx0XHR2YXIgdGV4RGF0YXMgPSBzY29wZS5fcGFyc2VyKCBidWZmZXIsIHRydWUgKTtcblxuXHRcdFx0XHRpbWFnZXNbIGkgXSA9IHtcblx0XHRcdFx0XHR3aWR0aDogdGV4RGF0YXMud2lkdGgsXG5cdFx0XHRcdFx0aGVpZ2h0OiB0ZXhEYXRhcy5oZWlnaHQsXG5cdFx0XHRcdFx0Zm9ybWF0OiB0ZXhEYXRhcy5mb3JtYXQsXG5cdFx0XHRcdFx0bWlwbWFwczogdGV4RGF0YXMubWlwbWFwc1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGxvYWRlZCArPSAxO1xuXG5cdFx0XHRcdGlmICggbG9hZGVkID09PSA2ICkge1xuXG5cdFx0XHRcdFx0aWYgKCB0ZXhEYXRhcy5taXBtYXBDb3VudCA9PT0gMSApXG5cdFx0XHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xuXHRcdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggdXJsICkgKSB7XG5cblx0XHRcdHZhciBsb2FkZWQgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdXJsLmxlbmd0aDsgaSA8IGlsOyArKyBpICkge1xuXG5cdFx0XHRcdGxvYWRUZXh0dXJlKCBpICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGNvbXByZXNzZWQgY3ViZW1hcCB0ZXh0dXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBERFMgZmlsZVxuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdFx0XHR2YXIgdGV4RGF0YXMgPSBzY29wZS5fcGFyc2VyKCBidWZmZXIsIHRydWUgKTtcblxuXHRcdFx0XHRpZiAoIHRleERhdGFzLmlzQ3ViZW1hcCApIHtcblxuXHRcdFx0XHRcdHZhciBmYWNlcyA9IHRleERhdGFzLm1pcG1hcHMubGVuZ3RoIC8gdGV4RGF0YXMubWlwbWFwQ291bnQ7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgZiA9IDA7IGYgPCBmYWNlczsgZiArKyApIHtcblxuXHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0gPSB7IG1pcG1hcHM6IFtdIH07XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRleERhdGFzLm1pcG1hcENvdW50OyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLm1pcG1hcHMucHVzaCggdGV4RGF0YXMubWlwbWFwc1sgZiAqIHRleERhdGFzLm1pcG1hcENvdW50ICsgaSBdICk7XG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLmZvcm1hdCA9IHRleERhdGFzLmZvcm1hdDtcblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0ud2lkdGggPSB0ZXhEYXRhcy53aWR0aDtcblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0uaGVpZ2h0ID0gdGV4RGF0YXMuaGVpZ2h0O1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRleHR1cmUuaW1hZ2Uud2lkdGggPSB0ZXhEYXRhcy53aWR0aDtcblx0XHRcdFx0XHR0ZXh0dXJlLmltYWdlLmhlaWdodCA9IHRleERhdGFzLmhlaWdodDtcblx0XHRcdFx0XHR0ZXh0dXJlLm1pcG1hcHMgPSB0ZXhEYXRhcy5taXBtYXBzO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRleERhdGFzLm1pcG1hcENvdW50ID09PSAxICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xuXHRcdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApO1xuXG5cdFx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9LFxuXG5cdHNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhdGggPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIE5pa29zIE0uIC8gaHR0cHM6Ly9naXRodWIuY29tL2ZvbzEyMy9cbiAqXG4gKiBBYnN0cmFjdCBCYXNlIGNsYXNzIHRvIGxvYWQgZ2VuZXJpYyBiaW5hcnkgdGV4dHVyZXMgZm9ybWF0cyAocmdiZSwgaGRyLCAuLi4pXG4gKi9cblxuZnVuY3Rpb24gRGF0YVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cblx0Ly8gb3ZlcnJpZGUgaW4gc3ViIGNsYXNzZXNcblx0dGhpcy5fcGFyc2VyID0gbnVsbDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBEYXRhVGV4dHVyZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciB0ZXh0dXJlID0gbmV3IERhdGFUZXh0dXJlKCk7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblxuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHR2YXIgdGV4RGF0YSA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciApO1xuXG5cdFx0XHRpZiAoICEgdGV4RGF0YSApIHJldHVybjtcblxuXHRcdFx0aWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEuaW1hZ2UgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZSA9IHRleERhdGEuaW1hZ2U7XG5cblx0XHRcdH0gZWxzZSBpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5kYXRhICkge1xuXG5cdFx0XHRcdHRleHR1cmUuaW1hZ2Uud2lkdGggPSB0ZXhEYXRhLndpZHRoO1xuXHRcdFx0XHR0ZXh0dXJlLmltYWdlLmhlaWdodCA9IHRleERhdGEuaGVpZ2h0O1xuXHRcdFx0XHR0ZXh0dXJlLmltYWdlLmRhdGEgPSB0ZXhEYXRhLmRhdGE7XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZS53cmFwUyA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS53cmFwUyA/IHRleERhdGEud3JhcFMgOiBDbGFtcFRvRWRnZVdyYXBwaW5nO1xuXHRcdFx0dGV4dHVyZS53cmFwVCA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS53cmFwVCA/IHRleERhdGEud3JhcFQgOiBDbGFtcFRvRWRnZVdyYXBwaW5nO1xuXG5cdFx0XHR0ZXh0dXJlLm1hZ0ZpbHRlciA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5tYWdGaWx0ZXIgPyB0ZXhEYXRhLm1hZ0ZpbHRlciA6IExpbmVhckZpbHRlcjtcblx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLm1pbkZpbHRlciA/IHRleERhdGEubWluRmlsdGVyIDogTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyO1xuXG5cdFx0XHR0ZXh0dXJlLmFuaXNvdHJvcHkgPSB1bmRlZmluZWQgIT09IHRleERhdGEuYW5pc290cm9weSA/IHRleERhdGEuYW5pc290cm9weSA6IDE7XG5cblx0XHRcdGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmZvcm1hdCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmZvcm1hdCA9IHRleERhdGEuZm9ybWF0O1xuXG5cdFx0XHR9XG5cdFx0XHRpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS50eXBlICkge1xuXG5cdFx0XHRcdHRleHR1cmUudHlwZSA9IHRleERhdGEudHlwZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5taXBtYXBzICkge1xuXG5cdFx0XHRcdHRleHR1cmUubWlwbWFwcyA9IHRleERhdGEubWlwbWFwcztcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIDEgPT09IHRleERhdGEubWlwbWFwQ291bnQgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlLCB0ZXhEYXRhICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gSW1hZ2VMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggSW1hZ2VMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0Y3Jvc3NPcmlnaW46ICdBbm9ueW1vdXMnLFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7XG5cblx0XHRpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsO1xuXG5cdFx0dXJsID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoIHVybCApO1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApO1xuXG5cdFx0aWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApO1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIDAgKTtcblxuXHRcdFx0cmV0dXJuIGNhY2hlZDtcblxuXHRcdH1cblxuXHRcdHZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnaW1nJyApO1xuXG5cdFx0aW1hZ2UuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdENhY2hlLmFkZCggdXJsLCB0aGlzICk7XG5cblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0aGlzICk7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHR9LCBmYWxzZSApO1xuXG5cdFx0Lypcblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRpZiAoIG9uUHJvZ3Jlc3MgKSBvblByb2dyZXNzKCBldmVudCApO1xuXG5cdFx0fSwgZmFsc2UgKTtcblx0XHQqL1xuXG5cdFx0aW1hZ2UuYWRkRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZXZlbnQgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdH0sIGZhbHNlICk7XG5cblx0XHRpZiAoIHVybC5zdWJzdHIoIDAsIDUgKSAhPT0gJ2RhdGE6JyApIHtcblxuXHRcdFx0aWYgKCB0aGlzLmNyb3NzT3JpZ2luICE9PSB1bmRlZmluZWQgKSBpbWFnZS5jcm9zc09yaWdpbiA9IHRoaXMuY3Jvc3NPcmlnaW47XG5cblx0XHR9XG5cblx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRpbWFnZS5zcmMgPSB1cmw7XG5cblx0XHRyZXR1cm4gaW1hZ2U7XG5cblx0fSxcblxuXHRzZXRDcm9zc09yaWdpbjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuY3Jvc3NPcmlnaW4gPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhdGggPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEN1YmVUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEN1YmVUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGNyb3NzT3JpZ2luOiAnQW5vbnltb3VzJyxcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybHMsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciB0ZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCk7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cblx0XHR2YXIgbG9hZGVkID0gMDtcblxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsc1sgaSBdLCBmdW5jdGlvbiAoIGltYWdlICkge1xuXG5cdFx0XHRcdHRleHR1cmUuaW1hZ2VzWyBpIF0gPSBpbWFnZTtcblxuXHRcdFx0XHRsb2FkZWQgKys7XG5cblx0XHRcdFx0aWYgKCBsb2FkZWQgPT09IDYgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LCB1bmRlZmluZWQsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyArKyBpICkge1xuXG5cdFx0XHRsb2FkVGV4dHVyZSggaSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fSxcblxuXHRzZXRDcm9zc09yaWdpbjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuY3Jvc3NPcmlnaW4gPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhdGggPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVGV4dHVyZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRjcm9zc09yaWdpbjogJ0Fub255bW91cycsXG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciB0ZXh0dXJlID0gbmV3IFRleHR1cmUoKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcblxuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggaW1hZ2UgKSB7XG5cblx0XHRcdHRleHR1cmUuaW1hZ2UgPSBpbWFnZTtcblxuXHRcdFx0Ly8gSlBFR3MgY2FuJ3QgaGF2ZSBhbiBhbHBoYSBjaGFubmVsLCBzbyBtZW1vcnkgY2FuIGJlIHNhdmVkIGJ5IHN0b3JpbmcgdGhlbSBhcyBSR0IuXG5cdFx0XHR2YXIgaXNKUEVHID0gdXJsLnNlYXJjaCggL1xcLihqcGd8anBlZykkLyApID4gMCB8fCB1cmwuc2VhcmNoKCAvXmRhdGFcXDppbWFnZVxcL2pwZWcvICkgPT09IDA7XG5cblx0XHRcdHRleHR1cmUuZm9ybWF0ID0gaXNKUEVHID8gUkdCRm9ybWF0IDogUkdCQUZvcm1hdDtcblx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG9uTG9hZCggdGV4dHVyZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEV4dGVuc2libGUgY3VydmUgb2JqZWN0XG4gKlxuICogU29tZSBjb21tb24gb2YgY3VydmUgbWV0aG9kczpcbiAqIC5nZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgKSwgLmdldFRhbmdlbnQoIHQgKVxuICogLmdldFBvaW50QXQoIHUsIG9wdGlvbmFsVGFyZ2V0ICksIC5nZXRUYW5nZW50QXQoIHUgKVxuICogLmdldFBvaW50cygpLCAuZ2V0U3BhY2VkUG9pbnRzKClcbiAqIC5nZXRMZW5ndGgoKVxuICogLnVwZGF0ZUFyY0xlbmd0aHMoKVxuICpcbiAqIFRoaXMgZm9sbG93aW5nIGN1cnZlcyBpbmhlcml0IGZyb20gVEhSRUUuQ3VydmU6XG4gKlxuICogLS0gMkQgY3VydmVzIC0tXG4gKiBUSFJFRS5BcmNDdXJ2ZVxuICogVEhSRUUuQ3ViaWNCZXppZXJDdXJ2ZVxuICogVEhSRUUuRWxsaXBzZUN1cnZlXG4gKiBUSFJFRS5MaW5lQ3VydmVcbiAqIFRIUkVFLlF1YWRyYXRpY0JlemllckN1cnZlXG4gKiBUSFJFRS5TcGxpbmVDdXJ2ZVxuICpcbiAqIC0tIDNEIGN1cnZlcyAtLVxuICogVEhSRUUuQ2F0bXVsbFJvbUN1cnZlM1xuICogVEhSRUUuQ3ViaWNCZXppZXJDdXJ2ZTNcbiAqIFRIUkVFLkxpbmVDdXJ2ZTNcbiAqIFRIUkVFLlF1YWRyYXRpY0JlemllckN1cnZlM1xuICpcbiAqIEEgc2VyaWVzIG9mIGN1cnZlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBUSFJFRS5DdXJ2ZVBhdGguXG4gKlxuICoqL1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqXHRBYnN0cmFjdCBDdXJ2ZSBiYXNlIGNsYXNzXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmZ1bmN0aW9uIEN1cnZlKCkge1xuXG5cdHRoaXMudHlwZSA9ICdDdXJ2ZSc7XG5cblx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSAyMDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ3VydmUucHJvdG90eXBlLCB7XG5cblx0Ly8gVmlydHVhbCBiYXNlIGNsYXNzIG1ldGhvZCB0byBvdmVyd3JpdGUgYW5kIGltcGxlbWVudCBpbiBzdWJjbGFzc2VzXG5cdC8vXHQtIHQgWzAgLi4gMV1cblxuXHRnZXRQb2ludDogZnVuY3Rpb24gKCAvKiB0LCBvcHRpb25hbFRhcmdldCAqLyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuZ2V0UG9pbnQoKSBub3QgaW1wbGVtZW50ZWQuJyApO1xuXHRcdHJldHVybiBudWxsO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHBvaW50IGF0IHJlbGF0aXZlIHBvc2l0aW9uIGluIGN1cnZlIGFjY29yZGluZyB0byBhcmMgbGVuZ3RoXG5cdC8vIC0gdSBbMCAuLiAxXVxuXG5cdGdldFBvaW50QXQ6IGZ1bmN0aW9uICggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgdCA9IHRoaXMuZ2V0VXRvVG1hcHBpbmcoIHUgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9LFxuXG5cdC8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnQoIHQgKVxuXG5cdGdldFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNTtcblxuXHRcdHZhciBwb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBkID0gMDsgZCA8PSBkaXZpc2lvbnM7IGQgKysgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50KCBkIC8gZGl2aXNpb25zICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBwb2ludHM7XG5cblx0fSxcblxuXHQvLyBHZXQgc2VxdWVuY2Ugb2YgcG9pbnRzIHVzaW5nIGdldFBvaW50QXQoIHUgKVxuXG5cdGdldFNwYWNlZFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNTtcblxuXHRcdHZhciBwb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBkID0gMDsgZCA8PSBkaXZpc2lvbnM7IGQgKysgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50QXQoIGQgLyBkaXZpc2lvbnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdC8vIEdldCB0b3RhbCBjdXJ2ZSBhcmMgbGVuZ3RoXG5cblx0Z2V0TGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbGVuZ3RocyA9IHRoaXMuZ2V0TGVuZ3RocygpO1xuXHRcdHJldHVybiBsZW5ndGhzWyBsZW5ndGhzLmxlbmd0aCAtIDEgXTtcblxuXHR9LFxuXG5cdC8vIEdldCBsaXN0IG9mIGN1bXVsYXRpdmUgc2VnbWVudCBsZW5ndGhzXG5cblx0Z2V0TGVuZ3RoczogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cblx0XHRpZiAoIHRoaXMuY2FjaGVBcmNMZW5ndGhzICYmXG5cdFx0XHQoIHRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aCA9PT0gZGl2aXNpb25zICsgMSApICYmXG5cdFx0XHQhIHRoaXMubmVlZHNVcGRhdGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3RocztcblxuXHRcdH1cblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdHZhciBjYWNoZSA9IFtdO1xuXHRcdHZhciBjdXJyZW50LCBsYXN0ID0gdGhpcy5nZXRQb2ludCggMCApO1xuXHRcdHZhciBwLCBzdW0gPSAwO1xuXG5cdFx0Y2FjaGUucHVzaCggMCApO1xuXG5cdFx0Zm9yICggcCA9IDE7IHAgPD0gZGl2aXNpb25zOyBwICsrICkge1xuXG5cdFx0XHRjdXJyZW50ID0gdGhpcy5nZXRQb2ludCggcCAvIGRpdmlzaW9ucyApO1xuXHRcdFx0c3VtICs9IGN1cnJlbnQuZGlzdGFuY2VUbyggbGFzdCApO1xuXHRcdFx0Y2FjaGUucHVzaCggc3VtICk7XG5cdFx0XHRsYXN0ID0gY3VycmVudDtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2FjaGVBcmNMZW5ndGhzID0gY2FjaGU7XG5cblx0XHRyZXR1cm4gY2FjaGU7IC8vIHsgc3VtczogY2FjaGUsIHN1bTogc3VtIH07IFN1bSBpcyBpbiB0aGUgbGFzdCBlbGVtZW50LlxuXG5cdH0sXG5cblx0dXBkYXRlQXJjTGVuZ3RoczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cdFx0dGhpcy5nZXRMZW5ndGhzKCk7XG5cblx0fSxcblxuXHQvLyBHaXZlbiB1ICggMCAuLiAxICksIGdldCBhIHQgdG8gZmluZCBwLiBUaGlzIGdpdmVzIHlvdSBwb2ludHMgd2hpY2ggYXJlIGVxdWlkaXN0YW50XG5cblx0Z2V0VXRvVG1hcHBpbmc6IGZ1bmN0aW9uICggdSwgZGlzdGFuY2UgKSB7XG5cblx0XHR2YXIgYXJjTGVuZ3RocyA9IHRoaXMuZ2V0TGVuZ3RocygpO1xuXG5cdFx0dmFyIGkgPSAwLCBpbCA9IGFyY0xlbmd0aHMubGVuZ3RoO1xuXG5cdFx0dmFyIHRhcmdldEFyY0xlbmd0aDsgLy8gVGhlIHRhcmdldGVkIHUgZGlzdGFuY2UgdmFsdWUgdG8gZ2V0XG5cblx0XHRpZiAoIGRpc3RhbmNlICkge1xuXG5cdFx0XHR0YXJnZXRBcmNMZW5ndGggPSBkaXN0YW5jZTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRhcmdldEFyY0xlbmd0aCA9IHUgKiBhcmNMZW5ndGhzWyBpbCAtIDEgXTtcblxuXHRcdH1cblxuXHRcdC8vIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBpbmRleCB3aXRoIGxhcmdlc3QgdmFsdWUgc21hbGxlciB0aGFuIHRhcmdldCB1IGRpc3RhbmNlXG5cblx0XHR2YXIgbG93ID0gMCwgaGlnaCA9IGlsIC0gMSwgY29tcGFyaXNvbjtcblxuXHRcdHdoaWxlICggbG93IDw9IGhpZ2ggKSB7XG5cblx0XHRcdGkgPSBNYXRoLmZsb29yKCBsb3cgKyAoIGhpZ2ggLSBsb3cgKSAvIDIgKTsgLy8gbGVzcyBsaWtlbHkgdG8gb3ZlcmZsb3csIHRob3VnaCBwcm9iYWJseSBub3QgaXNzdWUgaGVyZSwgSlMgZG9lc24ndCByZWFsbHkgaGF2ZSBpbnRlZ2VycywgYWxsIG51bWJlcnMgYXJlIGZsb2F0c1xuXG5cdFx0XHRjb21wYXJpc29uID0gYXJjTGVuZ3Roc1sgaSBdIC0gdGFyZ2V0QXJjTGVuZ3RoO1xuXG5cdFx0XHRpZiAoIGNvbXBhcmlzb24gPCAwICkge1xuXG5cdFx0XHRcdGxvdyA9IGkgKyAxO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBjb21wYXJpc29uID4gMCApIHtcblxuXHRcdFx0XHRoaWdoID0gaSAtIDE7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aGlnaCA9IGk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdC8vIERPTkVcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aSA9IGhpZ2g7XG5cblx0XHRpZiAoIGFyY0xlbmd0aHNbIGkgXSA9PT0gdGFyZ2V0QXJjTGVuZ3RoICkge1xuXG5cdFx0XHRyZXR1cm4gaSAvICggaWwgLSAxICk7XG5cblx0XHR9XG5cblx0XHQvLyB3ZSBjb3VsZCBnZXQgZmluZXIgZ3JhaW4gYXQgbGVuZ3Rocywgb3IgdXNlIHNpbXBsZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHBvaW50c1xuXG5cdFx0dmFyIGxlbmd0aEJlZm9yZSA9IGFyY0xlbmd0aHNbIGkgXTtcblx0XHR2YXIgbGVuZ3RoQWZ0ZXIgPSBhcmNMZW5ndGhzWyBpICsgMSBdO1xuXG5cdFx0dmFyIHNlZ21lbnRMZW5ndGggPSBsZW5ndGhBZnRlciAtIGxlbmd0aEJlZm9yZTtcblxuXHRcdC8vIGRldGVybWluZSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiB0aGUgJ2JlZm9yZScgYW5kICdhZnRlcicgcG9pbnRzXG5cblx0XHR2YXIgc2VnbWVudEZyYWN0aW9uID0gKCB0YXJnZXRBcmNMZW5ndGggLSBsZW5ndGhCZWZvcmUgKSAvIHNlZ21lbnRMZW5ndGg7XG5cblx0XHQvLyBhZGQgdGhhdCBmcmFjdGlvbmFsIGFtb3VudCB0byB0XG5cblx0XHR2YXIgdCA9ICggaSArIHNlZ21lbnRGcmFjdGlvbiApIC8gKCBpbCAtIDEgKTtcblxuXHRcdHJldHVybiB0O1xuXG5cdH0sXG5cblx0Ly8gUmV0dXJucyBhIHVuaXQgdmVjdG9yIHRhbmdlbnQgYXQgdFxuXHQvLyBJbiBjYXNlIGFueSBzdWIgY3VydmUgZG9lcyBub3QgaW1wbGVtZW50IGl0cyB0YW5nZW50IGRlcml2YXRpb24sXG5cdC8vIDIgcG9pbnRzIGEgc21hbGwgZGVsdGEgYXBhcnQgd2lsbCBiZSB1c2VkIHRvIGZpbmQgaXRzIGdyYWRpZW50XG5cdC8vIHdoaWNoIHNlZW1zIHRvIGdpdmUgYSByZWFzb25hYmxlIGFwcHJveGltYXRpb25cblxuXHRnZXRUYW5nZW50OiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHR2YXIgZGVsdGEgPSAwLjAwMDE7XG5cdFx0dmFyIHQxID0gdCAtIGRlbHRhO1xuXHRcdHZhciB0MiA9IHQgKyBkZWx0YTtcblxuXHRcdC8vIENhcHBpbmcgaW4gY2FzZSBvZiBkYW5nZXJcblxuXHRcdGlmICggdDEgPCAwICkgdDEgPSAwO1xuXHRcdGlmICggdDIgPiAxICkgdDIgPSAxO1xuXG5cdFx0dmFyIHB0MSA9IHRoaXMuZ2V0UG9pbnQoIHQxICk7XG5cdFx0dmFyIHB0MiA9IHRoaXMuZ2V0UG9pbnQoIHQyICk7XG5cblx0XHR2YXIgdmVjID0gcHQyLmNsb25lKCkuc3ViKCBwdDEgKTtcblx0XHRyZXR1cm4gdmVjLm5vcm1hbGl6ZSgpO1xuXG5cdH0sXG5cblx0Z2V0VGFuZ2VudEF0OiBmdW5jdGlvbiAoIHUgKSB7XG5cblx0XHR2YXIgdCA9IHRoaXMuZ2V0VXRvVG1hcHBpbmcoIHUgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRUYW5nZW50KCB0ICk7XG5cblx0fSxcblxuXHRjb21wdXRlRnJlbmV0RnJhbWVzOiBmdW5jdGlvbiAoIHNlZ21lbnRzLCBjbG9zZWQgKSB7XG5cblx0XHQvLyBzZWUgaHR0cDovL3d3dy5jcy5pbmRpYW5hLmVkdS9wdWIvdGVjaHJlcG9ydHMvVFI0MjUucGRmXG5cblx0XHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB0YW5nZW50cyA9IFtdO1xuXHRcdHZhciBub3JtYWxzID0gW107XG5cdFx0dmFyIGJpbm9ybWFscyA9IFtdO1xuXG5cdFx0dmFyIHZlYyA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG1hdCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHR2YXIgaSwgdSwgdGhldGE7XG5cblx0XHQvLyBjb21wdXRlIHRoZSB0YW5nZW50IHZlY3RvcnMgZm9yIGVhY2ggc2VnbWVudCBvbiB0aGUgY3VydmVcblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHR1ID0gaSAvIHNlZ21lbnRzO1xuXG5cdFx0XHR0YW5nZW50c1sgaSBdID0gdGhpcy5nZXRUYW5nZW50QXQoIHUgKTtcblx0XHRcdHRhbmdlbnRzWyBpIF0ubm9ybWFsaXplKCk7XG5cblx0XHR9XG5cblx0XHQvLyBzZWxlY3QgYW4gaW5pdGlhbCBub3JtYWwgdmVjdG9yIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGZpcnN0IHRhbmdlbnQgdmVjdG9yLFxuXHRcdC8vIGFuZCBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBtaW5pbXVtIHRhbmdlbnQgeHl6IGNvbXBvbmVudFxuXG5cdFx0bm9ybWFsc1sgMCBdID0gbmV3IFZlY3RvcjMoKTtcblx0XHRiaW5vcm1hbHNbIDAgXSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG1pbiA9IE51bWJlci5NQVhfVkFMVUU7XG5cdFx0dmFyIHR4ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueCApO1xuXHRcdHZhciB0eSA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnkgKTtcblx0XHR2YXIgdHogPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS56ICk7XG5cblx0XHRpZiAoIHR4IDw9IG1pbiApIHtcblxuXHRcdFx0bWluID0gdHg7XG5cdFx0XHRub3JtYWwuc2V0KCAxLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHR5IDw9IG1pbiApIHtcblxuXHRcdFx0bWluID0gdHk7XG5cdFx0XHRub3JtYWwuc2V0KCAwLCAxLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHR6IDw9IG1pbiApIHtcblxuXHRcdFx0bm9ybWFsLnNldCggMCwgMCwgMSApO1xuXG5cdFx0fVxuXG5cdFx0dmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgbm9ybWFsICkubm9ybWFsaXplKCk7XG5cblx0XHRub3JtYWxzWyAwIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCB2ZWMgKTtcblx0XHRiaW5vcm1hbHNbIDAgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIG5vcm1hbHNbIDAgXSApO1xuXG5cblx0XHQvLyBjb21wdXRlIHRoZSBzbG93bHktdmFyeWluZyBub3JtYWwgYW5kIGJpbm9ybWFsIHZlY3RvcnMgZm9yIGVhY2ggc2VnbWVudCBvbiB0aGUgY3VydmVcblxuXHRcdGZvciAoIGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRub3JtYWxzWyBpIF0gPSBub3JtYWxzWyBpIC0gMSBdLmNsb25lKCk7XG5cblx0XHRcdGJpbm9ybWFsc1sgaSBdID0gYmlub3JtYWxzWyBpIC0gMSBdLmNsb25lKCk7XG5cblx0XHRcdHZlYy5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIC0gMSBdLCB0YW5nZW50c1sgaSBdICk7XG5cblx0XHRcdGlmICggdmVjLmxlbmd0aCgpID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0dmVjLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdHRoZXRhID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdGFuZ2VudHNbIGkgLSAxIF0uZG90KCB0YW5nZW50c1sgaSBdICksIC0gMSwgMSApICk7IC8vIGNsYW1wIGZvciBmbG9hdGluZyBwdCBlcnJvcnNcblxuXHRcdFx0XHRub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJvdGF0aW9uQXhpcyggdmVjLCB0aGV0YSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ymlub3JtYWxzWyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vIGlmIHRoZSBjdXJ2ZSBpcyBjbG9zZWQsIHBvc3Rwcm9jZXNzIHRoZSB2ZWN0b3JzIHNvIHRoZSBmaXJzdCBhbmQgbGFzdCBub3JtYWwgdmVjdG9ycyBhcmUgdGhlIHNhbWVcblxuXHRcdGlmICggY2xvc2VkID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGV0YSA9IE1hdGguYWNvcyggX01hdGguY2xhbXAoIG5vcm1hbHNbIDAgXS5kb3QoIG5vcm1hbHNbIHNlZ21lbnRzIF0gKSwgLSAxLCAxICkgKTtcblx0XHRcdHRoZXRhIC89IHNlZ21lbnRzO1xuXG5cdFx0XHRpZiAoIHRhbmdlbnRzWyAwIF0uZG90KCB2ZWMuY3Jvc3NWZWN0b3JzKCBub3JtYWxzWyAwIF0sIG5vcm1hbHNbIHNlZ21lbnRzIF0gKSApID4gMCApIHtcblxuXHRcdFx0XHR0aGV0YSA9IC0gdGhldGE7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0Ly8gdHdpc3QgYSBsaXR0bGUuLi5cblx0XHRcdFx0bm9ybWFsc1sgaSBdLmFwcGx5TWF0cml4NCggbWF0Lm1ha2VSb3RhdGlvbkF4aXMoIHRhbmdlbnRzWyBpIF0sIHRoZXRhICogaSApICk7XG5cdFx0XHRcdGJpbm9ybWFsc1sgaSBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgXSwgbm9ybWFsc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHR0YW5nZW50czogdGFuZ2VudHMsXG5cdFx0XHRub3JtYWxzOiBub3JtYWxzLFxuXHRcdFx0Ymlub3JtYWxzOiBiaW5vcm1hbHNcblx0XHR9O1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSBzb3VyY2UuYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkYXRhID0ge1xuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnQ3VydmUnLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdDdXJ2ZS50b0pTT04nXG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGRhdGEuYXJjTGVuZ3RoRGl2aXNpb25zID0gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRmcm9tSlNPTjogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSBqc29uLmFyY0xlbmd0aERpdmlzaW9ucztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5mdW5jdGlvbiBFbGxpcHNlQ3VydmUoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnRWxsaXBzZUN1cnZlJztcblxuXHR0aGlzLmFYID0gYVggfHwgMDtcblx0dGhpcy5hWSA9IGFZIHx8IDA7XG5cblx0dGhpcy54UmFkaXVzID0geFJhZGl1cyB8fCAxO1xuXHR0aGlzLnlSYWRpdXMgPSB5UmFkaXVzIHx8IDE7XG5cblx0dGhpcy5hU3RhcnRBbmdsZSA9IGFTdGFydEFuZ2xlIHx8IDA7XG5cdHRoaXMuYUVuZEFuZ2xlID0gYUVuZEFuZ2xlIHx8IDIgKiBNYXRoLlBJO1xuXG5cdHRoaXMuYUNsb2Nrd2lzZSA9IGFDbG9ja3dpc2UgfHwgZmFsc2U7XG5cblx0dGhpcy5hUm90YXRpb24gPSBhUm90YXRpb24gfHwgMDtcblxufVxuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRWxsaXBzZUN1cnZlO1xuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLmlzRWxsaXBzZUN1cnZlID0gdHJ1ZTtcblxuRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblxuXHR2YXIgdHdvUGkgPSBNYXRoLlBJICogMjtcblx0dmFyIGRlbHRhQW5nbGUgPSB0aGlzLmFFbmRBbmdsZSAtIHRoaXMuYVN0YXJ0QW5nbGU7XG5cdHZhciBzYW1lUG9pbnRzID0gTWF0aC5hYnMoIGRlbHRhQW5nbGUgKSA8IE51bWJlci5FUFNJTE9OO1xuXG5cdC8vIGVuc3VyZXMgdGhhdCBkZWx0YUFuZ2xlIGlzIDAgLi4gMiBQSVxuXHR3aGlsZSAoIGRlbHRhQW5nbGUgPCAwICkgZGVsdGFBbmdsZSArPSB0d29QaTtcblx0d2hpbGUgKCBkZWx0YUFuZ2xlID4gdHdvUGkgKSBkZWx0YUFuZ2xlIC09IHR3b1BpO1xuXG5cdGlmICggZGVsdGFBbmdsZSA8IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0aWYgKCBzYW1lUG9pbnRzICkge1xuXG5cdFx0XHRkZWx0YUFuZ2xlID0gMDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSB0d29QaTtcblxuXHRcdH1cblxuXHR9XG5cblx0aWYgKCB0aGlzLmFDbG9ja3dpc2UgPT09IHRydWUgJiYgISBzYW1lUG9pbnRzICkge1xuXG5cdFx0aWYgKCBkZWx0YUFuZ2xlID09PSB0d29QaSApIHtcblxuXHRcdFx0ZGVsdGFBbmdsZSA9IC0gdHdvUGk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkZWx0YUFuZ2xlID0gZGVsdGFBbmdsZSAtIHR3b1BpO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR2YXIgYW5nbGUgPSB0aGlzLmFTdGFydEFuZ2xlICsgdCAqIGRlbHRhQW5nbGU7XG5cdHZhciB4ID0gdGhpcy5hWCArIHRoaXMueFJhZGl1cyAqIE1hdGguY29zKCBhbmdsZSApO1xuXHR2YXIgeSA9IHRoaXMuYVkgKyB0aGlzLnlSYWRpdXMgKiBNYXRoLnNpbiggYW5nbGUgKTtcblxuXHRpZiAoIHRoaXMuYVJvdGF0aW9uICE9PSAwICkge1xuXG5cdFx0dmFyIGNvcyA9IE1hdGguY29zKCB0aGlzLmFSb3RhdGlvbiApO1xuXHRcdHZhciBzaW4gPSBNYXRoLnNpbiggdGhpcy5hUm90YXRpb24gKTtcblxuXHRcdHZhciB0eCA9IHggLSB0aGlzLmFYO1xuXHRcdHZhciB0eSA9IHkgLSB0aGlzLmFZO1xuXG5cdFx0Ly8gUm90YXRlIHRoZSBwb2ludCBhYm91dCB0aGUgY2VudGVyIG9mIHRoZSBlbGxpcHNlLlxuXHRcdHggPSB0eCAqIGNvcyAtIHR5ICogc2luICsgdGhpcy5hWDtcblx0XHR5ID0gdHggKiBzaW4gKyB0eSAqIGNvcyArIHRoaXMuYVk7XG5cblx0fVxuXG5cdHJldHVybiBwb2ludC5zZXQoIHgsIHkgKTtcblxufTtcblxuRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5hWCA9IHNvdXJjZS5hWDtcblx0dGhpcy5hWSA9IHNvdXJjZS5hWTtcblxuXHR0aGlzLnhSYWRpdXMgPSBzb3VyY2UueFJhZGl1cztcblx0dGhpcy55UmFkaXVzID0gc291cmNlLnlSYWRpdXM7XG5cblx0dGhpcy5hU3RhcnRBbmdsZSA9IHNvdXJjZS5hU3RhcnRBbmdsZTtcblx0dGhpcy5hRW5kQW5nbGUgPSBzb3VyY2UuYUVuZEFuZ2xlO1xuXG5cdHRoaXMuYUNsb2Nrd2lzZSA9IHNvdXJjZS5hQ2xvY2t3aXNlO1xuXG5cdHRoaXMuYVJvdGF0aW9uID0gc291cmNlLmFSb3RhdGlvbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuXG5FbGxpcHNlQ3VydmUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEuYVggPSB0aGlzLmFYO1xuXHRkYXRhLmFZID0gdGhpcy5hWTtcblxuXHRkYXRhLnhSYWRpdXMgPSB0aGlzLnhSYWRpdXM7XG5cdGRhdGEueVJhZGl1cyA9IHRoaXMueVJhZGl1cztcblxuXHRkYXRhLmFTdGFydEFuZ2xlID0gdGhpcy5hU3RhcnRBbmdsZTtcblx0ZGF0YS5hRW5kQW5nbGUgPSB0aGlzLmFFbmRBbmdsZTtcblxuXHRkYXRhLmFDbG9ja3dpc2UgPSB0aGlzLmFDbG9ja3dpc2U7XG5cblx0ZGF0YS5hUm90YXRpb24gPSB0aGlzLmFSb3RhdGlvbjtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMuYVggPSBqc29uLmFYO1xuXHR0aGlzLmFZID0ganNvbi5hWTtcblxuXHR0aGlzLnhSYWRpdXMgPSBqc29uLnhSYWRpdXM7XG5cdHRoaXMueVJhZGl1cyA9IGpzb24ueVJhZGl1cztcblxuXHR0aGlzLmFTdGFydEFuZ2xlID0ganNvbi5hU3RhcnRBbmdsZTtcblx0dGhpcy5hRW5kQW5nbGUgPSBqc29uLmFFbmRBbmdsZTtcblxuXHR0aGlzLmFDbG9ja3dpc2UgPSBqc29uLmFDbG9ja3dpc2U7XG5cblx0dGhpcy5hUm90YXRpb24gPSBqc29uLmFSb3RhdGlvbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gQXJjQ3VydmUoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcblxuXHRFbGxpcHNlQ3VydmUuY2FsbCggdGhpcywgYVgsIGFZLCBhUmFkaXVzLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XG5cblx0dGhpcy50eXBlID0gJ0FyY0N1cnZlJztcblxufVxuXG5BcmNDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFbGxpcHNlQ3VydmUucHJvdG90eXBlICk7XG5BcmNDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBcmNDdXJ2ZTtcblxuQXJjQ3VydmUucHJvdG90eXBlLmlzQXJjQ3VydmUgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICpcbiAqIENlbnRyaXBldGFsIENhdG11bGxSb20gQ3VydmUgLSB3aGljaCBpcyB1c2VmdWwgZm9yIGF2b2lkaW5nXG4gKiBjdXNwcyBhbmQgc2VsZi1pbnRlcnNlY3Rpb25zIGluIG5vbi11bmlmb3JtIGNhdG11bGwgcm9tIGN1cnZlcy5cbiAqIGh0dHA6Ly93d3cuY2VteXVrc2VsLmNvbS9yZXNlYXJjaC9jYXRtdWxscm9tX3BhcmFtL2NhdG11bGxyb20ucGRmXG4gKlxuICogY3VydmUudHlwZSBhY2NlcHRzIGNlbnRyaXBldGFsKGRlZmF1bHQpLCBjaG9yZGFsIGFuZCBjYXRtdWxscm9tXG4gKiBjdXJ2ZS50ZW5zaW9uIGlzIHVzZWQgZm9yIGNhdG11bGxyb20gd2hpY2ggZGVmYXVsdHMgdG8gMC41XG4gKi9cblxuXG4vKlxuQmFzZWQgb24gYW4gb3B0aW1pemVkIGMrKyBzb2x1dGlvbiBpblxuIC0gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy85NDg5NzM2L2NhdG11bGwtcm9tLWN1cnZlLXdpdGgtbm8tY3VzcHMtYW5kLW5vLXNlbGYtaW50ZXJzZWN0aW9ucy9cbiAtIGh0dHA6Ly9pZGVvbmUuY29tL05vRWJWTVxuXG5UaGlzIEN1YmljUG9seSBjbGFzcyBjb3VsZCBiZSB1c2VkIGZvciByZXVzaW5nIHNvbWUgdmFyaWFibGVzIGFuZCBjYWxjdWxhdGlvbnMsXG5idXQgZm9yIHRocmVlLmpzIGN1cnZlIHVzZSwgaXQgY291bGQgYmUgcG9zc2libGUgaW5saW5lZCBhbmQgZmxhdHRlbiBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGxcbndoaWNoIGNhbiBiZSBwbGFjZWQgaW4gQ3VydmVVdGlscy5cbiovXG5cbmZ1bmN0aW9uIEN1YmljUG9seSgpIHtcblxuXHR2YXIgYzAgPSAwLCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwO1xuXG5cdC8qXG5cdCAqIENvbXB1dGUgY29lZmZpY2llbnRzIGZvciBhIGN1YmljIHBvbHlub21pYWxcblx0ICogICBwKHMpID0gYzAgKyBjMSpzICsgYzIqc14yICsgYzMqc14zXG5cdCAqIHN1Y2ggdGhhdFxuXHQgKiAgIHAoMCkgPSB4MCwgcCgxKSA9IHgxXG5cdCAqICBhbmRcblx0ICogICBwJygwKSA9IHQwLCBwJygxKSA9IHQxLlxuXHQgKi9cblx0ZnVuY3Rpb24gaW5pdCggeDAsIHgxLCB0MCwgdDEgKSB7XG5cblx0XHRjMCA9IHgwO1xuXHRcdGMxID0gdDA7XG5cdFx0YzIgPSAtIDMgKiB4MCArIDMgKiB4MSAtIDIgKiB0MCAtIHQxO1xuXHRcdGMzID0gMiAqIHgwIC0gMiAqIHgxICsgdDAgKyB0MTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGluaXRDYXRtdWxsUm9tOiBmdW5jdGlvbiAoIHgwLCB4MSwgeDIsIHgzLCB0ZW5zaW9uICkge1xuXG5cdFx0XHRpbml0KCB4MSwgeDIsIHRlbnNpb24gKiAoIHgyIC0geDAgKSwgdGVuc2lvbiAqICggeDMgLSB4MSApICk7XG5cblx0XHR9LFxuXG5cdFx0aW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOiBmdW5jdGlvbiAoIHgwLCB4MSwgeDIsIHgzLCBkdDAsIGR0MSwgZHQyICkge1xuXG5cdFx0XHQvLyBjb21wdXRlIHRhbmdlbnRzIHdoZW4gcGFyYW1ldGVyaXplZCBpbiBbdDEsdDJdXG5cdFx0XHR2YXIgdDEgPSAoIHgxIC0geDAgKSAvIGR0MCAtICggeDIgLSB4MCApIC8gKCBkdDAgKyBkdDEgKSArICggeDIgLSB4MSApIC8gZHQxO1xuXHRcdFx0dmFyIHQyID0gKCB4MiAtIHgxICkgLyBkdDEgLSAoIHgzIC0geDEgKSAvICggZHQxICsgZHQyICkgKyAoIHgzIC0geDIgKSAvIGR0MjtcblxuXHRcdFx0Ly8gcmVzY2FsZSB0YW5nZW50cyBmb3IgcGFyYW1ldHJpemF0aW9uIGluIFswLDFdXG5cdFx0XHR0MSAqPSBkdDE7XG5cdFx0XHR0MiAqPSBkdDE7XG5cblx0XHRcdGluaXQoIHgxLCB4MiwgdDEsIHQyICk7XG5cblx0XHR9LFxuXG5cdFx0Y2FsYzogZnVuY3Rpb24gKCB0ICkge1xuXG5cdFx0XHR2YXIgdDIgPSB0ICogdDtcblx0XHRcdHZhciB0MyA9IHQyICogdDtcblx0XHRcdHJldHVybiBjMCArIGMxICogdCArIGMyICogdDIgKyBjMyAqIHQzO1xuXG5cdFx0fVxuXG5cdH07XG5cbn1cblxuLy9cblxudmFyIHRtcCA9IG5ldyBWZWN0b3IzKCk7XG52YXIgcHgkMSA9IG5ldyBDdWJpY1BvbHkoKTtcbnZhciBweSA9IG5ldyBDdWJpY1BvbHkoKTtcbnZhciBweiA9IG5ldyBDdWJpY1BvbHkoKTtcblxuZnVuY3Rpb24gQ2F0bXVsbFJvbUN1cnZlMyggcG9pbnRzLCBjbG9zZWQsIGN1cnZlVHlwZSwgdGVuc2lvbiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0NhdG11bGxSb21DdXJ2ZTMnO1xuXG5cdHRoaXMucG9pbnRzID0gcG9pbnRzIHx8IFtdO1xuXHR0aGlzLmNsb3NlZCA9IGNsb3NlZCB8fCBmYWxzZTtcblx0dGhpcy5jdXJ2ZVR5cGUgPSBjdXJ2ZVR5cGUgfHwgJ2NlbnRyaXBldGFsJztcblx0dGhpcy50ZW5zaW9uID0gdGVuc2lvbiB8fCAwLjU7XG5cbn1cblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2F0bXVsbFJvbUN1cnZlMztcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuaXNDYXRtdWxsUm9tQ3VydmUzID0gdHJ1ZTtcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIHBvaW50cyA9IHRoaXMucG9pbnRzO1xuXHR2YXIgbCA9IHBvaW50cy5sZW5ndGg7XG5cblx0dmFyIHAgPSAoIGwgLSAoIHRoaXMuY2xvc2VkID8gMCA6IDEgKSApICogdDtcblx0dmFyIGludFBvaW50ID0gTWF0aC5mbG9vciggcCApO1xuXHR2YXIgd2VpZ2h0ID0gcCAtIGludFBvaW50O1xuXG5cdGlmICggdGhpcy5jbG9zZWQgKSB7XG5cblx0XHRpbnRQb2ludCArPSBpbnRQb2ludCA+IDAgPyAwIDogKCBNYXRoLmZsb29yKCBNYXRoLmFicyggaW50UG9pbnQgKSAvIGwgKSArIDEgKSAqIGw7XG5cblx0fSBlbHNlIGlmICggd2VpZ2h0ID09PSAwICYmIGludFBvaW50ID09PSBsIC0gMSApIHtcblxuXHRcdGludFBvaW50ID0gbCAtIDI7XG5cdFx0d2VpZ2h0ID0gMTtcblxuXHR9XG5cblx0dmFyIHAwLCBwMSwgcDIsIHAzOyAvLyA0IHBvaW50c1xuXG5cdGlmICggdGhpcy5jbG9zZWQgfHwgaW50UG9pbnQgPiAwICkge1xuXG5cdFx0cDAgPSBwb2ludHNbICggaW50UG9pbnQgLSAxICkgJSBsIF07XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIGV4dHJhcG9sYXRlIGZpcnN0IHBvaW50XG5cdFx0dG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgMCBdLCBwb2ludHNbIDEgXSApLmFkZCggcG9pbnRzWyAwIF0gKTtcblx0XHRwMCA9IHRtcDtcblxuXHR9XG5cblx0cDEgPSBwb2ludHNbIGludFBvaW50ICUgbCBdO1xuXHRwMiA9IHBvaW50c1sgKCBpbnRQb2ludCArIDEgKSAlIGwgXTtcblxuXHRpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ICsgMiA8IGwgKSB7XG5cblx0XHRwMyA9IHBvaW50c1sgKCBpbnRQb2ludCArIDIgKSAlIGwgXTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gZXh0cmFwb2xhdGUgbGFzdCBwb2ludFxuXHRcdHRtcC5zdWJWZWN0b3JzKCBwb2ludHNbIGwgLSAxIF0sIHBvaW50c1sgbCAtIDIgXSApLmFkZCggcG9pbnRzWyBsIC0gMSBdICk7XG5cdFx0cDMgPSB0bXA7XG5cblx0fVxuXG5cdGlmICggdGhpcy5jdXJ2ZVR5cGUgPT09ICdjZW50cmlwZXRhbCcgfHwgdGhpcy5jdXJ2ZVR5cGUgPT09ICdjaG9yZGFsJyApIHtcblxuXHRcdC8vIGluaXQgQ2VudHJpcGV0YWwgLyBDaG9yZGFsIENhdG11bGwtUm9tXG5cdFx0dmFyIHBvdyA9IHRoaXMuY3VydmVUeXBlID09PSAnY2hvcmRhbCcgPyAwLjUgOiAwLjI1O1xuXHRcdHZhciBkdDAgPSBNYXRoLnBvdyggcDAuZGlzdGFuY2VUb1NxdWFyZWQoIHAxICksIHBvdyApO1xuXHRcdHZhciBkdDEgPSBNYXRoLnBvdyggcDEuZGlzdGFuY2VUb1NxdWFyZWQoIHAyICksIHBvdyApO1xuXHRcdHZhciBkdDIgPSBNYXRoLnBvdyggcDIuZGlzdGFuY2VUb1NxdWFyZWQoIHAzICksIHBvdyApO1xuXG5cdFx0Ly8gc2FmZXR5IGNoZWNrIGZvciByZXBlYXRlZCBwb2ludHNcblx0XHRpZiAoIGR0MSA8IDFlLTQgKSBkdDEgPSAxLjA7XG5cdFx0aWYgKCBkdDAgPCAxZS00ICkgZHQwID0gZHQxO1xuXHRcdGlmICggZHQyIDwgMWUtNCApIGR0MiA9IGR0MTtcblxuXHRcdHB4JDEuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC54LCBwMS54LCBwMi54LCBwMy54LCBkdDAsIGR0MSwgZHQyICk7XG5cdFx0cHkuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC55LCBwMS55LCBwMi55LCBwMy55LCBkdDAsIGR0MSwgZHQyICk7XG5cdFx0cHouaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC56LCBwMS56LCBwMi56LCBwMy56LCBkdDAsIGR0MSwgZHQyICk7XG5cblx0fSBlbHNlIGlmICggdGhpcy5jdXJ2ZVR5cGUgPT09ICdjYXRtdWxscm9tJyApIHtcblxuXHRcdHB4JDEuaW5pdENhdG11bGxSb20oIHAwLngsIHAxLngsIHAyLngsIHAzLngsIHRoaXMudGVuc2lvbiApO1xuXHRcdHB5LmluaXRDYXRtdWxsUm9tKCBwMC55LCBwMS55LCBwMi55LCBwMy55LCB0aGlzLnRlbnNpb24gKTtcblx0XHRwei5pbml0Q2F0bXVsbFJvbSggcDAueiwgcDEueiwgcDIueiwgcDMueiwgdGhpcy50ZW5zaW9uICk7XG5cblx0fVxuXG5cdHBvaW50LnNldChcblx0XHRweCQxLmNhbGMoIHdlaWdodCApLFxuXHRcdHB5LmNhbGMoIHdlaWdodCApLFxuXHRcdHB6LmNhbGMoIHdlaWdodCApXG5cdCk7XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzb3VyY2UucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSBzb3VyY2UucG9pbnRzWyBpIF07XG5cblx0XHR0aGlzLnBvaW50cy5wdXNoKCBwb2ludC5jbG9uZSgpICk7XG5cblx0fVxuXG5cdHRoaXMuY2xvc2VkID0gc291cmNlLmNsb3NlZDtcblx0dGhpcy5jdXJ2ZVR5cGUgPSBzb3VyY2UuY3VydmVUeXBlO1xuXHR0aGlzLnRlbnNpb24gPSBzb3VyY2UudGVuc2lvbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0gdGhpcy5wb2ludHNbIGkgXTtcblx0XHRkYXRhLnBvaW50cy5wdXNoKCBwb2ludC50b0FycmF5KCkgKTtcblxuXHR9XG5cblx0ZGF0YS5jbG9zZWQgPSB0aGlzLmNsb3NlZDtcblx0ZGF0YS5jdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlVHlwZTtcblx0ZGF0YS50ZW5zaW9uID0gdGhpcy50ZW5zaW9uO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMucG9pbnRzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IGpzb24ucG9pbnRzWyBpIF07XG5cdFx0dGhpcy5wb2ludHMucHVzaCggbmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkoIHBvaW50ICkgKTtcblxuXHR9XG5cblx0dGhpcy5jbG9zZWQgPSBqc29uLmNsb3NlZDtcblx0dGhpcy5jdXJ2ZVR5cGUgPSBqc29uLmN1cnZlVHlwZTtcblx0dGhpcy50ZW5zaW9uID0ganNvbi50ZW5zaW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqXG4gKiBCZXppZXIgQ3VydmVzIGZvcm11bGFzIG9idGFpbmVkIGZyb21cbiAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQsOpemllcl9jdXJ2ZVxuICovXG5cbmZ1bmN0aW9uIENhdG11bGxSb20oIHQsIHAwLCBwMSwgcDIsIHAzICkge1xuXG5cdHZhciB2MCA9ICggcDIgLSBwMCApICogMC41O1xuXHR2YXIgdjEgPSAoIHAzIC0gcDEgKSAqIDAuNTtcblx0dmFyIHQyID0gdCAqIHQ7XG5cdHZhciB0MyA9IHQgKiB0Mjtcblx0cmV0dXJuICggMiAqIHAxIC0gMiAqIHAyICsgdjAgKyB2MSApICogdDMgKyAoIC0gMyAqIHAxICsgMyAqIHAyIC0gMiAqIHYwIC0gdjEgKSAqIHQyICsgdjAgKiB0ICsgcDE7XG5cbn1cblxuLy9cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDAoIHQsIHAgKSB7XG5cblx0dmFyIGsgPSAxIC0gdDtcblx0cmV0dXJuIGsgKiBrICogcDtcblxufVxuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMSggdCwgcCApIHtcblxuXHRyZXR1cm4gMiAqICggMSAtIHQgKSAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAyKCB0LCBwICkge1xuXG5cdHJldHVybiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyKCB0LCBwMCwgcDEsIHAyICkge1xuXG5cdHJldHVybiBRdWFkcmF0aWNCZXppZXJQMCggdCwgcDAgKSArIFF1YWRyYXRpY0JlemllclAxKCB0LCBwMSApICtcblx0XHRRdWFkcmF0aWNCZXppZXJQMiggdCwgcDIgKTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBDdWJpY0JlemllclAwKCB0LCBwICkge1xuXG5cdHZhciBrID0gMSAtIHQ7XG5cdHJldHVybiBrICogayAqIGsgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDEoIHQsIHAgKSB7XG5cblx0dmFyIGsgPSAxIC0gdDtcblx0cmV0dXJuIDMgKiBrICogayAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDIoIHQsIHAgKSB7XG5cblx0cmV0dXJuIDMgKiAoIDEgLSB0ICkgKiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMyggdCwgcCApIHtcblxuXHRyZXR1cm4gdCAqIHQgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllciggdCwgcDAsIHAxLCBwMiwgcDMgKSB7XG5cblx0cmV0dXJuIEN1YmljQmV6aWVyUDAoIHQsIHAwICkgKyBDdWJpY0JlemllclAxKCB0LCBwMSApICsgQ3ViaWNCZXppZXJQMiggdCwgcDIgKSArXG5cdFx0Q3ViaWNCZXppZXJQMyggdCwgcDMgKTtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllckN1cnZlKCB2MCwgdjEsIHYyLCB2MyApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N1YmljQmV6aWVyQ3VydmUnO1xuXG5cdHRoaXMudjAgPSB2MCB8fCBuZXcgVmVjdG9yMigpO1xuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjMgPSB2MyB8fCBuZXcgVmVjdG9yMigpO1xuXG59XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmljQmV6aWVyQ3VydmU7XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZSA9IHRydWU7XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7XG5cblx0cG9pbnQuc2V0KFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54LCB2My54ICksXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjAuY29weSggc291cmNlLnYwICk7XG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cdHRoaXMudjMuY29weSggc291cmNlLnYzICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cdGRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXHR0aGlzLnYzLmZyb21BcnJheSgganNvbi52MyApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBDdWJpY0JlemllckN1cnZlMyggdjAsIHYxLCB2MiwgdjMgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDdWJpY0JlemllckN1cnZlMyc7XG5cblx0dGhpcy52MCA9IHYwIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MyA9IHYzIHx8IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJpY0JlemllckN1cnZlMztcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZTMgPSB0cnVlO1xuXG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjIsIHYzID0gdGhpcy52MztcblxuXHRwb2ludC5zZXQoXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLngsIHYzLnggKSxcblx0XHRDdWJpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSwgdjMueSApLFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC56LCB2MS56LCB2Mi56LCB2My56IClcblx0KTtcblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblx0dGhpcy52My5jb3B5KCBzb3VyY2UudjMgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cdGRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblx0dGhpcy52My5mcm9tQXJyYXkoIGpzb24udjMgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gTGluZUN1cnZlKCB2MSwgdjIgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lQ3VydmUnO1xuXG5cdHRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMigpO1xuXHR0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjIoKTtcblxufVxuXG5MaW5lQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5MaW5lQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUN1cnZlO1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmlzTGluZUN1cnZlID0gdHJ1ZTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblxuXHRpZiAoIHQgPT09IDEgKSB7XG5cblx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdHBvaW50LmNvcHkoIHRoaXMudjIgKS5zdWIoIHRoaXMudjEgKTtcblx0XHRwb2ludC5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy52MSApO1xuXG5cdH1cblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cbi8vIExpbmUgY3VydmUgaXMgbGluZWFyLCBzbyB3ZSBjYW4gb3ZlcndyaXRlIGRlZmF1bHQgZ2V0UG9pbnRBdFxuXG5MaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50QXQgPSBmdW5jdGlvbiAoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHJldHVybiB0aGlzLmdldFBvaW50KCB1LCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmdldFRhbmdlbnQgPSBmdW5jdGlvbiAoIC8qIHQgKi8gKSB7XG5cblx0dmFyIHRhbmdlbnQgPSB0aGlzLnYyLmNsb25lKCkuc3ViKCB0aGlzLnYxICk7XG5cblx0cmV0dXJuIHRhbmdlbnQubm9ybWFsaXplKCk7XG5cbn07XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBMaW5lQ3VydmUzKCB2MSwgdjIgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lQ3VydmUzJztcblxuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuTGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUN1cnZlMztcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuaXNMaW5lQ3VydmUzID0gdHJ1ZTtcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0aWYgKCB0ID09PSAxICkge1xuXG5cdFx0cG9pbnQuY29weSggdGhpcy52MiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICkuc3ViKCB0aGlzLnYxICk7XG5cdFx0cG9pbnQubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMudjEgKTtcblxuXHR9XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG4vLyBMaW5lIGN1cnZlIGlzIGxpbmVhciwgc28gd2UgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0IGdldFBvaW50QXRcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuZ2V0UG9pbnRBdCA9IGZ1bmN0aW9uICggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0cmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHUsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cbn07XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5MaW5lQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuTGluZUN1cnZlMy5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJDdXJ2ZSggdjAsIHYxLCB2MiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1F1YWRyYXRpY0JlemllckN1cnZlJztcblxuXHR0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMigpO1xuXG59XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUXVhZHJhdGljQmV6aWVyQ3VydmU7XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5pc1F1YWRyYXRpY0JlemllckN1cnZlID0gdHJ1ZTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdHBvaW50LnNldChcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLnggKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xuXHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MCA9IHRoaXMudjAudG9BcnJheSgpO1xuXHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyQ3VydmUzKCB2MCwgdjEsIHYyICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUXVhZHJhdGljQmV6aWVyQ3VydmUzJztcblxuXHR0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMygpO1xuXG59XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBRdWFkcmF0aWNCZXppZXJDdXJ2ZTM7XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTMgPSB0cnVlO1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdHBvaW50LnNldChcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLnggKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKSxcblx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnogKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XG5cdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gU3BsaW5lQ3VydmUoIHBvaW50cyAvKiBhcnJheSBvZiBWZWN0b3IyICovICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BsaW5lQ3VydmUnO1xuXG5cdHRoaXMucG9pbnRzID0gcG9pbnRzIHx8IFtdO1xuXG59XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuU3BsaW5lQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BsaW5lQ3VydmU7XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS5pc1NwbGluZUN1cnZlID0gdHJ1ZTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdHZhciBwb2ludHMgPSB0aGlzLnBvaW50cztcblx0dmFyIHAgPSAoIHBvaW50cy5sZW5ndGggLSAxICkgKiB0O1xuXG5cdHZhciBpbnRQb2ludCA9IE1hdGguZmxvb3IoIHAgKTtcblx0dmFyIHdlaWdodCA9IHAgLSBpbnRQb2ludDtcblxuXHR2YXIgcDAgPSBwb2ludHNbIGludFBvaW50ID09PSAwID8gaW50UG9pbnQgOiBpbnRQb2ludCAtIDEgXTtcblx0dmFyIHAxID0gcG9pbnRzWyBpbnRQb2ludCBdO1xuXHR2YXIgcDIgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDIgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMSBdO1xuXHR2YXIgcDMgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDMgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMiBdO1xuXG5cdHBvaW50LnNldChcblx0XHRDYXRtdWxsUm9tKCB3ZWlnaHQsIHAwLngsIHAxLngsIHAyLngsIHAzLnggKSxcblx0XHRDYXRtdWxsUm9tKCB3ZWlnaHQsIHAwLnksIHAxLnksIHAyLnksIHAzLnkgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IHNvdXJjZS5wb2ludHNbIGkgXTtcblxuXHRcdHRoaXMucG9pbnRzLnB1c2goIHBvaW50LmNsb25lKCkgKTtcblxuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSB0aGlzLnBvaW50c1sgaSBdO1xuXHRcdGRhdGEucG9pbnRzLnB1c2goIHBvaW50LnRvQXJyYXkoKSApO1xuXG5cdH1cblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0ganNvbi5wb2ludHNbIGkgXTtcblx0XHR0aGlzLnBvaW50cy5wdXNoKCBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggcG9pbnQgKSApO1xuXG5cdH1cblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuXG5cbnZhciBDdXJ2ZXMgPSBPYmplY3QuZnJlZXplKHtcblx0QXJjQ3VydmU6IEFyY0N1cnZlLFxuXHRDYXRtdWxsUm9tQ3VydmUzOiBDYXRtdWxsUm9tQ3VydmUzLFxuXHRDdWJpY0JlemllckN1cnZlOiBDdWJpY0JlemllckN1cnZlLFxuXHRDdWJpY0JlemllckN1cnZlMzogQ3ViaWNCZXppZXJDdXJ2ZTMsXG5cdEVsbGlwc2VDdXJ2ZTogRWxsaXBzZUN1cnZlLFxuXHRMaW5lQ3VydmU6IExpbmVDdXJ2ZSxcblx0TGluZUN1cnZlMzogTGluZUN1cnZlMyxcblx0UXVhZHJhdGljQmV6aWVyQ3VydmU6IFF1YWRyYXRpY0JlemllckN1cnZlLFxuXHRRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6IFF1YWRyYXRpY0JlemllckN1cnZlMyxcblx0U3BsaW5lQ3VydmU6IFNwbGluZUN1cnZlXG59KTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKlxuICoqL1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqXHRDdXJ2ZWQgUGF0aCAtIGEgY3VydmUgcGF0aCBpcyBzaW1wbHkgYSBhcnJheSBvZiBjb25uZWN0ZWRcbiAqICBjdXJ2ZXMsIGJ1dCByZXRhaW5zIHRoZSBhcGkgb2YgYSBjdXJ2ZVxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5mdW5jdGlvbiBDdXJ2ZVBhdGgoKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDdXJ2ZVBhdGgnO1xuXG5cdHRoaXMuY3VydmVzID0gW107XG5cdHRoaXMuYXV0b0Nsb3NlID0gZmFsc2U7IC8vIEF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBwYXRoXG5cbn1cblxuQ3VydmVQYXRoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEN1cnZlUGF0aCxcblxuXHRhZGQ6IGZ1bmN0aW9uICggY3VydmUgKSB7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdH0sXG5cblx0Y2xvc2VQYXRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBBZGQgYSBsaW5lIGN1cnZlIGlmIHN0YXJ0IGFuZCBlbmQgb2YgbGluZXMgYXJlIG5vdCBjb25uZWN0ZWRcblx0XHR2YXIgc3RhcnRQb2ludCA9IHRoaXMuY3VydmVzWyAwIF0uZ2V0UG9pbnQoIDAgKTtcblx0XHR2YXIgZW5kUG9pbnQgPSB0aGlzLmN1cnZlc1sgdGhpcy5jdXJ2ZXMubGVuZ3RoIC0gMSBdLmdldFBvaW50KCAxICk7XG5cblx0XHRpZiAoICEgc3RhcnRQb2ludC5lcXVhbHMoIGVuZFBvaW50ICkgKSB7XG5cblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIG5ldyBMaW5lQ3VydmUoIGVuZFBvaW50LCBzdGFydFBvaW50ICkgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIFRvIGdldCBhY2N1cmF0ZSBwb2ludCB3aXRoIHJlZmVyZW5jZSB0b1xuXHQvLyBlbnRpcmUgcGF0aCBkaXN0YW5jZSBhdCB0aW1lIHQsXG5cdC8vIGZvbGxvd2luZyBoYXMgdG8gYmUgZG9uZTpcblxuXHQvLyAxLiBMZW5ndGggb2YgZWFjaCBzdWIgcGF0aCBoYXZlIHRvIGJlIGtub3duXG5cdC8vIDIuIExvY2F0ZSBhbmQgaWRlbnRpZnkgdHlwZSBvZiBjdXJ2ZVxuXHQvLyAzLiBHZXQgdCBmb3IgdGhlIGN1cnZlXG5cdC8vIDQuIFJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KHQnKVxuXG5cdGdldFBvaW50OiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHR2YXIgZCA9IHQgKiB0aGlzLmdldExlbmd0aCgpO1xuXHRcdHZhciBjdXJ2ZUxlbmd0aHMgPSB0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xuXHRcdHZhciBpID0gMDtcblxuXHRcdC8vIFRvIHRoaW5rIGFib3V0IGJvdW5kYXJpZXMgcG9pbnRzLlxuXG5cdFx0d2hpbGUgKCBpIDwgY3VydmVMZW5ndGhzLmxlbmd0aCApIHtcblxuXHRcdFx0aWYgKCBjdXJ2ZUxlbmd0aHNbIGkgXSA+PSBkICkge1xuXG5cdFx0XHRcdHZhciBkaWZmID0gY3VydmVMZW5ndGhzWyBpIF0gLSBkO1xuXHRcdFx0XHR2YXIgY3VydmUgPSB0aGlzLmN1cnZlc1sgaSBdO1xuXG5cdFx0XHRcdHZhciBzZWdtZW50TGVuZ3RoID0gY3VydmUuZ2V0TGVuZ3RoKCk7XG5cdFx0XHRcdHZhciB1ID0gc2VnbWVudExlbmd0aCA9PT0gMCA/IDAgOiAxIC0gZGlmZiAvIHNlZ21lbnRMZW5ndGg7XG5cblx0XHRcdFx0cmV0dXJuIGN1cnZlLmdldFBvaW50QXQoIHUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpICsrO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0XHQvLyBsb29wIHdoZXJlIHN1bSAhPSAwLCBzdW0gPiBkICwgc3VtKzEgPGRcblxuXHR9LFxuXG5cdC8vIFdlIGNhbm5vdCB1c2UgdGhlIGRlZmF1bHQgVEhSRUUuQ3VydmUgZ2V0UG9pbnQoKSB3aXRoIGdldExlbmd0aCgpIGJlY2F1c2UgaW5cblx0Ly8gVEhSRUUuQ3VydmUsIGdldExlbmd0aCgpIGRlcGVuZHMgb24gZ2V0UG9pbnQoKSBidXQgaW4gVEhSRUUuQ3VydmVQYXRoXG5cdC8vIGdldFBvaW50KCkgZGVwZW5kcyBvbiBnZXRMZW5ndGhcblxuXHRnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBsZW5zID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcblx0XHRyZXR1cm4gbGVuc1sgbGVucy5sZW5ndGggLSAxIF07XG5cblx0fSxcblxuXHQvLyBjYWNoZUxlbmd0aHMgbXVzdCBiZSByZWNhbGN1bGF0ZWQuXG5cdHVwZGF0ZUFyY0xlbmd0aHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMuY2FjaGVMZW5ndGhzID0gbnVsbDtcblx0XHR0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xuXG5cdH0sXG5cblx0Ly8gQ29tcHV0ZSBsZW5ndGhzIGFuZCBjYWNoZSB0aGVtXG5cdC8vIFdlIGNhbm5vdCBvdmVyd3JpdGUgZ2V0TGVuZ3RocygpIGJlY2F1c2UgVXRvVCBtYXBwaW5nIHVzZXMgaXQuXG5cblx0Z2V0Q3VydmVMZW5ndGhzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBXZSB1c2UgY2FjaGUgdmFsdWVzIGlmIGN1cnZlcyBhbmQgY2FjaGUgYXJyYXkgYXJlIHNhbWUgbGVuZ3RoXG5cblx0XHRpZiAoIHRoaXMuY2FjaGVMZW5ndGhzICYmIHRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aCA9PT0gdGhpcy5jdXJ2ZXMubGVuZ3RoICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7XG5cblx0XHR9XG5cblx0XHQvLyBHZXQgbGVuZ3RoIG9mIHN1Yi1jdXJ2ZVxuXHRcdC8vIFB1c2ggc3VtcyBpbnRvIGNhY2hlZCBhcnJheVxuXG5cdFx0dmFyIGxlbmd0aHMgPSBbXSwgc3VtcyA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRzdW1zICs9IHRoaXMuY3VydmVzWyBpIF0uZ2V0TGVuZ3RoKCk7XG5cdFx0XHRsZW5ndGhzLnB1c2goIHN1bXMgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2FjaGVMZW5ndGhzID0gbGVuZ3RocztcblxuXHRcdHJldHVybiBsZW5ndGhzO1xuXG5cdH0sXG5cblx0Z2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA0MDtcblxuXHRcdHZhciBwb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8PSBkaXZpc2lvbnM7IGkgKysgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50KCBpIC8gZGl2aXNpb25zICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hdXRvQ2xvc2UgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdGdldFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgMTI7XG5cblx0XHR2YXIgcG9pbnRzID0gW10sIGxhc3Q7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGN1cnZlcyA9IHRoaXMuY3VydmVzOyBpIDwgY3VydmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0gY3VydmVzWyBpIF07XG5cdFx0XHR2YXIgcmVzb2x1dGlvbiA9ICggY3VydmUgJiYgY3VydmUuaXNFbGxpcHNlQ3VydmUgKSA/IGRpdmlzaW9ucyAqIDJcblx0XHRcdFx0OiAoIGN1cnZlICYmIGN1cnZlLmlzTGluZUN1cnZlICkgPyAxXG5cdFx0XHRcdFx0OiAoIGN1cnZlICYmIGN1cnZlLmlzU3BsaW5lQ3VydmUgKSA/IGRpdmlzaW9ucyAqIGN1cnZlLnBvaW50cy5sZW5ndGhcblx0XHRcdFx0XHRcdDogZGl2aXNpb25zO1xuXG5cdFx0XHR2YXIgcHRzID0gY3VydmUuZ2V0UG9pbnRzKCByZXNvbHV0aW9uICk7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IHB0cy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0dmFyIHBvaW50ID0gcHRzWyBqIF07XG5cblx0XHRcdFx0aWYgKCBsYXN0ICYmIGxhc3QuZXF1YWxzKCBwb2ludCApICkgY29udGludWU7IC8vIGVuc3VyZXMgbm8gY29uc2VjdXRpdmUgcG9pbnRzIGFyZSBkdXBsaWNhdGVzXG5cblx0XHRcdFx0cG9pbnRzLnB1c2goIHBvaW50ICk7XG5cdFx0XHRcdGxhc3QgPSBwb2ludDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmF1dG9DbG9zZSAmJiBwb2ludHMubGVuZ3RoID4gMSAmJiAhIHBvaW50c1sgcG9pbnRzLmxlbmd0aCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VydmUgPSBzb3VyY2UuY3VydmVzWyBpIF07XG5cblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYXV0b0Nsb3NlID0gc291cmNlLmF1dG9DbG9zZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdFx0ZGF0YS5hdXRvQ2xvc2UgPSB0aGlzLmF1dG9DbG9zZTtcblx0XHRkYXRhLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0gdGhpcy5jdXJ2ZXNbIGkgXTtcblx0XHRcdGRhdGEuY3VydmVzLnB1c2goIGN1cnZlLnRvSlNPTigpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdFx0dGhpcy5hdXRvQ2xvc2UgPSBqc29uLmF1dG9DbG9zZTtcblx0XHR0aGlzLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0ganNvbi5jdXJ2ZXNbIGkgXTtcblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIG5ldyBDdXJ2ZXNbIGN1cnZlLnR5cGUgXSgpLmZyb21KU09OKCBjdXJ2ZSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBDcmVhdGVzIGZyZWUgZm9ybSAyZCBwYXRoIHVzaW5nIHNlcmllcyBvZiBwb2ludHMsIGxpbmVzIG9yIGN1cnZlcy5cbiAqKi9cblxuZnVuY3Rpb24gUGF0aCggcG9pbnRzICkge1xuXG5cdEN1cnZlUGF0aC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BhdGgnO1xuXG5cdHRoaXMuY3VycmVudFBvaW50ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRpZiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XG5cblx0fVxuXG59XG5cblBhdGgucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ3VydmVQYXRoLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBhdGgsXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLm1vdmVUbyggcG9pbnRzWyAwIF0ueCwgcG9pbnRzWyAwIF0ueSApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMubGluZVRvKCBwb2ludHNbIGkgXS54LCBwb2ludHNbIGkgXS55ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRtb3ZlVG86IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApOyAvLyBUT0RPIGNvbnNpZGVyIHJlZmVyZW5jaW5nIHZlY3RvcnMgaW5zdGVhZCBvZiBjb3B5aW5nP1xuXG5cdH0sXG5cblx0bGluZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgTGluZUN1cnZlKCB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLCBuZXcgVmVjdG9yMiggeCwgeSApICk7XG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApO1xuXG5cdH0sXG5cblx0cXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgUXVhZHJhdGljQmV6aWVyQ3VydmUoXG5cdFx0XHR0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUHgsIGFDUHkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhWCwgYVkgKVxuXHRcdCk7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTtcblxuXHR9LFxuXG5cdGJlemllckN1cnZlVG86IGZ1bmN0aW9uICggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBDdWJpY0JlemllckN1cnZlKFxuXHRcdFx0dGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1AxeCwgYUNQMXkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1AyeCwgYUNQMnkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhWCwgYVkgKVxuXHRcdCk7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTtcblxuXHR9LFxuXG5cdHNwbGluZVRocnU6IGZ1bmN0aW9uICggcHRzIC8qQXJyYXkgb2YgVmVjdG9yKi8gKSB7XG5cblx0XHR2YXIgbnB0cyA9IFsgdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSBdLmNvbmNhdCggcHRzICk7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgU3BsaW5lQ3VydmUoIG5wdHMgKTtcblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuY29weSggcHRzWyBwdHMubGVuZ3RoIC0gMSBdICk7XG5cblx0fSxcblxuXHRhcmM6IGZ1bmN0aW9uICggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdFx0dmFyIHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDtcblx0XHR2YXIgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55O1xuXG5cdFx0dGhpcy5hYnNhcmMoIGFYICsgeDAsIGFZICsgeTAsIGFSYWRpdXMsXG5cdFx0XHRhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XG5cblx0fSxcblxuXHRhYnNhcmM6IGZ1bmN0aW9uICggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdFx0dGhpcy5hYnNlbGxpcHNlKCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHR9LFxuXG5cdGVsbGlwc2U6IGZ1bmN0aW9uICggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XG5cblx0XHR2YXIgeDAgPSB0aGlzLmN1cnJlbnRQb2ludC54O1xuXHRcdHZhciB5MCA9IHRoaXMuY3VycmVudFBvaW50Lnk7XG5cblx0XHR0aGlzLmFic2VsbGlwc2UoIGFYICsgeDAsIGFZICsgeTAsIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApO1xuXG5cdH0sXG5cblx0YWJzZWxsaXBzZTogZnVuY3Rpb24gKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBFbGxpcHNlQ3VydmUoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICk7XG5cblx0XHRpZiAoIHRoaXMuY3VydmVzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdC8vIGlmIGEgcHJldmlvdXMgY3VydmUgaXMgcHJlc2VudCwgYXR0ZW1wdCB0byBqb2luXG5cdFx0XHR2YXIgZmlyc3RQb2ludCA9IGN1cnZlLmdldFBvaW50KCAwICk7XG5cblx0XHRcdGlmICggISBmaXJzdFBvaW50LmVxdWFscyggdGhpcy5jdXJyZW50UG9pbnQgKSApIHtcblxuXHRcdFx0XHR0aGlzLmxpbmVUbyggZmlyc3RQb2ludC54LCBmaXJzdFBvaW50LnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHZhciBsYXN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMSApO1xuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIGxhc3RQb2ludCApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRDdXJ2ZVBhdGgucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBzb3VyY2UuY3VycmVudFBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSBDdXJ2ZVBhdGgucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0XHRkYXRhLmN1cnJlbnRQb2ludCA9IHRoaXMuY3VycmVudFBvaW50LnRvQXJyYXkoKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0ZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdEN1cnZlUGF0aC5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KCBqc29uLmN1cnJlbnRQb2ludCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogRGVmaW5lcyBhIDJkIHNoYXBlIHBsYW5lIHVzaW5nIHBhdGhzLlxuICoqL1xuXG4vLyBTVEVQIDEgQ3JlYXRlIGEgcGF0aC5cbi8vIFNURVAgMiBUdXJuIHBhdGggaW50byBzaGFwZS5cbi8vIFNURVAgMyBFeHRydWRlR2VvbWV0cnkgdGFrZXMgaW4gU2hhcGUvU2hhcGVzXG4vLyBTVEVQIDNhIC0gRXh0cmFjdCBwb2ludHMgZnJvbSBlYWNoIHNoYXBlLCB0dXJuIHRvIHZlcnRpY2VzXG4vLyBTVEVQIDNiIC0gVHJpYW5ndWxhdGUgZWFjaCBzaGFwZSwgYWRkIGZhY2VzLlxuXG5mdW5jdGlvbiBTaGFwZSggcG9pbnRzICkge1xuXG5cdFBhdGguY2FsbCggdGhpcywgcG9pbnRzICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy50eXBlID0gJ1NoYXBlJztcblxuXHR0aGlzLmhvbGVzID0gW107XG5cbn1cblxuU2hhcGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggUGF0aC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTaGFwZSxcblxuXHRnZXRQb2ludHNIb2xlczogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHR2YXIgaG9sZXNQdHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aG9sZXNQdHNbIGkgXSA9IHRoaXMuaG9sZXNbIGkgXS5nZXRQb2ludHMoIGRpdmlzaW9ucyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhvbGVzUHRzO1xuXG5cdH0sXG5cblx0Ly8gZ2V0IHBvaW50cyBvZiBzaGFwZSBhbmQgaG9sZXMgKGtleXBvaW50cyBiYXNlZCBvbiBzZWdtZW50cyBwYXJhbWV0ZXIpXG5cblx0ZXh0cmFjdFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzaGFwZTogdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApLFxuXHRcdFx0aG9sZXM6IHRoaXMuZ2V0UG9pbnRzSG9sZXMoIGRpdmlzaW9ucyApXG5cblx0XHR9O1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRQYXRoLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5ob2xlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBob2xlID0gc291cmNlLmhvbGVzWyBpIF07XG5cblx0XHRcdHRoaXMuaG9sZXMucHVzaCggaG9sZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSBQYXRoLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEuaG9sZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGhvbGUgPSB0aGlzLmhvbGVzWyBpIF07XG5cdFx0XHRkYXRhLmhvbGVzLnB1c2goIGhvbGUudG9KU09OKCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0ZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdFBhdGgucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHRcdHRoaXMudXVpZCA9IGpzb24udXVpZDtcblx0XHR0aGlzLmhvbGVzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBob2xlID0ganNvbi5ob2xlc1sgaSBdO1xuXHRcdFx0dGhpcy5ob2xlcy5wdXNoKCBuZXcgUGF0aCgpLmZyb21KU09OKCBob2xlICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGlnaHQnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XG5cdHRoaXMuaW50ZW5zaXR5ID0gaW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgPyBpbnRlbnNpdHkgOiAxO1xuXG5cdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHVuZGVmaW5lZDtcblxufVxuXG5MaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaWdodCxcblxuXHRpc0xpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHRcdHRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3QuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpO1xuXHRcdGRhdGEub2JqZWN0LmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xuXG5cdFx0aWYgKCB0aGlzLmdyb3VuZENvbG9yICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5ncm91bmRDb2xvciA9IHRoaXMuZ3JvdW5kQ29sb3IuZ2V0SGV4KCk7XG5cblx0XHRpZiAoIHRoaXMuZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZTtcblx0XHRpZiAoIHRoaXMuYW5nbGUgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmFuZ2xlID0gdGhpcy5hbmdsZTtcblx0XHRpZiAoIHRoaXMuZGVjYXkgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRlY2F5ID0gdGhpcy5kZWNheTtcblx0XHRpZiAoIHRoaXMucGVudW1icmEgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnBlbnVtYnJhID0gdGhpcy5wZW51bWJyYTtcblxuXHRcdGlmICggdGhpcy5zaGFkb3cgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnNoYWRvdyA9IHRoaXMuc2hhZG93LnRvSlNPTigpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBIZW1pc3BoZXJlTGlnaHQoIHNreUNvbG9yLCBncm91bmRDb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIHNreUNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnSGVtaXNwaGVyZUxpZ2h0JztcblxuXHR0aGlzLmNhc3RTaGFkb3cgPSB1bmRlZmluZWQ7XG5cblx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTtcblx0dGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHR0aGlzLmdyb3VuZENvbG9yID0gbmV3IENvbG9yKCBncm91bmRDb2xvciApO1xuXG59XG5cbkhlbWlzcGhlcmVMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBIZW1pc3BoZXJlTGlnaHQsXG5cblx0aXNIZW1pc3BoZXJlTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZ3JvdW5kQ29sb3IuY29weSggc291cmNlLmdyb3VuZENvbG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpZ2h0U2hhZG93KCBjYW1lcmEgKSB7XG5cblx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cblx0dGhpcy5iaWFzID0gMDtcblx0dGhpcy5yYWRpdXMgPSAxO1xuXG5cdHRoaXMubWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCA1MTIsIDUxMiApO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIExpZ2h0U2hhZG93LnByb3RvdHlwZSwge1xuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5jYW1lcmEgPSBzb3VyY2UuY2FtZXJhLmNsb25lKCk7XG5cblx0XHR0aGlzLmJpYXMgPSBzb3VyY2UuYmlhcztcblx0XHR0aGlzLnJhZGl1cyA9IHNvdXJjZS5yYWRpdXM7XG5cblx0XHR0aGlzLm1hcFNpemUuY29weSggc291cmNlLm1hcFNpemUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdCA9IHt9O1xuXG5cdFx0aWYgKCB0aGlzLmJpYXMgIT09IDAgKSBvYmplY3QuYmlhcyA9IHRoaXMuYmlhcztcblx0XHRpZiAoIHRoaXMucmFkaXVzICE9PSAxICkgb2JqZWN0LnJhZGl1cyA9IHRoaXMucmFkaXVzO1xuXHRcdGlmICggdGhpcy5tYXBTaXplLnggIT09IDUxMiB8fCB0aGlzLm1hcFNpemUueSAhPT0gNTEyICkgb2JqZWN0Lm1hcFNpemUgPSB0aGlzLm1hcFNpemUudG9BcnJheSgpO1xuXG5cdFx0b2JqZWN0LmNhbWVyYSA9IHRoaXMuY2FtZXJhLnRvSlNPTiggZmFsc2UgKS5vYmplY3Q7XG5cdFx0ZGVsZXRlIG9iamVjdC5jYW1lcmEubWF0cml4O1xuXG5cdFx0cmV0dXJuIG9iamVjdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNwb3RMaWdodFNoYWRvdygpIHtcblxuXHRMaWdodFNoYWRvdy5jYWxsKCB0aGlzLCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIDUwLCAxLCAwLjUsIDUwMCApICk7XG5cbn1cblxuU3BvdExpZ2h0U2hhZG93LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0U2hhZG93LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNwb3RMaWdodFNoYWRvdyxcblxuXHRpc1Nwb3RMaWdodFNoYWRvdzogdHJ1ZSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uICggbGlnaHQgKSB7XG5cblx0XHR2YXIgY2FtZXJhID0gdGhpcy5jYW1lcmE7XG5cblx0XHR2YXIgZm92ID0gX01hdGguUkFEMkRFRyAqIDIgKiBsaWdodC5hbmdsZTtcblx0XHR2YXIgYXNwZWN0ID0gdGhpcy5tYXBTaXplLndpZHRoIC8gdGhpcy5tYXBTaXplLmhlaWdodDtcblx0XHR2YXIgZmFyID0gbGlnaHQuZGlzdGFuY2UgfHwgY2FtZXJhLmZhcjtcblxuXHRcdGlmICggZm92ICE9PSBjYW1lcmEuZm92IHx8IGFzcGVjdCAhPT0gY2FtZXJhLmFzcGVjdCB8fCBmYXIgIT09IGNhbWVyYS5mYXIgKSB7XG5cblx0XHRcdGNhbWVyYS5mb3YgPSBmb3Y7XG5cdFx0XHRjYW1lcmEuYXNwZWN0ID0gYXNwZWN0O1xuXHRcdFx0Y2FtZXJhLmZhciA9IGZhcjtcblx0XHRcdGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcG90TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlLCBhbmdsZSwgcGVudW1icmEsIGRlY2F5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3BvdExpZ2h0JztcblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAncG93ZXInLCB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHRcdC8vIHJlZjogZXF1YXRpb24gKDE3KSBmcm9tIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcblx0XHRcdHJldHVybiB0aGlzLmludGVuc2l0eSAqIE1hdGguUEk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCBwb3dlciApIHtcblxuXHRcdFx0Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLlxuXHRcdFx0Ly8gcmVmOiBlcXVhdGlvbiAoMTcpIGZyb20gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZlxuXHRcdFx0dGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvIE1hdGguUEk7XG5cblx0XHR9XG5cdH0gKTtcblxuXHR0aGlzLmRpc3RhbmNlID0gKCBkaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgPyBkaXN0YW5jZSA6IDA7XG5cdHRoaXMuYW5nbGUgPSAoIGFuZ2xlICE9PSB1bmRlZmluZWQgKSA/IGFuZ2xlIDogTWF0aC5QSSAvIDM7XG5cdHRoaXMucGVudW1icmEgPSAoIHBlbnVtYnJhICE9PSB1bmRlZmluZWQgKSA/IHBlbnVtYnJhIDogMDtcblx0dGhpcy5kZWNheSA9ICggZGVjYXkgIT09IHVuZGVmaW5lZCApID8gZGVjYXkgOiAxO1x0Ly8gZm9yIHBoeXNpY2FsbHkgY29ycmVjdCBsaWdodHMsIHNob3VsZCBiZSAyLlxuXG5cdHRoaXMuc2hhZG93ID0gbmV3IFNwb3RMaWdodFNoYWRvdygpO1xuXG59XG5cblNwb3RMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTcG90TGlnaHQsXG5cblx0aXNTcG90TGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZGlzdGFuY2UgPSBzb3VyY2UuZGlzdGFuY2U7XG5cdFx0dGhpcy5hbmdsZSA9IHNvdXJjZS5hbmdsZTtcblx0XHR0aGlzLnBlbnVtYnJhID0gc291cmNlLnBlbnVtYnJhO1xuXHRcdHRoaXMuZGVjYXkgPSBzb3VyY2UuZGVjYXk7XG5cblx0XHR0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTtcblxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5cbmZ1bmN0aW9uIFBvaW50TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIGRpc3RhbmNlLCBkZWNheSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ1BvaW50TGlnaHQnO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ3Bvd2VyJywge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNSkgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlbnNpdHkgKiA0ICogTWF0aC5QSTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHBvd2VyICkge1xuXG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNSkgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0XHR0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gKCA0ICogTWF0aC5QSSApO1xuXG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5kaXN0YW5jZSA9ICggZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApID8gZGlzdGFuY2UgOiAwO1xuXHR0aGlzLmRlY2F5ID0gKCBkZWNheSAhPT0gdW5kZWZpbmVkICkgPyBkZWNheSA6IDE7XHQvLyBmb3IgcGh5c2ljYWxseSBjb3JyZWN0IGxpZ2h0cywgc2hvdWxkIGJlIDIuXG5cblx0dGhpcy5zaGFkb3cgPSBuZXcgTGlnaHRTaGFkb3coIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggOTAsIDEsIDAuNSwgNTAwICkgKTtcblxufVxuXG5Qb2ludExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBvaW50TGlnaHQsXG5cblx0aXNQb2ludExpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmRpc3RhbmNlID0gc291cmNlLmRpc3RhbmNlO1xuXHRcdHRoaXMuZGVjYXkgPSBzb3VyY2UuZGVjYXk7XG5cblx0XHR0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyggKSB7XG5cblx0TGlnaHRTaGFkb3cuY2FsbCggdGhpcywgbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSA1LCA1LCA1LCAtIDUsIDAuNSwgNTAwICkgKTtcblxufVxuXG5EaXJlY3Rpb25hbExpZ2h0U2hhZG93LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0U2hhZG93LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IERpcmVjdGlvbmFsTGlnaHRTaGFkb3dcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIERpcmVjdGlvbmFsTGlnaHQoIGNvbG9yLCBpbnRlbnNpdHkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdEaXJlY3Rpb25hbExpZ2h0JztcblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7XG5cblx0dGhpcy5zaGFkb3cgPSBuZXcgRGlyZWN0aW9uYWxMaWdodFNoYWRvdygpO1xuXG59XG5cbkRpcmVjdGlvbmFsTGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogRGlyZWN0aW9uYWxMaWdodCxcblxuXHRpc0RpcmVjdGlvbmFsTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpO1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEFtYmllbnRMaWdodCggY29sb3IsIGludGVuc2l0eSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ0FtYmllbnRMaWdodCc7XG5cblx0dGhpcy5jYXN0U2hhZG93ID0gdW5kZWZpbmVkO1xuXG59XG5cbkFtYmllbnRMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBbWJpZW50TGlnaHQsXG5cblx0aXNBbWJpZW50TGlnaHQ6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb25cbiAqL1xuXG5mdW5jdGlvbiBSZWN0QXJlYUxpZ2h0KCBjb2xvciwgaW50ZW5zaXR5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnUmVjdEFyZWFMaWdodCc7XG5cblx0dGhpcy53aWR0aCA9ICggd2lkdGggIT09IHVuZGVmaW5lZCApID8gd2lkdGggOiAxMDtcblx0dGhpcy5oZWlnaHQgPSAoIGhlaWdodCAhPT0gdW5kZWZpbmVkICkgPyBoZWlnaHQgOiAxMDtcblxufVxuXG5SZWN0QXJlYUxpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFJlY3RBcmVhTGlnaHQsXG5cblx0aXNSZWN0QXJlYUxpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IExpZ2h0LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3Qud2lkdGggPSB0aGlzLndpZHRoO1xuXHRcdGRhdGEub2JqZWN0LmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgdGhhdCBpbnRlcnBvbGF0ZXMgU3RyaW5nc1xuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gU3RyaW5nS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU3RyaW5nS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAnc3RyaW5nJyxcblx0VmFsdWVCdWZmZXJUeXBlOiBBcnJheSxcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgQm9vbGVhbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBCb29sZWFuS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcyApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKTtcblxufVxuXG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJvb2xlYW5LZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdib29sJyxcblx0VmFsdWVCdWZmZXJUeXBlOiBBcnJheSxcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVEaXNjcmV0ZSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCxcblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWRcblxuXHQvLyBOb3RlOiBBY3R1YWxseSB0aGlzIHRyYWNrIGNvdWxkIGhhdmUgYSBvcHRpbWl6ZWQgLyBjb21wcmVzc2VkXG5cdC8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIHZhbHVlIGFuZCBhIGN1c3RvbSBpbnRlcnBvbGFudCB0aGF0XG5cdC8vIGNvbXB1dGVzIFwiZmlyc3RWYWx1ZSBeIGlzT2RkKCBpbmRleCApXCIuXG5cbn0gKTtcblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGludGVycG9sYW50cyBvdmVyIHBhcmFtZXRyaWMgc2FtcGxlcy5cbiAqXG4gKiBUaGUgcGFyYW1ldGVyIGRvbWFpbiBpcyBvbmUgZGltZW5zaW9uYWwsIHR5cGljYWxseSB0aGUgdGltZSBvciBhIHBhdGhcbiAqIGFsb25nIGEgY3VydmUgZGVmaW5lZCBieSB0aGUgZGF0YS5cbiAqXG4gKiBUaGUgc2FtcGxlIHZhbHVlcyBjYW4gaGF2ZSBhbnkgZGltZW5zaW9uYWxpdHkgYW5kIGRlcml2ZWQgY2xhc3NlcyBtYXlcbiAqIGFwcGx5IHNwZWNpYWwgaW50ZXJwcmV0YXRpb25zIHRvIHRoZSBkYXRhLlxuICpcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGludGVydmFsIHNlZWsgaW4gYSBUZW1wbGF0ZSBNZXRob2QsIGRlZmVycmluZ1xuICogdGhlIGFjdHVhbCBpbnRlcnBvbGF0aW9uIHRvIGRlcml2ZWQgY2xhc3Nlcy5cbiAqXG4gKiBUaW1lIGNvbXBsZXhpdHkgaXMgTygxKSBmb3IgbGluZWFyIGFjY2VzcyBjcm9zc2luZyBhdCBtb3N0IHR3byBwb2ludHNcbiAqIGFuZCBPKGxvZyBOKSBmb3IgcmFuZG9tIGFjY2Vzcywgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9ucy5cbiAqXG4gKiBSZWZlcmVuY2VzOlxuICpcbiAqIFx0XHRodHRwOi8vd3d3Lm9vZGVzaWduLmNvbS90ZW1wbGF0ZS1tZXRob2QtcGF0dGVybi5odG1sXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdHRoaXMucGFyYW1ldGVyUG9zaXRpb25zID0gcGFyYW1ldGVyUG9zaXRpb25zO1xuXHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XG5cblx0dGhpcy5yZXN1bHRCdWZmZXIgPSByZXN1bHRCdWZmZXIgIT09IHVuZGVmaW5lZCA/XG5cdFx0cmVzdWx0QnVmZmVyIDogbmV3IHNhbXBsZVZhbHVlcy5jb25zdHJ1Y3Rvciggc2FtcGxlU2l6ZSApO1xuXHR0aGlzLnNhbXBsZVZhbHVlcyA9IHNhbXBsZVZhbHVlcztcblx0dGhpcy52YWx1ZVNpemUgPSBzYW1wbGVTaXplO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEludGVycG9sYW50LnByb3RvdHlwZSwge1xuXG5cdGV2YWx1YXRlOiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHR2YXIgcHAgPSB0aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdGkxID0gdGhpcy5fY2FjaGVkSW5kZXgsXG5cblx0XHRcdHQxID0gcHBbIGkxIF0sXG5cdFx0XHR0MCA9IHBwWyBpMSAtIDEgXTtcblxuXHRcdHZhbGlkYXRlX2ludGVydmFsOiB7XG5cblx0XHRcdHNlZWs6IHtcblxuXHRcdFx0XHR2YXIgcmlnaHQ7XG5cblx0XHRcdFx0bGluZWFyX3NjYW46IHtcblxuXHRcdFx0XHRcdC8vLSBTZWUgaHR0cDovL2pzcGVyZi5jb20vY29tcGFyaXNvbi10by11bmRlZmluZWQvM1xuXHRcdFx0XHRcdC8vLSBzbG93ZXIgY29kZTpcblx0XHRcdFx0XHQvLy1cblx0XHRcdFx0XHQvLy0gXHRcdFx0XHRpZiAoIHQgPj0gdDEgfHwgdDEgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRmb3J3YXJkX3NjYW46IGlmICggISAoIHQgPCB0MSApICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgZ2l2ZVVwQXQgPSBpMSArIDI7IDsgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0MSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0IDwgdDAgKSBicmVhayBmb3J3YXJkX3NjYW47XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBhZnRlciBlbmRcblxuXHRcdFx0XHRcdFx0XHRcdGkxID0gcHAubGVuZ3RoO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKCBpMSAtIDEsIHQsIHQwICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmICggaTEgPT09IGdpdmVVcEF0ICkgYnJlYWs7IC8vIHRoaXMgbG9vcFxuXG5cdFx0XHRcdFx0XHRcdHQwID0gdDE7XG5cdFx0XHRcdFx0XHRcdHQxID0gcHBbICsrIGkxIF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0IDwgdDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFycml2ZWQgYXQgdGhlIHNvdWdodCBpbnRlcnZhbFxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrIHNlZWs7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgaW5kZXhcblx0XHRcdFx0XHRcdHJpZ2h0ID0gcHAubGVuZ3RoO1xuXHRcdFx0XHRcdFx0YnJlYWsgbGluZWFyX3NjYW47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLy0gc2xvd2VyIGNvZGU6XG5cdFx0XHRcdFx0Ly8tXHRcdFx0XHRcdGlmICggdCA8IHQwIHx8IHQwID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0aWYgKCAhICggdCA+PSB0MCApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBsb29waW5nP1xuXG5cdFx0XHRcdFx0XHR2YXIgdDFnbG9iYWwgPSBwcFsgMSBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHQgPCB0MWdsb2JhbCApIHtcblxuXHRcdFx0XHRcdFx0XHRpMSA9IDI7IC8vICsgMSwgdXNpbmcgdGhlIHNjYW4gZm9yIHRoZSBkZXRhaWxzXG5cdFx0XHRcdFx0XHRcdHQwID0gdDFnbG9iYWw7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gbGluZWFyIHJldmVyc2Ugc2NhblxuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgZ2l2ZVVwQXQgPSBpMSAtIDI7IDsgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYmVmb3JlIHN0YXJ0XG5cblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuYmVmb3JlU3RhcnRfKCAwLCB0LCB0MSApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3BcblxuXHRcdFx0XHRcdFx0XHR0MSA9IHQwO1xuXHRcdFx0XHRcdFx0XHR0MCA9IHBwWyAtLSBpMSAtIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQgPj0gdDAgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFycml2ZWQgYXQgdGhlIHNvdWdodCBpbnRlcnZhbFxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrIHNlZWs7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbmRleFxuXHRcdFx0XHRcdFx0cmlnaHQgPSBpMTtcblx0XHRcdFx0XHRcdGkxID0gMDtcblx0XHRcdFx0XHRcdGJyZWFrIGxpbmVhcl9zY2FuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdGhlIGludGVydmFsIGlzIHZhbGlkXG5cblx0XHRcdFx0XHRicmVhayB2YWxpZGF0ZV9pbnRlcnZhbDtcblxuXHRcdFx0XHR9IC8vIGxpbmVhciBzY2FuXG5cblx0XHRcdFx0Ly8gYmluYXJ5IHNlYXJjaFxuXG5cdFx0XHRcdHdoaWxlICggaTEgPCByaWdodCApIHtcblxuXHRcdFx0XHRcdHZhciBtaWQgPSAoIGkxICsgcmlnaHQgKSA+Pj4gMTtcblxuXHRcdFx0XHRcdGlmICggdCA8IHBwWyBtaWQgXSApIHtcblxuXHRcdFx0XHRcdFx0cmlnaHQgPSBtaWQ7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRpMSA9IG1pZCArIDE7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHQxID0gcHBbIGkxIF07XG5cdFx0XHRcdHQwID0gcHBbIGkxIC0gMSBdO1xuXG5cdFx0XHRcdC8vIGNoZWNrIGJvdW5kYXJ5IGNhc2VzLCBhZ2FpblxuXG5cdFx0XHRcdGlmICggdDAgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5iZWZvcmVTdGFydF8oIDAsIHQsIHQxICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdDEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGkxID0gcHAubGVuZ3RoO1xuXHRcdFx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKCBpMSAtIDEsIHQwLCB0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IC8vIHNlZWtcblxuXHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcblxuXHRcdFx0dGhpcy5pbnRlcnZhbENoYW5nZWRfKCBpMSwgdDAsIHQxICk7XG5cblx0XHR9IC8vIHZhbGlkYXRlX2ludGVydmFsXG5cblx0XHRyZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZV8oIGkxLCB0MCwgdCwgdDEgKTtcblxuXHR9LFxuXG5cdHNldHRpbmdzOiBudWxsLCAvLyBvcHRpb25hbCwgc3ViY2xhc3Mtc3BlY2lmaWMgc2V0dGluZ3Mgc3RydWN0dXJlXG5cdC8vIE5vdGU6IFRoZSBpbmRpcmVjdGlvbiBhbGxvd3MgY2VudHJhbCBjb250cm9sIG9mIG1hbnkgaW50ZXJwb2xhbnRzLlxuXG5cdC8vIC0tLSBQcm90ZWN0ZWQgaW50ZXJmYWNlXG5cblx0RGVmYXVsdFNldHRpbmdzXzoge30sXG5cblx0Z2V0U2V0dGluZ3NfOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXR0aW5ncyB8fCB0aGlzLkRlZmF1bHRTZXR0aW5nc187XG5cblx0fSxcblxuXHRjb3B5U2FtcGxlVmFsdWVfOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0Ly8gY29waWVzIGEgc2FtcGxlIHZhbHVlIHRvIHRoZSByZXN1bHQgYnVmZmVyXG5cblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXHRcdFx0b2Zmc2V0ID0gaW5kZXggKiBzdHJpZGU7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0cmVzdWx0WyBpIF0gPSB2YWx1ZXNbIG9mZnNldCArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHQvLyBUZW1wbGF0ZSBtZXRob2RzIGZvciBkZXJpdmVkIGNsYXNzZXM6XG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIC8qIGkxLCB0MCwgdCwgdDEgKi8gKSB7XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoICdjYWxsIHRvIGFic3RyYWN0IG1ldGhvZCcgKTtcblx0XHQvLyBpbXBsZW1lbnRhdGlvbnMgc2hhbGwgcmV0dXJuIHRoaXMucmVzdWx0QnVmZmVyXG5cblx0fSxcblxuXHRpbnRlcnZhbENoYW5nZWRfOiBmdW5jdGlvbiAoIC8qIGkxLCB0MCwgdDEgKi8gKSB7XG5cblx0XHQvLyBlbXB0eVxuXG5cdH1cblxufSApO1xuXG4vLyFcXCBERUNMQVJFIEFMSUFTIEFGVEVSIGFzc2lnbiBwcm90b3R5cGUgIVxuT2JqZWN0LmFzc2lnbiggSW50ZXJwb2xhbnQucHJvdG90eXBlLCB7XG5cblx0Ly8oIDAsIHQsIHQwICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXJcblx0YmVmb3JlU3RhcnRfOiBJbnRlcnBvbGFudC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXyxcblxuXHQvLyggTi0xLCB0Ti0xLCB0ICksIHJldHVybnMgdGhpcy5yZXN1bHRCdWZmZXJcblx0YWZ0ZXJFbmRfOiBJbnRlcnBvbGFudC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXyxcblxufSApO1xuXG4vKipcbiAqIFNwaGVyaWNhbCBsaW5lYXIgdW5pdCBxdWF0ZXJuaW9uIGludGVycG9sYW50LlxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cblF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXG5cdFx0XHRvZmZzZXQgPSBpMSAqIHN0cmlkZSxcblxuXHRcdFx0YWxwaGEgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICk7XG5cblx0XHRmb3IgKCB2YXIgZW5kID0gb2Zmc2V0ICsgc3RyaWRlOyBvZmZzZXQgIT09IGVuZDsgb2Zmc2V0ICs9IDQgKSB7XG5cblx0XHRcdFF1YXRlcm5pb24uc2xlcnBGbGF0KCByZXN1bHQsIDAsIHZhbHVlcywgb2Zmc2V0IC0gc3RyaWRlLCB2YWx1ZXMsIG9mZnNldCwgYWxwaGEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgcXVhdGVybmlvbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2suY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cblF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUXVhdGVybmlvbktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ3F1YXRlcm5pb24nLFxuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHREZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVMaW5lYXIsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZCAvLyBub3QgeWV0IGltcGxlbWVudGVkXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBrZXlmcmFtZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgY29sb3IuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBDb2xvcktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuQ29sb3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ29sb3JLZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdjb2xvcidcblxuXHQvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXG5cblx0Ly8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkXG5cblx0Ly8gTm90ZTogVmVyeSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBhbmQgbm90aGluZyBzcGVjaWFsIHlldC5cblx0Ly8gSG93ZXZlciwgdGhpcyBpcyB0aGUgcGxhY2UgZm9yIGNvbG9yIHNwYWNlIHBhcmFtZXRlcml6YXRpb24uXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBudW1lcmljIGtleWZyYW1lIHZhbHVlcy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gTnVtYmVyS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5OdW1iZXJLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTnVtYmVyS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAnbnVtYmVyJ1xuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHQvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcblxufSApO1xuXG4vKipcbiAqIEZhc3QgYW5kIHNpbXBsZSBjdWJpYyBzcGxpbmUgaW50ZXJwb2xhbnQuXG4gKlxuICogSXQgd2FzIGRlcml2ZWQgZnJvbSBhIEhlcm1pdGlhbiBjb25zdHJ1Y3Rpb24gc2V0dGluZyB0aGUgZmlyc3QgZGVyaXZhdGl2ZVxuICogYXQgZWFjaCBzYW1wbGUgcG9zaXRpb24gdG8gdGhlIGxpbmVhciBzbG9wZSBiZXR3ZWVuIG5laWdoYm9yaW5nIHBvc2l0aW9uc1xuICogb3ZlciB0aGVpciBwYXJhbWV0ZXIgaW50ZXJ2YWwuXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEN1YmljSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG5cdHRoaXMuX3dlaWdodFByZXYgPSAtIDA7XG5cdHRoaXMuX29mZnNldFByZXYgPSAtIDA7XG5cdHRoaXMuX3dlaWdodE5leHQgPSAtIDA7XG5cdHRoaXMuX29mZnNldE5leHQgPSAtIDA7XG5cbn1cblxuQ3ViaWNJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDdWJpY0ludGVycG9sYW50LFxuXG5cdERlZmF1bHRTZXR0aW5nc186IHtcblxuXHRcdGVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLFxuXHRcdGVuZGluZ0VuZDogWmVyb0N1cnZhdHVyZUVuZGluZ1xuXG5cdH0sXG5cblx0aW50ZXJ2YWxDaGFuZ2VkXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQxICkge1xuXG5cdFx0dmFyIHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHRpUHJldiA9IGkxIC0gMixcblx0XHRcdGlOZXh0ID0gaTEgKyAxLFxuXG5cdFx0XHR0UHJldiA9IHBwWyBpUHJldiBdLFxuXHRcdFx0dE5leHQgPSBwcFsgaU5leHQgXTtcblxuXHRcdGlmICggdFByZXYgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdTdGFydCApIHtcblxuXHRcdFx0XHRjYXNlIFplcm9TbG9wZUVuZGluZzpcblxuXHRcdFx0XHRcdC8vIGYnKHQwKSA9IDBcblx0XHRcdFx0XHRpUHJldiA9IGkxO1xuXHRcdFx0XHRcdHRQcmV2ID0gMiAqIHQwIC0gdDE7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFdyYXBBcm91bmRFbmRpbmc6XG5cblx0XHRcdFx0XHQvLyB1c2UgdGhlIG90aGVyIGVuZCBvZiB0aGUgY3VydmVcblx0XHRcdFx0XHRpUHJldiA9IHBwLmxlbmd0aCAtIDI7XG5cdFx0XHRcdFx0dFByZXYgPSB0MCArIHBwWyBpUHJldiBdIC0gcHBbIGlQcmV2ICsgMSBdO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDogLy8gWmVyb0N1cnZhdHVyZUVuZGluZ1xuXG5cdFx0XHRcdFx0Ly8gZicnKHQwKSA9IDAgYS5rLmEuIE5hdHVyYWwgU3BsaW5lXG5cdFx0XHRcdFx0aVByZXYgPSBpMTtcblx0XHRcdFx0XHR0UHJldiA9IHQxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHROZXh0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kICkge1xuXG5cdFx0XHRcdGNhc2UgWmVyb1Nsb3BlRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gZicodE4pID0gMFxuXHRcdFx0XHRcdGlOZXh0ID0gaTE7XG5cdFx0XHRcdFx0dE5leHQgPSAyICogdDEgLSB0MDtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgV3JhcEFyb3VuZEVuZGluZzpcblxuXHRcdFx0XHRcdC8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZVxuXHRcdFx0XHRcdGlOZXh0ID0gMTtcblx0XHRcdFx0XHR0TmV4dCA9IHQxICsgcHBbIDEgXSAtIHBwWyAwIF07XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cblx0XHRcdFx0XHQvLyBmJycodE4pID0gMCwgYS5rLmEuIE5hdHVyYWwgU3BsaW5lXG5cdFx0XHRcdFx0aU5leHQgPSBpMSAtIDE7XG5cdFx0XHRcdFx0dE5leHQgPSB0MDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGhhbGZEdCA9ICggdDEgLSB0MCApICogMC41LFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemU7XG5cblx0XHR0aGlzLl93ZWlnaHRQcmV2ID0gaGFsZkR0IC8gKCB0MCAtIHRQcmV2ICk7XG5cdFx0dGhpcy5fd2VpZ2h0TmV4dCA9IGhhbGZEdCAvICggdE5leHQgLSB0MSApO1xuXHRcdHRoaXMuX29mZnNldFByZXYgPSBpUHJldiAqIHN0cmlkZTtcblx0XHR0aGlzLl9vZmZzZXROZXh0ID0gaU5leHQgKiBzdHJpZGU7XG5cblx0fSxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG8xID0gaTEgKiBzdHJpZGUsXHRcdG8wID0gbzEgLSBzdHJpZGUsXG5cdFx0XHRvUCA9IHRoaXMuX29mZnNldFByZXYsIFx0b04gPSB0aGlzLl9vZmZzZXROZXh0LFxuXHRcdFx0d1AgPSB0aGlzLl93ZWlnaHRQcmV2LFx0d04gPSB0aGlzLl93ZWlnaHROZXh0LFxuXG5cdFx0XHRwID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxuXHRcdFx0cHAgPSBwICogcCxcblx0XHRcdHBwcCA9IHBwICogcDtcblxuXHRcdC8vIGV2YWx1YXRlIHBvbHlub21pYWxzXG5cblx0XHR2YXIgc1AgPSAtIHdQICogcHBwICsgMiAqIHdQICogcHAgLSB3UCAqIHA7XG5cdFx0dmFyIHMwID0gKCAxICsgd1AgKSAqIHBwcCArICggLSAxLjUgLSAyICogd1AgKSAqIHBwICsgKCAtIDAuNSArIHdQICkgKiBwICsgMTtcblx0XHR2YXIgczEgPSAoIC0gMSAtIHdOICkgKiBwcHAgKyAoIDEuNSArIHdOICkgKiBwcCArIDAuNSAqIHA7XG5cdFx0dmFyIHNOID0gd04gKiBwcHAgLSB3TiAqIHBwO1xuXG5cdFx0Ly8gY29tYmluZSBkYXRhIGxpbmVhcmx5XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0cmVzdWx0WyBpIF0gPVxuXHRcdFx0XHRcdHNQICogdmFsdWVzWyBvUCArIGkgXSArXG5cdFx0XHRcdFx0czAgKiB2YWx1ZXNbIG8wICsgaSBdICtcblx0XHRcdFx0XHRzMSAqIHZhbHVlc1sgbzEgKyBpIF0gK1xuXHRcdFx0XHRcdHNOICogdmFsdWVzWyBvTiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIExpbmVhckludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdEludGVycG9sYW50LmNhbGwoIHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcblxufVxuXG5MaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lYXJJbnRlcnBvbGFudCxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG9mZnNldDEgPSBpMSAqIHN0cmlkZSxcblx0XHRcdG9mZnNldDAgPSBvZmZzZXQxIC0gc3RyaWRlLFxuXG5cdFx0XHR3ZWlnaHQxID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxuXHRcdFx0d2VpZ2h0MCA9IDEgLSB3ZWlnaHQxO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHJlc3VsdFsgaSBdID1cblx0XHRcdFx0XHR2YWx1ZXNbIG9mZnNldDAgKyBpIF0gKiB3ZWlnaHQwICtcblx0XHRcdFx0XHR2YWx1ZXNbIG9mZnNldDEgKyBpIF0gKiB3ZWlnaHQxO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogSW50ZXJwb2xhbnQgdGhhdCBldmFsdWF0ZXMgdG8gdGhlIHNhbXBsZSB2YWx1ZSBhdCB0aGUgcG9zaXRpb24gcHJlY2VlZGluZ1xuICogdGhlIHBhcmFtZXRlci5cbiAqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gRGlzY3JldGVJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHRJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XG5cbn1cblxuRGlzY3JldGVJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBEaXNjcmV0ZUludGVycG9sYW50LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSAvKiwgdDAsIHQsIHQxICovICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyggaTEgLSAxICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICovXG5cbnZhciBBbmltYXRpb25VdGlscyA9IHtcblxuXHQvLyBzYW1lIGFzIEFycmF5LnByb3RvdHlwZS5zbGljZSwgYnV0IGFsc28gd29ya3Mgb24gdHlwZWQgYXJyYXlzXG5cdGFycmF5U2xpY2U6IGZ1bmN0aW9uICggYXJyYXksIGZyb20sIHRvICkge1xuXG5cdFx0aWYgKCBBbmltYXRpb25VdGlscy5pc1R5cGVkQXJyYXkoIGFycmF5ICkgKSB7XG5cblx0XHRcdC8vIGluIGlvczkgYXJyYXkuc3ViYXJyYXkoZnJvbSwgdW5kZWZpbmVkKSB3aWxsIHJldHVybiBlbXB0eSBhcnJheVxuXHRcdFx0Ly8gYnV0IGFycmF5LnN1YmFycmF5KGZyb20pIG9yIGFycmF5LnN1YmFycmF5KGZyb20sIGxlbikgaXMgY29ycmVjdFxuXHRcdFx0cmV0dXJuIG5ldyBhcnJheS5jb25zdHJ1Y3RvciggYXJyYXkuc3ViYXJyYXkoIGZyb20sIHRvICE9PSB1bmRlZmluZWQgPyB0byA6IGFycmF5Lmxlbmd0aCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyYXkuc2xpY2UoIGZyb20sIHRvICk7XG5cblx0fSxcblxuXHQvLyBjb252ZXJ0cyBhbiBhcnJheSB0byBhIHNwZWNpZmljIHR5cGVcblx0Y29udmVydEFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCB0eXBlLCBmb3JjZUNsb25lICkge1xuXG5cdFx0aWYgKCAhIGFycmF5IHx8IC8vIGxldCAndW5kZWZpbmVkJyBhbmQgJ251bGwnIHBhc3Ncblx0XHRcdFx0ISBmb3JjZUNsb25lICYmIGFycmF5LmNvbnN0cnVjdG9yID09PSB0eXBlICkgcmV0dXJuIGFycmF5O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZS5CWVRFU19QRVJfRUxFTUVOVCA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgdHlwZSggYXJyYXkgKTsgLy8gY3JlYXRlIHR5cGVkIGFycmF5XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5ICk7IC8vIGNyZWF0ZSBBcnJheVxuXG5cdH0sXG5cblx0aXNUeXBlZEFycmF5OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoIG9iamVjdCApICYmXG5cdFx0XHRcdCEgKCBvYmplY3QgaW5zdGFuY2VvZiBEYXRhVmlldyApO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJucyBhbiBhcnJheSBieSB3aGljaCB0aW1lcyBhbmQgdmFsdWVzIGNhbiBiZSBzb3J0ZWRcblx0Z2V0S2V5ZnJhbWVPcmRlcjogZnVuY3Rpb24gKCB0aW1lcyApIHtcblxuXHRcdGZ1bmN0aW9uIGNvbXBhcmVUaW1lKCBpLCBqICkge1xuXG5cdFx0XHRyZXR1cm4gdGltZXNbIGkgXSAtIHRpbWVzWyBqIF07XG5cblx0XHR9XG5cblx0XHR2YXIgbiA9IHRpbWVzLmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCBuICk7XG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkgcmVzdWx0WyBpIF0gPSBpO1xuXG5cdFx0cmVzdWx0LnNvcnQoIGNvbXBhcmVUaW1lICk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH0sXG5cblx0Ly8gdXNlcyB0aGUgYXJyYXkgcHJldmlvdXNseSByZXR1cm5lZCBieSAnZ2V0S2V5ZnJhbWVPcmRlcicgdG8gc29ydCBkYXRhXG5cdHNvcnRlZEFycmF5OiBmdW5jdGlvbiAoIHZhbHVlcywgc3RyaWRlLCBvcmRlciApIHtcblxuXHRcdHZhciBuVmFsdWVzID0gdmFsdWVzLmxlbmd0aDtcblx0XHR2YXIgcmVzdWx0ID0gbmV3IHZhbHVlcy5jb25zdHJ1Y3RvciggblZhbHVlcyApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBkc3RPZmZzZXQgPSAwOyBkc3RPZmZzZXQgIT09IG5WYWx1ZXM7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBzcmNPZmZzZXQgPSBvcmRlclsgaSBdICogc3RyaWRlO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHRyZXN1bHRbIGRzdE9mZnNldCArKyBdID0gdmFsdWVzWyBzcmNPZmZzZXQgKyBqIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHQvLyBmdW5jdGlvbiBmb3IgcGFyc2luZyBBT1Mga2V5ZnJhbWUgZm9ybWF0c1xuXHRmbGF0dGVuSlNPTjogZnVuY3Rpb24gKCBqc29uS2V5cywgdGltZXMsIHZhbHVlcywgdmFsdWVQcm9wZXJ0eU5hbWUgKSB7XG5cblx0XHR2YXIgaSA9IDEsIGtleSA9IGpzb25LZXlzWyAwIF07XG5cblx0XHR3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICYmIGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YVxuXG5cdFx0dmFyIHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVybjsgLy8gbm8gZGF0YVxuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXG5cdFx0XHRkbyB7XG5cblx0XHRcdFx0dmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGltZXMucHVzaCgga2V5LnRpbWUgKTtcblx0XHRcdFx0XHR2YWx1ZXMucHVzaC5hcHBseSggdmFsdWVzLCB2YWx1ZSApOyAvLyBwdXNoIGFsbCBlbGVtZW50c1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlLnRvQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gLi4uYXNzdW1lIFRIUkVFLk1hdGgtaXNoXG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlLnRvQXJyYXkoIHZhbHVlcywgdmFsdWVzLmxlbmd0aCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG90aGVyd2lzZSBwdXNoIGFzLWlzXG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBqc29uS2V5c1sgaSArKyBdO1xuXG5cdFx0XHR9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTtcblxuXHRcdH1cblxuXHR9XG5cbn07XG5cbi8qKlxuICpcbiAqIEEgdGltZWQgc2VxdWVuY2Ugb2Yga2V5ZnJhbWVzIGZvciBhIHNwZWNpZmljIHByb3BlcnR5LlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRpZiAoIG5hbWUgPT09IHVuZGVmaW5lZCApIHRocm93IG5ldyBFcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIG5hbWUgaXMgdW5kZWZpbmVkJyApO1xuXHRpZiAoIHRpbWVzID09PSB1bmRlZmluZWQgfHwgdGltZXMubGVuZ3RoID09PSAwICkgdGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogbm8ga2V5ZnJhbWVzIGluIHRyYWNrIG5hbWVkICcgKyBuYW1lICk7XG5cblx0dGhpcy5uYW1lID0gbmFtZTtcblxuXHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0aW1lcywgdGhpcy5UaW1lQnVmZmVyVHlwZSApO1xuXHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdmFsdWVzLCB0aGlzLlZhbHVlQnVmZmVyVHlwZSApO1xuXG5cdHRoaXMuc2V0SW50ZXJwb2xhdGlvbiggaW50ZXJwb2xhdGlvbiB8fCB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICk7XG5cblx0dGhpcy52YWxpZGF0ZSgpO1xuXHR0aGlzLm9wdGltaXplKCk7XG5cbn1cblxuLy8gU3RhdGljIG1ldGhvZHM6XG5cbk9iamVjdC5hc3NpZ24oIEtleWZyYW1lVHJhY2ssIHtcblxuXHQvLyBTZXJpYWxpemF0aW9uIChpbiBzdGF0aWMgY29udGV4dCwgYmVjYXVzZSBvZiBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uXG5cdC8vIGFuZCBhdXRvbWF0aWMgaW52b2NhdGlvbiBvZiAudG9KU09OKTpcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0aWYgKCBqc29uLnR5cGUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UnICk7XG5cblx0XHR9XG5cblx0XHR2YXIgdHJhY2tUeXBlID0gS2V5ZnJhbWVUcmFjay5fZ2V0VHJhY2tUeXBlRm9yVmFsdWVUeXBlTmFtZSgganNvbi50eXBlICk7XG5cblx0XHRpZiAoIGpzb24udGltZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gW10sIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRBbmltYXRpb25VdGlscy5mbGF0dGVuSlNPTigganNvbi5rZXlzLCB0aW1lcywgdmFsdWVzLCAndmFsdWUnICk7XG5cblx0XHRcdGpzb24udGltZXMgPSB0aW1lcztcblx0XHRcdGpzb24udmFsdWVzID0gdmFsdWVzO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZGVyaXZlZCBjbGFzc2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgcGFyc2UgbWV0aG9kXG5cdFx0aWYgKCB0cmFja1R5cGUucGFyc2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIHRyYWNrVHlwZS5wYXJzZSgganNvbiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYnkgZGVmYXVsdCwgd2UgYXNzdW1lIGEgY29uc3RydWN0b3IgY29tcGF0aWJsZSB3aXRoIHRoZSBiYXNlXG5cdFx0XHRyZXR1cm4gbmV3IHRyYWNrVHlwZSgganNvbi5uYW1lLCBqc29uLnRpbWVzLCBqc29uLnZhbHVlcywganNvbi5pbnRlcnBvbGF0aW9uICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggdHJhY2sgKSB7XG5cblx0XHR2YXIgdHJhY2tUeXBlID0gdHJhY2suY29uc3RydWN0b3I7XG5cblx0XHR2YXIganNvbjtcblxuXHRcdC8vIGRlcml2ZWQgY2xhc3NlcyBjYW4gZGVmaW5lIGEgc3RhdGljIHRvSlNPTiBtZXRob2Rcblx0XHRpZiAoIHRyYWNrVHlwZS50b0pTT04gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0anNvbiA9IHRyYWNrVHlwZS50b0pTT04oIHRyYWNrICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBieSBkZWZhdWx0LCB3ZSBhc3N1bWUgdGhlIGRhdGEgY2FuIGJlIHNlcmlhbGl6ZWQgYXMtaXNcblx0XHRcdGpzb24gPSB7XG5cblx0XHRcdFx0J25hbWUnOiB0cmFjay5uYW1lLFxuXHRcdFx0XHQndGltZXMnOiBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRyYWNrLnRpbWVzLCBBcnJheSApLFxuXHRcdFx0XHQndmFsdWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0cmFjay52YWx1ZXMsIEFycmF5IClcblxuXHRcdFx0fTtcblxuXHRcdFx0dmFyIGludGVycG9sYXRpb24gPSB0cmFjay5nZXRJbnRlcnBvbGF0aW9uKCk7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhdGlvbiAhPT0gdHJhY2suRGVmYXVsdEludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdFx0anNvbi5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0anNvbi50eXBlID0gdHJhY2suVmFsdWVUeXBlTmFtZTsgLy8gbWFuZGF0b3J5XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9LFxuXG5cdF9nZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lOiBmdW5jdGlvbiAoIHR5cGVOYW1lICkge1xuXG5cdFx0c3dpdGNoICggdHlwZU5hbWUudG9Mb3dlckNhc2UoKSApIHtcblxuXHRcdFx0Y2FzZSAnc2NhbGFyJzpcblx0XHRcdGNhc2UgJ2RvdWJsZSc6XG5cdFx0XHRjYXNlICdmbG9hdCc6XG5cdFx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0Y2FzZSAnaW50ZWdlcic6XG5cblx0XHRcdFx0cmV0dXJuIE51bWJlcktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgJ3ZlY3Rvcic6XG5cdFx0XHRjYXNlICd2ZWN0b3IyJzpcblx0XHRcdGNhc2UgJ3ZlY3RvcjMnOlxuXHRcdFx0Y2FzZSAndmVjdG9yNCc6XG5cblx0XHRcdFx0cmV0dXJuIFZlY3RvcktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgJ2NvbG9yJzpcblxuXHRcdFx0XHRyZXR1cm4gQ29sb3JLZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlICdxdWF0ZXJuaW9uJzpcblxuXHRcdFx0XHRyZXR1cm4gUXVhdGVybmlvbktleWZyYW1lVHJhY2s7XG5cblx0XHRcdGNhc2UgJ2Jvb2wnOlxuXHRcdFx0Y2FzZSAnYm9vbGVhbic6XG5cblx0XHRcdFx0cmV0dXJuIEJvb2xlYW5LZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlICdzdHJpbmcnOlxuXG5cdFx0XHRcdHJldHVybiBTdHJpbmdLZXlmcmFtZVRyYWNrO1xuXG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVW5zdXBwb3J0ZWQgdHlwZU5hbWU6ICcgKyB0eXBlTmFtZSApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSwge1xuXG5cdGNvbnN0cnVjdG9yOiBLZXlmcmFtZVRyYWNrLFxuXG5cdFRpbWVCdWZmZXJUeXBlOiBGbG9hdDMyQXJyYXksXG5cblx0VmFsdWVCdWZmZXJUeXBlOiBGbG9hdDMyQXJyYXksXG5cblx0RGVmYXVsdEludGVycG9sYXRpb246IEludGVycG9sYXRlTGluZWFyLFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgRGlzY3JldGVJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH0sXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgTGluZWFySW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9LFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDogZnVuY3Rpb24gKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IEN1YmljSW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9LFxuXG5cdHNldEludGVycG9sYXRpb246IGZ1bmN0aW9uICggaW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdHZhciBmYWN0b3J5TWV0aG9kO1xuXG5cdFx0c3dpdGNoICggaW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZURpc2NyZXRlOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEludGVycG9sYXRlTGluZWFyOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZVNtb290aDpcblxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0XHRpZiAoIGZhY3RvcnlNZXRob2QgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIG1lc3NhZ2UgPSBcInVuc3VwcG9ydGVkIGludGVycG9sYXRpb24gZm9yIFwiICtcblx0XHRcdFx0dGhpcy5WYWx1ZVR5cGVOYW1lICsgXCIga2V5ZnJhbWUgdHJhY2sgbmFtZWQgXCIgKyB0aGlzLm5hbWU7XG5cblx0XHRcdGlmICggdGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIGZhbGwgYmFjayB0byBkZWZhdWx0LCB1bmxlc3MgdGhlIGRlZmF1bHQgaXRzZWxmIGlzIG1lc3NlZCB1cFxuXHRcdFx0XHRpZiAoIGludGVycG9sYXRpb24gIT09IHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnNldEludGVycG9sYXRpb24oIHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBtZXNzYWdlICk7IC8vIGZhdGFsLCBpbiB0aGlzIGNhc2VcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazonLCBtZXNzYWdlICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLmNyZWF0ZUludGVycG9sYW50ID0gZmFjdG9yeU1ldGhvZDtcblxuXHR9LFxuXG5cdGdldEludGVycG9sYXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHN3aXRjaCAoIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgKSB7XG5cblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVEaXNjcmV0ZTtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVMaW5lYXI7XG5cblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6XG5cblx0XHRcdFx0cmV0dXJuIEludGVycG9sYXRlU21vb3RoO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Z2V0VmFsdWVTaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoIC8gdGhpcy50aW1lcy5sZW5ndGg7XG5cblx0fSxcblxuXHQvLyBtb3ZlIGFsbCBrZXlmcmFtZXMgZWl0aGVyIGZvcndhcmRzIG9yIGJhY2t3YXJkcyBpbiB0aW1lXG5cdHNoaWZ0OiBmdW5jdGlvbiAoIHRpbWVPZmZzZXQgKSB7XG5cblx0XHRpZiAoIHRpbWVPZmZzZXQgIT09IDAuMCApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcztcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdGltZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHRpbWVzWyBpIF0gKz0gdGltZU9mZnNldDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBzY2FsZSBhbGwga2V5ZnJhbWUgdGltZXMgYnkgYSBmYWN0b3IgKHVzZWZ1bCBmb3IgZnJhbWUgPC0+IHNlY29uZHMgY29udmVyc2lvbnMpXG5cdHNjYWxlOiBmdW5jdGlvbiAoIHRpbWVTY2FsZSApIHtcblxuXHRcdGlmICggdGltZVNjYWxlICE9PSAxLjAgKSB7XG5cblx0XHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXM7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR0aW1lc1sgaSBdICo9IHRpbWVTY2FsZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyByZW1vdmVzIGtleWZyYW1lcyBiZWZvcmUgYW5kIGFmdGVyIGFuaW1hdGlvbiB3aXRob3V0IGNoYW5naW5nIGFueSB2YWx1ZXMgd2l0aGluIHRoZSByYW5nZSBbc3RhcnRUaW1lLCBlbmRUaW1lXS5cblx0Ly8gSU1QT1JUQU5UOiBXZSBkbyBub3Qgc2hpZnQgYXJvdW5kIGtleXMgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0cmFjayB0aW1lLCBiZWNhdXNlIGZvciBpbnRlcnBvbGF0ZWQga2V5cyB0aGlzIHdpbGwgY2hhbmdlIHRoZWlyIHZhbHVlc1xuXHR0cmltOiBmdW5jdGlvbiAoIHN0YXJ0VGltZSwgZW5kVGltZSApIHtcblxuXHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHRuS2V5cyA9IHRpbWVzLmxlbmd0aCxcblx0XHRcdGZyb20gPSAwLFxuXHRcdFx0dG8gPSBuS2V5cyAtIDE7XG5cblx0XHR3aGlsZSAoIGZyb20gIT09IG5LZXlzICYmIHRpbWVzWyBmcm9tIF0gPCBzdGFydFRpbWUgKSB7XG5cblx0XHRcdCsrIGZyb207XG5cblx0XHR9XG5cblx0XHR3aGlsZSAoIHRvICE9PSAtIDEgJiYgdGltZXNbIHRvIF0gPiBlbmRUaW1lICkge1xuXG5cdFx0XHQtLSB0bztcblxuXHRcdH1cblxuXHRcdCsrIHRvOyAvLyBpbmNsdXNpdmUgLT4gZXhjbHVzaXZlIGJvdW5kXG5cblx0XHRpZiAoIGZyb20gIT09IDAgfHwgdG8gIT09IG5LZXlzICkge1xuXG5cdFx0XHQvLyBlbXB0eSB0cmFja3MgYXJlIGZvcmJpZGRlbiwgc28ga2VlcCBhdCBsZWFzdCBvbmUga2V5ZnJhbWVcblx0XHRcdGlmICggZnJvbSA+PSB0byApIHRvID0gTWF0aC5tYXgoIHRvLCAxICksIGZyb20gPSB0byAtIDE7XG5cblx0XHRcdHZhciBzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpO1xuXHRcdFx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRpbWVzLCBmcm9tLCB0byApO1xuXHRcdFx0dGhpcy52YWx1ZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB0aGlzLnZhbHVlcywgZnJvbSAqIHN0cmlkZSwgdG8gKiBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gZW5zdXJlIHdlIGRvIG5vdCBnZXQgYSBHYXJiYWdlSW5HYXJiYWdlT3V0IHNpdHVhdGlvbiwgbWFrZSBzdXJlIHRyYWNrcyBhcmUgYXQgbGVhc3QgbWluaW1hbGx5IHZpYWJsZVxuXHR2YWxpZGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZhbGlkID0gdHJ1ZTtcblxuXHRcdHZhciB2YWx1ZVNpemUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpO1xuXHRcdGlmICggdmFsdWVTaXplIC0gTWF0aC5mbG9vciggdmFsdWVTaXplICkgIT09IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBJbnZhbGlkIHZhbHVlIHNpemUgaW4gdHJhY2suJywgdGhpcyApO1xuXHRcdFx0dmFsaWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnZhbHVlcyxcblxuXHRcdFx0bktleXMgPSB0aW1lcy5sZW5ndGg7XG5cblx0XHRpZiAoIG5LZXlzID09PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuJywgdGhpcyApO1xuXHRcdFx0dmFsaWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciBwcmV2VGltZSA9IG51bGw7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5LZXlzOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY3VyclRpbWUgPSB0aW1lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHR5cGVvZiBjdXJyVGltZSA9PT0gJ251bWJlcicgJiYgaXNOYU4oIGN1cnJUaW1lICkgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFRpbWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLicsIHRoaXMsIGksIGN1cnJUaW1lICk7XG5cdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcHJldlRpbWUgIT09IG51bGwgJiYgcHJldlRpbWUgPiBjdXJyVGltZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuJywgdGhpcywgaSwgY3VyclRpbWUsIHByZXZUaW1lICk7XG5cdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdHByZXZUaW1lID0gY3VyclRpbWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIEFuaW1hdGlvblV0aWxzLmlzVHlwZWRBcnJheSggdmFsdWVzICkgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdmFsdWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdHZhciB2YWx1ZSA9IHZhbHVlc1sgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBpc05hTiggdmFsdWUgKSApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4nLCB0aGlzLCBpLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbGlkO1xuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlcyBlcXVpdmFsZW50IHNlcXVlbnRpYWwga2V5cyBhcyBjb21tb24gaW4gbW9ycGggdGFyZ2V0IHNlcXVlbmNlc1xuXHQvLyAoMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwKSAtLT4gKDAsMCwxLDEsMCwwKVxuXHRvcHRpbWl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcyxcblx0XHRcdHZhbHVlcyA9IHRoaXMudmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy5nZXRWYWx1ZVNpemUoKSxcblxuXHRcdFx0c21vb3RoSW50ZXJwb2xhdGlvbiA9IHRoaXMuZ2V0SW50ZXJwb2xhdGlvbigpID09PSBJbnRlcnBvbGF0ZVNtb290aCxcblxuXHRcdFx0d3JpdGVJbmRleCA9IDEsXG5cdFx0XHRsYXN0SW5kZXggPSB0aW1lcy5sZW5ndGggLSAxO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxOyBpIDwgbGFzdEluZGV4OyArKyBpICkge1xuXG5cdFx0XHR2YXIga2VlcCA9IGZhbHNlO1xuXG5cdFx0XHR2YXIgdGltZSA9IHRpbWVzWyBpIF07XG5cdFx0XHR2YXIgdGltZU5leHQgPSB0aW1lc1sgaSArIDEgXTtcblxuXHRcdFx0Ly8gcmVtb3ZlIGFkamFjZW50IGtleWZyYW1lcyBzY2hlZHVsZWQgYXQgdGhlIHNhbWUgdGltZVxuXG5cdFx0XHRpZiAoIHRpbWUgIT09IHRpbWVOZXh0ICYmICggaSAhPT0gMSB8fCB0aW1lICE9PSB0aW1lWyAwIF0gKSApIHtcblxuXHRcdFx0XHRpZiAoICEgc21vb3RoSW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0XHRcdC8vIHJlbW92ZSB1bm5lY2Vzc2FyeSBrZXlmcmFtZXMgc2FtZSBhcyB0aGVpciBuZWlnaGJvcnNcblxuXHRcdFx0XHRcdHZhciBvZmZzZXQgPSBpICogc3RyaWRlLFxuXHRcdFx0XHRcdFx0b2Zmc2V0UCA9IG9mZnNldCAtIHN0cmlkZSxcblx0XHRcdFx0XHRcdG9mZnNldE4gPSBvZmZzZXQgKyBzdHJpZGU7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIHZhbHVlID0gdmFsdWVzWyBvZmZzZXQgKyBqIF07XG5cblx0XHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHZhbHVlc1sgb2Zmc2V0UCArIGogXSB8fFxuXHRcdFx0XHRcdFx0XHR2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXROICsgaiBdICkge1xuXG5cdFx0XHRcdFx0XHRcdGtlZXAgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRrZWVwID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gaW4tcGxhY2UgY29tcGFjdGlvblxuXG5cdFx0XHRpZiAoIGtlZXAgKSB7XG5cblx0XHRcdFx0aWYgKCBpICE9PSB3cml0ZUluZGV4ICkge1xuXG5cdFx0XHRcdFx0dGltZXNbIHdyaXRlSW5kZXggXSA9IHRpbWVzWyBpIF07XG5cblx0XHRcdFx0XHR2YXIgcmVhZE9mZnNldCA9IGkgKiBzdHJpZGUsXG5cdFx0XHRcdFx0XHR3cml0ZU9mZnNldCA9IHdyaXRlSW5kZXggKiBzdHJpZGU7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFsdWVzWyB3cml0ZU9mZnNldCArIGogXSA9IHZhbHVlc1sgcmVhZE9mZnNldCArIGogXTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Kysgd3JpdGVJbmRleDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gZmx1c2ggbGFzdCBrZXlmcmFtZSAoY29tcGFjdGlvbiBsb29rcyBhaGVhZClcblxuXHRcdGlmICggbGFzdEluZGV4ID4gMCApIHtcblxuXHRcdFx0dGltZXNbIHdyaXRlSW5kZXggXSA9IHRpbWVzWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0Zm9yICggdmFyIHJlYWRPZmZzZXQgPSBsYXN0SW5kZXggKiBzdHJpZGUsIHdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZSwgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHtcblxuXHRcdFx0XHR2YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdCsrIHdyaXRlSW5kZXg7XG5cblx0XHR9XG5cblx0XHRpZiAoIHdyaXRlSW5kZXggIT09IHRpbWVzLmxlbmd0aCApIHtcblxuXHRcdFx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRpbWVzLCAwLCB3cml0ZUluZGV4ICk7XG5cdFx0XHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHZhbHVlcywgMCwgd3JpdGVJbmRleCAqIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgdmVjdG9yZWQga2V5ZnJhbWUgdmFsdWVzLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5WZWN0b3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogVmVjdG9yS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAndmVjdG9yJ1xuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHQvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcblxufSApO1xuXG4vKipcbiAqXG4gKiBSZXVzYWJsZSBzZXQgb2YgVHJhY2tzIHRoYXQgcmVwcmVzZW50IGFuIGFuaW1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uQ2xpcCggbmFtZSwgZHVyYXRpb24sIHRyYWNrcyApIHtcblxuXHR0aGlzLm5hbWUgPSBuYW1lO1xuXHR0aGlzLnRyYWNrcyA9IHRyYWNrcztcblx0dGhpcy5kdXJhdGlvbiA9ICggZHVyYXRpb24gIT09IHVuZGVmaW5lZCApID8gZHVyYXRpb24gOiAtIDE7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0Ly8gdGhpcyBtZWFucyBpdCBzaG91bGQgZmlndXJlIG91dCBpdHMgZHVyYXRpb24gYnkgc2Nhbm5pbmcgdGhlIHRyYWNrc1xuXHRpZiAoIHRoaXMuZHVyYXRpb24gPCAwICkge1xuXG5cdFx0dGhpcy5yZXNldER1cmF0aW9uKCk7XG5cblx0fVxuXG5cdHRoaXMub3B0aW1pemUoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25DbGlwLCB7XG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciB0cmFja3MgPSBbXSxcblx0XHRcdGpzb25UcmFja3MgPSBqc29uLnRyYWNrcyxcblx0XHRcdGZyYW1lVGltZSA9IDEuMCAvICgganNvbi5mcHMgfHwgMS4wICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBqc29uVHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dHJhY2tzLnB1c2goIEtleWZyYW1lVHJhY2sucGFyc2UoIGpzb25UcmFja3NbIGkgXSApLnNjYWxlKCBmcmFtZVRpbWUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBBbmltYXRpb25DbGlwKCBqc29uLm5hbWUsIGpzb24uZHVyYXRpb24sIHRyYWNrcyApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIGNsaXAgKSB7XG5cblx0XHR2YXIgdHJhY2tzID0gW10sXG5cdFx0XHRjbGlwVHJhY2tzID0gY2xpcC50cmFja3M7XG5cblx0XHR2YXIganNvbiA9IHtcblxuXHRcdFx0J25hbWUnOiBjbGlwLm5hbWUsXG5cdFx0XHQnZHVyYXRpb24nOiBjbGlwLmR1cmF0aW9uLFxuXHRcdFx0J3RyYWNrcyc6IHRyYWNrc1xuXG5cdFx0fTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGNsaXBUcmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR0cmFja3MucHVzaCggS2V5ZnJhbWVUcmFjay50b0pTT04oIGNsaXBUcmFja3NbIGkgXSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9LFxuXG5cdENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlOiBmdW5jdGlvbiAoIG5hbWUsIG1vcnBoVGFyZ2V0U2VxdWVuY2UsIGZwcywgbm9Mb29wICkge1xuXG5cdFx0dmFyIG51bU1vcnBoVGFyZ2V0cyA9IG1vcnBoVGFyZ2V0U2VxdWVuY2UubGVuZ3RoO1xuXHRcdHZhciB0cmFja3MgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG51bU1vcnBoVGFyZ2V0czsgaSArKyApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gW107XG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdHRpbWVzLnB1c2goXG5cdFx0XHRcdCggaSArIG51bU1vcnBoVGFyZ2V0cyAtIDEgKSAlIG51bU1vcnBoVGFyZ2V0cyxcblx0XHRcdFx0aSxcblx0XHRcdFx0KCBpICsgMSApICUgbnVtTW9ycGhUYXJnZXRzICk7XG5cblx0XHRcdHZhbHVlcy5wdXNoKCAwLCAxLCAwICk7XG5cblx0XHRcdHZhciBvcmRlciA9IEFuaW1hdGlvblV0aWxzLmdldEtleWZyYW1lT3JkZXIoIHRpbWVzICk7XG5cdFx0XHR0aW1lcyA9IEFuaW1hdGlvblV0aWxzLnNvcnRlZEFycmF5KCB0aW1lcywgMSwgb3JkZXIgKTtcblx0XHRcdHZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLnNvcnRlZEFycmF5KCB2YWx1ZXMsIDEsIG9yZGVyICk7XG5cblx0XHRcdC8vIGlmIHRoZXJlIGlzIGEga2V5IGF0IHRoZSBmaXJzdCBmcmFtZSwgZHVwbGljYXRlIGl0IGFzIHRoZVxuXHRcdFx0Ly8gbGFzdCBmcmFtZSBhcyB3ZWxsIGZvciBwZXJmZWN0IGxvb3AuXG5cdFx0XHRpZiAoICEgbm9Mb29wICYmIHRpbWVzWyAwIF0gPT09IDAgKSB7XG5cblx0XHRcdFx0dGltZXMucHVzaCggbnVtTW9ycGhUYXJnZXRzICk7XG5cdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZXNbIDAgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRyYWNrcy5wdXNoKFxuXHRcdFx0XHRuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjayhcblx0XHRcdFx0XHQnLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1snICsgbW9ycGhUYXJnZXRTZXF1ZW5jZVsgaSBdLm5hbWUgKyAnXScsXG5cdFx0XHRcdFx0dGltZXMsIHZhbHVlc1xuXHRcdFx0XHQpLnNjYWxlKCAxLjAgLyBmcHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBBbmltYXRpb25DbGlwKCBuYW1lLCAtIDEsIHRyYWNrcyApO1xuXG5cdH0sXG5cblx0ZmluZEJ5TmFtZTogZnVuY3Rpb24gKCBvYmplY3RPckNsaXBBcnJheSwgbmFtZSApIHtcblxuXHRcdHZhciBjbGlwQXJyYXkgPSBvYmplY3RPckNsaXBBcnJheTtcblxuXHRcdGlmICggISBBcnJheS5pc0FycmF5KCBvYmplY3RPckNsaXBBcnJheSApICkge1xuXG5cdFx0XHR2YXIgbyA9IG9iamVjdE9yQ2xpcEFycmF5O1xuXHRcdFx0Y2xpcEFycmF5ID0gby5nZW9tZXRyeSAmJiBvLmdlb21ldHJ5LmFuaW1hdGlvbnMgfHwgby5hbmltYXRpb25zO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY2xpcEFycmF5Lmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBjbGlwQXJyYXlbIGkgXS5uYW1lID09PSBuYW1lICkge1xuXG5cdFx0XHRcdHJldHVybiBjbGlwQXJyYXlbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fSxcblxuXHRDcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlczogZnVuY3Rpb24gKCBtb3JwaFRhcmdldHMsIGZwcywgbm9Mb29wICkge1xuXG5cdFx0dmFyIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzID0ge307XG5cblx0XHQvLyB0ZXN0ZWQgd2l0aCBodHRwczovL3JlZ2V4MTAxLmNvbS8gb24gdHJpY2sgc2VxdWVuY2VzXG5cdFx0Ly8gc3VjaCBmbGFtaW5nb19mbHlBXzAwMywgZmxhbWluZ29fcnVuMV8wMDMsIGNyZGVhdGgwMDU5XG5cdFx0dmFyIHBhdHRlcm4gPSAvXihbXFx3LV0qPykoW1xcZF0rKSQvO1xuXG5cdFx0Ly8gc29ydCBtb3JwaCB0YXJnZXQgbmFtZXMgaW50byBhbmltYXRpb24gZ3JvdXBzIGJhc2VkXG5cdFx0Ly8gcGF0dGVybnMgbGlrZSBXYWxrXzAwMSwgV2Fsa18wMDIsIFJ1bl8wMDEsIFJ1bl8wMDJcblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGkgXTtcblx0XHRcdHZhciBwYXJ0cyA9IG1vcnBoVGFyZ2V0Lm5hbWUubWF0Y2goIHBhdHRlcm4gKTtcblxuXHRcdFx0aWYgKCBwYXJ0cyAmJiBwYXJ0cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRcdHZhciBuYW1lID0gcGFydHNbIDEgXTtcblxuXHRcdFx0XHR2YXIgYW5pbWF0aW9uTW9ycGhUYXJnZXRzID0gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXTtcblx0XHRcdFx0aWYgKCAhIGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRcdGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0gPSBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBbXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YW5pbWF0aW9uTW9ycGhUYXJnZXRzLnB1c2goIG1vcnBoVGFyZ2V0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjbGlwcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdGNsaXBzLnB1c2goIEFuaW1hdGlvbkNsaXAuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoIG5hbWUsIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0sIGZwcywgbm9Mb29wICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjbGlwcztcblxuXHR9LFxuXG5cdC8vIHBhcnNlIHRoZSBhbmltYXRpb24uaGllcmFyY2h5IGZvcm1hdFxuXHRwYXJzZUFuaW1hdGlvbjogZnVuY3Rpb24gKCBhbmltYXRpb24sIGJvbmVzICkge1xuXG5cdFx0aWYgKCAhIGFuaW1hdGlvbiApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkFuaW1hdGlvbkNsaXA6IE5vIGFuaW1hdGlvbiBpbiBKU09OTG9hZGVyIGRhdGEuJyApO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHR2YXIgYWRkTm9uZW1wdHlUcmFjayA9IGZ1bmN0aW9uICggdHJhY2tUeXBlLCB0cmFja05hbWUsIGFuaW1hdGlvbktleXMsIHByb3BlcnR5TmFtZSwgZGVzdFRyYWNrcyApIHtcblxuXHRcdFx0Ly8gb25seSByZXR1cm4gdHJhY2sgaWYgdGhlcmUgYXJlIGFjdHVhbGx5IGtleXMuXG5cdFx0XHRpZiAoIGFuaW1hdGlvbktleXMubGVuZ3RoICE9PSAwICkge1xuXG5cdFx0XHRcdHZhciB0aW1lcyA9IFtdO1xuXHRcdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdFx0QW5pbWF0aW9uVXRpbHMuZmxhdHRlbkpTT04oIGFuaW1hdGlvbktleXMsIHRpbWVzLCB2YWx1ZXMsIHByb3BlcnR5TmFtZSApO1xuXG5cdFx0XHRcdC8vIGVtcHR5IGtleXMgYXJlIGZpbHRlcmVkIG91dCwgc28gY2hlY2sgYWdhaW5cblx0XHRcdFx0aWYgKCB0aW1lcy5sZW5ndGggIT09IDAgKSB7XG5cblx0XHRcdFx0XHRkZXN0VHJhY2tzLnB1c2goIG5ldyB0cmFja1R5cGUoIHRyYWNrTmFtZSwgdGltZXMsIHZhbHVlcyApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdFx0dmFyIHRyYWNrcyA9IFtdO1xuXG5cdFx0dmFyIGNsaXBOYW1lID0gYW5pbWF0aW9uLm5hbWUgfHwgJ2RlZmF1bHQnO1xuXHRcdC8vIGF1dG9tYXRpYyBsZW5ndGggZGV0ZXJtaW5hdGlvbiBpbiBBbmltYXRpb25DbGlwLlxuXHRcdHZhciBkdXJhdGlvbiA9IGFuaW1hdGlvbi5sZW5ndGggfHwgLSAxO1xuXHRcdHZhciBmcHMgPSBhbmltYXRpb24uZnBzIHx8IDMwO1xuXG5cdFx0dmFyIGhpZXJhcmNoeVRyYWNrcyA9IGFuaW1hdGlvbi5oaWVyYXJjaHkgfHwgW107XG5cblx0XHRmb3IgKCB2YXIgaCA9IDA7IGggPCBoaWVyYXJjaHlUcmFja3MubGVuZ3RoOyBoICsrICkge1xuXG5cdFx0XHR2YXIgYW5pbWF0aW9uS2V5cyA9IGhpZXJhcmNoeVRyYWNrc1sgaCBdLmtleXM7XG5cblx0XHRcdC8vIHNraXAgZW1wdHkgdHJhY2tzXG5cdFx0XHRpZiAoICEgYW5pbWF0aW9uS2V5cyB8fCBhbmltYXRpb25LZXlzLmxlbmd0aCA9PT0gMCApIGNvbnRpbnVlO1xuXG5cdFx0XHQvLyBwcm9jZXNzIG1vcnBoIHRhcmdldHNcblx0XHRcdGlmICggYW5pbWF0aW9uS2V5c1sgMCBdLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHQvLyBmaWd1cmUgb3V0IGFsbCBtb3JwaCB0YXJnZXRzIHVzZWQgaW4gdGhpcyB0cmFja1xuXHRcdFx0XHR2YXIgbW9ycGhUYXJnZXROYW1lcyA9IHt9O1xuXG5cdFx0XHRcdGZvciAoIHZhciBrID0gMDsgayA8IGFuaW1hdGlvbktleXMubGVuZ3RoOyBrICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgbSA9IDA7IG0gPCBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzLmxlbmd0aDsgbSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRtb3JwaFRhcmdldE5hbWVzWyBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzWyBtIF0gXSA9IC0gMTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBjcmVhdGUgYSB0cmFjayBmb3IgZWFjaCBtb3JwaCB0YXJnZXQgd2l0aCBhbGwgemVyb1xuXHRcdFx0XHQvLyBtb3JwaFRhcmdldEluZmx1ZW5jZXMgZXhjZXB0IGZvciB0aGUga2V5cyBpbiB3aGljaFxuXHRcdFx0XHQvLyB0aGUgbW9ycGhUYXJnZXQgaXMgbmFtZWQuXG5cdFx0XHRcdGZvciAoIHZhciBtb3JwaFRhcmdldE5hbWUgaW4gbW9ycGhUYXJnZXROYW1lcyApIHtcblxuXHRcdFx0XHRcdHZhciB0aW1lcyA9IFtdO1xuXHRcdFx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBtID0gMDsgbSAhPT0gYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7ICsrIG0gKSB7XG5cblx0XHRcdFx0XHRcdHZhciBhbmltYXRpb25LZXkgPSBhbmltYXRpb25LZXlzWyBrIF07XG5cblx0XHRcdFx0XHRcdHRpbWVzLnB1c2goIGFuaW1hdGlvbktleS50aW1lICk7XG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaCggKCBhbmltYXRpb25LZXkubW9ycGhUYXJnZXQgPT09IG1vcnBoVGFyZ2V0TmFtZSApID8gMSA6IDAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRyYWNrcy5wdXNoKCBuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjayggJy5tb3JwaFRhcmdldEluZmx1ZW5jZVsnICsgbW9ycGhUYXJnZXROYW1lICsgJ10nLCB0aW1lcywgdmFsdWVzICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZHVyYXRpb24gPSBtb3JwaFRhcmdldE5hbWVzLmxlbmd0aCAqICggZnBzIHx8IDEuMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIC4uLmFzc3VtZSBza2VsZXRhbCBhbmltYXRpb25cblxuXHRcdFx0XHR2YXIgYm9uZU5hbWUgPSAnLmJvbmVzWycgKyBib25lc1sgaCBdLm5hbWUgKyAnXSc7XG5cblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcblx0XHRcdFx0XHRWZWN0b3JLZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcucG9zaXRpb24nLFxuXHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdwb3MnLCB0cmFja3MgKTtcblxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxuXHRcdFx0XHRcdFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcucXVhdGVybmlvbicsXG5cdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3JvdCcsIHRyYWNrcyApO1xuXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXG5cdFx0XHRcdFx0VmVjdG9yS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnNjYWxlJyxcblx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAnc2NsJywgdHJhY2tzICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdHJhY2tzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHR2YXIgY2xpcCA9IG5ldyBBbmltYXRpb25DbGlwKCBjbGlwTmFtZSwgZHVyYXRpb24sIHRyYWNrcyApO1xuXG5cdFx0cmV0dXJuIGNsaXA7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbkNsaXAucHJvdG90eXBlLCB7XG5cblx0cmVzZXREdXJhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRyYWNrcyA9IHRoaXMudHJhY2tzLCBkdXJhdGlvbiA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSB0cmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgdHJhY2sgPSB0aGlzLnRyYWNrc1sgaSBdO1xuXG5cdFx0XHRkdXJhdGlvbiA9IE1hdGgubWF4KCBkdXJhdGlvbiwgdHJhY2sudGltZXNbIHRyYWNrLnRpbWVzLmxlbmd0aCAtIDEgXSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXG5cdH0sXG5cblx0dHJpbTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnRyYWNrc1sgaSBdLnRyaW0oIDAsIHRoaXMuZHVyYXRpb24gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b3B0aW1pemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy50cmFja3NbIGkgXS5vcHRpbWl6ZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBNYXRlcmlhbExvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblx0dGhpcy50ZXh0dXJlcyA9IHt9O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIE1hdGVyaWFsTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0c2V0VGV4dHVyZXM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnRleHR1cmVzID0gdmFsdWU7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIHRleHR1cmVzID0gdGhpcy50ZXh0dXJlcztcblxuXHRcdGZ1bmN0aW9uIGdldFRleHR1cmUoIG5hbWUgKSB7XG5cblx0XHRcdGlmICggdGV4dHVyZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsTG9hZGVyOiBVbmRlZmluZWQgdGV4dHVyZScsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGV4dHVyZXNbIG5hbWUgXTtcblxuXHRcdH1cblxuXHRcdHZhciBtYXRlcmlhbCA9IG5ldyBNYXRlcmlhbHNbIGpzb24udHlwZSBdKCk7XG5cblx0XHRpZiAoIGpzb24udXVpZCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudXVpZCA9IGpzb24udXVpZDtcblx0XHRpZiAoIGpzb24ubmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubmFtZSA9IGpzb24ubmFtZTtcblx0XHRpZiAoIGpzb24uY29sb3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNvbG9yLnNldEhleCgganNvbi5jb2xvciApO1xuXHRcdGlmICgganNvbi5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzcyA9IGpzb24ucm91Z2huZXNzO1xuXHRcdGlmICgganNvbi5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzcyA9IGpzb24ubWV0YWxuZXNzO1xuXHRcdGlmICgganNvbi5lbWlzc2l2ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmUuc2V0SGV4KCBqc29uLmVtaXNzaXZlICk7XG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhci5zZXRIZXgoIGpzb24uc3BlY3VsYXIgKTtcblx0XHRpZiAoIGpzb24uc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGluaW5lc3MgPSBqc29uLnNoaW5pbmVzcztcblx0XHRpZiAoIGpzb24uY2xlYXJDb2F0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhckNvYXQgPSBqc29uLmNsZWFyQ29hdDtcblx0XHRpZiAoIGpzb24uY2xlYXJDb2F0Um91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgPSBqc29uLmNsZWFyQ29hdFJvdWdobmVzcztcblx0XHRpZiAoIGpzb24udW5pZm9ybXMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnVuaWZvcm1zID0ganNvbi51bmlmb3Jtcztcblx0XHRpZiAoIGpzb24udmVydGV4U2hhZGVyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIgPSBqc29uLnZlcnRleFNoYWRlcjtcblx0XHRpZiAoIGpzb24uZnJhZ21lbnRTaGFkZXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyID0ganNvbi5mcmFnbWVudFNoYWRlcjtcblx0XHRpZiAoIGpzb24udmVydGV4Q29sb3JzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSBqc29uLnZlcnRleENvbG9ycztcblx0XHRpZiAoIGpzb24uZm9nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mb2cgPSBqc29uLmZvZztcblx0XHRpZiAoIGpzb24uZmxhdFNoYWRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0ganNvbi5mbGF0U2hhZGluZztcblx0XHRpZiAoIGpzb24uYmxlbmRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJsZW5kaW5nID0ganNvbi5ibGVuZGluZztcblx0XHRpZiAoIGpzb24uc2lkZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2lkZSA9IGpzb24uc2lkZTtcblx0XHRpZiAoIGpzb24ub3BhY2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwub3BhY2l0eSA9IGpzb24ub3BhY2l0eTtcblx0XHRpZiAoIGpzb24udHJhbnNwYXJlbnQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRyYW5zcGFyZW50ID0ganNvbi50cmFuc3BhcmVudDtcblx0XHRpZiAoIGpzb24uYWxwaGFUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbHBoYVRlc3QgPSBqc29uLmFscGhhVGVzdDtcblx0XHRpZiAoIGpzb24uZGVwdGhUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aFRlc3QgPSBqc29uLmRlcHRoVGVzdDtcblx0XHRpZiAoIGpzb24uZGVwdGhXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVwdGhXcml0ZSA9IGpzb24uZGVwdGhXcml0ZTtcblx0XHRpZiAoIGpzb24uY29sb3JXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29sb3JXcml0ZSA9IGpzb24uY29sb3JXcml0ZTtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWUgPSBqc29uLndpcmVmcmFtZTtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZXdpZHRoICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggPSBqc29uLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWNhcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZWNhcCA9IGpzb24ud2lyZWZyYW1lTGluZWNhcDtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWpvaW4gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVqb2luID0ganNvbi53aXJlZnJhbWVMaW5lam9pbjtcblxuXHRcdGlmICgganNvbi5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm90YXRpb24gPSBqc29uLnJvdGF0aW9uO1xuXG5cdFx0aWYgKCBqc29uLmxpbmV3aWR0aCAhPT0gMSApIG1hdGVyaWFsLmxpbmV3aWR0aCA9IGpzb24ubGluZXdpZHRoO1xuXHRcdGlmICgganNvbi5kYXNoU2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGFzaFNpemUgPSBqc29uLmRhc2hTaXplO1xuXHRcdGlmICgganNvbi5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5nYXBTaXplID0ganNvbi5nYXBTaXplO1xuXHRcdGlmICgganNvbi5zY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2NhbGUgPSBqc29uLnNjYWxlO1xuXG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXQgPSBqc29uLnBvbHlnb25PZmZzZXQ7XG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXRGYWN0b3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRGYWN0b3IgPSBqc29uLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXRVbml0cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzID0ganNvbi5wb2x5Z29uT2Zmc2V0VW5pdHM7XG5cblx0XHRpZiAoIGpzb24uc2tpbm5pbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNraW5uaW5nID0ganNvbi5za2lubmluZztcblx0XHRpZiAoIGpzb24ubW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tb3JwaFRhcmdldHMgPSBqc29uLm1vcnBoVGFyZ2V0cztcblx0XHRpZiAoIGpzb24uZGl0aGVyaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXRoZXJpbmcgPSBqc29uLmRpdGhlcmluZztcblxuXHRcdGlmICgganNvbi52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52aXNpYmxlID0ganNvbi52aXNpYmxlO1xuXHRcdGlmICgganNvbi51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudXNlckRhdGEgPSBqc29uLnVzZXJEYXRhO1xuXG5cdFx0Ly8gRGVwcmVjYXRlZFxuXG5cdFx0aWYgKCBqc29uLnNoYWRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0ganNvbi5zaGFkaW5nID09PSAxOyAvLyBUSFJFRS5GbGF0U2hhZGluZ1xuXG5cdFx0Ly8gZm9yIFBvaW50c01hdGVyaWFsXG5cblx0XHRpZiAoIGpzb24uc2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2l6ZSA9IGpzb24uc2l6ZTtcblx0XHRpZiAoIGpzb24uc2l6ZUF0dGVudWF0aW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaXplQXR0ZW51YXRpb24gPSBqc29uLnNpemVBdHRlbnVhdGlvbjtcblxuXHRcdC8vIG1hcHNcblxuXHRcdGlmICgganNvbi5tYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1hcCA9IGdldFRleHR1cmUoIGpzb24ubWFwICk7XG5cblx0XHRpZiAoIGpzb24uYWxwaGFNYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bWF0ZXJpYWwuYWxwaGFNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFscGhhTWFwICk7XG5cdFx0XHRtYXRlcmlhbC50cmFuc3BhcmVudCA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uYnVtcE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcE1hcCA9IGdldFRleHR1cmUoIGpzb24uYnVtcE1hcCApO1xuXHRcdGlmICgganNvbi5idW1wU2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJ1bXBTY2FsZSA9IGpzb24uYnVtcFNjYWxlO1xuXG5cdFx0aWYgKCBqc29uLm5vcm1hbE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubm9ybWFsTWFwID0gZ2V0VGV4dHVyZSgganNvbi5ub3JtYWxNYXAgKTtcblx0XHRpZiAoIGpzb24ubm9ybWFsU2NhbGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIG5vcm1hbFNjYWxlID0ganNvbi5ub3JtYWxTY2FsZTtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBub3JtYWxTY2FsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHQvLyBCbGVuZGVyIGV4cG9ydGVyIHVzZWQgdG8gZXhwb3J0IGEgc2NhbGFyLiBTZWUgIzc0NTlcblxuXHRcdFx0XHRub3JtYWxTY2FsZSA9IFsgbm9ybWFsU2NhbGUsIG5vcm1hbFNjYWxlIF07XG5cblx0XHRcdH1cblxuXHRcdFx0bWF0ZXJpYWwubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggbm9ybWFsU2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbi5kaXNwbGFjZW1lbnRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCA9IGdldFRleHR1cmUoIGpzb24uZGlzcGxhY2VtZW50TWFwICk7XG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudFNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZSA9IGpzb24uZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudEJpYXMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXMgPSBqc29uLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHRpZiAoIGpzb24ucm91Z2huZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnJvdWdobmVzc01hcCApO1xuXHRcdGlmICgganNvbi5tZXRhbG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24ubWV0YWxuZXNzTWFwICk7XG5cblx0XHRpZiAoIGpzb24uZW1pc3NpdmVNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlTWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbWlzc2l2ZU1hcCApO1xuXHRcdGlmICgganNvbi5lbWlzc2l2ZUludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHkgPSBqc29uLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhck1hcCA9IGdldFRleHR1cmUoIGpzb24uc3BlY3VsYXJNYXAgKTtcblxuXHRcdGlmICgganNvbi5lbnZNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVudk1hcCA9IGdldFRleHR1cmUoIGpzb24uZW52TWFwICk7XG5cblx0XHRpZiAoIGpzb24ucmVmbGVjdGl2aXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yZWZsZWN0aXZpdHkgPSBqc29uLnJlZmxlY3Rpdml0eTtcblxuXHRcdGlmICgganNvbi5saWdodE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubGlnaHRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmxpZ2h0TWFwICk7XG5cdFx0aWYgKCBqc29uLmxpZ2h0TWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eSA9IGpzb24ubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uYW9NYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFvTWFwID0gZ2V0VGV4dHVyZSgganNvbi5hb01hcCApO1xuXHRcdGlmICgganNvbi5hb01hcEludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHkgPSBqc29uLmFvTWFwSW50ZW5zaXR5O1xuXG5cdFx0aWYgKCBqc29uLmdyYWRpZW50TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ncmFkaWVudE1hcCA9IGdldFRleHR1cmUoIGpzb24uZ3JhZGllbnRNYXAgKTtcblxuXHRcdHJldHVybiBtYXRlcmlhbDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckdlb21ldHJ5TG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0dmFyIGluZGV4ID0ganNvbi5kYXRhLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgdHlwZWRBcnJheSA9IG5ldyBUWVBFRF9BUlJBWVNbIGluZGV4LnR5cGUgXSggaW5kZXguYXJyYXkgKTtcblx0XHRcdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCAxICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNvbi5kYXRhLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdHZhciB0eXBlZEFycmF5ID0gbmV3IFRZUEVEX0FSUkFZU1sgYXR0cmlidXRlLnR5cGUgXSggYXR0cmlidXRlLmFycmF5ICk7XG5cblx0XHRcdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgga2V5LCBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZS5ub3JtYWxpemVkICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSBqc29uLmRhdGEuZ3JvdXBzIHx8IGpzb24uZGF0YS5kcmF3Y2FsbHMgfHwganNvbi5kYXRhLm9mZnNldHM7XG5cblx0XHRpZiAoIGdyb3VwcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBncm91cHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXG5cdFx0XHRcdGdlb21ldHJ5LmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGJvdW5kaW5nU3BoZXJlID0ganNvbi5kYXRhLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgY2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0aWYgKCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjZW50ZXIuZnJvbUFycmF5KCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoIGNlbnRlciwgYm91bmRpbmdTcGhlcmUucmFkaXVzICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnk7XG5cblx0fVxuXG59ICk7XG5cbnZhciBUWVBFRF9BUlJBWVMgPSB7XG5cdEludDhBcnJheTogSW50OEFycmF5LFxuXHRVaW50OEFycmF5OiBVaW50OEFycmF5LFxuXHQvLyBXb3JrYXJvdW5kIGZvciBJRTExIHByZSBLQjI5Mjk0MzcuIFNlZSAjMTE0NDBcblx0VWludDhDbGFtcGVkQXJyYXk6IHR5cGVvZiBVaW50OENsYW1wZWRBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OENsYW1wZWRBcnJheSA6IFVpbnQ4QXJyYXksXG5cdEludDE2QXJyYXk6IEludDE2QXJyYXksXG5cdFVpbnQxNkFycmF5OiBVaW50MTZBcnJheSxcblx0SW50MzJBcnJheTogSW50MzJBcnJheSxcblx0VWludDMyQXJyYXk6IFVpbnQzMkFycmF5LFxuXHRGbG9hdDMyQXJyYXk6IEZsb2F0MzJBcnJheSxcblx0RmxvYXQ2NEFycmF5OiBGbG9hdDY0QXJyYXlcbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMb2FkZXIoKSB7fVxuXG5Mb2FkZXIuSGFuZGxlcnMgPSB7XG5cblx0aGFuZGxlcnM6IFtdLFxuXG5cdGFkZDogZnVuY3Rpb24gKCByZWdleCwgbG9hZGVyICkge1xuXG5cdFx0dGhpcy5oYW5kbGVycy5wdXNoKCByZWdleCwgbG9hZGVyICk7XG5cblx0fSxcblxuXHRnZXQ6IGZ1bmN0aW9uICggZmlsZSApIHtcblxuXHRcdHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBsOyBpICs9IDIgKSB7XG5cblx0XHRcdHZhciByZWdleCA9IGhhbmRsZXJzWyBpIF07XG5cdFx0XHR2YXIgbG9hZGVyID0gaGFuZGxlcnNbIGkgKyAxIF07XG5cblx0XHRcdGlmICggcmVnZXgudGVzdCggZmlsZSApICkge1xuXG5cdFx0XHRcdHJldHVybiBsb2FkZXI7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH1cblxufTtcblxuT2JqZWN0LmFzc2lnbiggTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGNyb3NzT3JpZ2luOiB1bmRlZmluZWQsXG5cblx0b25Mb2FkU3RhcnQ6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdG9uTG9hZFByb2dyZXNzOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRvbkxvYWRDb21wbGV0ZTogZnVuY3Rpb24gKCkge30sXG5cblx0aW5pdE1hdGVyaWFsczogZnVuY3Rpb24gKCBtYXRlcmlhbHMsIHRleHR1cmVQYXRoLCBjcm9zc09yaWdpbiApIHtcblxuXHRcdHZhciBhcnJheSA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbWF0ZXJpYWxzLmxlbmd0aDsgKysgaSApIHtcblxuXHRcdFx0YXJyYXlbIGkgXSA9IHRoaXMuY3JlYXRlTWF0ZXJpYWwoIG1hdGVyaWFsc1sgaSBdLCB0ZXh0dXJlUGF0aCwgY3Jvc3NPcmlnaW4gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGNyZWF0ZU1hdGVyaWFsOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBCbGVuZGluZ01vZGUgPSB7XG5cdFx0XHROb0JsZW5kaW5nOiBOb0JsZW5kaW5nLFxuXHRcdFx0Tm9ybWFsQmxlbmRpbmc6IE5vcm1hbEJsZW5kaW5nLFxuXHRcdFx0QWRkaXRpdmVCbGVuZGluZzogQWRkaXRpdmVCbGVuZGluZyxcblx0XHRcdFN1YnRyYWN0aXZlQmxlbmRpbmc6IFN1YnRyYWN0aXZlQmxlbmRpbmcsXG5cdFx0XHRNdWx0aXBseUJsZW5kaW5nOiBNdWx0aXBseUJsZW5kaW5nLFxuXHRcdFx0Q3VzdG9tQmxlbmRpbmc6IEN1c3RvbUJsZW5kaW5nXG5cdFx0fTtcblxuXHRcdHZhciBjb2xvciA9IG5ldyBDb2xvcigpO1xuXHRcdHZhciB0ZXh0dXJlTG9hZGVyID0gbmV3IFRleHR1cmVMb2FkZXIoKTtcblx0XHR2YXIgbWF0ZXJpYWxMb2FkZXIgPSBuZXcgTWF0ZXJpYWxMb2FkZXIoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjcmVhdGVNYXRlcmlhbCggbSwgdGV4dHVyZVBhdGgsIGNyb3NzT3JpZ2luICkge1xuXG5cdFx0XHQvLyBjb252ZXJ0IGZyb20gb2xkIG1hdGVyaWFsIGZvcm1hdFxuXG5cdFx0XHR2YXIgdGV4dHVyZXMgPSB7fTtcblxuXHRcdFx0ZnVuY3Rpb24gbG9hZFRleHR1cmUoIHBhdGgsIHJlcGVhdCwgb2Zmc2V0LCB3cmFwLCBhbmlzb3Ryb3B5ICkge1xuXG5cdFx0XHRcdHZhciBmdWxsUGF0aCA9IHRleHR1cmVQYXRoICsgcGF0aDtcblx0XHRcdFx0dmFyIGxvYWRlciA9IExvYWRlci5IYW5kbGVycy5nZXQoIGZ1bGxQYXRoICk7XG5cblx0XHRcdFx0dmFyIHRleHR1cmU7XG5cblx0XHRcdFx0aWYgKCBsb2FkZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlID0gbG9hZGVyLmxvYWQoIGZ1bGxQYXRoICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRleHR1cmVMb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIGNyb3NzT3JpZ2luICk7XG5cdFx0XHRcdFx0dGV4dHVyZSA9IHRleHR1cmVMb2FkZXIubG9hZCggZnVsbFBhdGggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCByZXBlYXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUucmVwZWF0LmZyb21BcnJheSggcmVwZWF0ICk7XG5cblx0XHRcdFx0XHRpZiAoIHJlcGVhdFsgMCBdICE9PSAxICkgdGV4dHVyZS53cmFwUyA9IFJlcGVhdFdyYXBwaW5nO1xuXHRcdFx0XHRcdGlmICggcmVwZWF0WyAxIF0gIT09IDEgKSB0ZXh0dXJlLndyYXBUID0gUmVwZWF0V3JhcHBpbmc7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm9mZnNldC5mcm9tQXJyYXkoIG9mZnNldCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHdyYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGlmICggd3JhcFsgMCBdID09PSAncmVwZWF0JyApIHRleHR1cmUud3JhcFMgPSBSZXBlYXRXcmFwcGluZztcblx0XHRcdFx0XHRpZiAoIHdyYXBbIDAgXSA9PT0gJ21pcnJvcicgKSB0ZXh0dXJlLndyYXBTID0gTWlycm9yZWRSZXBlYXRXcmFwcGluZztcblxuXHRcdFx0XHRcdGlmICggd3JhcFsgMSBdID09PSAncmVwZWF0JyApIHRleHR1cmUud3JhcFQgPSBSZXBlYXRXcmFwcGluZztcblx0XHRcdFx0XHRpZiAoIHdyYXBbIDEgXSA9PT0gJ21pcnJvcicgKSB0ZXh0dXJlLndyYXBUID0gTWlycm9yZWRSZXBlYXRXcmFwcGluZztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBhbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLmFuaXNvdHJvcHkgPSBhbmlzb3Ryb3B5O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgdXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdFx0XHRcdHRleHR1cmVzWyB1dWlkIF0gPSB0ZXh0dXJlO1xuXG5cdFx0XHRcdHJldHVybiB1dWlkO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vXG5cblx0XHRcdHZhciBqc29uID0ge1xuXHRcdFx0XHR1dWlkOiBfTWF0aC5nZW5lcmF0ZVVVSUQoKSxcblx0XHRcdFx0dHlwZTogJ01lc2hMYW1iZXJ0TWF0ZXJpYWwnXG5cdFx0XHR9O1xuXG5cdFx0XHRmb3IgKCB2YXIgbmFtZSBpbiBtICkge1xuXG5cdFx0XHRcdHZhciB2YWx1ZSA9IG1bIG5hbWUgXTtcblxuXHRcdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdFx0Y2FzZSAnRGJnQ29sb3InOlxuXHRcdFx0XHRcdGNhc2UgJ0RiZ0luZGV4Jzpcblx0XHRcdFx0XHRjYXNlICdvcHRpY2FsRGVuc2l0eSc6XG5cdFx0XHRcdFx0Y2FzZSAnaWxsdW1pbmF0aW9uJzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ0RiZ05hbWUnOlxuXHRcdFx0XHRcdFx0anNvbi5uYW1lID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdibGVuZGluZyc6XG5cdFx0XHRcdFx0XHRqc29uLmJsZW5kaW5nID0gQmxlbmRpbmdNb2RlWyB2YWx1ZSBdO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JBbWJpZW50Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbWJpZW50Jzpcblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxvYWRlci5jcmVhdGVNYXRlcmlhbDonLCBuYW1lLCAnaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4nICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb2xvckRpZmZ1c2UnOlxuXHRcdFx0XHRcdFx0anNvbi5jb2xvciA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yU3BlY3VsYXInOlxuXHRcdFx0XHRcdFx0anNvbi5zcGVjdWxhciA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yRW1pc3NpdmUnOlxuXHRcdFx0XHRcdFx0anNvbi5lbWlzc2l2ZSA9IGNvbG9yLmZyb21BcnJheSggdmFsdWUgKS5nZXRIZXgoKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3NwZWN1bGFyQ29lZic6XG5cdFx0XHRcdFx0XHRqc29uLnNoaW5pbmVzcyA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnc2hhZGluZyc6XG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICdiYXNpYycgKSBqc29uLnR5cGUgPSAnTWVzaEJhc2ljTWF0ZXJpYWwnO1xuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAncGhvbmcnICkganNvbi50eXBlID0gJ01lc2hQaG9uZ01hdGVyaWFsJztcblx0XHRcdFx0XHRcdGlmICggdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N0YW5kYXJkJyApIGpzb24udHlwZSA9ICdNZXNoU3RhbmRhcmRNYXRlcmlhbCc7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlJzpcblx0XHRcdFx0XHRcdGpzb24ubWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcERpZmZ1c2VSZXBlYXQsIG0ubWFwRGlmZnVzZU9mZnNldCwgbS5tYXBEaWZmdXNlV3JhcCwgbS5tYXBEaWZmdXNlQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZVJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZU9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZVdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcERpZmZ1c2VBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlJzpcblx0XHRcdFx0XHRcdGpzb24uZW1pc3NpdmVNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwRW1pc3NpdmVSZXBlYXQsIG0ubWFwRW1pc3NpdmVPZmZzZXQsIG0ubWFwRW1pc3NpdmVXcmFwLCBtLm1hcEVtaXNzaXZlQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmVSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBFbWlzc2l2ZVdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodCc6XG5cdFx0XHRcdFx0XHRqc29uLmxpZ2h0TWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcExpZ2h0UmVwZWF0LCBtLm1hcExpZ2h0T2Zmc2V0LCBtLm1hcExpZ2h0V3JhcCwgbS5tYXBMaWdodEFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0UmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodE9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTGlnaHRXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodEFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU8nOlxuXHRcdFx0XHRcdFx0anNvbi5hb01hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBBT1JlcGVhdCwgbS5tYXBBT09mZnNldCwgbS5tYXBBT1dyYXAsIG0ubWFwQU9Bbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBBT1JlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU9PZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFPV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU9Bbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXAnOlxuXHRcdFx0XHRcdFx0anNvbi5idW1wTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEJ1bXBSZXBlYXQsIG0ubWFwQnVtcE9mZnNldCwgbS5tYXBCdW1wV3JhcCwgbS5tYXBCdW1wQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcFNjYWxlJzpcblx0XHRcdFx0XHRcdGpzb24uYnVtcFNjYWxlID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcEFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsJzpcblx0XHRcdFx0XHRcdGpzb24ubm9ybWFsTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcE5vcm1hbFJlcGVhdCwgbS5tYXBOb3JtYWxPZmZzZXQsIG0ubWFwTm9ybWFsV3JhcCwgbS5tYXBOb3JtYWxBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxGYWN0b3InOlxuXHRcdFx0XHRcdFx0anNvbi5ub3JtYWxTY2FsZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbFdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbEFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXInOlxuXHRcdFx0XHRcdFx0anNvbi5zcGVjdWxhck1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBTcGVjdWxhclJlcGVhdCwgbS5tYXBTcGVjdWxhck9mZnNldCwgbS5tYXBTcGVjdWxhcldyYXAsIG0ubWFwU3BlY3VsYXJBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhclJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXJPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFNwZWN1bGFyV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXJBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzcyc6XG5cdFx0XHRcdFx0XHRqc29uLm1ldGFsbmVzc01hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBNZXRhbG5lc3NSZXBlYXQsIG0ubWFwTWV0YWxuZXNzT2Zmc2V0LCBtLm1hcE1ldGFsbmVzc1dyYXAsIG0ubWFwTWV0YWxuZXNzQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBNZXRhbG5lc3NPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzc1dyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzc0FuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzJzpcblx0XHRcdFx0XHRcdGpzb24ucm91Z2huZXNzTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcFJvdWdobmVzc1JlcGVhdCwgbS5tYXBSb3VnaG5lc3NPZmZzZXQsIG0ubWFwUm91Z2huZXNzV3JhcCwgbS5tYXBSb3VnaG5lc3NBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3NSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFJvdWdobmVzc09mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYSc6XG5cdFx0XHRcdFx0XHRqc29uLmFscGhhTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEFscGhhUmVwZWF0LCBtLm1hcEFscGhhT2Zmc2V0LCBtLm1hcEFscGhhV3JhcCwgbS5tYXBBbHBoYUFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYU9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQWxwaGFXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYUFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZmxpcFNpZGVkJzpcblx0XHRcdFx0XHRcdGpzb24uc2lkZSA9IEJhY2tTaWRlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZG91YmxlU2lkZWQnOlxuXHRcdFx0XHRcdFx0anNvbi5zaWRlID0gRG91YmxlU2lkZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3RyYW5zcGFyZW5jeSc6XG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6IHRyYW5zcGFyZW5jeSBoYXMgYmVlbiByZW5hbWVkIHRvIG9wYWNpdHknICk7XG5cdFx0XHRcdFx0XHRqc29uLm9wYWNpdHkgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2RlcHRoVGVzdCc6XG5cdFx0XHRcdFx0Y2FzZSAnZGVwdGhXcml0ZSc6XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JXcml0ZSc6XG5cdFx0XHRcdFx0Y2FzZSAnb3BhY2l0eSc6XG5cdFx0XHRcdFx0Y2FzZSAncmVmbGVjdGl2aXR5Jzpcblx0XHRcdFx0XHRjYXNlICd0cmFuc3BhcmVudCc6XG5cdFx0XHRcdFx0Y2FzZSAndmlzaWJsZSc6XG5cdFx0XHRcdFx0Y2FzZSAnd2lyZWZyYW1lJzpcblx0XHRcdFx0XHRcdGpzb25bIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmVydGV4Q29sb3JzJzpcblx0XHRcdFx0XHRcdGlmICggdmFsdWUgPT09IHRydWUgKSBqc29uLnZlcnRleENvbG9ycyA9IFZlcnRleENvbG9ycztcblx0XHRcdFx0XHRcdGlmICggdmFsdWUgPT09ICdmYWNlJyApIGpzb24udmVydGV4Q29sb3JzID0gRmFjZUNvbG9ycztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTG9hZGVyLmNyZWF0ZU1hdGVyaWFsOiBVbnN1cHBvcnRlZCcsIG5hbWUsIHZhbHVlICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLnR5cGUgPT09ICdNZXNoQmFzaWNNYXRlcmlhbCcgKSBkZWxldGUganNvbi5lbWlzc2l2ZTtcblx0XHRcdGlmICgganNvbi50eXBlICE9PSAnTWVzaFBob25nTWF0ZXJpYWwnICkgZGVsZXRlIGpzb24uc3BlY3VsYXI7XG5cblx0XHRcdGlmICgganNvbi5vcGFjaXR5IDwgMSApIGpzb24udHJhbnNwYXJlbnQgPSB0cnVlO1xuXG5cdFx0XHRtYXRlcmlhbExvYWRlci5zZXRUZXh0dXJlcyggdGV4dHVyZXMgKTtcblxuXHRcdFx0cmV0dXJuIG1hdGVyaWFsTG9hZGVyLnBhcnNlKCBqc29uICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIERvbiBNY0N1cmR5IC8gaHR0cHM6Ly93d3cuZG9ubWNjdXJkeS5jb21cbiAqL1xuXG52YXIgTG9hZGVyVXRpbHMgPSB7XG5cblx0ZGVjb2RlVGV4dDogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdGlmICggdHlwZW9mIFRleHREZWNvZGVyICE9PSAndW5kZWZpbmVkJyApIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZSggYXJyYXkgKTtcblxuXHRcdH1cblxuXHRcdC8vIEF2b2lkIHRoZSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5KSBzaG9ydGN1dCwgd2hpY2hcblx0XHQvLyB0aHJvd3MgYSBcIm1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIgZXJyb3IgZm9yIGxhcmdlIGFycmF5cy5cblxuXHRcdHZhciBzID0gJyc7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gYXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdC8vIEltcGxpY2l0bHkgYXNzdW1lcyBsaXR0bGUtZW5kaWFuLlxuXHRcdFx0cyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCBhcnJheVsgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvLyBNZXJnZXMgbXVsdGktYnl0ZSB1dGYtOCBjaGFyYWN0ZXJzLlxuXHRcdHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoIGVzY2FwZSggcyApICk7XG5cblx0fSxcblxuXHRleHRyYWN0VXJsQmFzZTogZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHR2YXIgaW5kZXggPSB1cmwubGFzdEluZGV4T2YoICcvJyApO1xuXG5cdFx0aWYgKCBpbmRleCA9PT0gLSAxICkgcmV0dXJuICcuLyc7XG5cblx0XHRyZXR1cm4gdXJsLnN1YnN0ciggMCwgaW5kZXggKyAxICk7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEpTT05Mb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0aWYgKCB0eXBlb2YgbWFuYWdlciA9PT0gJ2Jvb2xlYW4nICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSlNPTkxvYWRlcjogc2hvd1N0YXR1cyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGNvbnN0cnVjdG9yLicgKTtcblx0XHRtYW5hZ2VyID0gdW5kZWZpbmVkO1xuXG5cdH1cblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxuXHR0aGlzLndpdGhDcmVkZW50aWFscyA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEpTT05Mb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgdGV4dHVyZVBhdGggPSB0aGlzLnRleHR1cmVQYXRoICYmICggdHlwZW9mIHRoaXMudGV4dHVyZVBhdGggPT09ICdzdHJpbmcnICkgPyB0aGlzLnRleHR1cmVQYXRoIDogTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoIHVybCApO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dmFyIGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7XG5cdFx0XHR2YXIgbWV0YWRhdGEgPSBqc29uLm1ldGFkYXRhO1xuXG5cdFx0XHRpZiAoIG1ldGFkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dmFyIHR5cGUgPSBtZXRhZGF0YS50eXBlO1xuXG5cdFx0XHRcdGlmICggdHlwZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCB0eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdvYmplY3QnICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuSlNPTkxvYWRlcjogJyArIHVybCArICcgc2hvdWxkIGJlIGxvYWRlZCB3aXRoIFRIUkVFLk9iamVjdExvYWRlciBpbnN0ZWFkLicgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG9iamVjdCA9IHNjb3BlLnBhcnNlKCBqc29uLCB0ZXh0dXJlUGF0aCApO1xuXHRcdFx0b25Mb2FkKCBvYmplY3QuZ2VvbWV0cnksIG9iamVjdC5tYXRlcmlhbHMgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHNldFRleHR1cmVQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy50ZXh0dXJlUGF0aCA9IHZhbHVlO1xuXG5cdH0sXG5cblx0cGFyc2U6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0ZnVuY3Rpb24gcGFyc2VNb2RlbCgganNvbiwgZ2VvbWV0cnkgKSB7XG5cblx0XHRcdGZ1bmN0aW9uIGlzQml0U2V0KCB2YWx1ZSwgcG9zaXRpb24gKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlICYgKCAxIDw8IHBvc2l0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGksIGosIGZpLFxuXG5cdFx0XHRcdG9mZnNldCwgekxlbmd0aCxcblxuXHRcdFx0XHRjb2xvckluZGV4LCBub3JtYWxJbmRleCwgdXZJbmRleCwgbWF0ZXJpYWxJbmRleCxcblxuXHRcdFx0XHR0eXBlLFxuXHRcdFx0XHRpc1F1YWQsXG5cdFx0XHRcdGhhc01hdGVyaWFsLFxuXHRcdFx0XHRoYXNGYWNlVmVydGV4VXYsXG5cdFx0XHRcdGhhc0ZhY2VOb3JtYWwsIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwsXG5cdFx0XHRcdGhhc0ZhY2VDb2xvciwgaGFzRmFjZVZlcnRleENvbG9yLFxuXG5cdFx0XHRcdHZlcnRleCwgZmFjZSwgZmFjZUEsIGZhY2VCLCBoZXgsIG5vcm1hbCxcblxuXHRcdFx0XHR1dkxheWVyLCB1diwgdSwgdixcblxuXHRcdFx0XHRmYWNlcyA9IGpzb24uZmFjZXMsXG5cdFx0XHRcdHZlcnRpY2VzID0ganNvbi52ZXJ0aWNlcyxcblx0XHRcdFx0bm9ybWFscyA9IGpzb24ubm9ybWFscyxcblx0XHRcdFx0Y29sb3JzID0ganNvbi5jb2xvcnMsXG5cblx0XHRcdFx0c2NhbGUgPSBqc29uLnNjYWxlLFxuXG5cdFx0XHRcdG5VdkxheWVycyA9IDA7XG5cblxuXHRcdFx0aWYgKCBqc29uLnV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIGRpc3JlZ2FyZCBlbXB0eSBhcnJheXNcblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGpzb24udXZzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGlmICgganNvbi51dnNbIGkgXS5sZW5ndGggKSBuVXZMYXllcnMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgblV2TGF5ZXJzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdID0gW107XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdG9mZnNldCA9IDA7XG5cdFx0XHR6TGVuZ3RoID0gdmVydGljZXMubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldCA8IHpMZW5ndGggKSB7XG5cblx0XHRcdFx0dmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlO1xuXHRcdFx0XHR2ZXJ0ZXgueSA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlO1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHZlcnRpY2VzWyBvZmZzZXQgKysgXSAqIHNjYWxlO1xuXG5cdFx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzLnB1c2goIHZlcnRleCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdG9mZnNldCA9IDA7XG5cdFx0XHR6TGVuZ3RoID0gZmFjZXMubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldCA8IHpMZW5ndGggKSB7XG5cblx0XHRcdFx0dHlwZSA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRpc1F1YWQgPSBpc0JpdFNldCggdHlwZSwgMCApO1xuXHRcdFx0XHRoYXNNYXRlcmlhbCA9IGlzQml0U2V0KCB0eXBlLCAxICk7XG5cdFx0XHRcdGhhc0ZhY2VWZXJ0ZXhVdiA9IGlzQml0U2V0KCB0eXBlLCAzICk7XG5cdFx0XHRcdGhhc0ZhY2VOb3JtYWwgPSBpc0JpdFNldCggdHlwZSwgNCApO1xuXHRcdFx0XHRoYXNGYWNlVmVydGV4Tm9ybWFsID0gaXNCaXRTZXQoIHR5cGUsIDUgKTtcblx0XHRcdFx0aGFzRmFjZUNvbG9yID0gaXNCaXRTZXQoIHR5cGUsIDYgKTtcblx0XHRcdFx0aGFzRmFjZVZlcnRleENvbG9yID0gaXNCaXRTZXQoIHR5cGUsIDcgKTtcblxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcInR5cGVcIiwgdHlwZSwgXCJiaXRzXCIsIGlzUXVhZCwgaGFzTWF0ZXJpYWwsIGhhc0ZhY2VWZXJ0ZXhVdiwgaGFzRmFjZU5vcm1hbCwgaGFzRmFjZVZlcnRleE5vcm1hbCwgaGFzRmFjZUNvbG9yLCBoYXNGYWNlVmVydGV4Q29sb3IpO1xuXG5cdFx0XHRcdGlmICggaXNRdWFkICkge1xuXG5cdFx0XHRcdFx0ZmFjZUEgPSBuZXcgRmFjZTMoKTtcblx0XHRcdFx0XHRmYWNlQS5hID0gZmFjZXNbIG9mZnNldCBdO1xuXHRcdFx0XHRcdGZhY2VBLmIgPSBmYWNlc1sgb2Zmc2V0ICsgMSBdO1xuXHRcdFx0XHRcdGZhY2VBLmMgPSBmYWNlc1sgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0XHRcdFx0ZmFjZUIgPSBuZXcgRmFjZTMoKTtcblx0XHRcdFx0XHRmYWNlQi5hID0gZmFjZXNbIG9mZnNldCArIDEgXTtcblx0XHRcdFx0XHRmYWNlQi5iID0gZmFjZXNbIG9mZnNldCArIDIgXTtcblx0XHRcdFx0XHRmYWNlQi5jID0gZmFjZXNbIG9mZnNldCArIDMgXTtcblxuXHRcdFx0XHRcdG9mZnNldCArPSA0O1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdFx0bWF0ZXJpYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdGZhY2VBLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4O1xuXHRcdFx0XHRcdFx0ZmFjZUIubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXg7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB0byBnZXQgZmFjZSA8PT4gdXYgaW5kZXggY29ycmVzcG9uZGVuY2VcblxuXHRcdFx0XHRcdGZpID0gZ2VvbWV0cnkuZmFjZXMubGVuZ3RoO1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgblV2TGF5ZXJzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHV2TGF5ZXIgPSBqc29uLnV2c1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpICsgMSBdID0gW107XG5cblx0XHRcdFx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCA0OyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0dXZJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHUgPSB1dkxheWVyWyB1dkluZGV4ICogMiBdO1xuXHRcdFx0XHRcdFx0XHRcdHYgPSB1dkxheWVyWyB1dkluZGV4ICogMiArIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHV2ID0gbmV3IFZlY3RvcjIoIHUsIHYgKTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggaiAhPT0gMiApIGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXS5wdXNoKCB1diApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggaiAhPT0gMCApIGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgKyAxIF0ucHVzaCggdXYgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZU5vcm1hbCApIHtcblxuXHRcdFx0XHRcdFx0bm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzO1xuXG5cdFx0XHRcdFx0XHRmYWNlQS5ub3JtYWwuc2V0KFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCBdXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRmYWNlQi5ub3JtYWwuY29weSggZmFjZUEubm9ybWFsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgNDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7XG5cblx0XHRcdFx0XHRcdFx0bm9ybWFsID0gbmV3IFZlY3RvcjMoXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4IF1cblx0XHRcdFx0XHRcdFx0KTtcblxuXG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMiApIGZhY2VBLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMCApIGZhY2VCLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlQ29sb3IgKSB7XG5cblx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRoZXggPSBjb2xvcnNbIGNvbG9ySW5kZXggXTtcblxuXHRcdFx0XHRcdFx0ZmFjZUEuY29sb3Iuc2V0SGV4KCBoZXggKTtcblx0XHRcdFx0XHRcdGZhY2VCLmNvbG9yLnNldEhleCggaGV4ICk7XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleENvbG9yICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IDQ7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdFx0aGV4ID0gY29sb3JzWyBjb2xvckluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpICE9PSAyICkgZmFjZUEudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggaGV4ICkgKTtcblx0XHRcdFx0XHRcdFx0aWYgKCBpICE9PSAwICkgZmFjZUIudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggaGV4ICkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZXMucHVzaCggZmFjZUEgKTtcblx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlcy5wdXNoKCBmYWNlQiApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmYWNlID0gbmV3IEZhY2UzKCk7XG5cdFx0XHRcdFx0ZmFjZS5hID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdGZhY2UuYiA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRmYWNlLmMgPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0XHRpZiAoIGhhc01hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0XHRtYXRlcmlhbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0ZmFjZS5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleDtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHRvIGdldCBmYWNlIDw9PiB1diBpbmRleCBjb3JyZXNwb25kZW5jZVxuXG5cdFx0XHRcdFx0ZmkgPSBnZW9tZXRyeS5mYWNlcy5sZW5ndGg7XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBuVXZMYXllcnM7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dXZMYXllciA9IGpzb24udXZzWyBpIF07XG5cblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdID0gW107XG5cblx0XHRcdFx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0dXZJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHUgPSB1dkxheWVyWyB1dkluZGV4ICogMiBdO1xuXHRcdFx0XHRcdFx0XHRcdHYgPSB1dkxheWVyWyB1dkluZGV4ICogMiArIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRcdHV2ID0gbmV3IFZlY3RvcjIoIHUsIHYgKTtcblxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXS5wdXNoKCB1diApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlTm9ybWFsICkge1xuXG5cdFx0XHRcdFx0XHRub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7XG5cblx0XHRcdFx0XHRcdGZhY2Uubm9ybWFsLnNldChcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggXVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCAzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdG5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdICogMztcblxuXHRcdFx0XHRcdFx0XHRub3JtYWwgPSBuZXcgVmVjdG9yMyhcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggXVxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdGZhY2UudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VDb2xvciApIHtcblxuXHRcdFx0XHRcdFx0Y29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdGZhY2UuY29sb3Iuc2V0SGV4KCBjb2xvcnNbIGNvbG9ySW5kZXggXSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhDb2xvciApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCAzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRcdGZhY2UudmVydGV4Q29sb3JzLnB1c2goIG5ldyBDb2xvciggY29sb3JzWyBjb2xvckluZGV4IF0gKSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlcy5wdXNoKCBmYWNlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBwYXJzZVNraW4oIGpzb24sIGdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgaW5mbHVlbmNlc1BlclZlcnRleCA9ICgganNvbi5pbmZsdWVuY2VzUGVyVmVydGV4ICE9PSB1bmRlZmluZWQgKSA/IGpzb24uaW5mbHVlbmNlc1BlclZlcnRleCA6IDI7XG5cblx0XHRcdGlmICgganNvbi5za2luV2VpZ2h0cyApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnNraW5XZWlnaHRzLmxlbmd0aDsgaSA8IGw7IGkgKz0gaW5mbHVlbmNlc1BlclZlcnRleCApIHtcblxuXHRcdFx0XHRcdHZhciB4ID0ganNvbi5za2luV2VpZ2h0c1sgaSBdO1xuXHRcdFx0XHRcdHZhciB5ID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMSApID8ganNvbi5za2luV2VpZ2h0c1sgaSArIDEgXSA6IDA7XG5cdFx0XHRcdFx0dmFyIHogPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAyICkgPyBqc29uLnNraW5XZWlnaHRzWyBpICsgMiBdIDogMDtcblx0XHRcdFx0XHR2YXIgdyA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDMgKSA/IGpzb24uc2tpbldlaWdodHNbIGkgKyAzIF0gOiAwO1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuc2tpbldlaWdodHMucHVzaCggbmV3IFZlY3RvcjQoIHgsIHksIHosIHcgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGpzb24uc2tpbkluZGljZXMgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5za2luSW5kaWNlcy5sZW5ndGg7IGkgPCBsOyBpICs9IGluZmx1ZW5jZXNQZXJWZXJ0ZXggKSB7XG5cblx0XHRcdFx0XHR2YXIgYSA9IGpzb24uc2tpbkluZGljZXNbIGkgXTtcblx0XHRcdFx0XHR2YXIgYiA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDEgKSA/IGpzb24uc2tpbkluZGljZXNbIGkgKyAxIF0gOiAwO1xuXHRcdFx0XHRcdHZhciBjID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMiApID8ganNvbi5za2luSW5kaWNlc1sgaSArIDIgXSA6IDA7XG5cdFx0XHRcdFx0dmFyIGQgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAzICkgPyBqc29uLnNraW5JbmRpY2VzWyBpICsgMyBdIDogMDtcblxuXHRcdFx0XHRcdGdlb21ldHJ5LnNraW5JbmRpY2VzLnB1c2goIG5ldyBWZWN0b3I0KCBhLCBiLCBjLCBkICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkuYm9uZXMgPSBqc29uLmJvbmVzO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvbmVzICYmIGdlb21ldHJ5LmJvbmVzLmxlbmd0aCA+IDAgJiYgKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggIT09IGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCB8fCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggIT09IGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCApICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1doZW4gc2tpbm5pbmcsIG51bWJlciBvZiB2ZXJ0aWNlcyAoJyArIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCArICcpLCBza2luSW5kaWNlcyAoJyArXG5cdFx0XHRcdFx0Z2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoICsgJyksIGFuZCBza2luV2VpZ2h0cyAoJyArIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCArICcpIHNob3VsZCBtYXRjaC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHBhcnNlTW9ycGhpbmcoIGpzb24sIGdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgc2NhbGUgPSBqc29uLnNjYWxlO1xuXG5cdFx0XHRpZiAoIGpzb24ubW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdID0ge307XG5cdFx0XHRcdFx0Z2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0ubmFtZSA9IGpzb24ubW9ycGhUYXJnZXRzWyBpIF0ubmFtZTtcblx0XHRcdFx0XHRnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcyA9IFtdO1xuXG5cdFx0XHRcdFx0dmFyIGRzdFZlcnRpY2VzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7XG5cdFx0XHRcdFx0dmFyIHNyY1ZlcnRpY2VzID0ganNvbi5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcztcblxuXHRcdFx0XHRcdGZvciAoIHZhciB2ID0gMCwgdmwgPSBzcmNWZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArPSAzICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdFx0XHRcdHZlcnRleC54ID0gc3JjVmVydGljZXNbIHYgXSAqIHNjYWxlO1xuXHRcdFx0XHRcdFx0dmVydGV4LnkgPSBzcmNWZXJ0aWNlc1sgdiArIDEgXSAqIHNjYWxlO1xuXHRcdFx0XHRcdFx0dmVydGV4LnogPSBzcmNWZXJ0aWNlc1sgdiArIDIgXSAqIHNjYWxlO1xuXG5cdFx0XHRcdFx0XHRkc3RWZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXggKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLm1vcnBoQ29sb3JzICE9PSB1bmRlZmluZWQgJiYganNvbi5tb3JwaENvbG9ycy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkpTT05Mb2FkZXI6IFwibW9ycGhDb2xvcnNcIiBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2luZyB0aGVtIGFzIGZhY2UgY29sb3JzLicgKTtcblxuXHRcdFx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblx0XHRcdFx0dmFyIG1vcnBoQ29sb3JzID0ganNvbi5tb3JwaENvbG9yc1sgMCBdLmNvbG9ycztcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZmFjZXNbIGkgXS5jb2xvci5mcm9tQXJyYXkoIG1vcnBoQ29sb3JzLCBpICogMyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcGFyc2VBbmltYXRpb25zKCBqc29uLCBnZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIG91dHB1dEFuaW1hdGlvbnMgPSBbXTtcblxuXHRcdFx0Ly8gcGFyc2Ugb2xkIHN0eWxlIEJvbmUvSGllcmFyY2h5IGFuaW1hdGlvbnNcblx0XHRcdHZhciBhbmltYXRpb25zID0gW107XG5cblx0XHRcdGlmICgganNvbi5hbmltYXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhbmltYXRpb25zLnB1c2goIGpzb24uYW5pbWF0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLmFuaW1hdGlvbnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGpzb24uYW5pbWF0aW9ucy5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHRhbmltYXRpb25zID0gYW5pbWF0aW9ucy5jb25jYXQoIGpzb24uYW5pbWF0aW9ucyApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRhbmltYXRpb25zLnB1c2goIGpzb24uYW5pbWF0aW9ucyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBhbmltYXRpb25zLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2VBbmltYXRpb24oIGFuaW1hdGlvbnNbIGkgXSwgZ2VvbWV0cnkuYm9uZXMgKTtcblx0XHRcdFx0aWYgKCBjbGlwICkgb3V0cHV0QW5pbWF0aW9ucy5wdXNoKCBjbGlwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gcGFyc2UgaW1wbGljaXQgbW9ycGggYW5pbWF0aW9uc1xuXHRcdFx0aWYgKCBnZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0Ly8gVE9ETzogRmlndXJlIG91dCB3aGF0IGFuIGFwcHJvcHJhaXRlIEZQUyBpcyBmb3IgbW9ycGggdGFyZ2V0IGFuaW1hdGlvbnMgLS0gZGVmYXVsdGluZyB0byAxMCwgYnV0IHJlYWxseSBpdCBpcyBjb21wbGV0ZWx5IGFyYml0cmFyeS5cblx0XHRcdFx0dmFyIG1vcnBoQW5pbWF0aW9uQ2xpcHMgPSBBbmltYXRpb25DbGlwLkNyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzKCBnZW9tZXRyeS5tb3JwaFRhcmdldHMsIDEwICk7XG5cdFx0XHRcdG91dHB1dEFuaW1hdGlvbnMgPSBvdXRwdXRBbmltYXRpb25zLmNvbmNhdCggbW9ycGhBbmltYXRpb25DbGlwcyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggb3V0cHV0QW5pbWF0aW9ucy5sZW5ndGggPiAwICkgZ2VvbWV0cnkuYW5pbWF0aW9ucyA9IG91dHB1dEFuaW1hdGlvbnM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcGFyc2UoIGpzb24sIHRleHR1cmVQYXRoICkge1xuXG5cdFx0XHRpZiAoIGpzb24uZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEdlb21ldHJ5IDQuMCBzcGVjXG5cdFx0XHRcdGpzb24gPSBqc29uLmRhdGE7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLnNjYWxlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0anNvbi5zY2FsZSA9IDEuMCAvIGpzb24uc2NhbGU7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0anNvbi5zY2FsZSA9IDEuMDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cnkoKTtcblxuXHRcdFx0cGFyc2VNb2RlbCgganNvbiwgZ2VvbWV0cnkgKTtcblx0XHRcdHBhcnNlU2tpbigganNvbiwgZ2VvbWV0cnkgKTtcblx0XHRcdHBhcnNlTW9ycGhpbmcoIGpzb24sIGdlb21ldHJ5ICk7XG5cdFx0XHRwYXJzZUFuaW1hdGlvbnMoIGpzb24sIGdlb21ldHJ5ICk7XG5cblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdGlmICgganNvbi5tYXRlcmlhbHMgPT09IHVuZGVmaW5lZCB8fCBqc29uLm1hdGVyaWFscy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHsgZ2VvbWV0cnk6IGdlb21ldHJ5IH07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIG1hdGVyaWFscyA9IExvYWRlci5wcm90b3R5cGUuaW5pdE1hdGVyaWFscygganNvbi5tYXRlcmlhbHMsIHRleHR1cmVQYXRoLCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0XHRcdFx0cmV0dXJuIHsgZ2VvbWV0cnk6IGdlb21ldHJ5LCBtYXRlcmlhbHM6IG1hdGVyaWFscyB9O1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIE9iamVjdExvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblx0dGhpcy50ZXh0dXJlUGF0aCA9ICcnO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIE9iamVjdExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0aWYgKCB0aGlzLnRleHR1cmVQYXRoID09PSAnJyApIHtcblxuXHRcdFx0dGhpcy50ZXh0dXJlUGF0aCA9IHVybC5zdWJzdHJpbmcoIDAsIHVybC5sYXN0SW5kZXhPZiggJy8nICkgKyAxICk7XG5cblx0XHR9XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHR2YXIganNvbiA9IG51bGw7XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0XHRcdGlmICggb25FcnJvciAhPT0gdW5kZWZpbmVkICkgb25FcnJvciggZXJyb3IgKTtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUU6T2JqZWN0TG9hZGVyOiBDYW5cXCd0IHBhcnNlICcgKyB1cmwgKyAnLicsIGVycm9yLm1lc3NhZ2UgKTtcblxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1ldGFkYXRhID0ganNvbi5tZXRhZGF0YTtcblxuXHRcdFx0aWYgKCBtZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdnZW9tZXRyeScgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdExvYWRlcjogQ2FuXFwndCBsb2FkICcgKyB1cmwgKyAnLiBVc2UgVEhSRUUuSlNPTkxvYWRlciBpbnN0ZWFkLicgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHNjb3BlLnBhcnNlKCBqc29uLCBvbkxvYWQgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHNldFRleHR1cmVQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy50ZXh0dXJlUGF0aCA9IHZhbHVlO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uLCBvbkxvYWQgKSB7XG5cblx0XHR2YXIgc2hhcGVzID0gdGhpcy5wYXJzZVNoYXBlKCBqc29uLnNoYXBlcyApO1xuXHRcdHZhciBnZW9tZXRyaWVzID0gdGhpcy5wYXJzZUdlb21ldHJpZXMoIGpzb24uZ2VvbWV0cmllcywgc2hhcGVzICk7XG5cblx0XHR2YXIgaW1hZ2VzID0gdGhpcy5wYXJzZUltYWdlcygganNvbi5pbWFnZXMsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIG9uTG9hZCggb2JqZWN0ICk7XG5cblx0XHR9ICk7XG5cblx0XHR2YXIgdGV4dHVyZXMgPSB0aGlzLnBhcnNlVGV4dHVyZXMoIGpzb24udGV4dHVyZXMsIGltYWdlcyApO1xuXHRcdHZhciBtYXRlcmlhbHMgPSB0aGlzLnBhcnNlTWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZXMgKTtcblxuXHRcdHZhciBvYmplY3QgPSB0aGlzLnBhcnNlT2JqZWN0KCBqc29uLm9iamVjdCwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICk7XG5cblx0XHRpZiAoIGpzb24uYW5pbWF0aW9ucyApIHtcblxuXHRcdFx0b2JqZWN0LmFuaW1hdGlvbnMgPSB0aGlzLnBhcnNlQW5pbWF0aW9ucygganNvbi5hbmltYXRpb25zICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uaW1hZ2VzID09PSB1bmRlZmluZWQgfHwganNvbi5pbWFnZXMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgb25Mb2FkKCBvYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBvYmplY3Q7XG5cblx0fSxcblxuXHRwYXJzZVNoYXBlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgc2hhcGVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBzaGFwZSA9IG5ldyBTaGFwZSgpLmZyb21KU09OKCBqc29uWyBpIF0gKTtcblxuXHRcdFx0XHRzaGFwZXNbIHNoYXBlLnV1aWQgXSA9IHNoYXBlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdH0sXG5cblx0cGFyc2VHZW9tZXRyaWVzOiBmdW5jdGlvbiAoIGpzb24sIHNoYXBlcyApIHtcblxuXHRcdHZhciBnZW9tZXRyaWVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5TG9hZGVyID0gbmV3IEpTT05Mb2FkZXIoKTtcblx0XHRcdHZhciBidWZmZXJHZW9tZXRyeUxvYWRlciA9IG5ldyBCdWZmZXJHZW9tZXRyeUxvYWRlcigpO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5O1xuXHRcdFx0XHR2YXIgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7XG5cblx0XHRcdFx0XHRjYXNlICdQbGFuZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdQbGFuZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQm94R2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0JveEJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdDdWJlR2VvbWV0cnknOiAvLyBiYWNrd2FyZHMgY29tcGF0aWJsZVxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEuZGVwdGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGhTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXB0aFNlZ21lbnRzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0NpcmNsZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdDaXJjbGVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5zZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0N5bGluZGVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0N5bGluZGVyQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXNUb3AsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzQm90dG9tLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vcGVuRW5kZWQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdDb25lR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0NvbmVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEub3BlbkVuZGVkLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnU3BoZXJlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1NwaGVyZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpTGVuZ3RoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnRG9kZWNhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0RvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdJY29zYWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdPY3RhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ09jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVGV0cmFoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXRhaWxcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnUmluZ0dlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdSaW5nQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5pbm5lclJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vdXRlclJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaVNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50dWJlLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YnVsYXJTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5hcmNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNLbm90R2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1RvcnVzS25vdEJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YmUsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHVidWxhclNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnAsXG5cdFx0XHRcdFx0XHRcdGRhdGEucVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdMYXRoZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdMYXRoZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucG9pbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdQb2x5aGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1BvbHloZWRyb25CdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnZlcnRpY2VzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmluZGljZXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRldGFpbHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnU2hhcGVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnU2hhcGVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdHZhciBnZW9tZXRyeVNoYXBlcyA9IFtdO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZGF0YS5zaGFwZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIHNoYXBlID0gc2hhcGVzWyBkYXRhLnNoYXBlc1sgaiBdIF07XG5cblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnlTaGFwZXMucHVzaCggc2hhcGUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnlTaGFwZXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuY3VydmVTZWdtZW50c1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gYnVmZmVyR2VvbWV0cnlMb2FkZXIucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gZ2VvbWV0cnlMb2FkZXIucGFyc2UoIGRhdGEsIHRoaXMudGV4dHVyZVBhdGggKS5nZW9tZXRyeTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuc3VwcG9ydGVkIGdlb21ldHJ5IHR5cGUgXCInICsgZGF0YS50eXBlICsgJ1wiJyApO1xuXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z2VvbWV0cnkudXVpZCA9IGRhdGEudXVpZDtcblxuXHRcdFx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgZ2VvbWV0cnkubmFtZSA9IGRhdGEubmFtZTtcblxuXHRcdFx0XHRnZW9tZXRyaWVzWyBkYXRhLnV1aWQgXSA9IGdlb21ldHJ5O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cmllcztcblxuXHR9LFxuXG5cdHBhcnNlTWF0ZXJpYWxzOiBmdW5jdGlvbiAoIGpzb24sIHRleHR1cmVzICkge1xuXG5cdFx0dmFyIG1hdGVyaWFscyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBsb2FkZXIgPSBuZXcgTWF0ZXJpYWxMb2FkZXIoKTtcblx0XHRcdGxvYWRlci5zZXRUZXh0dXJlcyggdGV4dHVyZXMgKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBkYXRhID0ganNvblsgaSBdO1xuXG5cdFx0XHRcdGlmICggZGF0YS50eXBlID09PSAnTXVsdGlNYXRlcmlhbCcgKSB7XG5cblx0XHRcdFx0XHQvLyBEZXByZWNhdGVkXG5cblx0XHRcdFx0XHR2YXIgYXJyYXkgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IGRhdGEubWF0ZXJpYWxzLmxlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0YXJyYXkucHVzaCggbG9hZGVyLnBhcnNlKCBkYXRhLm1hdGVyaWFsc1sgaiBdICkgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1hdGVyaWFsc1sgZGF0YS51dWlkIF0gPSBhcnJheTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0bWF0ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGxvYWRlci5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGVyaWFscztcblxuXHR9LFxuXG5cdHBhcnNlQW5pbWF0aW9uczogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIGFuaW1hdGlvbnMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2UoIGpzb25bIGkgXSApO1xuXG5cdFx0XHRhbmltYXRpb25zLnB1c2goIGNsaXAgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhbmltYXRpb25zO1xuXG5cdH0sXG5cblx0cGFyc2VJbWFnZXM6IGZ1bmN0aW9uICgganNvbiwgb25Mb2FkICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblx0XHR2YXIgaW1hZ2VzID0ge307XG5cblx0XHRmdW5jdGlvbiBsb2FkSW1hZ2UoIHVybCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRyZXR1cm4gbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgJiYganNvbi5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgbWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlciggb25Mb2FkICk7XG5cblx0XHRcdHZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIG1hbmFnZXIgKTtcblx0XHRcdGxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGltYWdlID0ganNvblsgaSBdO1xuXHRcdFx0XHR2YXIgcGF0aCA9IC9eKFxcL1xcLyl8KFthLXpdKzooXFwvXFwvKT8pL2kudGVzdCggaW1hZ2UudXJsICkgPyBpbWFnZS51cmwgOiBzY29wZS50ZXh0dXJlUGF0aCArIGltYWdlLnVybDtcblxuXHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXSA9IGxvYWRJbWFnZSggcGF0aCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW1hZ2VzO1xuXG5cdH0sXG5cblx0cGFyc2VUZXh0dXJlczogZnVuY3Rpb24gKCBqc29uLCBpbWFnZXMgKSB7XG5cblx0XHRmdW5jdGlvbiBwYXJzZUNvbnN0YW50KCB2YWx1ZSwgdHlwZSApIHtcblxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICkgcmV0dXJuIHZhbHVlO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLicsIHZhbHVlICk7XG5cblx0XHRcdHJldHVybiB0eXBlWyB2YWx1ZSBdO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRleHR1cmVzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBkYXRhID0ganNvblsgaSBdO1xuXG5cdFx0XHRcdGlmICggZGF0YS5pbWFnZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBObyBcImltYWdlXCIgc3BlY2lmaWVkIGZvcicsIGRhdGEudXVpZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGltYWdlc1sgZGF0YS5pbWFnZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBpbWFnZScsIGRhdGEuaW1hZ2UgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZSggaW1hZ2VzWyBkYXRhLmltYWdlIF0gKTtcblx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0dGV4dHVyZS51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0XHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1hcHBpbmcgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWFwcGluZyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFwcGluZywgVEVYVFVSRV9NQVBQSU5HICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm9mZnNldCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5vZmZzZXQuZnJvbUFycmF5KCBkYXRhLm9mZnNldCApO1xuXHRcdFx0XHRpZiAoIGRhdGEucmVwZWF0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJlcGVhdC5mcm9tQXJyYXkoIGRhdGEucmVwZWF0ICk7XG5cdFx0XHRcdGlmICggZGF0YS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuY2VudGVyLmZyb21BcnJheSggZGF0YS5jZW50ZXIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJvdGF0aW9uID0gZGF0YS5yb3RhdGlvbjtcblxuXHRcdFx0XHRpZiAoIGRhdGEud3JhcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwUyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMCBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwVCA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMSBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggZGF0YS5mb3JtYXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZm9ybWF0ID0gZGF0YS5mb3JtYXQ7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1pbkZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLm1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5tYWdGaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1hZ0ZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLmFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuYW5pc290cm9weSA9IGRhdGEuYW5pc290cm9weTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuZmxpcFkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZmxpcFkgPSBkYXRhLmZsaXBZO1xuXG5cdFx0XHRcdHRleHR1cmVzWyBkYXRhLnV1aWQgXSA9IHRleHR1cmU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlcztcblxuXHR9LFxuXG5cdHBhcnNlT2JqZWN0OiBmdW5jdGlvbiAoIGRhdGEsIGdlb21ldHJpZXMsIG1hdGVyaWFscyApIHtcblxuXHRcdHZhciBvYmplY3Q7XG5cblx0XHRmdW5jdGlvbiBnZXRHZW9tZXRyeSggbmFtZSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyaWVzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBnZW9tZXRyeScsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZ2VvbWV0cmllc1sgbmFtZSBdO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0TWF0ZXJpYWwoIG5hbWUgKSB7XG5cblx0XHRcdGlmICggbmFtZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cblx0XHRcdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbmFtZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHV1aWQgPSBuYW1lWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIG1hdGVyaWFsc1sgdXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgdXVpZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWxzWyB1dWlkIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGFycmF5O1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWxzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCcsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0ZXJpYWxzWyBuYW1lIF07XG5cblx0XHR9XG5cblx0XHRzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7XG5cblx0XHRcdGNhc2UgJ1NjZW5lJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU2NlbmUoKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuYmFja2dyb3VuZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCBOdW1iZXIuaXNJbnRlZ2VyKCBkYXRhLmJhY2tncm91bmQgKSApIHtcblxuXHRcdFx0XHRcdFx0b2JqZWN0LmJhY2tncm91bmQgPSBuZXcgQ29sb3IoIGRhdGEuYmFja2dyb3VuZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGRhdGEuZm9nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2cnICkge1xuXG5cdFx0XHRcdFx0XHRvYmplY3QuZm9nID0gbmV3IEZvZyggZGF0YS5mb2cuY29sb3IsIGRhdGEuZm9nLm5lYXIsIGRhdGEuZm9nLmZhciApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggZGF0YS5mb2cudHlwZSA9PT0gJ0ZvZ0V4cDInICkge1xuXG5cdFx0XHRcdFx0XHRvYmplY3QuZm9nID0gbmV3IEZvZ0V4cDIoIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5kZW5zaXR5ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQZXJzcGVjdGl2ZUNhbWVyYSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBkYXRhLmZvdiwgZGF0YS5hc3BlY3QsIGRhdGEubmVhciwgZGF0YS5mYXIgKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuZm9jdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5mb2N1cyA9IGRhdGEuZm9jdXM7XG5cdFx0XHRcdGlmICggZGF0YS56b29tICE9PSB1bmRlZmluZWQgKSBvYmplY3Quem9vbSA9IGRhdGEuem9vbTtcblx0XHRcdFx0aWYgKCBkYXRhLmZpbG1HYXVnZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1HYXVnZSA9IGRhdGEuZmlsbUdhdWdlO1xuXHRcdFx0XHRpZiAoIGRhdGEuZmlsbU9mZnNldCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1PZmZzZXQgPSBkYXRhLmZpbG1PZmZzZXQ7XG5cdFx0XHRcdGlmICggZGF0YS52aWV3ICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCBkYXRhLnZpZXcgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnT3J0aG9ncmFwaGljQ2FtZXJhJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCBkYXRhLmxlZnQsIGRhdGEucmlnaHQsIGRhdGEudG9wLCBkYXRhLmJvdHRvbSwgZGF0YS5uZWFyLCBkYXRhLmZhciApO1xuXG5cdFx0XHRcdGlmICggZGF0YS56b29tICE9PSB1bmRlZmluZWQgKSBvYmplY3Quem9vbSA9IGRhdGEuem9vbTtcblx0XHRcdFx0aWYgKCBkYXRhLnZpZXcgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIGRhdGEudmlldyApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdBbWJpZW50TGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBBbWJpZW50TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0RpcmVjdGlvbmFsTGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBEaXJlY3Rpb25hbExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQb2ludExpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgUG9pbnRMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEuZGlzdGFuY2UsIGRhdGEuZGVjYXkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUmVjdEFyZWFMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFJlY3RBcmVhTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLndpZHRoLCBkYXRhLmhlaWdodCApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdTcG90TGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTcG90TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLmRpc3RhbmNlLCBkYXRhLmFuZ2xlLCBkYXRhLnBlbnVtYnJhLCBkYXRhLmRlY2F5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0hlbWlzcGhlcmVMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IEhlbWlzcGhlcmVMaWdodCggZGF0YS5jb2xvciwgZGF0YS5ncm91bmRDb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnU2tpbm5lZE1lc2gnOlxuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlci5wYXJzZU9iamVjdCgpIGRvZXMgbm90IHN1cHBvcnQgU2tpbm5lZE1lc2ggeWV0LicgKTtcblxuXHRcdFx0Y2FzZSAnTWVzaCc6XG5cblx0XHRcdFx0dmFyIGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKTtcblx0XHRcdFx0dmFyIG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmJvbmVzICYmIGdlb21ldHJ5LmJvbmVzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMT0QnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMT0QoKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnTGluZSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmUoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICksIGRhdGEubW9kZSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMaW5lTG9vcCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVMb29wKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0xpbmVTZWdtZW50cyc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmVTZWdtZW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdQb2ludENsb3VkJzpcblx0XHRcdGNhc2UgJ1BvaW50cyc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBvaW50cyggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdTcHJpdGUnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBTcHJpdGUoIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnR3JvdXAnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBHcm91cCgpO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0fVxuXG5cdFx0b2JqZWN0LnV1aWQgPSBkYXRhLnV1aWQ7XG5cblx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRpZiAoIGRhdGEubWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9iamVjdC5tYXRyaXguZnJvbUFycmF5KCBkYXRhLm1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGRhdGEubWF0cml4QXV0b1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBkYXRhLm1hdHJpeEF1dG9VcGRhdGU7XG5cdFx0XHRpZiAoIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlICkgb2JqZWN0Lm1hdHJpeC5kZWNvbXBvc2UoIG9iamVjdC5wb3NpdGlvbiwgb2JqZWN0LnF1YXRlcm5pb24sIG9iamVjdC5zY2FsZSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCBkYXRhLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucG9zaXRpb24uZnJvbUFycmF5KCBkYXRhLnBvc2l0aW9uICk7XG5cdFx0XHRpZiAoIGRhdGEucm90YXRpb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5yb3RhdGlvbi5mcm9tQXJyYXkoIGRhdGEucm90YXRpb24gKTtcblx0XHRcdGlmICggZGF0YS5xdWF0ZXJuaW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3QucXVhdGVybmlvbi5mcm9tQXJyYXkoIGRhdGEucXVhdGVybmlvbiApO1xuXHRcdFx0aWYgKCBkYXRhLnNjYWxlICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2NhbGUuZnJvbUFycmF5KCBkYXRhLnNjYWxlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGRhdGEuY2FzdFNoYWRvdyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmNhc3RTaGFkb3cgPSBkYXRhLmNhc3RTaGFkb3c7XG5cdFx0aWYgKCBkYXRhLnJlY2VpdmVTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5yZWNlaXZlU2hhZG93ID0gZGF0YS5yZWNlaXZlU2hhZG93O1xuXG5cdFx0aWYgKCBkYXRhLnNoYWRvdyApIHtcblxuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5iaWFzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LmJpYXMgPSBkYXRhLnNoYWRvdy5iaWFzO1xuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5yYWRpdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cucmFkaXVzID0gZGF0YS5zaGFkb3cucmFkaXVzO1xuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5tYXBTaXplICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93Lm1hcFNpemUuZnJvbUFycmF5KCBkYXRhLnNoYWRvdy5tYXBTaXplICk7XG5cdFx0XHRpZiAoIGRhdGEuc2hhZG93LmNhbWVyYSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5jYW1lcmEgPSB0aGlzLnBhcnNlT2JqZWN0KCBkYXRhLnNoYWRvdy5jYW1lcmEgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZGF0YS52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlzaWJsZSA9IGRhdGEudmlzaWJsZTtcblx0XHRpZiAoIGRhdGEuZnJ1c3R1bUN1bGxlZCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBkYXRhLmZydXN0dW1DdWxsZWQ7XG5cdFx0aWYgKCBkYXRhLnJlbmRlck9yZGVyICE9PSB1bmRlZmluZWQgKSBvYmplY3QucmVuZGVyT3JkZXIgPSBkYXRhLnJlbmRlck9yZGVyO1xuXHRcdGlmICggZGF0YS51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnVzZXJEYXRhID0gZGF0YS51c2VyRGF0YTtcblxuXHRcdGlmICggZGF0YS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgY2hpbGRyZW4gPSBkYXRhLmNoaWxkcmVuO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0b2JqZWN0LmFkZCggdGhpcy5wYXJzZU9iamVjdCggY2hpbGRyZW5bIGkgXSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhLnR5cGUgPT09ICdMT0QnICkge1xuXG5cdFx0XHR2YXIgbGV2ZWxzID0gZGF0YS5sZXZlbHM7XG5cblx0XHRcdGZvciAoIHZhciBsID0gMDsgbCA8IGxldmVscy5sZW5ndGg7IGwgKysgKSB7XG5cblx0XHRcdFx0dmFyIGxldmVsID0gbGV2ZWxzWyBsIF07XG5cdFx0XHRcdHZhciBjaGlsZCA9IG9iamVjdC5nZXRPYmplY3RCeVByb3BlcnR5KCAndXVpZCcsIGxldmVsLm9iamVjdCApO1xuXG5cdFx0XHRcdGlmICggY2hpbGQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdG9iamVjdC5hZGRMZXZlbCggY2hpbGQsIGxldmVsLmRpc3RhbmNlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqZWN0O1xuXG5cdH1cblxufSApO1xuXG52YXIgVEVYVFVSRV9NQVBQSU5HID0ge1xuXHRVVk1hcHBpbmc6IFVWTWFwcGluZyxcblx0Q3ViZVJlZmxlY3Rpb25NYXBwaW5nOiBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVSZWZyYWN0aW9uTWFwcGluZzogQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLFxuXHRFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzogRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyxcblx0U3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc6IFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nLFxuXHRDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZ1xufTtcblxudmFyIFRFWFRVUkVfV1JBUFBJTkcgPSB7XG5cdFJlcGVhdFdyYXBwaW5nOiBSZXBlYXRXcmFwcGluZyxcblx0Q2xhbXBUb0VkZ2VXcmFwcGluZzogQ2xhbXBUb0VkZ2VXcmFwcGluZyxcblx0TWlycm9yZWRSZXBlYXRXcmFwcGluZzogTWlycm9yZWRSZXBlYXRXcmFwcGluZ1xufTtcblxudmFyIFRFWFRVUkVfRklMVEVSID0ge1xuXHROZWFyZXN0RmlsdGVyOiBOZWFyZXN0RmlsdGVyLFxuXHROZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcjogTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIsXG5cdE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI6IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIsXG5cdExpbmVhckZpbHRlcjogTGluZWFyRmlsdGVyLFxuXHRMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyOiBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyLFxuXHRMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI6IExpbmVhck1pcE1hcExpbmVhckZpbHRlclxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBtaW5pbWFsIGNsYXNzIGZvciBwcm94aW5nIGZ1bmN0aW9ucyB0byBQYXRoLiBSZXBsYWNlcyBvbGQgXCJleHRyYWN0U3VicGF0aHMoKVwiXG4gKiovXG5cbmZ1bmN0aW9uIFNoYXBlUGF0aCgpIHtcblxuXHR0aGlzLnR5cGUgPSAnU2hhcGVQYXRoJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCk7XG5cblx0dGhpcy5zdWJQYXRocyA9IFtdO1xuXHR0aGlzLmN1cnJlbnRQYXRoID0gbnVsbDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBTaGFwZVBhdGgucHJvdG90eXBlLCB7XG5cblx0bW92ZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoID0gbmV3IFBhdGgoKTtcblx0XHR0aGlzLnN1YlBhdGhzLnB1c2goIHRoaXMuY3VycmVudFBhdGggKTtcblx0XHR0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyggeCwgeSApO1xuXG5cdH0sXG5cblx0bGluZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyggeCwgeSApO1xuXG5cdH0sXG5cblx0cXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLnF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBhWSApO1xuXG5cdH0sXG5cblx0YmV6aWVyQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5iZXppZXJDdXJ2ZVRvKCBhQ1AxeCwgYUNQMXksIGFDUDJ4LCBhQ1AyeSwgYVgsIGFZICk7XG5cblx0fSxcblxuXHRzcGxpbmVUaHJ1OiBmdW5jdGlvbiAoIHB0cyApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGguc3BsaW5lVGhydSggcHRzICk7XG5cblx0fSxcblxuXHR0b1NoYXBlczogZnVuY3Rpb24gKCBpc0NDVywgbm9Ib2xlcyApIHtcblxuXHRcdGZ1bmN0aW9uIHRvU2hhcGVzTm9Ib2xlcyggaW5TdWJwYXRocyApIHtcblxuXHRcdFx0dmFyIHNoYXBlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBpblN1YnBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIHRtcFBhdGggPSBpblN1YnBhdGhzWyBpIF07XG5cblx0XHRcdFx0dmFyIHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7XG5cdFx0XHRcdHRtcFNoYXBlLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzO1xuXG5cdFx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzaGFwZXM7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBpc1BvaW50SW5zaWRlUG9seWdvbiggaW5QdCwgaW5Qb2x5Z29uICkge1xuXG5cdFx0XHR2YXIgcG9seUxlbiA9IGluUG9seWdvbi5sZW5ndGg7XG5cblx0XHRcdC8vIGluUHQgb24gcG9seWdvbiBjb250b3VyID0+IGltbWVkaWF0ZSBzdWNjZXNzICAgIG9yXG5cdFx0XHQvLyB0b2dnbGluZyBvZiBpbnNpZGUvb3V0c2lkZSBhdCBldmVyeSBzaW5nbGUhIGludGVyc2VjdGlvbiBwb2ludCBvZiBhbiBlZGdlXG5cdFx0XHQvLyAgd2l0aCB0aGUgaG9yaXpvbnRhbCBsaW5lIHRocm91Z2ggaW5QdCwgbGVmdCBvZiBpblB0XG5cdFx0XHQvLyAgbm90IGNvdW50aW5nIGxvd2VyWSBlbmRwb2ludHMgb2YgZWRnZXMgYW5kIHdob2xlIGVkZ2VzIG9uIHRoYXQgbGluZVxuXHRcdFx0dmFyIGluc2lkZSA9IGZhbHNlO1xuXHRcdFx0Zm9yICggdmFyIHAgPSBwb2x5TGVuIC0gMSwgcSA9IDA7IHEgPCBwb2x5TGVuOyBwID0gcSArKyApIHtcblxuXHRcdFx0XHR2YXIgZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBwIF07XG5cdFx0XHRcdHZhciBlZGdlSGlnaFB0ID0gaW5Qb2x5Z29uWyBxIF07XG5cblx0XHRcdFx0dmFyIGVkZ2VEeCA9IGVkZ2VIaWdoUHQueCAtIGVkZ2VMb3dQdC54O1xuXHRcdFx0XHR2YXIgZWRnZUR5ID0gZWRnZUhpZ2hQdC55IC0gZWRnZUxvd1B0Lnk7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggZWRnZUR5ICkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdC8vIG5vdCBwYXJhbGxlbFxuXHRcdFx0XHRcdGlmICggZWRnZUR5IDwgMCApIHtcblxuXHRcdFx0XHRcdFx0ZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBxIF07IGVkZ2VEeCA9IC0gZWRnZUR4O1xuXHRcdFx0XHRcdFx0ZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcCBdOyBlZGdlRHkgPSAtIGVkZ2VEeTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoICggaW5QdC55IDwgZWRnZUxvd1B0LnkgKSB8fCAoIGluUHQueSA+IGVkZ2VIaWdoUHQueSApICkgXHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBpblB0LnkgPT09IGVkZ2VMb3dQdC55ICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGluUHQueCA9PT0gZWRnZUxvd1B0LnggKVx0XHRyZXR1cm5cdHRydWU7XHRcdC8vIGluUHQgaXMgb24gY29udG91ciA/XG5cdFx0XHRcdFx0XHQvLyBjb250aW51ZTtcdFx0XHRcdC8vIG5vIGludGVyc2VjdGlvbiBvciBlZGdlTG93UHQgPT4gZG9lc24ndCBjb3VudCAhISFcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHZhciBwZXJwRWRnZSA9IGVkZ2VEeSAqICggaW5QdC54IC0gZWRnZUxvd1B0LnggKSAtIGVkZ2VEeCAqICggaW5QdC55IC0gZWRnZUxvd1B0LnkgKTtcblx0XHRcdFx0XHRcdGlmICggcGVycEVkZ2UgPT09IDAgKVx0XHRcdFx0cmV0dXJuXHR0cnVlO1x0XHQvLyBpblB0IGlzIG9uIGNvbnRvdXIgP1xuXHRcdFx0XHRcdFx0aWYgKCBwZXJwRWRnZSA8IDAgKSBcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0aW5zaWRlID0gISBpbnNpZGU7XHRcdC8vIHRydWUgaW50ZXJzZWN0aW9uIGxlZnQgb2YgaW5QdFxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBwYXJhbGxlbCBvciBjb2xsaW5lYXJcblx0XHRcdFx0XHRpZiAoIGluUHQueSAhPT0gZWRnZUxvd1B0LnkgKSBcdFx0Y29udGludWU7XHRcdFx0Ly8gcGFyYWxsZWxcblx0XHRcdFx0XHQvLyBlZGdlIGxpZXMgb24gdGhlIHNhbWUgaG9yaXpvbnRhbCBsaW5lIGFzIGluUHRcblx0XHRcdFx0XHRpZiAoICggKCBlZGdlSGlnaFB0LnggPD0gaW5QdC54ICkgJiYgKCBpblB0LnggPD0gZWRnZUxvd1B0LnggKSApIHx8XG5cdFx0XHRcdFx0XHQgKCAoIGVkZ2VMb3dQdC54IDw9IGluUHQueCApICYmICggaW5QdC54IDw9IGVkZ2VIaWdoUHQueCApICkgKVx0XHRyZXR1cm5cdHRydWU7XHQvLyBpblB0OiBQb2ludCBvbiBjb250b3VyICFcblx0XHRcdFx0XHQvLyBjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuXHRpbnNpZGU7XG5cblx0XHR9XG5cblx0XHR2YXIgaXNDbG9ja1dpc2UgPSBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlO1xuXG5cdFx0dmFyIHN1YlBhdGhzID0gdGhpcy5zdWJQYXRocztcblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMCApIHJldHVybiBbXTtcblxuXHRcdGlmICggbm9Ib2xlcyA9PT0gdHJ1ZSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0dmFyIHNvbGlkLCB0bXBQYXRoLCB0bXBTaGFwZSwgc2hhcGVzID0gW107XG5cblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdFx0dG1wUGF0aCA9IHN1YlBhdGhzWyAwIF07XG5cdFx0XHR0bXBTaGFwZSA9IG5ldyBTaGFwZSgpO1xuXHRcdFx0dG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XG5cdFx0XHRzaGFwZXMucHVzaCggdG1wU2hhcGUgKTtcblx0XHRcdHJldHVybiBzaGFwZXM7XG5cblx0XHR9XG5cblx0XHR2YXIgaG9sZXNGaXJzdCA9ICEgaXNDbG9ja1dpc2UoIHN1YlBhdGhzWyAwIF0uZ2V0UG9pbnRzKCkgKTtcblx0XHRob2xlc0ZpcnN0ID0gaXNDQ1cgPyAhIGhvbGVzRmlyc3QgOiBob2xlc0ZpcnN0O1xuXG5cdFx0Ly8gY29uc29sZS5sb2coXCJIb2xlcyBmaXJzdFwiLCBob2xlc0ZpcnN0KTtcblxuXHRcdHZhciBiZXR0ZXJTaGFwZUhvbGVzID0gW107XG5cdFx0dmFyIG5ld1NoYXBlcyA9IFtdO1xuXHRcdHZhciBuZXdTaGFwZUhvbGVzID0gW107XG5cdFx0dmFyIG1haW5JZHggPSAwO1xuXHRcdHZhciB0bXBQb2ludHM7XG5cblx0XHRuZXdTaGFwZXNbIG1haW5JZHggXSA9IHVuZGVmaW5lZDtcblx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHN1YlBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRtcFBhdGggPSBzdWJQYXRoc1sgaSBdO1xuXHRcdFx0dG1wUG9pbnRzID0gdG1wUGF0aC5nZXRQb2ludHMoKTtcblx0XHRcdHNvbGlkID0gaXNDbG9ja1dpc2UoIHRtcFBvaW50cyApO1xuXHRcdFx0c29saWQgPSBpc0NDVyA/ICEgc29saWQgOiBzb2xpZDtcblxuXHRcdFx0aWYgKCBzb2xpZCApIHtcblxuXHRcdFx0XHRpZiAoICggISBob2xlc0ZpcnN0ICkgJiYgKCBuZXdTaGFwZXNbIG1haW5JZHggXSApIClcdG1haW5JZHggKys7XG5cblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0gPSB7IHM6IG5ldyBTaGFwZSgpLCBwOiB0bXBQb2ludHMgfTtcblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0ucy5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcblxuXHRcdFx0XHRpZiAoIGhvbGVzRmlyc3QgKVx0bWFpbklkeCArKztcblx0XHRcdFx0bmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdID0gW107XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY3cnLCBpKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0ucHVzaCggeyBoOiB0bXBQYXRoLCBwOiB0bXBQb2ludHNbIDAgXSB9ICk7XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY2N3JywgaSk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIG9ubHkgSG9sZXM/IC0+IHByb2JhYmx5IGFsbCBTaGFwZXMgd2l0aCB3cm9uZyBvcmllbnRhdGlvblxuXHRcdGlmICggISBuZXdTaGFwZXNbIDAgXSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0aWYgKCBuZXdTaGFwZXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0dmFyIGFtYmlndW91cyA9IGZhbHNlO1xuXHRcdFx0dmFyIHRvQ2hhbmdlID0gW107XG5cblx0XHRcdGZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkge1xuXG5cdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHNJZHggXSA9IFtdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkge1xuXG5cdFx0XHRcdHZhciBzaG8gPSBuZXdTaGFwZUhvbGVzWyBzSWR4IF07XG5cblx0XHRcdFx0Zm9yICggdmFyIGhJZHggPSAwOyBoSWR4IDwgc2hvLmxlbmd0aDsgaElkeCArKyApIHtcblxuXHRcdFx0XHRcdHZhciBobyA9IHNob1sgaElkeCBdO1xuXHRcdFx0XHRcdHZhciBob2xlX3VuYXNzaWduZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIHMySWR4ID0gMDsgczJJZHggPCBuZXdTaGFwZXMubGVuZ3RoOyBzMklkeCArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpc1BvaW50SW5zaWRlUG9seWdvbiggaG8ucCwgbmV3U2hhcGVzWyBzMklkeCBdLnAgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHNJZHggIT09IHMySWR4IClcdHRvQ2hhbmdlLnB1c2goIHsgZnJvbXM6IHNJZHgsIHRvczogczJJZHgsIGhvbGU6IGhJZHggfSApO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGhvbGVfdW5hc3NpZ25lZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHMySWR4IF0ucHVzaCggaG8gKTtcblxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0YW1iaWd1b3VzID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcblxuXHRcdFx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgc0lkeCBdLnB1c2goIGhvICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcImFtYmlndW91czogXCIsIGFtYmlndW91cyk7XG5cdFx0XHRpZiAoIHRvQ2hhbmdlLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJ0byBjaGFuZ2U6IFwiLCB0b0NoYW5nZSk7XG5cdFx0XHRcdGlmICggISBhbWJpZ3VvdXMgKVx0bmV3U2hhcGVIb2xlcyA9IGJldHRlclNoYXBlSG9sZXM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciB0bXBIb2xlcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBuZXdTaGFwZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRtcFNoYXBlID0gbmV3U2hhcGVzWyBpIF0ucztcblx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXHRcdFx0dG1wSG9sZXMgPSBuZXdTaGFwZUhvbGVzWyBpIF07XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSB0bXBIb2xlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR0bXBTaGFwZS5ob2xlcy5wdXNoKCB0bXBIb2xlc1sgaiBdLmggKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9jb25zb2xlLmxvZyhcInNoYXBlXCIsIHNoYXBlcyk7XG5cblx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRm9udCggZGF0YSApIHtcblxuXHR0aGlzLnR5cGUgPSAnRm9udCc7XG5cblx0dGhpcy5kYXRhID0gZGF0YTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGb250LnByb3RvdHlwZSwge1xuXG5cdGlzRm9udDogdHJ1ZSxcblxuXHRnZW5lcmF0ZVNoYXBlczogZnVuY3Rpb24gKCB0ZXh0LCBzaXplLCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxMDA7XG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDQ7XG5cblx0XHR2YXIgc2hhcGVzID0gW107XG5cdFx0dmFyIHBhdGhzID0gY3JlYXRlUGF0aHMoIHRleHQsIHNpemUsIGRpdmlzaW9ucywgdGhpcy5kYXRhICk7XG5cblx0XHRmb3IgKCB2YXIgcCA9IDAsIHBsID0gcGF0aHMubGVuZ3RoOyBwIDwgcGw7IHAgKysgKSB7XG5cblx0XHRcdEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCBzaGFwZXMsIHBhdGhzWyBwIF0udG9TaGFwZXMoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNoYXBlcztcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gY3JlYXRlUGF0aHMoIHRleHQsIHNpemUsIGRpdmlzaW9ucywgZGF0YSApIHtcblxuXHR2YXIgY2hhcnMgPSBTdHJpbmcoIHRleHQgKS5zcGxpdCggJycgKTtcblx0dmFyIHNjYWxlID0gc2l6ZSAvIGRhdGEucmVzb2x1dGlvbjtcblx0dmFyIGxpbmVfaGVpZ2h0ID0gKCBkYXRhLmJvdW5kaW5nQm94LnlNYXggLSBkYXRhLmJvdW5kaW5nQm94LnlNaW4gKyBkYXRhLnVuZGVybGluZVRoaWNrbmVzcyApICogc2NhbGU7XG5cblx0dmFyIHBhdGhzID0gW107XG5cblx0dmFyIG9mZnNldFggPSAwLCBvZmZzZXRZID0gMDtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHR2YXIgY2hhciA9IGNoYXJzWyBpIF07XG5cblx0XHRpZiAoIGNoYXIgPT09ICdcXG4nICkge1xuXG5cdFx0XHRvZmZzZXRYID0gMDtcblx0XHRcdG9mZnNldFkgLT0gbGluZV9oZWlnaHQ7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgcmV0ID0gY3JlYXRlUGF0aCggY2hhciwgZGl2aXNpb25zLCBzY2FsZSwgb2Zmc2V0WCwgb2Zmc2V0WSwgZGF0YSApO1xuXHRcdFx0b2Zmc2V0WCArPSByZXQub2Zmc2V0WDtcblx0XHRcdHBhdGhzLnB1c2goIHJldC5wYXRoICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiBwYXRocztcblxufVxuXG5mdW5jdGlvbiBjcmVhdGVQYXRoKCBjaGFyLCBkaXZpc2lvbnMsIHNjYWxlLCBvZmZzZXRYLCBvZmZzZXRZLCBkYXRhICkge1xuXG5cdHZhciBnbHlwaCA9IGRhdGEuZ2x5cGhzWyBjaGFyIF0gfHwgZGF0YS5nbHlwaHNbICc/JyBdO1xuXG5cdGlmICggISBnbHlwaCApIHJldHVybjtcblxuXHR2YXIgcGF0aCA9IG5ldyBTaGFwZVBhdGgoKTtcblxuXHR2YXIgeCwgeSwgY3B4LCBjcHksIGNweDEsIGNweTEsIGNweDIsIGNweTI7XG5cblx0aWYgKCBnbHlwaC5vICkge1xuXG5cdFx0dmFyIG91dGxpbmUgPSBnbHlwaC5fY2FjaGVkT3V0bGluZSB8fCAoIGdseXBoLl9jYWNoZWRPdXRsaW5lID0gZ2x5cGguby5zcGxpdCggJyAnICkgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG91dGxpbmUubGVuZ3RoOyBpIDwgbDsgKSB7XG5cblx0XHRcdHZhciBhY3Rpb24gPSBvdXRsaW5lWyBpICsrIF07XG5cblx0XHRcdHN3aXRjaCAoIGFjdGlvbiApIHtcblxuXHRcdFx0XHRjYXNlICdtJzogLy8gbW92ZVRvXG5cblx0XHRcdFx0XHR4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdHkgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRwYXRoLm1vdmVUbyggeCwgeSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnbCc6IC8vIGxpbmVUb1xuXG5cdFx0XHRcdFx0eCA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHR5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0cGF0aC5saW5lVG8oIHgsIHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ3EnOiAvLyBxdWFkcmF0aWNDdXJ2ZVRvXG5cblx0XHRcdFx0XHRjcHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXHRcdFx0XHRcdGNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblxuXHRcdFx0XHRcdHBhdGgucXVhZHJhdGljQ3VydmVUbyggY3B4MSwgY3B5MSwgY3B4LCBjcHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2InOiAvLyBiZXppZXJDdXJ2ZVRvXG5cblx0XHRcdFx0XHRjcHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXHRcdFx0XHRcdGNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0Y3B5MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRjcHgyID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweTIgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRwYXRoLmJlemllckN1cnZlVG8oIGNweDEsIGNweTEsIGNweDIsIGNweTIsIGNweCwgY3B5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4geyBvZmZzZXRYOiBnbHlwaC5oYSAqIHNjYWxlLCBwYXRoOiBwYXRoIH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvbnRMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRm9udExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dmFyIGpzb247XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRm9udExvYWRlcjogdHlwZWZhY2UuanMgc3VwcG9ydCBpcyBiZWluZyBkZXByZWNhdGVkLiBVc2UgdHlwZWZhY2UuanNvbiBpbnN0ZWFkLicgKTtcblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQuc3Vic3RyaW5nKCA2NSwgdGV4dC5sZW5ndGggLSAyICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZm9udCA9IHNjb3BlLnBhcnNlKCBqc29uICk7XG5cblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBmb250ICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0cmV0dXJuIG5ldyBGb250KCBqc29uICk7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgY29udGV4dDtcblxudmFyIEF1ZGlvQ29udGV4dCA9IHtcblxuXHRnZXRDb250ZXh0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIGNvbnRleHQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29udGV4dCA9IG5ldyAoIHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCApKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udGV4dDtcblxuXHR9LFxuXG5cdHNldENvbnRleHQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRjb250ZXh0ID0gdmFsdWU7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgUmVlY2UgQWFyb24gTGVjcml2YWluIC8gaHR0cDovL3JlZWNlbm90ZXMuY29tL1xuICovXG5cbmZ1bmN0aW9uIEF1ZGlvTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEF1ZGlvTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdFx0dmFyIGNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29udGV4dCgpO1xuXG5cdFx0XHRjb250ZXh0LmRlY29kZUF1ZGlvRGF0YSggYnVmZmVyLCBmdW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkge1xuXG5cdFx0XHRcdG9uTG9hZCggYXVkaW9CdWZmZXIgKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3RlcmVvQ2FtZXJhKCkge1xuXG5cdHRoaXMudHlwZSA9ICdTdGVyZW9DYW1lcmEnO1xuXG5cdHRoaXMuYXNwZWN0ID0gMTtcblxuXHR0aGlzLmV5ZVNlcCA9IDAuMDY0O1xuXG5cdHRoaXMuY2FtZXJhTCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuXHR0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSggMSApO1xuXHR0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY2FtZXJhUiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuXHR0aGlzLmNhbWVyYVIubGF5ZXJzLmVuYWJsZSggMiApO1xuXHR0aGlzLmNhbWVyYVIubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFN0ZXJlb0NhbWVyYS5wcm90b3R5cGUsIHtcblxuXHR1cGRhdGU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGluc3RhbmNlLCBmb2N1cywgZm92LCBhc3BlY3QsIG5lYXIsIGZhciwgem9vbSwgZXllU2VwO1xuXG5cdFx0dmFyIGV5ZVJpZ2h0ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgZXllTGVmdCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCBjYW1lcmEgKSB7XG5cblx0XHRcdHZhciBuZWVkc1VwZGF0ZSA9IGluc3RhbmNlICE9PSB0aGlzIHx8IGZvY3VzICE9PSBjYW1lcmEuZm9jdXMgfHwgZm92ICE9PSBjYW1lcmEuZm92IHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhc3BlY3QgIT09IGNhbWVyYS5hc3BlY3QgKiB0aGlzLmFzcGVjdCB8fCBuZWFyICE9PSBjYW1lcmEubmVhciB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmFyICE9PSBjYW1lcmEuZmFyIHx8IHpvb20gIT09IGNhbWVyYS56b29tIHx8IGV5ZVNlcCAhPT0gdGhpcy5leWVTZXA7XG5cblx0XHRcdGlmICggbmVlZHNVcGRhdGUgKSB7XG5cblx0XHRcdFx0aW5zdGFuY2UgPSB0aGlzO1xuXHRcdFx0XHRmb2N1cyA9IGNhbWVyYS5mb2N1cztcblx0XHRcdFx0Zm92ID0gY2FtZXJhLmZvdjtcblx0XHRcdFx0YXNwZWN0ID0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0O1xuXHRcdFx0XHRuZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0XHRcdGZhciA9IGNhbWVyYS5mYXI7XG5cdFx0XHRcdHpvb20gPSBjYW1lcmEuem9vbTtcblxuXHRcdFx0XHQvLyBPZmYtYXhpcyBzdGVyZW9zY29waWMgZWZmZWN0IGJhc2VkIG9uXG5cdFx0XHRcdC8vIGh0dHA6Ly9wYXVsYm91cmtlLm5ldC9zdGVyZW9ncmFwaGljcy9zdGVyZW9yZW5kZXIvXG5cblx0XHRcdFx0dmFyIHByb2plY3Rpb25NYXRyaXggPSBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jbG9uZSgpO1xuXHRcdFx0XHRleWVTZXAgPSB0aGlzLmV5ZVNlcCAvIDI7XG5cdFx0XHRcdHZhciBleWVTZXBPblByb2plY3Rpb24gPSBleWVTZXAgKiBuZWFyIC8gZm9jdXM7XG5cdFx0XHRcdHZhciB5bWF4ID0gKCBuZWFyICogTWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiBmb3YgKiAwLjUgKSApIC8gem9vbTtcblx0XHRcdFx0dmFyIHhtaW4sIHhtYXg7XG5cblx0XHRcdFx0Ly8gdHJhbnNsYXRlIHhPZmZzZXRcblxuXHRcdFx0XHRleWVMZWZ0LmVsZW1lbnRzWyAxMiBdID0gLSBleWVTZXA7XG5cdFx0XHRcdGV5ZVJpZ2h0LmVsZW1lbnRzWyAxMiBdID0gZXllU2VwO1xuXG5cdFx0XHRcdC8vIGZvciBsZWZ0IGV5ZVxuXG5cdFx0XHRcdHhtaW4gPSAtIHltYXggKiBhc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247XG5cdFx0XHRcdHhtYXggPSB5bWF4ICogYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uO1xuXG5cdFx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDAgXSA9IDIgKiBuZWFyIC8gKCB4bWF4IC0geG1pbiApO1xuXHRcdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7XG5cblx0XHRcdFx0dGhpcy5jYW1lcmFMLnByb2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHRcdC8vIGZvciByaWdodCBleWVcblxuXHRcdFx0XHR4bWluID0gLSB5bWF4ICogYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uO1xuXHRcdFx0XHR4bWF4ID0geW1heCAqIGFzcGVjdCAtIGV5ZVNlcE9uUHJvamVjdGlvbjtcblxuXHRcdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAwIF0gPSAyICogbmVhciAvICggeG1heCAtIHhtaW4gKTtcblx0XHRcdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgOCBdID0gKCB4bWF4ICsgeG1pbiApIC8gKCB4bWF4IC0geG1pbiApO1xuXG5cdFx0XHRcdHRoaXMuY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmNhbWVyYUwubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkubXVsdGlwbHkoIGV5ZUxlZnQgKTtcblx0XHRcdHRoaXMuY2FtZXJhUi5tYXRyaXhXb3JsZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5tdWx0aXBseSggZXllUmlnaHQgKTtcblxuXHRcdH07XG5cblx0fSApKClcblxufSApO1xuXG4vKipcbiAqIENhbWVyYSBmb3IgcmVuZGVyaW5nIGN1YmUgbWFwc1xuICpcdC0gcmVuZGVycyBzY2VuZSBpbnRvIGF4aXMtYWxpZ25lZCBjdWJlXG4gKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDdWJlQ2FtZXJhKCBuZWFyLCBmYXIsIGN1YmVSZXNvbHV0aW9uICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3ViZUNhbWVyYSc7XG5cblx0dmFyIGZvdiA9IDkwLCBhc3BlY3QgPSAxO1xuXG5cdHZhciBjYW1lcmFQWCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFQWC51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFQWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAxLCAwLCAwICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYVBYICk7XG5cblx0dmFyIGNhbWVyYU5YID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYU5YLnVwLnNldCggMCwgLSAxLCAwICk7XG5cdGNhbWVyYU5YLmxvb2tBdCggbmV3IFZlY3RvcjMoIC0gMSwgMCwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFOWCApO1xuXG5cdHZhciBjYW1lcmFQWSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFQWS51cC5zZXQoIDAsIDAsIDEgKTtcblx0Y2FtZXJhUFkubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMSwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFQWSApO1xuXG5cdHZhciBjYW1lcmFOWSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFOWS51cC5zZXQoIDAsIDAsIC0gMSApO1xuXHRjYW1lcmFOWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhTlkgKTtcblxuXHR2YXIgY2FtZXJhUFogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhUFoudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0Y2FtZXJhUFoubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMCwgMSApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFQWiApO1xuXG5cdHZhciBjYW1lcmFOWiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFOWi51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFOWi5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhTlogKTtcblxuXHR2YXIgb3B0aW9ucyA9IHsgZm9ybWF0OiBSR0JGb3JtYXQsIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLCBtaW5GaWx0ZXI6IExpbmVhckZpbHRlciB9O1xuXG5cdHRoaXMucmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSggY3ViZVJlc29sdXRpb24sIGN1YmVSZXNvbHV0aW9uLCBvcHRpb25zICk7XG5cdHRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9IFwiQ3ViZUNhbWVyYVwiO1xuXG5cdHRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUgKSB7XG5cblx0XHRpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkgdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0O1xuXHRcdHZhciBnZW5lcmF0ZU1pcG1hcHMgPSByZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7XG5cblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDA7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFgsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMTtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWCwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSAyO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBZLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDM7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlksIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gNDtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWiwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBnZW5lcmF0ZU1pcG1hcHM7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSA1O1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5aLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggbnVsbCApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhciA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdHZhciByZW5kZXJUYXJnZXQgPSB0aGlzLnJlbmRlclRhcmdldDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IGk7XG5cdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0XHRyZW5kZXJlci5jbGVhciggY29sb3IsIGRlcHRoLCBzdGVuY2lsICk7XG5cblx0XHR9XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIG51bGwgKTtcblxuXHR9O1xuXG59XG5cbkN1YmVDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5DdWJlQ2FtZXJhLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmVDYW1lcmE7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBdWRpb0xpc3RlbmVyKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQXVkaW9MaXN0ZW5lcic7XG5cblx0dGhpcy5jb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTtcblxuXHR0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO1xuXHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0dGhpcy5maWx0ZXIgPSBudWxsO1xuXG59XG5cbkF1ZGlvTGlzdGVuZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQXVkaW9MaXN0ZW5lcixcblxuXHRnZXRJbnB1dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2FpbjtcblxuXHR9LFxuXG5cdHJlbW92ZUZpbHRlcjogZnVuY3Rpb24gKCApIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdFx0dGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cdFx0XHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cdFx0XHR0aGlzLmZpbHRlciA9IG51bGw7XG5cblx0XHR9XG5cblx0fSxcblxuXHRnZXRGaWx0ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlcjtcblxuXHR9LFxuXG5cdHNldEZpbHRlcjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdFx0dGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmZpbHRlciA9IHZhbHVlO1xuXHRcdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdHRoaXMuZmlsdGVyLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdH0sXG5cblx0Z2V0TWFzdGVyVm9sdW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7XG5cblx0fSxcblxuXHRzZXRNYXN0ZXJWb2x1bWU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoIHZhbHVlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTtcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHRcdHZhciBzY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgb3JpZW50YXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcblxuXHRcdFx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cblx0XHRcdHZhciBsaXN0ZW5lciA9IHRoaXMuY29udGV4dC5saXN0ZW5lcjtcblx0XHRcdHZhciB1cCA9IHRoaXMudXA7XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKTtcblxuXHRcdFx0b3JpZW50YXRpb24uc2V0KCAwLCAwLCAtIDEgKS5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdFx0aWYgKCBsaXN0ZW5lci5wb3NpdGlvblggKSB7XG5cblx0XHRcdFx0bGlzdGVuZXIucG9zaXRpb25YLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi54LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIucG9zaXRpb25ZLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi55LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIucG9zaXRpb25aLnNldFZhbHVlQXRUaW1lKCBwb3NpdGlvbi56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIuZm9yd2FyZFguc2V0VmFsdWVBdFRpbWUoIG9yaWVudGF0aW9uLngsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5mb3J3YXJkWS5zZXRWYWx1ZUF0VGltZSggb3JpZW50YXRpb24ueSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLmZvcndhcmRaLnNldFZhbHVlQXRUaW1lKCBvcmllbnRhdGlvbi56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIudXBYLnNldFZhbHVlQXRUaW1lKCB1cC54LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIudXBZLnNldFZhbHVlQXRUaW1lKCB1cC55LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIudXBaLnNldFZhbHVlQXRUaW1lKCB1cC56LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRsaXN0ZW5lci5zZXRQb3NpdGlvbiggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApO1xuXHRcdFx0XHRsaXN0ZW5lci5zZXRPcmllbnRhdGlvbiggb3JpZW50YXRpb24ueCwgb3JpZW50YXRpb24ueSwgb3JpZW50YXRpb24ueiwgdXAueCwgdXAueSwgdXAueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBSZWVjZSBBYXJvbiBMZWNyaXZhaW4gLyBodHRwOi8vcmVlY2Vub3Rlcy5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW8oIGxpc3RlbmVyICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQXVkaW8nO1xuXG5cdHRoaXMuY29udGV4dCA9IGxpc3RlbmVyLmNvbnRleHQ7XG5cblx0dGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTtcblx0dGhpcy5nYWluLmNvbm5lY3QoIGxpc3RlbmVyLmdldElucHV0KCkgKTtcblxuXHR0aGlzLmF1dG9wbGF5ID0gZmFsc2U7XG5cblx0dGhpcy5idWZmZXIgPSBudWxsO1xuXHR0aGlzLmxvb3AgPSBmYWxzZTtcblx0dGhpcy5zdGFydFRpbWUgPSAwO1xuXHR0aGlzLm9mZnNldCA9IDA7XG5cdHRoaXMucGxheWJhY2tSYXRlID0gMTtcblx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSB0cnVlO1xuXHR0aGlzLnNvdXJjZVR5cGUgPSAnZW1wdHknO1xuXG5cdHRoaXMuZmlsdGVycyA9IFtdO1xuXG59XG5cbkF1ZGlvLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEF1ZGlvLFxuXG5cdGdldE91dHB1dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2FpbjtcblxuXHR9LFxuXG5cdHNldE5vZGVTb3VyY2U6IGZ1bmN0aW9uICggYXVkaW9Ob2RlICkge1xuXG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnYXVkaW9Ob2RlJztcblx0XHR0aGlzLnNvdXJjZSA9IGF1ZGlvTm9kZTtcblx0XHR0aGlzLmNvbm5lY3QoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0QnVmZmVyOiBmdW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkge1xuXG5cdFx0dGhpcy5idWZmZXIgPSBhdWRpb0J1ZmZlcjtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnYnVmZmVyJztcblxuXHRcdGlmICggdGhpcy5hdXRvcGxheSApIHRoaXMucGxheSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRwbGF5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR2YXIgc291cmNlID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xuXG5cdFx0c291cmNlLmJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuXHRcdHNvdXJjZS5sb29wID0gdGhpcy5sb29wO1xuXHRcdHNvdXJjZS5vbmVuZGVkID0gdGhpcy5vbkVuZGVkLmJpbmQoIHRoaXMgKTtcblx0XHRzb3VyY2UucGxheWJhY2tSYXRlLnNldFZhbHVlQXRUaW1lKCB0aGlzLnBsYXliYWNrUmF0ZSwgdGhpcy5zdGFydFRpbWUgKTtcblx0XHR0aGlzLnN0YXJ0VGltZSA9IHRoaXMuY29udGV4dC5jdXJyZW50VGltZTtcblx0XHRzb3VyY2Uuc3RhcnQoIHRoaXMuc3RhcnRUaW1lLCB0aGlzLm9mZnNldCApO1xuXG5cdFx0dGhpcy5pc1BsYXlpbmcgPSB0cnVlO1xuXG5cdFx0dGhpcy5zb3VyY2UgPSBzb3VyY2U7XG5cblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0KCk7XG5cblx0fSxcblxuXHRwYXVzZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLnN0b3AoKTtcblx0XHRcdHRoaXMub2Zmc2V0ICs9ICggdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lIC0gdGhpcy5zdGFydFRpbWUgKSAqIHRoaXMucGxheWJhY2tSYXRlO1xuXHRcdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3RvcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMuc291cmNlLnN0b3AoKTtcblx0XHR0aGlzLm9mZnNldCA9IDA7XG5cdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29ubmVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5maWx0ZXJzWyBpIC0gMSBdLmNvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzY29ubmVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuZGlzY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5maWx0ZXJzWyBpIC0gMSBdLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmRpc2Nvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmRpc2Nvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0RmlsdGVyczogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVycztcblxuXHR9LFxuXG5cdHNldEZpbHRlcnM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoICEgdmFsdWUgKSB2YWx1ZSA9IFtdO1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5kaXNjb25uZWN0KCk7XG5cdFx0XHR0aGlzLmZpbHRlcnMgPSB2YWx1ZTtcblx0XHRcdHRoaXMuY29ubmVjdCgpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5maWx0ZXJzID0gdmFsdWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEZpbHRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWyAwIF07XG5cblx0fSxcblxuXHRzZXRGaWx0ZXI6IGZ1bmN0aW9uICggZmlsdGVyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RmlsdGVycyggZmlsdGVyID8gWyBmaWx0ZXIgXSA6IFtdICk7XG5cblx0fSxcblxuXHRzZXRQbGF5YmFja1JhdGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZSggdGhpcy5wbGF5YmFja1JhdGUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRQbGF5YmFja1JhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBsYXliYWNrUmF0ZTtcblxuXHR9LFxuXG5cdG9uRW5kZWQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cblx0fSxcblxuXHRnZXRMb29wOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubG9vcDtcblxuXHR9LFxuXG5cdHNldExvb3A6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5sb29wID0gdmFsdWU7XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5sb29wID0gdGhpcy5sb29wO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRWb2x1bWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcblxuXHR9LFxuXG5cdHNldFZvbHVtZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSggdmFsdWUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBQb3NpdGlvbmFsQXVkaW8oIGxpc3RlbmVyICkge1xuXG5cdEF1ZGlvLmNhbGwoIHRoaXMsIGxpc3RlbmVyICk7XG5cblx0dGhpcy5wYW5uZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlUGFubmVyKCk7XG5cdHRoaXMucGFubmVyLmNvbm5lY3QoIHRoaXMuZ2FpbiApO1xuXG59XG5cblBvc2l0aW9uYWxBdWRpby5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBBdWRpby5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQb3NpdGlvbmFsQXVkaW8sXG5cblx0Z2V0T3V0cHV0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXI7XG5cblx0fSxcblxuXHRnZXRSZWZEaXN0YW5jZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlO1xuXG5cdH0sXG5cblx0c2V0UmVmRGlzdGFuY2U6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhbm5lci5yZWZEaXN0YW5jZSA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Z2V0Um9sbG9mZkZhY3RvcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I7XG5cblx0fSxcblxuXHRzZXRSb2xsb2ZmRmFjdG9yOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvciA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Z2V0RGlzdGFuY2VNb2RlbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWw7XG5cblx0fSxcblxuXHRzZXREaXN0YW5jZU1vZGVsOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbCA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Z2V0TWF4RGlzdGFuY2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZTtcblxuXHR9LFxuXG5cdHNldE1heERpc3RhbmNlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIubWF4RGlzdGFuY2UgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xuXG5cdFx0XHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdFx0cG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHRoaXMucGFubmVyLnNldFBvc2l0aW9uKCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW9BbmFseXNlciggYXVkaW8sIGZmdFNpemUgKSB7XG5cblx0dGhpcy5hbmFseXNlciA9IGF1ZGlvLmNvbnRleHQuY3JlYXRlQW5hbHlzZXIoKTtcblx0dGhpcy5hbmFseXNlci5mZnRTaXplID0gZmZ0U2l6ZSAhPT0gdW5kZWZpbmVkID8gZmZ0U2l6ZSA6IDIwNDg7XG5cblx0dGhpcy5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoIHRoaXMuYW5hbHlzZXIuZnJlcXVlbmN5QmluQ291bnQgKTtcblxuXHRhdWRpby5nZXRPdXRwdXQoKS5jb25uZWN0KCB0aGlzLmFuYWx5c2VyICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQXVkaW9BbmFseXNlci5wcm90b3R5cGUsIHtcblxuXHRnZXRGcmVxdWVuY3lEYXRhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKCB0aGlzLmRhdGEgKTtcblxuXHRcdHJldHVybiB0aGlzLmRhdGE7XG5cblx0fSxcblxuXHRnZXRBdmVyYWdlRnJlcXVlbmN5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmFsdWUgPSAwLCBkYXRhID0gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFsdWUgKz0gZGF0YVsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlIC8gZGF0YS5sZW5ndGg7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEJ1ZmZlcmVkIHNjZW5lIGdyYXBoIHByb3BlcnR5IHRoYXQgYWxsb3dzIHdlaWdodGVkIGFjY3VtdWxhdGlvbi5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFByb3BlcnR5TWl4ZXIoIGJpbmRpbmcsIHR5cGVOYW1lLCB2YWx1ZVNpemUgKSB7XG5cblx0dGhpcy5iaW5kaW5nID0gYmluZGluZztcblx0dGhpcy52YWx1ZVNpemUgPSB2YWx1ZVNpemU7XG5cblx0dmFyIGJ1ZmZlclR5cGUgPSBGbG9hdDY0QXJyYXksXG5cdFx0bWl4RnVuY3Rpb247XG5cblx0c3dpdGNoICggdHlwZU5hbWUgKSB7XG5cblx0XHRjYXNlICdxdWF0ZXJuaW9uJzpcblx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fc2xlcnA7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgJ3N0cmluZyc6XG5cdFx0Y2FzZSAnYm9vbCc6XG5cdFx0XHRidWZmZXJUeXBlID0gQXJyYXk7XG5cdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX3NlbGVjdDtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fbGVycDtcblxuXHR9XG5cblx0dGhpcy5idWZmZXIgPSBuZXcgYnVmZmVyVHlwZSggdmFsdWVTaXplICogNCApO1xuXHQvLyBsYXlvdXQ6IFsgaW5jb21pbmcgfCBhY2N1MCB8IGFjY3UxIHwgb3JpZyBdXG5cdC8vXG5cdC8vIGludGVycG9sYXRvcnMgY2FuIHVzZSAuYnVmZmVyIGFzIHRoZWlyIC5yZXN1bHRcblx0Ly8gdGhlIGRhdGEgdGhlbiBnb2VzIHRvICdpbmNvbWluZydcblx0Ly9cblx0Ly8gJ2FjY3UwJyBhbmQgJ2FjY3UxJyBhcmUgdXNlZCBmcmFtZS1pbnRlcmxlYXZlZCBmb3Jcblx0Ly8gdGhlIGN1bXVsYXRpdmUgcmVzdWx0IGFuZCBhcmUgY29tcGFyZWQgdG8gZGV0ZWN0XG5cdC8vIGNoYW5nZXNcblx0Ly9cblx0Ly8gJ29yaWcnIHN0b3JlcyB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIHByb3BlcnR5XG5cblx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uID0gbWl4RnVuY3Rpb247XG5cblx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcblxuXHR0aGlzLnVzZUNvdW50ID0gMDtcblx0dGhpcy5yZWZlcmVuY2VDb3VudCA9IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlNaXhlci5wcm90b3R5cGUsIHtcblxuXHQvLyBhY2N1bXVsYXRlIGRhdGEgaW4gdGhlICdpbmNvbWluZycgcmVnaW9uIGludG8gJ2FjY3U8aT4nXG5cdGFjY3VtdWxhdGU6IGZ1bmN0aW9uICggYWNjdUluZGV4LCB3ZWlnaHQgKSB7XG5cblx0XHQvLyBub3RlOiBoYXBwaWx5IGFjY3VtdWxhdGluZyBub3RoaW5nIHdoZW4gd2VpZ2h0ID0gMCwgdGhlIGNhbGxlciBrbm93c1xuXHRcdC8vIHRoZSB3ZWlnaHQgYW5kIHNob3VsZG4ndCBoYXZlIG1hZGUgdGhlIGNhbGwgaW4gdGhlIGZpcnN0IHBsYWNlXG5cblx0XHR2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdG9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZSxcblxuXHRcdFx0Y3VycmVudFdlaWdodCA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodDtcblxuXHRcdGlmICggY3VycmVudFdlaWdodCA9PT0gMCApIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gaW5jb21pbmcgKiB3ZWlnaHRcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBpIF0gPSBidWZmZXJbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ID0gd2VpZ2h0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gYWNjdU4gKyBpbmNvbWluZyAqIHdlaWdodFxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ICs9IHdlaWdodDtcblx0XHRcdHZhciBtaXggPSB3ZWlnaHQgLyBjdXJyZW50V2VpZ2h0O1xuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uKCBidWZmZXIsIG9mZnNldCwgMCwgbWl4LCBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IGN1cnJlbnRXZWlnaHQ7XG5cblx0fSxcblxuXHQvLyBhcHBseSB0aGUgc3RhdGUgb2YgJ2FjY3U8aT4nIHRvIHRoZSBiaW5kaW5nIHdoZW4gYWNjdXMgZGlmZmVyXG5cdGFwcGx5OiBmdW5jdGlvbiAoIGFjY3VJbmRleCApIHtcblxuXHRcdHZhciBzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0b2Zmc2V0ID0gYWNjdUluZGV4ICogc3RyaWRlICsgc3RyaWRlLFxuXG5cdFx0XHR3ZWlnaHQgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQsXG5cblx0XHRcdGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7XG5cblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwO1xuXG5cdFx0aWYgKCB3ZWlnaHQgPCAxICkge1xuXG5cdFx0XHQvLyBhY2N1TiA6PSBhY2N1TiArIG9yaWdpbmFsICogKCAxIC0gY3VtdWxhdGl2ZVdlaWdodCApXG5cblx0XHRcdHZhciBvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gc3RyaWRlICogMztcblxuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uKFxuXHRcdFx0XHRidWZmZXIsIG9mZnNldCwgb3JpZ2luYWxWYWx1ZU9mZnNldCwgMSAtIHdlaWdodCwgc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IHN0cmlkZSArIHN0cmlkZTsgaSAhPT0gZTsgKysgaSApIHtcblxuXHRcdFx0aWYgKCBidWZmZXJbIGkgXSAhPT0gYnVmZmVyWyBpICsgc3RyaWRlIF0gKSB7XG5cblx0XHRcdFx0Ly8gdmFsdWUgaGFzIGNoYW5nZWQgLT4gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHRcdFx0YmluZGluZy5zZXRWYWx1ZSggYnVmZmVyLCBvZmZzZXQgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIHJlbWVtYmVyIHRoZSBzdGF0ZSBvZiB0aGUgYm91bmQgcHJvcGVydHkgYW5kIGNvcHkgaXQgdG8gYm90aCBhY2N1c1xuXHRzYXZlT3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJpbmRpbmcgPSB0aGlzLmJpbmRpbmc7XG5cblx0XHR2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblxuXHRcdFx0b3JpZ2luYWxWYWx1ZU9mZnNldCA9IHN0cmlkZSAqIDM7XG5cblx0XHRiaW5kaW5nLmdldFZhbHVlKCBidWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTtcblxuXHRcdC8vIGFjY3VbMC4uMV0gOj0gb3JpZyAtLSBpbml0aWFsbHkgZGV0ZWN0IGNoYW5nZXMgYWdhaW5zdCB0aGUgb3JpZ2luYWxcblx0XHRmb3IgKCB2YXIgaSA9IHN0cmlkZSwgZSA9IG9yaWdpbmFsVmFsdWVPZmZzZXQ7IGkgIT09IGU7ICsrIGkgKSB7XG5cblx0XHRcdGJ1ZmZlclsgaSBdID0gYnVmZmVyWyBvcmlnaW5hbFZhbHVlT2Zmc2V0ICsgKCBpICUgc3RyaWRlICkgXTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XG5cblx0fSxcblxuXHQvLyBhcHBseSB0aGUgc3RhdGUgcHJldmlvdXNseSB0YWtlbiB2aWEgJ3NhdmVPcmlnaW5hbFN0YXRlJyB0byB0aGUgYmluZGluZ1xuXHRyZXN0b3JlT3JpZ2luYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9yaWdpbmFsVmFsdWVPZmZzZXQgPSB0aGlzLnZhbHVlU2l6ZSAqIDM7XG5cdFx0dGhpcy5iaW5kaW5nLnNldFZhbHVlKCB0aGlzLmJ1ZmZlciwgb3JpZ2luYWxWYWx1ZU9mZnNldCApO1xuXG5cdH0sXG5cblxuXHQvLyBtaXggZnVuY3Rpb25zXG5cblx0X3NlbGVjdDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XG5cblx0XHRpZiAoIHQgPj0gMC41ICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHtcblxuXHRcdFx0XHRidWZmZXJbIGRzdE9mZnNldCArIGkgXSA9IGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfc2xlcnA6IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCApIHtcblxuXHRcdFF1YXRlcm5pb24uc2xlcnBGbGF0KCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgc3JjT2Zmc2V0LCB0ICk7XG5cblx0fSxcblxuXHRfbGVycDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0LCBzdHJpZGUgKSB7XG5cblx0XHR2YXIgcyA9IDEgLSB0O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBqID0gZHN0T2Zmc2V0ICsgaTtcblxuXHRcdFx0YnVmZmVyWyBqIF0gPSBidWZmZXJbIGogXSAqIHMgKyBidWZmZXJbIHNyY09mZnNldCArIGkgXSAqIHQ7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgcmVmZXJlbmNlIHRvIGEgcmVhbCBwcm9wZXJ0eSBpbiB0aGUgc2NlbmUgZ3JhcGguXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG4vLyBDaGFyYWN0ZXJzIFtdLjovIGFyZSByZXNlcnZlZCBmb3IgdHJhY2sgYmluZGluZyBzeW50YXguXG52YXIgUkVTRVJWRURfQ0hBUlNfUkUgPSAnXFxcXFtcXFxcXVxcXFwuOlxcXFwvJztcblxuZnVuY3Rpb24gQ29tcG9zaXRlKCB0YXJnZXRHcm91cCwgcGF0aCwgb3B0aW9uYWxQYXJzZWRQYXRoICkge1xuXG5cdHZhciBwYXJzZWRQYXRoID0gb3B0aW9uYWxQYXJzZWRQYXRoIHx8IFByb3BlcnR5QmluZGluZy5wYXJzZVRyYWNrTmFtZSggcGF0aCApO1xuXG5cdHRoaXMuX3RhcmdldEdyb3VwID0gdGFyZ2V0R3JvdXA7XG5cdHRoaXMuX2JpbmRpbmdzID0gdGFyZ2V0R3JvdXAuc3Vic2NyaWJlXyggcGF0aCwgcGFyc2VkUGF0aCApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENvbXBvc2l0ZS5wcm90b3R5cGUsIHtcblxuXHRnZXRWYWx1ZTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5iaW5kKCk7IC8vIGJpbmQgYWxsIGJpbmRpbmdcblxuXHRcdHZhciBmaXJzdFZhbGlkSW5kZXggPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRiaW5kaW5nID0gdGhpcy5fYmluZGluZ3NbIGZpcnN0VmFsaWRJbmRleCBdO1xuXG5cdFx0Ly8gYW5kIG9ubHkgY2FsbCAuZ2V0VmFsdWUgb24gdGhlIGZpcnN0XG5cdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSBiaW5kaW5nLmdldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblxuXHRzZXRWYWx1ZTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRmb3IgKCB2YXIgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdFx0ICBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLnNldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRiaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0XHQgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uYmluZCgpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dW5iaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0XHQgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0udW5iaW5kKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cblxuZnVuY3Rpb24gUHJvcGVydHlCaW5kaW5nKCByb290Tm9kZSwgcGF0aCwgcGFyc2VkUGF0aCApIHtcblxuXHR0aGlzLnBhdGggPSBwYXRoO1xuXHR0aGlzLnBhcnNlZFBhdGggPSBwYXJzZWRQYXRoIHx8IFByb3BlcnR5QmluZGluZy5wYXJzZVRyYWNrTmFtZSggcGF0aCApO1xuXG5cdHRoaXMubm9kZSA9IFByb3BlcnR5QmluZGluZy5maW5kTm9kZSggcm9vdE5vZGUsIHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSApIHx8IHJvb3ROb2RlO1xuXG5cdHRoaXMucm9vdE5vZGUgPSByb290Tm9kZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBQcm9wZXJ0eUJpbmRpbmcsIHtcblxuXHRDb21wb3NpdGU6IENvbXBvc2l0ZSxcblxuXHRjcmVhdGU6IGZ1bmN0aW9uICggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApIHtcblxuXHRcdGlmICggISAoIHJvb3QgJiYgcm9vdC5pc0FuaW1hdGlvbk9iamVjdEdyb3VwICkgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgUHJvcGVydHlCaW5kaW5nKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZy5Db21wb3NpdGUoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXBsYWNlcyBzcGFjZXMgd2l0aCB1bmRlcnNjb3JlcyBhbmQgcmVtb3ZlcyB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzIGZyb21cblx0ICogbm9kZSBuYW1lcywgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBwYXJzZVRyYWNrTmFtZSgpLlxuXHQgKlxuXHQgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgTm9kZSBuYW1lIHRvIGJlIHNhbml0aXplZC5cblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c2FuaXRpemVOb2RlTmFtZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcmVzZXJ2ZWRSZSA9IG5ldyBSZWdFeHAoICdbJyArIFJFU0VSVkVEX0NIQVJTX1JFICsgJ10nLCAnZycgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzYW5pdGl6ZU5vZGVOYW1lKCBuYW1lICkge1xuXG5cdFx0XHRyZXR1cm4gbmFtZS5yZXBsYWNlKCAvXFxzL2csICdfJyApLnJlcGxhY2UoIHJlc2VydmVkUmUsICcnICk7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdHBhcnNlVHJhY2tOYW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBBdHRlbXB0cyB0byBhbGxvdyBub2RlIG5hbWVzIGZyb20gYW55IGxhbmd1YWdlLiBFUzUncyBgXFx3YCByZWdleHAgbWF0Y2hlc1xuXHRcdC8vIG9ubHkgbGF0aW4gY2hhcmFjdGVycywgYW5kIHRoZSB1bmljb2RlIFxccHtMfSBpcyBub3QgeWV0IHN1cHBvcnRlZC4gU29cblx0XHQvLyBpbnN0ZWFkLCB3ZSBleGNsdWRlIHJlc2VydmVkIGNoYXJhY3RlcnMgYW5kIG1hdGNoIGV2ZXJ5dGhpbmcgZWxzZS5cblx0XHR2YXIgd29yZENoYXIgPSAnW14nICsgUkVTRVJWRURfQ0hBUlNfUkUgKyAnXSc7XG5cdFx0dmFyIHdvcmRDaGFyT3JEb3QgPSAnW14nICsgUkVTRVJWRURfQ0hBUlNfUkUucmVwbGFjZSggJ1xcXFwuJywgJycgKSArICddJztcblxuXHRcdC8vIFBhcmVudCBkaXJlY3RvcmllcywgZGVsaW1pdGVkIGJ5ICcvJyBvciAnOicuIEN1cnJlbnRseSB1bnVzZWQsIGJ1dCBtdXN0XG5cdFx0Ly8gYmUgbWF0Y2hlZCB0byBwYXJzZSB0aGUgcmVzdCBvZiB0aGUgdHJhY2sgbmFtZS5cblx0XHR2YXIgZGlyZWN0b3J5UmUgPSAvKCg/OldDK1tcXC86XSkqKS8uc291cmNlLnJlcGxhY2UoICdXQycsIHdvcmRDaGFyICk7XG5cblx0XHQvLyBUYXJnZXQgbm9kZS4gTWF5IGNvbnRhaW4gd29yZCBjaGFyYWN0ZXJzIChhLXpBLVowLTlfKSBhbmQgJy4nIG9yICctJy5cblx0XHR2YXIgbm9kZVJlID0gLyhXQ09EKyk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDT0QnLCB3b3JkQ2hhck9yRG90ICk7XG5cblx0XHQvLyBPYmplY3Qgb24gdGFyZ2V0IG5vZGUsIGFuZCBhY2Nlc3Nvci4gTWF5IG5vdCBjb250YWluIHJlc2VydmVkXG5cdFx0Ly8gY2hhcmFjdGVycy4gQWNjZXNzb3IgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlciBleGNlcHQgY2xvc2luZyBicmFja2V0LlxuXHRcdHZhciBvYmplY3RSZSA9IC8oPzpcXC4oV0MrKSg/OlxcWyguKylcXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDJywgd29yZENoYXIgKTtcblxuXHRcdC8vIFByb3BlcnR5IGFuZCBhY2Nlc3Nvci4gTWF5IG5vdCBjb250YWluIHJlc2VydmVkIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heVxuXHRcdC8vIGNvbnRhaW4gYW55IG5vbi1icmFja2V0IGNoYXJhY3RlcnMuXG5cdFx0dmFyIHByb3BlcnR5UmUgPSAvXFwuKFdDKykoPzpcXFsoLispXFxdKT8vLnNvdXJjZS5yZXBsYWNlKCAnV0MnLCB3b3JkQ2hhciApO1xuXG5cdFx0dmFyIHRyYWNrUmUgPSBuZXcgUmVnRXhwKCAnJ1xuXHRcdFx0KyAnXidcblx0XHRcdCsgZGlyZWN0b3J5UmVcblx0XHRcdCsgbm9kZVJlXG5cdFx0XHQrIG9iamVjdFJlXG5cdFx0XHQrIHByb3BlcnR5UmVcblx0XHRcdCsgJyQnXG5cdFx0KTtcblxuXHRcdHZhciBzdXBwb3J0ZWRPYmplY3ROYW1lcyA9IFsgJ21hdGVyaWFsJywgJ21hdGVyaWFscycsICdib25lcycgXTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBwYXJzZVRyYWNrTmFtZSggdHJhY2tOYW1lICkge1xuXG5cdFx0XHR2YXIgbWF0Y2hlcyA9IHRyYWNrUmUuZXhlYyggdHJhY2tOYW1lICk7XG5cblx0XHRcdGlmICggISBtYXRjaGVzICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogJyArIHRyYWNrTmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciByZXN1bHRzID0ge1xuXHRcdFx0XHQvLyBkaXJlY3RvcnlOYW1lOiBtYXRjaGVzWyAxIF0sIC8vICh0c2NodykgY3VycmVudGx5IHVudXNlZFxuXHRcdFx0XHRub2RlTmFtZTogbWF0Y2hlc1sgMiBdLFxuXHRcdFx0XHRvYmplY3ROYW1lOiBtYXRjaGVzWyAzIF0sXG5cdFx0XHRcdG9iamVjdEluZGV4OiBtYXRjaGVzWyA0IF0sXG5cdFx0XHRcdHByb3BlcnR5TmFtZTogbWF0Y2hlc1sgNSBdLCAvLyByZXF1aXJlZFxuXHRcdFx0XHRwcm9wZXJ0eUluZGV4OiBtYXRjaGVzWyA2IF1cblx0XHRcdH07XG5cblx0XHRcdHZhciBsYXN0RG90ID0gcmVzdWx0cy5ub2RlTmFtZSAmJiByZXN1bHRzLm5vZGVOYW1lLmxhc3RJbmRleE9mKCAnLicgKTtcblxuXHRcdFx0aWYgKCBsYXN0RG90ICE9PSB1bmRlZmluZWQgJiYgbGFzdERvdCAhPT0gLSAxICkge1xuXG5cdFx0XHRcdHZhciBvYmplY3ROYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmcoIGxhc3REb3QgKyAxICk7XG5cblx0XHRcdFx0Ly8gT2JqZWN0IG5hbWVzIG11c3QgYmUgY2hlY2tlZCBhZ2FpbnN0IGEgd2hpdGVsaXN0LiBPdGhlcndpc2UsIHRoZXJlXG5cdFx0XHRcdC8vIGlzIG5vIHdheSB0byBwYXJzZSAnZm9vLmJhci5iYXonOiAnYmF6JyBtdXN0IGJlIGEgcHJvcGVydHksIGJ1dFxuXHRcdFx0XHQvLyAnYmFyJyBjb3VsZCBiZSB0aGUgb2JqZWN0TmFtZSwgb3IgcGFydCBvZiBhIG5vZGVOYW1lICh3aGljaCBjYW5cblx0XHRcdFx0Ly8gaW5jbHVkZSAnLicgY2hhcmFjdGVycykuXG5cdFx0XHRcdGlmICggc3VwcG9ydGVkT2JqZWN0TmFtZXMuaW5kZXhPZiggb2JqZWN0TmFtZSApICE9PSAtIDEgKSB7XG5cblx0XHRcdFx0XHRyZXN1bHRzLm5vZGVOYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmcoIDAsIGxhc3REb3QgKTtcblx0XHRcdFx0XHRyZXN1bHRzLm9iamVjdE5hbWUgPSBvYmplY3ROYW1lO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHJlc3VsdHMucHJvcGVydHlOYW1lID09PSBudWxsIHx8IHJlc3VsdHMucHJvcGVydHlOYW1lLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdQcm9wZXJ0eUJpbmRpbmc6IGNhbiBub3QgcGFyc2UgcHJvcGVydHlOYW1lIGZyb20gdHJhY2tOYW1lOiAnICsgdHJhY2tOYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRmaW5kTm9kZTogZnVuY3Rpb24gKCByb290LCBub2RlTmFtZSApIHtcblxuXHRcdGlmICggISBub2RlTmFtZSB8fCBub2RlTmFtZSA9PT0gXCJcIiB8fCBub2RlTmFtZSA9PT0gXCJyb290XCIgfHwgbm9kZU5hbWUgPT09IFwiLlwiIHx8IG5vZGVOYW1lID09PSAtIDEgfHwgbm9kZU5hbWUgPT09IHJvb3QubmFtZSB8fCBub2RlTmFtZSA9PT0gcm9vdC51dWlkICkge1xuXG5cdFx0XHRyZXR1cm4gcm9vdDtcblxuXHRcdH1cblxuXHRcdC8vIHNlYXJjaCBpbnRvIHNrZWxldG9uIGJvbmVzLlxuXHRcdGlmICggcm9vdC5za2VsZXRvbiApIHtcblxuXHRcdFx0dmFyIGJvbmUgPSByb290LnNrZWxldG9uLmdldEJvbmVCeU5hbWUoIG5vZGVOYW1lICk7XG5cblx0XHRcdGlmICggYm9uZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBib25lO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBzZWFyY2ggaW50byBub2RlIHN1YnRyZWUuXG5cdFx0aWYgKCByb290LmNoaWxkcmVuICkge1xuXG5cdFx0XHR2YXIgc2VhcmNoTm9kZVN1YnRyZWUgPSBmdW5jdGlvbiAoIGNoaWxkcmVuICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZhciBjaGlsZE5vZGUgPSBjaGlsZHJlblsgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBjaGlsZE5vZGUubmFtZSA9PT0gbm9kZU5hbWUgfHwgY2hpbGROb2RlLnV1aWQgPT09IG5vZGVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gY2hpbGROb2RlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIHJlc3VsdCA9IHNlYXJjaE5vZGVTdWJ0cmVlKCBjaGlsZE5vZGUuY2hpbGRyZW4gKTtcblxuXHRcdFx0XHRcdGlmICggcmVzdWx0ICkgcmV0dXJuIHJlc3VsdDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH07XG5cblx0XHRcdHZhciBzdWJUcmVlTm9kZSA9IHNlYXJjaE5vZGVTdWJ0cmVlKCByb290LmNoaWxkcmVuICk7XG5cblx0XHRcdGlmICggc3ViVHJlZU5vZGUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHN1YlRyZWVOb2RlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZSwgeyAvLyBwcm90b3R5cGUsIGNvbnRpbnVlZFxuXG5cdC8vIHRoZXNlIGFyZSB1c2VkIHRvIFwiYmluZFwiIGEgbm9uZXhpc3RlbnQgcHJvcGVydHlcblx0X2dldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblx0X3NldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRCaW5kaW5nVHlwZToge1xuXHRcdERpcmVjdDogMCxcblx0XHRFbnRpcmVBcnJheTogMSxcblx0XHRBcnJheUVsZW1lbnQ6IDIsXG5cdFx0SGFzRnJvbVRvQXJyYXk6IDNcblx0fSxcblxuXHRWZXJzaW9uaW5nOiB7XG5cdFx0Tm9uZTogMCxcblx0XHROZWVkc1VwZGF0ZTogMSxcblx0XHRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOiAyXG5cdH0sXG5cblx0R2V0dGVyQnlCaW5kaW5nVHlwZTogW1xuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMubm9kZVsgdGhpcy5wcm9wZXJ0eU5hbWUgXTtcblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdHZhciBzb3VyY2UgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHNvdXJjZS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKysgXSA9IHNvdXJjZVsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9LFxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF07XG5cblx0XHR9LFxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfdG9BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0FycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdF0sXG5cblx0U2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc6IFtcblxuXHRcdFtcblx0XHRcdC8vIERpcmVjdFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdFsgdGhpcy5wcm9wZXJ0eU5hbWUgXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdF0sIFtcblxuXHRcdFx0Ly8gRW50aXJlQXJyYXlcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHZhciBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0ZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0XHRkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XSwgW1xuXG5cdFx0XHQvLyBBcnJheUVsZW1lbnRcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdLCBbXG5cblx0XHRcdC8vIEhhc1RvRnJvbUFycmF5XG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XVxuXG5cdF0sXG5cblx0Z2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlX3VuYm91bmQoIHRhcmdldEFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTtcblx0XHR0aGlzLmdldFZhbHVlKCB0YXJnZXRBcnJheSwgb2Zmc2V0ICk7XG5cblx0XHQvLyBOb3RlOiBUaGlzIGNsYXNzIHVzZXMgYSBTdGF0ZSBwYXR0ZXJuIG9uIGEgcGVyLW1ldGhvZCBiYXNpczpcblx0XHQvLyAnYmluZCcgc2V0cyAndGhpcy5nZXRWYWx1ZScgLyAnc2V0VmFsdWUnIGFuZCBzaGFkb3dzIHRoZVxuXHRcdC8vIHByb3RvdHlwZSB2ZXJzaW9uIG9mIHRoZXNlIG1ldGhvZHMgd2l0aCBvbmUgdGhhdCByZXByZXNlbnRzXG5cdFx0Ly8gdGhlIGJvdW5kIHN0YXRlLiBXaGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgZm91bmQsIHRoZSBtZXRob2RzXG5cdFx0Ly8gYmVjb21lIG5vLW9wcy5cblxuXHR9LFxuXG5cdHNldFZhbHVlOiBmdW5jdGlvbiBnZXRWYWx1ZV91bmJvdW5kKCBzb3VyY2VBcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5iaW5kKCk7XG5cdFx0dGhpcy5zZXRWYWx1ZSggc291cmNlQXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cblx0Ly8gY3JlYXRlIGdldHRlciAvIHNldHRlciBwYWlyIGZvciBhIHByb3BlcnR5IGluIHRoZSBzY2VuZSBncmFwaFxuXHRiaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGFyZ2V0T2JqZWN0ID0gdGhpcy5ub2RlLFxuXHRcdFx0cGFyc2VkUGF0aCA9IHRoaXMucGFyc2VkUGF0aCxcblxuXHRcdFx0b2JqZWN0TmFtZSA9IHBhcnNlZFBhdGgub2JqZWN0TmFtZSxcblx0XHRcdHByb3BlcnR5TmFtZSA9IHBhcnNlZFBhdGgucHJvcGVydHlOYW1lLFxuXHRcdFx0cHJvcGVydHlJbmRleCA9IHBhcnNlZFBhdGgucHJvcGVydHlJbmRleDtcblxuXHRcdGlmICggISB0YXJnZXRPYmplY3QgKSB7XG5cblx0XHRcdHRhcmdldE9iamVjdCA9IFByb3BlcnR5QmluZGluZy5maW5kTm9kZSggdGhpcy5yb290Tm9kZSwgcGFyc2VkUGF0aC5ub2RlTmFtZSApIHx8IHRoaXMucm9vdE5vZGU7XG5cblx0XHRcdHRoaXMubm9kZSA9IHRhcmdldE9iamVjdDtcblxuXHRcdH1cblxuXHRcdC8vIHNldCBmYWlsIHN0YXRlIHNvIHdlIGNhbiBqdXN0ICdyZXR1cm4nIG9uIGVycm9yXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYXZhaWxhYmxlO1xuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZTtcblxuXHRcdC8vIGVuc3VyZSB0aGVyZSBpcyBhIHZhbHVlIG5vZGVcblx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0ICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIG5vZGUgZm9yIHRyYWNrOiAnICsgdGhpcy5wYXRoICsgJyBidXQgaXQgd2FzblxcJ3QgZm91bmQuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3ROYW1lICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0SW5kZXggPSBwYXJzZWRQYXRoLm9iamVjdEluZGV4O1xuXG5cdFx0XHQvLyBzcGVjaWFsIGNhc2VzIHdlcmUgd2UgbmVlZCB0byByZWFjaCBkZWVwZXIgaW50byB0aGUgaGllcmFyY2h5IHRvIGdldCB0aGUgZmFjZSBtYXRlcmlhbHMuLi4uXG5cdFx0XHRzd2l0Y2ggKCBvYmplY3ROYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ21hdGVyaWFscyc6XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHMgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXRlcmlhbHMgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWxzIGFycmF5LicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHM7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdib25lcyc6XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0LnNrZWxldG9uICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgc2tlbGV0b24uJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gcG90ZW50aWFsIGZ1dHVyZSBvcHRpbWl6YXRpb246IHNraXAgdGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50ZWdlclxuXHRcdFx0XHRcdC8vIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci5cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5za2VsZXRvbi5ib25lcztcblxuXHRcdFx0XHRcdC8vIHN1cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNlcy5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0YXJnZXRPYmplY3QubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgaSBdLm5hbWUgPT09IG9iamVjdEluZGV4ICkge1xuXG5cdFx0XHRcdFx0XHRcdG9iamVjdEluZGV4ID0gaTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0aWYgKCBvYmplY3RJbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gYmluZCB0byBvYmplY3RJbmRleCBvZiBvYmplY3ROYW1lLCBidXQgaXMgdW5kZWZpbmVkLicsIHRoaXMsIHRhcmdldE9iamVjdCApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyByZXNvbHZlIHByb3BlcnR5XG5cdFx0dmFyIG5vZGVQcm9wZXJ0eSA9IHRhcmdldE9iamVjdFsgcHJvcGVydHlOYW1lIF07XG5cblx0XHRpZiAoIG5vZGVQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBwYXJzZWRQYXRoLm5vZGVOYW1lO1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogJyArIG5vZGVOYW1lICtcblx0XHRcdFx0Jy4nICsgcHJvcGVydHlOYW1lICsgJyBidXQgaXQgd2FzblxcJ3QgZm91bmQuJywgdGFyZ2V0T2JqZWN0ICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHQvLyBkZXRlcm1pbmUgdmVyc2lvbmluZyBzY2hlbWVcblx0XHR2YXIgdmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5Ob25lO1xuXG5cdFx0aWYgKCB0YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgIT09IHVuZGVmaW5lZCApIHsgLy8gbWF0ZXJpYWxcblxuXHRcdFx0dmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTtcblx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0O1xuXG5cdFx0fSBlbHNlIGlmICggdGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgIT09IHVuZGVmaW5lZCApIHsgLy8gbm9kZSB0cmFuc2Zvcm1cblxuXHRcdFx0dmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xuXHRcdFx0dGhpcy50YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Q7XG5cblx0XHR9XG5cblx0XHQvLyBkZXRlcm1pbmUgaG93IHRoZSBwcm9wZXJ0eSBnZXRzIGJvdW5kXG5cdFx0dmFyIGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7XG5cblx0XHRpZiAoIHByb3BlcnR5SW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gYWNjZXNzIGEgc3ViIGVsZW1lbnQgb2YgdGhlIHByb3BlcnR5IGFycmF5IChvbmx5IHByaW1pdGl2ZXMgYXJlIHN1cHBvcnRlZCByaWdodCBub3cpXG5cblx0XHRcdGlmICggcHJvcGVydHlOYW1lID09PSBcIm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1wiICkge1xuXG5cdFx0XHRcdC8vIHBvdGVudGlhbCBvcHRpbWl6YXRpb24sIHNraXAgdGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50ZWdlciwgYW5kIGNvbnZlcnQgdGhlIGludGVnZXIgc3RyaW5nIHRvIGEgdHJ1ZSBpbnRlZ2VyLlxuXG5cdFx0XHRcdC8vIHN1cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNlcy5cblx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS4nLCB0aGlzICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdC5nZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvblsgaSBdLm5hbWUgPT09IHByb3BlcnR5SW5kZXggKSB7XG5cblx0XHRcdFx0XHRcdFx0cHJvcGVydHlJbmRleCA9IGk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaFRhcmdldHMuJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdLm5hbWUgPT09IHByb3BlcnR5SW5kZXggKSB7XG5cblx0XHRcdFx0XHRcdFx0cHJvcGVydHlJbmRleCA9IGk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQ7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcblx0XHRcdHRoaXMucHJvcGVydHlJbmRleCA9IHByb3BlcnR5SW5kZXg7XG5cblx0XHR9IGVsc2UgaWYgKCBub2RlUHJvcGVydHkuZnJvbUFycmF5ICE9PSB1bmRlZmluZWQgJiYgbm9kZVByb3BlcnR5LnRvQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gbXVzdCB1c2UgY29weSBmb3IgT2JqZWN0M0QuRXVsZXIvUXVhdGVybmlvblxuXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuSGFzRnJvbVRvQXJyYXk7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcblxuXHRcdH0gZWxzZSBpZiAoIEFycmF5LmlzQXJyYXkoIG5vZGVQcm9wZXJ0eSApICkge1xuXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuRW50aXJlQXJyYXk7XG5cblx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eSA9IG5vZGVQcm9wZXJ0eTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2VsZWN0IGdldHRlciAvIHNldHRlclxuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbIGJpbmRpbmdUeXBlIF07XG5cdFx0dGhpcy5zZXRWYWx1ZSA9IHRoaXMuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmdbIGJpbmRpbmdUeXBlIF1bIHZlcnNpb25pbmcgXTtcblxuXHR9LFxuXG5cdHVuYmluZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5ub2RlID0gbnVsbDtcblxuXHRcdC8vIGJhY2sgdG8gdGhlIHByb3RvdHlwZSB2ZXJzaW9uIG9mIGdldFZhbHVlIC8gc2V0VmFsdWVcblx0XHQvLyBub3RlOiBhdm9pZGluZyB0byBtdXRhdGUgdGhlIHNoYXBlIG9mICd0aGlzJyB2aWEgJ2RlbGV0ZSdcblx0XHR0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5ib3VuZDtcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5ib3VuZDtcblxuXHR9XG5cbn0gKTtcblxuLy8hXFwgREVDTEFSRSBBTElBUyBBRlRFUiBhc3NpZ24gcHJvdG90eXBlICFcbk9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUsIHtcblxuXHQvLyBpbml0aWFsIHN0YXRlIG9mIHRoZXNlIG1ldGhvZHMgdGhhdCBjYWxscyAnYmluZCdcblx0X2dldFZhbHVlX3VuYm91bmQ6IFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuZ2V0VmFsdWUsXG5cdF9zZXRWYWx1ZV91bmJvdW5kOiBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLnNldFZhbHVlLFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgZ3JvdXAgb2Ygb2JqZWN0cyB0aGF0IHJlY2VpdmVzIGEgc2hhcmVkIGFuaW1hdGlvbiBzdGF0ZS5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiBcdC1cdEFkZCBvYmplY3RzIHlvdSB3b3VsZCBvdGhlcndpc2UgcGFzcyBhcyAncm9vdCcgdG8gdGhlXG4gKiBcdFx0Y29uc3RydWN0b3Igb3IgdGhlIC5jbGlwQWN0aW9uIG1ldGhvZCBvZiBBbmltYXRpb25NaXhlci5cbiAqXG4gKiBcdC1cdEluc3RlYWQgcGFzcyB0aGlzIG9iamVjdCBhcyAncm9vdCcuXG4gKlxuICogXHQtXHRZb3UgY2FuIGFsc28gYWRkIGFuZCByZW1vdmUgb2JqZWN0cyBsYXRlciB3aGVuIHRoZSBtaXhlclxuICogXHRcdGlzIHJ1bm5pbmcuXG4gKlxuICogTm90ZTpcbiAqXG4gKiAgXHRPYmplY3RzIG9mIHRoaXMgY2xhc3MgYXBwZWFyIGFzIG9uZSBvYmplY3QgdG8gdGhlIG1peGVyLFxuICogIFx0c28gY2FjaGUgY29udHJvbCBvZiB0aGUgaW5kaXZpZHVhbCBvYmplY3RzIG11c3QgYmUgZG9uZVxuICogIFx0b24gdGhlIGdyb3VwLlxuICpcbiAqIExpbWl0YXRpb246XG4gKlxuICogXHQtIFx0VGhlIGFuaW1hdGVkIHByb3BlcnRpZXMgbXVzdCBiZSBjb21wYXRpYmxlIGFtb25nIHRoZVxuICogXHRcdGFsbCBvYmplY3RzIGluIHRoZSBncm91cC5cbiAqXG4gKiAgLVx0QSBzaW5nbGUgcHJvcGVydHkgY2FuIGVpdGhlciBiZSBjb250cm9sbGVkIHRocm91Z2ggYVxuICogIFx0dGFyZ2V0IGdyb3VwIG9yIGRpcmVjdGx5LCBidXQgbm90IGJvdGguXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbk9iamVjdEdyb3VwKCkge1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdC8vIGNhY2hlZCBvYmplY3RzIGZvbGxvd2VkIGJ5IHRoZSBhY3RpdmUgb25lc1xuXHR0aGlzLl9vYmplY3RzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApO1xuXG5cdHRoaXMubkNhY2hlZE9iamVjdHNfID0gMDtcdFx0XHQvLyB0aHJlc2hvbGRcblx0Ly8gbm90ZTogcmVhZCBieSBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlXG5cblx0dmFyIGluZGljZXMgPSB7fTtcblx0dGhpcy5faW5kaWNlc0J5VVVJRCA9IGluZGljZXM7XHRcdC8vIGZvciBib29ra2VlcGluZ1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRpbmRpY2VzWyBhcmd1bWVudHNbIGkgXS51dWlkIF0gPSBpO1xuXG5cdH1cblxuXHR0aGlzLl9wYXRocyA9IFtdO1x0XHRcdFx0XHQvLyBpbnNpZGU6IHN0cmluZ1xuXHR0aGlzLl9wYXJzZWRQYXRocyA9IFtdO1x0XHRcdFx0Ly8gaW5zaWRlOiB7IHdlIGRvbid0IGNhcmUsIGhlcmUgfVxuXHR0aGlzLl9iaW5kaW5ncyA9IFtdOyBcdFx0XHRcdC8vIGluc2lkZTogQXJyYXk8IFByb3BlcnR5QmluZGluZyA+XG5cdHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCA9IHt9OyBcdC8vIGluc2lkZTogaW5kaWNlcyBpbiB0aGVzZSBhcnJheXNcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHRoaXMuc3RhdHMgPSB7XG5cblx0XHRvYmplY3RzOiB7XG5cdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHNjb3BlLl9vYmplY3RzLmxlbmd0aDtcblxuXHRcdFx0fSxcblx0XHRcdGdldCBpblVzZSgpIHtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcy50b3RhbCAtIHNjb3BlLm5DYWNoZWRPYmplY3RzXztcblxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0IGJpbmRpbmdzUGVyT2JqZWN0KCkge1xuXG5cdFx0XHRyZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDtcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbk9iamVjdEdyb3VwLnByb3RvdHlwZSwge1xuXG5cdGlzQW5pbWF0aW9uT2JqZWN0R3JvdXA6IHRydWUsXG5cblx0YWRkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxuXHRcdFx0cGF0aHMgPSB0aGlzLl9wYXRocyxcblx0XHRcdHBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoLFxuXHRcdFx0a25vd25PYmplY3QgPSB1bmRlZmluZWQ7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZCxcblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdGlmICggaW5kZXggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyB1bmtub3duIG9iamVjdCAtPiBhZGQgaXQgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHRpbmRleCA9IG5PYmplY3RzICsrO1xuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0cy5wdXNoKCBvYmplY3QgKTtcblxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0YmluZGluZ3NbIGogXS5wdXNoKCBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHtcblxuXHRcdFx0XHRrbm93bk9iamVjdCA9IG9iamVjdHNbIGluZGV4IF07XG5cblx0XHRcdFx0Ly8gbW92ZSBleGlzdGluZyBvYmplY3QgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHR2YXIgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNoZWRPYmplY3RzLFxuXHRcdFx0XHRcdGxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdENhY2hlZE9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gZmlyc3RBY3RpdmVJbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdID0gb2JqZWN0O1xuXG5cdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHR2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSxcblx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF07XG5cblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBsYXN0Q2FjaGVkO1xuXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHNpbmNlIHdlIGRvIG5vdCBib3RoZXIgdG8gY3JlYXRlIG5ldyBiaW5kaW5nc1xuXHRcdFx0XHRcdFx0Ly8gZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkLCB0aGUgYmluZGluZyBtYXlcblx0XHRcdFx0XHRcdC8vIG9yIG1heSBub3QgZXhpc3RcblxuXHRcdFx0XHRcdFx0YmluZGluZyA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aHNbIGogXSwgcGFyc2VkUGF0aHNbIGogXSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0c1sgaW5kZXggXSAhPT0ga25vd25PYmplY3QgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkFuaW1hdGlvbk9iamVjdEdyb3VwOiBEaWZmZXJlbnQgb2JqZWN0cyB3aXRoIHRoZSBzYW1lIFVVSUQgJyArXG5cdFx0XHRcdFx0XHQnZGV0ZWN0ZWQuIENsZWFuIHRoZSBjYWNoZXMgb3IgcmVjcmVhdGUgeW91ciBpbmZyYXN0cnVjdHVyZSB3aGVuIHJlbG9hZGluZyBzY2VuZXMuJyApO1xuXG5cdFx0XHR9IC8vIGVsc2UgdGhlIG9iamVjdCBpcyBhbHJlYWR5IHdoZXJlIHdlIHdhbnQgaXQgdG8gYmVcblxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcblxuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSxcblx0XHRcdFx0dXVpZCA9IG9iamVjdC51dWlkLFxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICYmIGluZGV4ID49IG5DYWNoZWRPYmplY3RzICkge1xuXG5cdFx0XHRcdC8vIG1vdmUgZXhpc3Rpbmcgb2JqZWN0IGludG8gdGhlIENBQ0hFRCByZWdpb25cblxuXHRcdFx0XHR2YXIgbGFzdENhY2hlZEluZGV4ID0gbkNhY2hlZE9iamVjdHMgKyssXG5cdFx0XHRcdFx0Zmlyc3RBY3RpdmVPYmplY3QgPSBvYmplY3RzWyBsYXN0Q2FjaGVkSW5kZXggXTtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBmaXJzdEFjdGl2ZU9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGZpcnN0QWN0aXZlT2JqZWN0O1xuXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIHV1aWQgXSA9IGxhc3RDYWNoZWRJbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgbGFzdENhY2hlZEluZGV4IF0gPSBvYmplY3Q7XG5cblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdHZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLFxuXHRcdFx0XHRcdFx0Zmlyc3RBY3RpdmUgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdLFxuXHRcdFx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTtcblxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGZpcnN0QWN0aXZlO1xuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgbGFzdENhY2hlZEluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXG5cblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlICYgZm9yZ2V0XG5cdHVuY2FjaGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcblx0XHRcdG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZGVsZXRlIGluZGljZXNCeVVVSURbIHV1aWQgXTtcblxuXHRcdFx0XHRpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMgKSB7XG5cblx0XHRcdFx0XHQvLyBvYmplY3QgaXMgY2FjaGVkLCBzaHJpbmsgdGhlIENBQ0hFRCByZWdpb25cblxuXHRcdFx0XHRcdHZhciBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsXG5cdFx0XHRcdFx0XHRsYXN0Q2FjaGVkT2JqZWN0ID0gb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdLFxuXHRcdFx0XHRcdFx0bGFzdEluZGV4ID0gLS0gbk9iamVjdHMsXG5cdFx0XHRcdFx0XHRsYXN0T2JqZWN0ID0gb2JqZWN0c1sgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHQvLyBsYXN0IGNhY2hlZCBvYmplY3QgdGFrZXMgdGhpcyBvYmplY3QncyBwbGFjZVxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RDYWNoZWRPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7XG5cblx0XHRcdFx0XHQvLyBsYXN0IG9iamVjdCBnb2VzIHRvIHRoZSBhY3RpdmF0ZWQgc2xvdCBhbmQgcG9wXG5cdFx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdE9iamVjdC51dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4O1xuXHRcdFx0XHRcdG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3RPYmplY3Q7XG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcblxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdFx0bGFzdCA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3Q7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIG9iamVjdCBpcyBhY3RpdmUsIGp1c3Qgc3dhcCB3aXRoIHRoZSBsYXN0IGFuZCBwb3BcblxuXHRcdFx0XHRcdHZhciBsYXN0SW5kZXggPSAtLSBuT2JqZWN0cyxcblx0XHRcdFx0XHRcdGxhc3RPYmplY3QgPSBvYmplY3RzWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RPYmplY3Q7XG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcblxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF07XG5cblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSAvLyBjYWNoZWQgb3IgYWN0aXZlXG5cblx0XHRcdH0gLy8gaWYgb2JqZWN0IGlzIGtub3duXG5cblx0XHR9IC8vIGZvciBhcmd1bWVudHNcblxuXHRcdHRoaXMubkNhY2hlZE9iamVjdHNfID0gbkNhY2hlZE9iamVjdHM7XG5cblx0fSxcblxuXHQvLyBJbnRlcm5hbCBpbnRlcmZhY2UgdXNlZCBieSBiZWZyaWVuZGVkIFByb3BlcnR5QmluZGluZy5Db21wb3NpdGU6XG5cblx0c3Vic2NyaWJlXzogZnVuY3Rpb24gKCBwYXRoLCBwYXJzZWRQYXRoICkge1xuXG5cdFx0Ly8gcmV0dXJucyBhbiBhcnJheSBvZiBiaW5kaW5ncyBmb3IgdGhlIGdpdmVuIHBhdGggdGhhdCBpcyBjaGFuZ2VkXG5cdFx0Ly8gYWNjb3JkaW5nIHRvIHRoZSBjb250YWluZWQgb2JqZWN0cyBpbiB0aGUgZ3JvdXBcblxuXHRcdHZhciBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLFxuXHRcdFx0aW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF0sXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIGJpbmRpbmdzWyBpbmRleCBdO1xuXG5cdFx0dmFyIHBhdGhzID0gdGhpcy5fcGF0aHMsXG5cdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0b2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGJpbmRpbmdzRm9yUGF0aCA9IG5ldyBBcnJheSggbk9iamVjdHMgKTtcblxuXHRcdGluZGV4ID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0aW5kaWNlc0J5UGF0aFsgcGF0aCBdID0gaW5kZXg7XG5cblx0XHRwYXRocy5wdXNoKCBwYXRoICk7XG5cdFx0cGFyc2VkUGF0aHMucHVzaCggcGFyc2VkUGF0aCApO1xuXHRcdGJpbmRpbmdzLnB1c2goIGJpbmRpbmdzRm9yUGF0aCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSBuQ2FjaGVkT2JqZWN0cywgbiA9IG9iamVjdHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gb2JqZWN0c1sgaSBdO1xuXHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpIF0gPSBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBiaW5kaW5nc0ZvclBhdGg7XG5cblx0fSxcblxuXHR1bnN1YnNjcmliZV86IGZ1bmN0aW9uICggcGF0aCApIHtcblxuXHRcdC8vIHRlbGxzIHRoZSBncm91cCB0byBmb3JnZXQgYWJvdXQgYSBwcm9wZXJ0eSBwYXRoIGFuZCBubyBsb25nZXJcblx0XHQvLyB1cGRhdGUgdGhlIGFycmF5IHByZXZpb3VzbHkgb2J0YWluZWQgd2l0aCAnc3Vic2NyaWJlXydcblxuXHRcdHZhciBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLFxuXHRcdFx0aW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF07XG5cblx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwYXRocyA9IHRoaXMuX3BhdGhzLFxuXHRcdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NJbmRleCA9IGJpbmRpbmdzLmxlbmd0aCAtIDEsXG5cdFx0XHRcdGxhc3RCaW5kaW5ncyA9IGJpbmRpbmdzWyBsYXN0QmluZGluZ3NJbmRleCBdLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NQYXRoID0gcGF0aFsgbGFzdEJpbmRpbmdzSW5kZXggXTtcblxuXHRcdFx0aW5kaWNlc0J5UGF0aFsgbGFzdEJpbmRpbmdzUGF0aCBdID0gaW5kZXg7XG5cblx0XHRcdGJpbmRpbmdzWyBpbmRleCBdID0gbGFzdEJpbmRpbmdzO1xuXHRcdFx0YmluZGluZ3MucG9wKCk7XG5cblx0XHRcdHBhcnNlZFBhdGhzWyBpbmRleCBdID0gcGFyc2VkUGF0aHNbIGxhc3RCaW5kaW5nc0luZGV4IF07XG5cdFx0XHRwYXJzZWRQYXRocy5wb3AoKTtcblxuXHRcdFx0cGF0aHNbIGluZGV4IF0gPSBwYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTtcblx0XHRcdHBhdGhzLnBvcCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBBY3Rpb24gcHJvdmlkZWQgYnkgQW5pbWF0aW9uTWl4ZXIgZm9yIHNjaGVkdWxpbmcgY2xpcCBwbGF5YmFjayBvbiBzcGVjaWZpY1xuICogb2JqZWN0cy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKlxuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbkFjdGlvbiggbWl4ZXIsIGNsaXAsIGxvY2FsUm9vdCApIHtcblxuXHR0aGlzLl9taXhlciA9IG1peGVyO1xuXHR0aGlzLl9jbGlwID0gY2xpcDtcblx0dGhpcy5fbG9jYWxSb290ID0gbG9jYWxSb290IHx8IG51bGw7XG5cblx0dmFyIHRyYWNrcyA9IGNsaXAudHJhY2tzLFxuXHRcdG5UcmFja3MgPSB0cmFja3MubGVuZ3RoLFxuXHRcdGludGVycG9sYW50cyA9IG5ldyBBcnJheSggblRyYWNrcyApO1xuXG5cdHZhciBpbnRlcnBvbGFudFNldHRpbmdzID0ge1xuXHRcdGVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLFxuXHRcdGVuZGluZ0VuZDogWmVyb0N1cnZhdHVyZUVuZGluZ1xuXHR9O1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHtcblxuXHRcdHZhciBpbnRlcnBvbGFudCA9IHRyYWNrc1sgaSBdLmNyZWF0ZUludGVycG9sYW50KCBudWxsICk7XG5cdFx0aW50ZXJwb2xhbnRzWyBpIF0gPSBpbnRlcnBvbGFudDtcblx0XHRpbnRlcnBvbGFudC5zZXR0aW5ncyA9IGludGVycG9sYW50U2V0dGluZ3M7XG5cblx0fVxuXG5cdHRoaXMuX2ludGVycG9sYW50U2V0dGluZ3MgPSBpbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdHRoaXMuX2ludGVycG9sYW50cyA9IGludGVycG9sYW50cztcdC8vIGJvdW5kIGJ5IHRoZSBtaXhlclxuXG5cdC8vIGluc2lkZTogUHJvcGVydHlNaXhlciAobWFuYWdlZCBieSB0aGUgbWl4ZXIpXG5cdHRoaXMuX3Byb3BlcnR5QmluZGluZ3MgPSBuZXcgQXJyYXkoIG5UcmFja3MgKTtcblxuXHR0aGlzLl9jYWNoZUluZGV4ID0gbnVsbDtcdFx0XHQvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyXG5cdHRoaXMuX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1x0XHQvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyXG5cblx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XG5cblx0dGhpcy5sb29wID0gTG9vcFJlcGVhdDtcblx0dGhpcy5fbG9vcENvdW50ID0gLSAxO1xuXG5cdC8vIGdsb2JhbCBtaXhlciB0aW1lIHdoZW4gdGhlIGFjdGlvbiBpcyB0byBiZSBzdGFydGVkXG5cdC8vIGl0J3Mgc2V0IGJhY2sgdG8gJ251bGwnIHVwb24gc3RhcnQgb2YgdGhlIGFjdGlvblxuXHR0aGlzLl9zdGFydFRpbWUgPSBudWxsO1xuXG5cdC8vIHNjYWxlZCBsb2NhbCB0aW1lIG9mIHRoZSBhY3Rpb25cblx0Ly8gZ2V0cyBjbGFtcGVkIG9yIHdyYXBwZWQgdG8gMC4uY2xpcC5kdXJhdGlvbiBhY2NvcmRpbmcgdG8gbG9vcFxuXHR0aGlzLnRpbWUgPSAwO1xuXG5cdHRoaXMudGltZVNjYWxlID0gMTtcblx0dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gMTtcblxuXHR0aGlzLndlaWdodCA9IDE7XG5cdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IDE7XG5cblx0dGhpcy5yZXBldGl0aW9ucyA9IEluZmluaXR5OyBcdFx0Ly8gbm8uIG9mIHJlcGV0aXRpb25zIHdoZW4gbG9vcGluZ1xuXG5cdHRoaXMucGF1c2VkID0gZmFsc2U7XHRcdFx0XHQvLyB0cnVlIC0+IHplcm8gZWZmZWN0aXZlIHRpbWUgc2NhbGVcblx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcdFx0XHRcdC8vIGZhbHNlIC0+IHplcm8gZWZmZWN0aXZlIHdlaWdodFxuXG5cdHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgXHQ9IGZhbHNlO1x0Ly8ga2VlcCBmZWVkaW5nIHRoZSBsYXN0IGZyYW1lP1xuXG5cdHRoaXMuemVyb1Nsb3BlQXRTdGFydCBcdD0gdHJ1ZTtcdFx0Ly8gZm9yIHNtb290aCBpbnRlcnBvbGF0aW9uIHcvbyBzZXBhcmF0ZVxuXHR0aGlzLnplcm9TbG9wZUF0RW5kXHRcdD0gdHJ1ZTtcdFx0Ly8gY2xpcHMgZm9yIHN0YXJ0LCBsb29wIGFuZCBlbmRcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25BY3Rpb24ucHJvdG90eXBlLCB7XG5cblx0Ly8gU3RhdGUgJiBTY2hlZHVsaW5nXG5cblx0cGxheTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN0b3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuX21peGVyLl9kZWFjdGl2YXRlQWN0aW9uKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcy5yZXNldCgpO1xuXG5cdH0sXG5cblx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMucGF1c2VkID0gZmFsc2U7XG5cdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTtcblxuXHRcdHRoaXMudGltZSA9IDA7XHRcdFx0Ly8gcmVzdGFydCBjbGlwXG5cdFx0dGhpcy5fbG9vcENvdW50ID0gLSAxO1x0Ly8gZm9yZ2V0IHByZXZpb3VzIGxvb3BzXG5cdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDtcdC8vIGZvcmdldCBzY2hlZHVsaW5nXG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKTtcblxuXHR9LFxuXG5cdGlzUnVubmluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZW5hYmxlZCAmJiAhIHRoaXMucGF1c2VkICYmIHRoaXMudGltZVNjYWxlICE9PSAwICYmXG5cdFx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9PT0gbnVsbCAmJiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24oIHRoaXMgKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybiB0cnVlIHdoZW4gcGxheSBoYXMgYmVlbiBjYWxsZWRcblx0aXNTY2hlZHVsZWQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24oIHRoaXMgKTtcblxuXHR9LFxuXG5cdHN0YXJ0QXQ6IGZ1bmN0aW9uICggdGltZSApIHtcblxuXHRcdHRoaXMuX3N0YXJ0VGltZSA9IHRpbWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldExvb3A6IGZ1bmN0aW9uICggbW9kZSwgcmVwZXRpdGlvbnMgKSB7XG5cblx0XHR0aGlzLmxvb3AgPSBtb2RlO1xuXHRcdHRoaXMucmVwZXRpdGlvbnMgPSByZXBldGl0aW9ucztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gV2VpZ2h0XG5cblx0Ly8gc2V0IHRoZSB3ZWlnaHQgc3RvcHBpbmcgYW55IHNjaGVkdWxlZCBmYWRpbmdcblx0Ly8gYWx0aG91Z2ggLmVuYWJsZWQgPSBmYWxzZSB5aWVsZHMgYW4gZWZmZWN0aXZlIHdlaWdodCBvZiB6ZXJvLCB0aGlzXG5cdC8vIG1ldGhvZCBkb2VzICpub3QqIGNoYW5nZSAuZW5hYmxlZCwgYmVjYXVzZSBpdCB3b3VsZCBiZSBjb25mdXNpbmdcblx0c2V0RWZmZWN0aXZlV2VpZ2h0OiBmdW5jdGlvbiAoIHdlaWdodCApIHtcblxuXHRcdHRoaXMud2VpZ2h0ID0gd2VpZ2h0O1xuXG5cdFx0Ly8gbm90ZTogc2FtZSBsb2dpYyBhcyB3aGVuIHVwZGF0ZWQgYXQgcnVudGltZVxuXHRcdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHRoaXMuZW5hYmxlZCA/IHdlaWdodCA6IDA7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wRmFkaW5nKCk7XG5cblx0fSxcblxuXHQvLyByZXR1cm4gdGhlIHdlaWdodCBjb25zaWRlcmluZyBmYWRpbmcgYW5kIC5lbmFibGVkXG5cdGdldEVmZmVjdGl2ZVdlaWdodDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodDtcblxuXHR9LFxuXG5cdGZhZGVJbjogZnVuY3Rpb24gKCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyggZHVyYXRpb24sIDAsIDEgKTtcblxuXHR9LFxuXG5cdGZhZGVPdXQ6IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9uLCAxLCAwICk7XG5cblx0fSxcblxuXHRjcm9zc0ZhZGVGcm9tOiBmdW5jdGlvbiAoIGZhZGVPdXRBY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkge1xuXG5cdFx0ZmFkZU91dEFjdGlvbi5mYWRlT3V0KCBkdXJhdGlvbiApO1xuXHRcdHRoaXMuZmFkZUluKCBkdXJhdGlvbiApO1xuXG5cdFx0aWYgKCB3YXJwICkge1xuXG5cdFx0XHR2YXIgZmFkZUluRHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uLFxuXHRcdFx0XHRmYWRlT3V0RHVyYXRpb24gPSBmYWRlT3V0QWN0aW9uLl9jbGlwLmR1cmF0aW9uLFxuXG5cdFx0XHRcdHN0YXJ0RW5kUmF0aW8gPSBmYWRlT3V0RHVyYXRpb24gLyBmYWRlSW5EdXJhdGlvbixcblx0XHRcdFx0ZW5kU3RhcnRSYXRpbyA9IGZhZGVJbkR1cmF0aW9uIC8gZmFkZU91dER1cmF0aW9uO1xuXG5cdFx0XHRmYWRlT3V0QWN0aW9uLndhcnAoIDEuMCwgc3RhcnRFbmRSYXRpbywgZHVyYXRpb24gKTtcblx0XHRcdHRoaXMud2FycCggZW5kU3RhcnRSYXRpbywgMS4wLCBkdXJhdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjcm9zc0ZhZGVUbzogZnVuY3Rpb24gKCBmYWRlSW5BY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkge1xuXG5cdFx0cmV0dXJuIGZhZGVJbkFjdGlvbi5jcm9zc0ZhZGVGcm9tKCB0aGlzLCBkdXJhdGlvbiwgd2FycCApO1xuXG5cdH0sXG5cblx0c3RvcEZhZGluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHdlaWdodEludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XG5cblx0XHRpZiAoIHdlaWdodEludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XG5cdFx0XHR0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIHdlaWdodEludGVycG9sYW50ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIFRpbWUgU2NhbGUgQ29udHJvbFxuXG5cdC8vIHNldCB0aGUgdGltZSBzY2FsZSBzdG9wcGluZyBhbnkgc2NoZWR1bGVkIHdhcnBpbmdcblx0Ly8gYWx0aG91Z2ggLnBhdXNlZCA9IHRydWUgeWllbGRzIGFuIGVmZmVjdGl2ZSB0aW1lIHNjYWxlIG9mIHplcm8sIHRoaXNcblx0Ly8gbWV0aG9kIGRvZXMgKm5vdCogY2hhbmdlIC5wYXVzZWQsIGJlY2F1c2UgaXQgd291bGQgYmUgY29uZnVzaW5nXG5cdHNldEVmZmVjdGl2ZVRpbWVTY2FsZTogZnVuY3Rpb24gKCB0aW1lU2NhbGUgKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aGlzLnBhdXNlZCA/IDAgOiB0aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRoZSB0aW1lIHNjYWxlIGNvbnNpZGVyaW5nIHdhcnBpbmcgYW5kIC5wYXVzZWRcblx0Z2V0RWZmZWN0aXZlVGltZVNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlO1xuXG5cdH0sXG5cblx0c2V0RHVyYXRpb246IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRoaXMuX2NsaXAuZHVyYXRpb24gLyBkdXJhdGlvbjtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0fSxcblxuXHRzeW5jV2l0aDogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR0aGlzLnRpbWUgPSBhY3Rpb24udGltZTtcblx0XHR0aGlzLnRpbWVTY2FsZSA9IGFjdGlvbi50aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0aGFsdDogZnVuY3Rpb24gKCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLndhcnAoIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSwgMCwgZHVyYXRpb24gKTtcblxuXHR9LFxuXG5cdHdhcnA6IGZ1bmN0aW9uICggc3RhcnRUaW1lU2NhbGUsIGVuZFRpbWVTY2FsZSwgZHVyYXRpb24gKSB7XG5cblx0XHR2YXIgbWl4ZXIgPSB0aGlzLl9taXhlciwgbm93ID0gbWl4ZXIudGltZSxcblx0XHRcdGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQsXG5cblx0XHRcdHRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aW50ZXJwb2xhbnQgPSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpO1xuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudDtcblxuXHRcdH1cblxuXHRcdHZhciB0aW1lcyA9IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdHZhbHVlcyA9IGludGVycG9sYW50LnNhbXBsZVZhbHVlcztcblxuXHRcdHRpbWVzWyAwIF0gPSBub3c7XG5cdFx0dGltZXNbIDEgXSA9IG5vdyArIGR1cmF0aW9uO1xuXG5cdFx0dmFsdWVzWyAwIF0gPSBzdGFydFRpbWVTY2FsZSAvIHRpbWVTY2FsZTtcblx0XHR2YWx1ZXNbIDEgXSA9IGVuZFRpbWVTY2FsZSAvIHRpbWVTY2FsZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3RvcFdhcnBpbmc6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0aW1lU2NhbGVJbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xuXG5cdFx0aWYgKCB0aW1lU2NhbGVJbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHRcdFx0dGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB0aW1lU2NhbGVJbnRlcnBvbGFudCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBPYmplY3QgQWNjZXNzb3JzXG5cblx0Z2V0TWl4ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9taXhlcjtcblxuXHR9LFxuXG5cdGdldENsaXA6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9jbGlwO1xuXG5cdH0sXG5cblx0Z2V0Um9vdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsUm9vdCB8fCB0aGlzLl9taXhlci5fcm9vdDtcblxuXHR9LFxuXG5cdC8vIEludGVybmFcblxuXHRfdXBkYXRlOiBmdW5jdGlvbiAoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICkge1xuXG5cdFx0Ly8gY2FsbGVkIGJ5IHRoZSBtaXhlclxuXG5cdFx0aWYgKCAhIHRoaXMuZW5hYmxlZCApIHtcblxuXHRcdFx0Ly8gY2FsbCAuX3VwZGF0ZVdlaWdodCgpIHRvIHVwZGF0ZSAuX2VmZmVjdGl2ZVdlaWdodFxuXG5cdFx0XHR0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBzdGFydFRpbWUgPSB0aGlzLl9zdGFydFRpbWU7XG5cblx0XHRpZiAoIHN0YXJ0VGltZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gY2hlY2sgZm9yIHNjaGVkdWxlZCBzdGFydCBvZiBhY3Rpb25cblxuXHRcdFx0dmFyIHRpbWVSdW5uaW5nID0gKCB0aW1lIC0gc3RhcnRUaW1lICkgKiB0aW1lRGlyZWN0aW9uO1xuXHRcdFx0aWYgKCB0aW1lUnVubmluZyA8IDAgfHwgdGltZURpcmVjdGlvbiA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm47IC8vIHlldCB0byBjb21lIC8gZG9uJ3QgZGVjaWRlIHdoZW4gZGVsdGEgPSAwXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gc3RhcnRcblxuXHRcdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDsgLy8gdW5zY2hlZHVsZVxuXHRcdFx0ZGVsdGFUaW1lID0gdGltZURpcmVjdGlvbiAqIHRpbWVSdW5uaW5nO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYXBwbHkgdGltZSBzY2FsZSBhbmQgYWR2YW5jZSB0aW1lXG5cblx0XHRkZWx0YVRpbWUgKj0gdGhpcy5fdXBkYXRlVGltZVNjYWxlKCB0aW1lICk7XG5cdFx0dmFyIGNsaXBUaW1lID0gdGhpcy5fdXBkYXRlVGltZSggZGVsdGFUaW1lICk7XG5cblx0XHQvLyBub3RlOiBfdXBkYXRlVGltZSBtYXkgZGlzYWJsZSB0aGUgYWN0aW9uIHJlc3VsdGluZyBpblxuXHRcdC8vIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgMFxuXG5cdFx0dmFyIHdlaWdodCA9IHRoaXMuX3VwZGF0ZVdlaWdodCggdGltZSApO1xuXG5cdFx0aWYgKCB3ZWlnaHQgPiAwICkge1xuXG5cdFx0XHR2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5faW50ZXJwb2xhbnRzO1xuXHRcdFx0dmFyIHByb3BlcnR5TWl4ZXJzID0gdGhpcy5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gaW50ZXJwb2xhbnRzLmxlbmd0aDsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRpbnRlcnBvbGFudHNbIGogXS5ldmFsdWF0ZSggY2xpcFRpbWUgKTtcblx0XHRcdFx0cHJvcGVydHlNaXhlcnNbIGogXS5hY2N1bXVsYXRlKCBhY2N1SW5kZXgsIHdlaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfdXBkYXRlV2VpZ2h0OiBmdW5jdGlvbiAoIHRpbWUgKSB7XG5cblx0XHR2YXIgd2VpZ2h0ID0gMDtcblxuXHRcdGlmICggdGhpcy5lbmFibGVkICkge1xuXG5cdFx0XHR3ZWlnaHQgPSB0aGlzLndlaWdodDtcblx0XHRcdHZhciBpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0XHRpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBpbnRlcnBvbGFudFZhbHVlID0gaW50ZXJwb2xhbnQuZXZhbHVhdGUoIHRpbWUgKVsgMCBdO1xuXG5cdFx0XHRcdHdlaWdodCAqPSBpbnRlcnBvbGFudFZhbHVlO1xuXG5cdFx0XHRcdGlmICggdGltZSA+IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9uc1sgMSBdICkge1xuXG5cdFx0XHRcdFx0dGhpcy5zdG9wRmFkaW5nKCk7XG5cblx0XHRcdFx0XHRpZiAoIGludGVycG9sYW50VmFsdWUgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGZhZGVkIG91dCwgZGlzYWJsZVxuXHRcdFx0XHRcdFx0dGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSB3ZWlnaHQ7XG5cdFx0cmV0dXJuIHdlaWdodDtcblxuXHR9LFxuXG5cdF91cGRhdGVUaW1lU2NhbGU6IGZ1bmN0aW9uICggdGltZSApIHtcblxuXHRcdHZhciB0aW1lU2NhbGUgPSAwO1xuXG5cdFx0aWYgKCAhIHRoaXMucGF1c2VkICkge1xuXG5cdFx0XHR0aW1lU2NhbGUgPSB0aGlzLnRpbWVTY2FsZTtcblxuXHRcdFx0dmFyIGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dmFyIGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07XG5cblx0XHRcdFx0dGltZVNjYWxlICo9IGludGVycG9sYW50VmFsdWU7XG5cblx0XHRcdFx0aWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0XHRcdFx0XHRpZiAoIHRpbWVTY2FsZSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbW90aW9uIGhhcyBoYWx0ZWQsIHBhdXNlXG5cdFx0XHRcdFx0XHR0aGlzLnBhdXNlZCA9IHRydWU7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyB3YXJwIGRvbmUgLSBhcHBseSBmaW5hbCB0aW1lIHNjYWxlXG5cdFx0XHRcdFx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHRyZXR1cm4gdGltZVNjYWxlO1xuXG5cdH0sXG5cblx0X3VwZGF0ZVRpbWU6IGZ1bmN0aW9uICggZGVsdGFUaW1lICkge1xuXG5cdFx0dmFyIHRpbWUgPSB0aGlzLnRpbWUgKyBkZWx0YVRpbWU7XG5cblx0XHRpZiAoIGRlbHRhVGltZSA9PT0gMCApIHJldHVybiB0aW1lO1xuXG5cdFx0dmFyIGR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbixcblxuXHRcdFx0bG9vcCA9IHRoaXMubG9vcCxcblx0XHRcdGxvb3BDb3VudCA9IHRoaXMuX2xvb3BDb3VudDtcblxuXHRcdGlmICggbG9vcCA9PT0gTG9vcE9uY2UgKSB7XG5cblx0XHRcdGlmICggbG9vcENvdW50ID09PSAtIDEgKSB7XG5cblx0XHRcdFx0Ly8ganVzdCBzdGFydGVkXG5cblx0XHRcdFx0dGhpcy5fbG9vcENvdW50ID0gMDtcblx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdHJ1ZSwgdHJ1ZSwgZmFsc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRoYW5kbGVfc3RvcDoge1xuXG5cdFx0XHRcdGlmICggdGltZSA+PSBkdXJhdGlvbiApIHtcblxuXHRcdFx0XHRcdHRpbWUgPSBkdXJhdGlvbjtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0aW1lIDwgMCApIHtcblxuXHRcdFx0XHRcdHRpbWUgPSAwO1xuXG5cdFx0XHRcdH0gZWxzZSBicmVhayBoYW5kbGVfc3RvcDtcblxuXHRcdFx0XHRpZiAoIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgKSB0aGlzLnBhdXNlZCA9IHRydWU7XG5cdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xuXHRcdFx0XHRcdHR5cGU6ICdmaW5pc2hlZCcsIGFjdGlvbjogdGhpcyxcblx0XHRcdFx0XHRkaXJlY3Rpb246IGRlbHRhVGltZSA8IDAgPyAtIDEgOiAxXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHsgLy8gcmVwZXRpdGl2ZSBSZXBlYXQgb3IgUGluZ1BvbmdcblxuXHRcdFx0dmFyIHBpbmdQb25nID0gKCBsb29wID09PSBMb29wUGluZ1BvbmcgKTtcblxuXHRcdFx0aWYgKCBsb29wQ291bnQgPT09IC0gMSApIHtcblxuXHRcdFx0XHQvLyBqdXN0IHN0YXJ0ZWRcblxuXHRcdFx0XHRpZiAoIGRlbHRhVGltZSA+PSAwICkge1xuXG5cdFx0XHRcdFx0bG9vcENvdW50ID0gMDtcblxuXHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIHRydWUsIHRoaXMucmVwZXRpdGlvbnMgPT09IDAsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHdoZW4gbG9vcGluZyBpbiByZXZlcnNlIGRpcmVjdGlvbiwgdGhlIGluaXRpYWxcblx0XHRcdFx0XHQvLyB0cmFuc2l0aW9uIHRocm91Z2ggemVybyBjb3VudHMgYXMgYSByZXBldGl0aW9uLFxuXHRcdFx0XHRcdC8vIHNvIGxlYXZlIGxvb3BDb3VudCBhdCAtMVxuXG5cdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdGhpcy5yZXBldGl0aW9ucyA9PT0gMCwgdHJ1ZSwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aW1lID49IGR1cmF0aW9uIHx8IHRpbWUgPCAwICkge1xuXG5cdFx0XHRcdC8vIHdyYXAgYXJvdW5kXG5cblx0XHRcdFx0dmFyIGxvb3BEZWx0YSA9IE1hdGguZmxvb3IoIHRpbWUgLyBkdXJhdGlvbiApOyAvLyBzaWduZWRcblx0XHRcdFx0dGltZSAtPSBkdXJhdGlvbiAqIGxvb3BEZWx0YTtcblxuXHRcdFx0XHRsb29wQ291bnQgKz0gTWF0aC5hYnMoIGxvb3BEZWx0YSApO1xuXG5cdFx0XHRcdHZhciBwZW5kaW5nID0gdGhpcy5yZXBldGl0aW9ucyAtIGxvb3BDb3VudDtcblxuXHRcdFx0XHRpZiAoIHBlbmRpbmcgPD0gMCApIHtcblxuXHRcdFx0XHRcdC8vIGhhdmUgdG8gc3RvcCAoc3dpdGNoIHN0YXRlLCBjbGFtcCB0aW1lLCBmaXJlIGV2ZW50KVxuXG5cdFx0XHRcdFx0aWYgKCB0aGlzLmNsYW1wV2hlbkZpbmlzaGVkICkgdGhpcy5wYXVzZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0XHR0aW1lID0gZGVsdGFUaW1lID4gMCA/IGR1cmF0aW9uIDogMDtcblxuXHRcdFx0XHRcdHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHtcblx0XHRcdFx0XHRcdHR5cGU6ICdmaW5pc2hlZCcsIGFjdGlvbjogdGhpcyxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogZGVsdGFUaW1lID4gMCA/IDEgOiAtIDFcblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIGtlZXAgcnVubmluZ1xuXG5cdFx0XHRcdFx0aWYgKCBwZW5kaW5nID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHQvLyBlbnRlcmluZyB0aGUgbGFzdCByb3VuZFxuXG5cdFx0XHRcdFx0XHR2YXIgYXRTdGFydCA9IGRlbHRhVGltZSA8IDA7XG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBhdFN0YXJ0LCAhIGF0U3RhcnQsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBmYWxzZSwgZmFsc2UsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLl9sb29wQ291bnQgPSBsb29wQ291bnQ7XG5cblx0XHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnbG9vcCcsIGFjdGlvbjogdGhpcywgbG9vcERlbHRhOiBsb29wRGVsdGFcblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcGluZ1BvbmcgJiYgKCBsb29wQ291bnQgJiAxICkgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gaW52ZXJ0IHRpbWUgZm9yIHRoZSBcInBvbmcgcm91bmRcIlxuXG5cdFx0XHRcdHRoaXMudGltZSA9IHRpbWU7XG5cdFx0XHRcdHJldHVybiBkdXJhdGlvbiAtIHRpbWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMudGltZSA9IHRpbWU7XG5cdFx0cmV0dXJuIHRpbWU7XG5cblx0fSxcblxuXHRfc2V0RW5kaW5nczogZnVuY3Rpb24gKCBhdFN0YXJ0LCBhdEVuZCwgcGluZ1BvbmcgKSB7XG5cblx0XHR2YXIgc2V0dGluZ3MgPSB0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdFx0aWYgKCBwaW5nUG9uZyApIHtcblxuXHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgXHQ9IFplcm9TbG9wZUVuZGluZztcblx0XHRcdHNldHRpbmdzLmVuZGluZ0VuZFx0XHQ9IFplcm9TbG9wZUVuZGluZztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGFzc3VtaW5nIGZvciBMb29wT25jZSBhdFN0YXJ0ID09IGF0RW5kID09IHRydWVcblxuXHRcdFx0aWYgKCBhdFN0YXJ0ICkge1xuXG5cdFx0XHRcdHNldHRpbmdzLmVuZGluZ1N0YXJ0ID0gdGhpcy56ZXJvU2xvcGVBdFN0YXJ0ID8gWmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCA9IFdyYXBBcm91bmRFbmRpbmc7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBhdEVuZCApIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgPSB0aGlzLnplcm9TbG9wZUF0RW5kID8gWmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgXHQgPSBXcmFwQXJvdW5kRW5kaW5nO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfc2NoZWR1bGVGYWRpbmc6IGZ1bmN0aW9uICggZHVyYXRpb24sIHdlaWdodE5vdywgd2VpZ2h0VGhlbiApIHtcblxuXHRcdHZhciBtaXhlciA9IHRoaXMuX21peGVyLCBub3cgPSBtaXhlci50aW1lLFxuXHRcdFx0aW50ZXJwb2xhbnQgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtcblxuXHRcdGlmICggaW50ZXJwb2xhbnQgPT09IG51bGwgKSB7XG5cblx0XHRcdGludGVycG9sYW50ID0gbWl4ZXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKTtcblx0XHRcdHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gaW50ZXJwb2xhbnQ7XG5cblx0XHR9XG5cblx0XHR2YXIgdGltZXMgPSBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHR2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7XG5cblx0XHR0aW1lc1sgMCBdID0gbm93OyBcdFx0XHRcdHZhbHVlc1sgMCBdID0gd2VpZ2h0Tm93O1xuXHRcdHRpbWVzWyAxIF0gPSBub3cgKyBkdXJhdGlvbjtcdHZhbHVlc1sgMSBdID0gd2VpZ2h0VGhlbjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBQbGF5ZXIgZm9yIEFuaW1hdGlvbkNsaXBzLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uTWl4ZXIoIHJvb3QgKSB7XG5cblx0dGhpcy5fcm9vdCA9IHJvb3Q7XG5cdHRoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7XG5cdHRoaXMuX2FjY3VJbmRleCA9IDA7XG5cblx0dGhpcy50aW1lID0gMDtcblxuXHR0aGlzLnRpbWVTY2FsZSA9IDEuMDtcblxufVxuXG5BbmltYXRpb25NaXhlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQW5pbWF0aW9uTWl4ZXIsXG5cblx0X2JpbmRBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKSB7XG5cblx0XHR2YXIgcm9vdCA9IGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHR0cmFja3MgPSBhY3Rpb24uX2NsaXAudHJhY2tzLFxuXHRcdFx0blRyYWNrcyA9IHRyYWNrcy5sZW5ndGgsXG5cdFx0XHRiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncyxcblx0XHRcdGludGVycG9sYW50cyA9IGFjdGlvbi5faW50ZXJwb2xhbnRzLFxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQsXG5cdFx0XHRiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdzQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRpZiAoIGJpbmRpbmdzQnlOYW1lID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJpbmRpbmdzQnlOYW1lID0ge307XG5cdFx0XHRiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSA9IGJpbmRpbmdzQnlOYW1lO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuVHJhY2tzOyArKyBpICkge1xuXG5cdFx0XHR2YXIgdHJhY2sgPSB0cmFja3NbIGkgXSxcblx0XHRcdFx0dHJhY2tOYW1lID0gdHJhY2submFtZSxcblx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzQnlOYW1lWyB0cmFja05hbWUgXTtcblxuXHRcdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YmluZGluZ3NbIGkgXSA9IGJpbmRpbmc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBleGlzdGluZyBiaW5kaW5nLCBtYWtlIHN1cmUgdGhlIGNhY2hlIGtub3dzXG5cblx0XHRcdFx0XHRpZiAoIGJpbmRpbmcuX2NhY2hlSW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRcdCsrIGJpbmRpbmcucmVmZXJlbmNlQ291bnQ7XG5cdFx0XHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgcGF0aCA9IHByb3RvdHlwZUFjdGlvbiAmJiBwcm90b3R5cGVBY3Rpb24uXG5cdFx0XHRcdFx0X3Byb3BlcnR5QmluZGluZ3NbIGkgXS5iaW5kaW5nLnBhcnNlZFBhdGg7XG5cblx0XHRcdFx0YmluZGluZyA9IG5ldyBQcm9wZXJ0eU1peGVyKFxuXHRcdFx0XHRcdFByb3BlcnR5QmluZGluZy5jcmVhdGUoIHJvb3QsIHRyYWNrTmFtZSwgcGF0aCApLFxuXHRcdFx0XHRcdHRyYWNrLlZhbHVlVHlwZU5hbWUsIHRyYWNrLmdldFZhbHVlU2l6ZSgpICk7XG5cblx0XHRcdFx0KysgYmluZGluZy5yZWZlcmVuY2VDb3VudDtcblx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICk7XG5cblx0XHRcdFx0YmluZGluZ3NbIGkgXSA9IGJpbmRpbmc7XG5cblx0XHRcdH1cblxuXHRcdFx0aW50ZXJwb2xhbnRzWyBpIF0ucmVzdWx0QnVmZmVyID0gYmluZGluZy5idWZmZXI7XG5cblx0XHR9XG5cblx0fSxcblxuXHRfYWN0aXZhdGVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0aWYgKCAhIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSApIHtcblxuXHRcdFx0aWYgKCBhY3Rpb24uX2NhY2hlSW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Ly8gdGhpcyBhY3Rpb24gaGFzIGJlZW4gZm9yZ290dGVuIGJ5IHRoZSBjYWNoZSwgYnV0IHRoZSB1c2VyXG5cdFx0XHRcdC8vIGFwcGVhcnMgdG8gYmUgc3RpbGwgdXNpbmcgaXQgLT4gcmViaW5kXG5cblx0XHRcdFx0dmFyIHJvb3RVdWlkID0gKCBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290ICkudXVpZCxcblx0XHRcdFx0XHRjbGlwVXVpZCA9IGFjdGlvbi5fY2xpcC51dWlkLFxuXHRcdFx0XHRcdGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdFx0XHR0aGlzLl9iaW5kQWN0aW9uKCBhY3Rpb24sXG5cdFx0XHRcdFx0YWN0aW9uc0ZvckNsaXAgJiYgYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF0gKTtcblxuXHRcdFx0XHR0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbiggYWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7XG5cblx0XHRcdC8vIGluY3JlbWVudCByZWZlcmVuY2UgY291bnRzIC8gc29ydCBvdXQgc3RhdGVcblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR2YXIgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBiaW5kaW5nLnVzZUNvdW50ICsrID09PSAwICkge1xuXG5cdFx0XHRcdFx0dGhpcy5fbGVuZEJpbmRpbmcoIGJpbmRpbmcgKTtcblx0XHRcdFx0XHRiaW5kaW5nLnNhdmVPcmlnaW5hbFN0YXRlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2xlbmRBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0X2RlYWN0aXZhdGVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0aWYgKCB0aGlzLl9pc0FjdGl2ZUFjdGlvbiggYWN0aW9uICkgKSB7XG5cblx0XHRcdHZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0Ly8gZGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudHMgLyBzb3J0IG91dCBzdGF0ZVxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0XHRpZiAoIC0tIGJpbmRpbmcudXNlQ291bnQgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRiaW5kaW5nLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCk7XG5cdFx0XHRcdFx0dGhpcy5fdGFrZUJhY2tCaW5kaW5nKCBiaW5kaW5nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3Rha2VCYWNrQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VyXG5cblx0X2luaXRNZW1vcnlNYW5hZ2VyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLl9hY3Rpb25zID0gW107IC8vICduQWN0aXZlQWN0aW9ucycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lc1xuXHRcdHRoaXMuX25BY3RpdmVBY3Rpb25zID0gMDtcblxuXHRcdHRoaXMuX2FjdGlvbnNCeUNsaXAgPSB7fTtcblx0XHQvLyBpbnNpZGU6XG5cdFx0Ly8ge1xuXHRcdC8vIFx0XHRrbm93bkFjdGlvbnM6IEFycmF5PCBBbmltYXRpb25BY3Rpb24gPlx0LSB1c2VkIGFzIHByb3RvdHlwZXNcblx0XHQvLyBcdFx0YWN0aW9uQnlSb290OiBBbmltYXRpb25BY3Rpb25cdFx0XHQtIGxvb2t1cFxuXHRcdC8vIH1cblxuXG5cdFx0dGhpcy5fYmluZGluZ3MgPSBbXTsgLy8gJ25BY3RpdmVCaW5kaW5ncycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lc1xuXHRcdHRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDA7XG5cblx0XHR0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUgPSB7fTsgLy8gaW5zaWRlOiBNYXA8IG5hbWUsIFByb3BlcnR5TWl4ZXIgPlxuXG5cblx0XHR0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzID0gW107IC8vIHNhbWUgZ2FtZSBhcyBhYm92ZVxuXHRcdHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzID0gMDtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR0aGlzLnN0YXRzID0ge1xuXG5cdFx0XHRhY3Rpb25zOiB7XG5cdFx0XHRcdGdldCB0b3RhbCgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fYWN0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0fSxcblx0XHRcdFx0Z2V0IGluVXNlKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9uQWN0aXZlQWN0aW9ucztcblxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0YmluZGluZ3M6IHtcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9iaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRcdFx0fSxcblx0XHRcdFx0Z2V0IGluVXNlKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9uQWN0aXZlQmluZGluZ3M7XG5cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGNvbnRyb2xJbnRlcnBvbGFudHM6IHtcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aDtcblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzO1xuXG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSxcblxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBmb3IgQW5pbWF0aW9uQWN0aW9uIG9iamVjdHNcblxuXHRfaXNBY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0dmFyIGluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4O1xuXHRcdHJldHVybiBpbmRleCAhPT0gbnVsbCAmJiBpbmRleCA8IHRoaXMuX25BY3RpdmVBY3Rpb25zO1xuXG5cdH0sXG5cblx0X2FkZEluYWN0aXZlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGFjdGlvbnNGb3JDbGlwID0ge1xuXG5cdFx0XHRcdGtub3duQWN0aW9uczogWyBhY3Rpb24gXSxcblx0XHRcdFx0YWN0aW9uQnlSb290OiB7fVxuXG5cdFx0XHR9O1xuXG5cdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSAwO1xuXG5cdFx0XHRhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdID0gYWN0aW9uc0ZvckNsaXA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIga25vd25BY3Rpb25zID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zO1xuXG5cdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBrbm93bkFjdGlvbnMubGVuZ3RoO1xuXHRcdFx0a25vd25BY3Rpb25zLnB1c2goIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gYWN0aW9ucy5sZW5ndGg7XG5cdFx0YWN0aW9ucy5wdXNoKCBhY3Rpb24gKTtcblxuXHRcdGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSA9IGFjdGlvbjtcblxuXHR9LFxuXG5cdF9yZW1vdmVJbmFjdGl2ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBhY3Rpb25zLmxlbmd0aCAtIDEgXSxcblx0XHRcdGNhY2hlSW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXg7XG5cblx0XHRsYXN0SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4O1xuXHRcdGFjdGlvbnNbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjtcblx0XHRhY3Rpb25zLnBvcCgpO1xuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gbnVsbDtcblxuXG5cdFx0dmFyIGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCxcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSxcblx0XHRcdGtub3duQWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnMsXG5cblx0XHRcdGxhc3RLbm93bkFjdGlvbiA9XG5cdFx0XHRcdGtub3duQWN0aW9uc0ZvckNsaXBbIGtub3duQWN0aW9uc0ZvckNsaXAubGVuZ3RoIC0gMSBdLFxuXG5cdFx0XHRieUNsaXBDYWNoZUluZGV4ID0gYWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4O1xuXG5cdFx0bGFzdEtub3duQWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gYnlDbGlwQ2FjaGVJbmRleDtcblx0XHRrbm93bkFjdGlvbnNGb3JDbGlwWyBieUNsaXBDYWNoZUluZGV4IF0gPSBsYXN0S25vd25BY3Rpb247XG5cdFx0a25vd25BY3Rpb25zRm9yQ2xpcC5wb3AoKTtcblxuXHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7XG5cblxuXHRcdHZhciBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3QsXG5cdFx0XHRyb290VXVpZCA9ICggYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCApLnV1aWQ7XG5cblx0XHRkZWxldGUgYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBrbm93bkFjdGlvbnNGb3JDbGlwLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0ZGVsZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHR9XG5cblx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTtcblxuXHR9LFxuXG5cdF9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncztcblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0aWYgKCAtLSBiaW5kaW5nLnJlZmVyZW5jZUNvdW50ID09PSAwICkge1xuXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyggYmluZGluZyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRfbGVuZEFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHQvLyBbIGFjdGl2ZSBhY3Rpb25zIHwgIGluYWN0aXZlIGFjdGlvbnMgIF1cblx0XHQvLyBbICBhY3RpdmUgYWN0aW9ucyA+fCBpbmFjdGl2ZSBhY3Rpb25zIF1cblx0XHQvLyAgICAgICAgICAgICAgICAgcyAgICAgICAgYVxuXHRcdC8vICAgICAgICAgICAgICAgICAgPC1zd2FwLT5cblx0XHQvLyAgICAgICAgICAgICAgICAgYSAgICAgICAgc1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0cHJldkluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyArKyxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdGFjdGlvbnNbIGxhc3RBY3RpdmVJbmRleCBdID0gYWN0aW9uO1xuXG5cdFx0Zmlyc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRhY3Rpb25zWyBwcmV2SW5kZXggXSA9IGZpcnN0SW5hY3RpdmVBY3Rpb247XG5cblx0fSxcblxuXHRfdGFrZUJhY2tBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0Ly8gWyAgYWN0aXZlIGFjdGlvbnMgIHwgaW5hY3RpdmUgYWN0aW9ucyBdXG5cdFx0Ly8gWyBhY3RpdmUgYWN0aW9ucyB8PCBpbmFjdGl2ZSBhY3Rpb25zICBdXG5cdFx0Ly8gICAgICAgIGEgICAgICAgIHNcblx0XHQvLyAgICAgICAgIDwtc3dhcC0+XG5cdFx0Ly8gICAgICAgIHMgICAgICAgIGFcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdHByZXZJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsXG5cblx0XHRcdGxhc3RBY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcblxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDtcblx0XHRhY3Rpb25zWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGFjdGlvbjtcblxuXHRcdGxhc3RBY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YWN0aW9uc1sgcHJldkluZGV4IF0gPSBsYXN0QWN0aXZlQWN0aW9uO1xuXG5cdH0sXG5cblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIFByb3BlcnR5TWl4ZXIgb2JqZWN0c1xuXG5cdF9hZGRJbmFjdGl2ZUJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFtZSApIHtcblxuXHRcdHZhciBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSxcblxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGlmICggYmluZGluZ0J5TmFtZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0ge307XG5cdFx0XHRiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSA9IGJpbmRpbmdCeU5hbWU7XG5cblx0XHR9XG5cblx0XHRiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXSA9IGJpbmRpbmc7XG5cblx0XHRiaW5kaW5nLl9jYWNoZUluZGV4ID0gYmluZGluZ3MubGVuZ3RoO1xuXHRcdGJpbmRpbmdzLnB1c2goIGJpbmRpbmcgKTtcblxuXHR9LFxuXG5cdF9yZW1vdmVJbmFjdGl2ZUJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJvcEJpbmRpbmcgPSBiaW5kaW5nLmJpbmRpbmcsXG5cdFx0XHRyb290VXVpZCA9IHByb3BCaW5kaW5nLnJvb3ROb2RlLnV1aWQsXG5cdFx0XHR0cmFja05hbWUgPSBwcm9wQmluZGluZy5wYXRoLFxuXHRcdFx0YmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0sXG5cblx0XHRcdGxhc3RJbmFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1sgYmluZGluZ3MubGVuZ3RoIC0gMSBdLFxuXHRcdFx0Y2FjaGVJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXg7XG5cblx0XHRsYXN0SW5hY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcblx0XHRiaW5kaW5nc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQmluZGluZztcblx0XHRiaW5kaW5ncy5wb3AoKTtcblxuXHRcdGRlbGV0ZSBiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXTtcblxuXHRcdHJlbW92ZV9lbXB0eV9tYXA6IHtcblxuXHRcdFx0Zm9yICggdmFyIF8gaW4gYmluZGluZ0J5TmFtZSApIGJyZWFrIHJlbW92ZV9lbXB0eV9tYXA7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcblxuXHRcdFx0ZGVsZXRlIGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0X2xlbmRCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcgKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdHByZXZJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXgsXG5cblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncyArKyxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1sgbGFzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRiaW5kaW5nLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdGJpbmRpbmdzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7XG5cblx0XHRmaXJzdEluYWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRiaW5kaW5nc1sgcHJldkluZGV4IF0gPSBmaXJzdEluYWN0aXZlQmluZGluZztcblxuXHR9LFxuXG5cdF90YWtlQmFja0JpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJldkluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzLFxuXG5cdFx0XHRsYXN0QWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gYmluZGluZztcblxuXHRcdGxhc3RBY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGJpbmRpbmdzWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVCaW5kaW5nO1xuXG5cdH0sXG5cblxuXHQvLyBNZW1vcnkgbWFuYWdlbWVudCBvZiBJbnRlcnBvbGFudHMgZm9yIHdlaWdodCBhbmQgdGltZSBzY2FsZVxuXG5cdF9sZW5kQ29udHJvbEludGVycG9sYW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cyxcblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzICsrLFxuXHRcdFx0aW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpbnRlcnBvbGFudCA9IG5ldyBMaW5lYXJJbnRlcnBvbGFudChcblx0XHRcdFx0bmV3IEZsb2F0MzJBcnJheSggMiApLCBuZXcgRmxvYXQzMkFycmF5KCAyICksXG5cdFx0XHRcdDEsIHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIgKTtcblxuXHRcdFx0aW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdFx0aW50ZXJwb2xhbnRzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGludGVycG9sYW50O1xuXG5cdH0sXG5cblx0X3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50OiBmdW5jdGlvbiAoIGludGVycG9sYW50ICkge1xuXG5cdFx0dmFyIGludGVycG9sYW50cyA9IHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsXG5cdFx0XHRwcmV2SW5kZXggPSBpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXgsXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzLFxuXG5cdFx0XHRsYXN0QWN0aXZlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGZpcnN0SW5hY3RpdmVJbmRleCBdO1xuXG5cdFx0aW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4O1xuXHRcdGludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBpbnRlcnBvbGFudDtcblxuXHRcdGxhc3RBY3RpdmVJbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0aW50ZXJwb2xhbnRzWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVJbnRlcnBvbGFudDtcblxuXHR9LFxuXG5cdF9jb250cm9sSW50ZXJwb2xhbnRzUmVzdWx0QnVmZmVyOiBuZXcgRmxvYXQzMkFycmF5KCAxICksXG5cblx0Ly8gcmV0dXJuIGFuIGFjdGlvbiBmb3IgYSBjbGlwIG9wdGlvbmFsbHkgdXNpbmcgYSBjdXN0b20gcm9vdCB0YXJnZXRcblx0Ly8gb2JqZWN0ICh0aGlzIG1ldGhvZCBhbGxvY2F0ZXMgYSBsb3Qgb2YgZHluYW1pYyBtZW1vcnkgaW4gY2FzZSBhXG5cdC8vIHByZXZpb3VzbHkgdW5rbm93biBjbGlwL3Jvb3QgY29tYmluYXRpb24gaXMgc3BlY2lmaWVkKVxuXHRjbGlwQWN0aW9uOiBmdW5jdGlvbiAoIGNsaXAsIG9wdGlvbmFsUm9vdCApIHtcblxuXHRcdHZhciByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZCxcblxuXHRcdFx0Y2xpcE9iamVjdCA9IHR5cGVvZiBjbGlwID09PSAnc3RyaW5nJyA/XG5cdFx0XHRcdEFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSggcm9vdCwgY2xpcCApIDogY2xpcCxcblxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwT2JqZWN0ICE9PSBudWxsID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCxcblxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLFxuXHRcdFx0cHJvdG90eXBlQWN0aW9uID0gbnVsbDtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGV4aXN0aW5nQWN0aW9uID1cblx0XHRcdFx0XHRhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRcdGlmICggZXhpc3RpbmdBY3Rpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZXhpc3RpbmdBY3Rpb247XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gd2Uga25vdyB0aGUgY2xpcCwgc28gd2UgZG9uJ3QgaGF2ZSB0byBwYXJzZSBhbGxcblx0XHRcdC8vIHRoZSBiaW5kaW5ncyBhZ2FpbiBidXQgY2FuIGp1c3QgY29weVxuXHRcdFx0cHJvdG90eXBlQWN0aW9uID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zWyAwIF07XG5cblx0XHRcdC8vIGFsc28sIHRha2UgdGhlIGNsaXAgZnJvbSB0aGUgcHJvdG90eXBlIGFjdGlvblxuXHRcdFx0aWYgKCBjbGlwT2JqZWN0ID09PSBudWxsIClcblx0XHRcdFx0Y2xpcE9iamVjdCA9IHByb3RvdHlwZUFjdGlvbi5fY2xpcDtcblxuXHRcdH1cblxuXHRcdC8vIGNsaXAgbXVzdCBiZSBrbm93biB3aGVuIHNwZWNpZmllZCB2aWEgc3RyaW5nXG5cdFx0aWYgKCBjbGlwT2JqZWN0ID09PSBudWxsICkgcmV0dXJuIG51bGw7XG5cblx0XHQvLyBhbGxvY2F0ZSBhbGwgcmVzb3VyY2VzIHJlcXVpcmVkIHRvIHJ1biBpdFxuXHRcdHZhciBuZXdBY3Rpb24gPSBuZXcgQW5pbWF0aW9uQWN0aW9uKCB0aGlzLCBjbGlwT2JqZWN0LCBvcHRpb25hbFJvb3QgKTtcblxuXHRcdHRoaXMuX2JpbmRBY3Rpb24oIG5ld0FjdGlvbiwgcHJvdG90eXBlQWN0aW9uICk7XG5cblx0XHQvLyBhbmQgbWFrZSB0aGUgYWN0aW9uIGtub3duIHRvIHRoZSBtZW1vcnkgbWFuYWdlclxuXHRcdHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBuZXdBY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApO1xuXG5cdFx0cmV0dXJuIG5ld0FjdGlvbjtcblxuXHR9LFxuXG5cdC8vIGdldCBhbiBleGlzdGluZyBhY3Rpb25cblx0ZXhpc3RpbmdBY3Rpb246IGZ1bmN0aW9uICggY2xpcCwgb3B0aW9uYWxSb290ICkge1xuXG5cdFx0dmFyIHJvb3QgPSBvcHRpb25hbFJvb3QgfHwgdGhpcy5fcm9vdCxcblx0XHRcdHJvb3RVdWlkID0gcm9vdC51dWlkLFxuXG5cdFx0XHRjbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdzdHJpbmcnID9cblx0XHRcdFx0QW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKCByb290LCBjbGlwICkgOiBjbGlwLFxuXG5cdFx0XHRjbGlwVXVpZCA9IGNsaXBPYmplY3QgPyBjbGlwT2JqZWN0LnV1aWQgOiBjbGlwLFxuXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJldHVybiBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF0gfHwgbnVsbDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH0sXG5cblx0Ly8gZGVhY3RpdmF0ZXMgYWxsIHByZXZpb3VzbHkgc2NoZWR1bGVkIGFjdGlvbnNcblx0c3RvcEFsbEFjdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0bkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSB0aGlzLl9uQWN0aXZlQmluZGluZ3M7XG5cblx0XHR0aGlzLl9uQWN0aXZlQWN0aW9ucyA9IDA7XG5cdFx0dGhpcy5fbkFjdGl2ZUJpbmRpbmdzID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkFjdGlvbnM7ICsrIGkgKSB7XG5cblx0XHRcdGFjdGlvbnNbIGkgXS5yZXNldCgpO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0udXNlQ291bnQgPSAwO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBhZHZhbmNlIHRoZSB0aW1lIGFuZCB1cGRhdGUgYXBwbHkgdGhlIGFuaW1hdGlvblxuXHR1cGRhdGU6IGZ1bmN0aW9uICggZGVsdGFUaW1lICkge1xuXG5cdFx0ZGVsdGFUaW1lICo9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0bkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucyxcblxuXHRcdFx0dGltZSA9IHRoaXMudGltZSArPSBkZWx0YVRpbWUsXG5cdFx0XHR0aW1lRGlyZWN0aW9uID0gTWF0aC5zaWduKCBkZWx0YVRpbWUgKSxcblxuXHRcdFx0YWNjdUluZGV4ID0gdGhpcy5fYWNjdUluZGV4IF49IDE7XG5cblx0XHQvLyBydW4gYWN0aXZlIGFjdGlvbnNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkFjdGlvbnM7ICsrIGkgKSB7XG5cblx0XHRcdHZhciBhY3Rpb24gPSBhY3Rpb25zWyBpIF07XG5cblx0XHRcdGFjdGlvbi5fdXBkYXRlKCB0aW1lLCBkZWx0YVRpbWUsIHRpbWVEaXJlY3Rpb24sIGFjY3VJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkJpbmRpbmdzOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLmFwcGx5KCBhY2N1SW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRoaXMgbWl4ZXIncyByb290IHRhcmdldCBvYmplY3Rcblx0Z2V0Um9vdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3Jvb3Q7XG5cblx0fSxcblxuXHQvLyBmcmVlIGFsbCByZXNvdXJjZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIGNsaXBcblx0dW5jYWNoZUNsaXA6IGZ1bmN0aW9uICggY2xpcCApIHtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdGNsaXBVdWlkID0gY2xpcC51dWlkLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIG5vdGU6IGp1c3QgY2FsbGluZyBfcmVtb3ZlSW5hY3RpdmVBY3Rpb24gd291bGQgbWVzcyB1cCB0aGVcblx0XHRcdC8vIGl0ZXJhdGlvbiBzdGF0ZSBhbmQgYWxzbyByZXF1aXJlIHVwZGF0aW5nIHRoZSBzdGF0ZSB3ZSBjYW5cblx0XHRcdC8vIGp1c3QgdGhyb3cgYXdheVxuXG5cdFx0XHR2YXIgYWN0aW9uc1RvUmVtb3ZlID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhY3Rpb25zVG9SZW1vdmUubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBhY3Rpb24gPSBhY3Rpb25zVG9SZW1vdmVbIGkgXTtcblxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0XHR2YXIgY2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcblx0XHRcdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBhY3Rpb25zLmxlbmd0aCAtIDEgXTtcblxuXHRcdFx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBudWxsO1xuXHRcdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1xuXG5cdFx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0XHRcdGFjdGlvbnNbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUFjdGlvbjtcblx0XHRcdFx0YWN0aW9ucy5wb3AoKTtcblxuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkZWxldGUgYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIGZyZWUgYWxsIHJlc291cmNlcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgcm9vdCB0YXJnZXQgb2JqZWN0XG5cdHVuY2FjaGVSb290OiBmdW5jdGlvbiAoIHJvb3QgKSB7XG5cblx0XHR2YXIgcm9vdFV1aWQgPSByb290LnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcDtcblxuXHRcdGZvciAoIHZhciBjbGlwVXVpZCBpbiBhY3Rpb25zQnlDbGlwICkge1xuXG5cdFx0XHR2YXIgYWN0aW9uQnlSb290ID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXS5hY3Rpb25CeVJvb3QsXG5cdFx0XHRcdGFjdGlvbiA9IGFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdFx0aWYgKCBhY3Rpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRpZiAoIGJpbmRpbmdCeU5hbWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIHRyYWNrTmFtZSBpbiBiaW5kaW5nQnlOYW1lICkge1xuXG5cdFx0XHRcdHZhciBiaW5kaW5nID0gYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07XG5cdFx0XHRcdGJpbmRpbmcucmVzdG9yZU9yaWdpbmFsU3RhdGUoKTtcblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIHJlbW92ZSBhIHRhcmdldGVkIGNsaXAgZnJvbSB0aGUgY2FjaGVcblx0dW5jYWNoZUFjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XG5cblx0XHR2YXIgYWN0aW9uID0gdGhpcy5leGlzdGluZ0FjdGlvbiggY2xpcCwgb3B0aW9uYWxSb290ICk7XG5cblx0XHRpZiAoIGFjdGlvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7XG5cdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBVbmlmb3JtKCB2YWx1ZSApIHtcblxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiBUeXBlIHBhcmFtZXRlciBpcyBubyBsb25nZXIgbmVlZGVkLicgKTtcblx0XHR2YWx1ZSA9IGFyZ3VtZW50c1sgMSBdO1xuXG5cdH1cblxuXHR0aGlzLnZhbHVlID0gdmFsdWU7XG5cbn1cblxuVW5pZm9ybS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0cmV0dXJuIG5ldyBVbmlmb3JtKCB0aGlzLnZhbHVlLmNsb25lID09PSB1bmRlZmluZWQgPyB0aGlzLnZhbHVlIDogdGhpcy52YWx1ZS5jbG9uZSgpICk7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkoKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSc7XG5cdHRoaXMubWF4SW5zdGFuY2VkQ291bnQgPSB1bmRlZmluZWQ7XG5cbn1cblxuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnksXG5cblx0aXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5tYXhJbnN0YW5jZWRDb3VudCA9IHNvdXJjZS5tYXhJbnN0YW5jZWRDb3VudDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSggaW50ZXJsZWF2ZWRCdWZmZXIsIGl0ZW1TaXplLCBvZmZzZXQsIG5vcm1hbGl6ZWQgKSB7XG5cblx0dGhpcy5kYXRhID0gaW50ZXJsZWF2ZWRCdWZmZXI7XG5cdHRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTtcblx0dGhpcy5vZmZzZXQgPSBvZmZzZXQ7XG5cblx0dGhpcy5ub3JtYWxpemVkID0gbm9ybWFsaXplZCA9PT0gdHJ1ZTtcblxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7XG5cblx0Y291bnQ6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5kYXRhLmNvdW50O1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0YXJyYXk6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5O1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXG5cdHNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0IF0gPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIGluZGV4LCB5ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFo6IGZ1bmN0aW9uICggaW5kZXgsIHogKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAzIF0gPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRYOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgXTtcblxuXHR9LFxuXG5cdGdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXTtcblxuXHR9LFxuXG5cdGdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXTtcblxuXHR9LFxuXG5cdGdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXTtcblxuXHR9LFxuXG5cdHNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkge1xuXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWVo6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHogKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWlc6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHosIHcgKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHN0cmlkZSApIHtcblxuXHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cdHRoaXMuc3RyaWRlID0gc3RyaWRlO1xuXHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHN0cmlkZSA6IDA7XG5cblx0dGhpcy5keW5hbWljID0gZmFsc2U7XG5cdHRoaXMudXBkYXRlUmFuZ2UgPSB7IG9mZnNldDogMCwgY291bnQ6IC0gMSB9O1xuXG5cdHRoaXMudmVyc2lvbiA9IDA7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUsICduZWVkc1VwZGF0ZScsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUsIHtcblxuXHRpc0ludGVybGVhdmVkQnVmZmVyOiB0cnVlLFxuXG5cdG9uVXBsb2FkQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdHNldEFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHRoaXMuc3RyaWRlIDogMDtcblx0XHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldER5bmFtaWM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmR5bmFtaWMgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7XG5cdFx0dGhpcy5jb3VudCA9IHNvdXJjZS5jb3VudDtcblx0XHR0aGlzLnN0cmlkZSA9IHNvdXJjZS5zdHJpZGU7XG5cdFx0dGhpcy5keW5hbWljID0gc291cmNlLmR5bmFtaWM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBdDogZnVuY3Rpb24gKCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkge1xuXG5cdFx0aW5kZXgxICo9IHRoaXMuc3RyaWRlO1xuXHRcdGluZGV4MiAqPSBhdHRyaWJ1dGUuc3RyaWRlO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5zdHJpZGU7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlLCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMuYXJyYXkuc2V0KCB2YWx1ZSwgb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRvblVwbG9hZDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHRoaXMub25VcGxvYWRDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBzdHJpZGUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0SW50ZXJsZWF2ZWRCdWZmZXIuY2FsbCggdGhpcywgYXJyYXksIHN0cmlkZSApO1xuXG5cdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IG1lc2hQZXJBdHRyaWJ1dGUgfHwgMTtcblxufVxuXG5JbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcixcblxuXHRpc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0SW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICovXG5cbmZ1bmN0aW9uIEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBhcnJheSwgaXRlbVNpemUgKTtcblxuXHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBtZXNoUGVyQXR0cmlidXRlIHx8IDE7XG5cbn1cblxuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUsXG5cblx0aXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBzdGVwaG9taSAvIGh0dHA6Ly9zdGVwaGFuZWdpbmllci5jb20vXG4gKi9cblxuZnVuY3Rpb24gUmF5Y2FzdGVyKCBvcmlnaW4sIGRpcmVjdGlvbiwgbmVhciwgZmFyICkge1xuXG5cdHRoaXMucmF5ID0gbmV3IFJheSggb3JpZ2luLCBkaXJlY3Rpb24gKTtcblx0Ly8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZCAoZm9yIGFjY3VyYXRlIGRpc3RhbmNlIGNhbGN1bGF0aW9ucylcblxuXHR0aGlzLm5lYXIgPSBuZWFyIHx8IDA7XG5cdHRoaXMuZmFyID0gZmFyIHx8IEluZmluaXR5O1xuXG5cdHRoaXMucGFyYW1zID0ge1xuXHRcdE1lc2g6IHt9LFxuXHRcdExpbmU6IHt9LFxuXHRcdExPRDoge30sXG5cdFx0UG9pbnRzOiB7IHRocmVzaG9sZDogMSB9LFxuXHRcdFNwcml0ZToge31cblx0fTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcy5wYXJhbXMsIHtcblx0XHRQb2ludENsb3VkOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXI6IHBhcmFtcy5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gcGFyYW1zLlBvaW50cy4nICk7XG5cdFx0XHRcdHJldHVybiB0aGlzLlBvaW50cztcblxuXHRcdFx0fVxuXHRcdH1cblx0fSApO1xuXG59XG5cbmZ1bmN0aW9uIGFzY1NvcnQoIGEsIGIgKSB7XG5cblx0cmV0dXJuIGEuZGlzdGFuY2UgLSBiLmRpc3RhbmNlO1xuXG59XG5cbmZ1bmN0aW9uIGludGVyc2VjdE9iamVjdCggb2JqZWN0LCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApIHtcblxuXHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRvYmplY3QucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XG5cblx0aWYgKCByZWN1cnNpdmUgPT09IHRydWUgKSB7XG5cblx0XHR2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpbnRlcnNlY3RPYmplY3QoIGNoaWxkcmVuWyBpIF0sIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdHJ1ZSApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBSYXljYXN0ZXIucHJvdG90eXBlLCB7XG5cblx0bGluZVByZWNpc2lvbjogMSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggb3JpZ2luLCBkaXJlY3Rpb24gKSB7XG5cblx0XHQvLyBkaXJlY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkIChmb3IgYWNjdXJhdGUgZGlzdGFuY2UgY2FsY3VsYXRpb25zKVxuXG5cdFx0dGhpcy5yYXkuc2V0KCBvcmlnaW4sIGRpcmVjdGlvbiApO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNhbWVyYTogZnVuY3Rpb24gKCBjb29yZHMsIGNhbWVyYSApIHtcblxuXHRcdGlmICggKCBjYW1lcmEgJiYgY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgKSApIHtcblxuXHRcdFx0dGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cdFx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCBjb29yZHMueCwgY29vcmRzLnksIDAuNSApLnVucHJvamVjdCggY2FtZXJhICkuc3ViKCB0aGlzLnJheS5vcmlnaW4gKS5ub3JtYWxpemUoKTtcblxuXHRcdH0gZWxzZSBpZiAoICggY2FtZXJhICYmIGNhbWVyYS5pc09ydGhvZ3JhcGhpY0NhbWVyYSApICkge1xuXG5cdFx0XHR0aGlzLnJheS5vcmlnaW4uc2V0KCBjb29yZHMueCwgY29vcmRzLnksICggY2FtZXJhLm5lYXIgKyBjYW1lcmEuZmFyICkgLyAoIGNhbWVyYS5uZWFyIC0gY2FtZXJhLmZhciApICkudW5wcm9qZWN0KCBjYW1lcmEgKTsgLy8gc2V0IG9yaWdpbiBpbiBwbGFuZSBvZiBjYW1lcmFcblx0XHRcdHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoIDAsIDAsIC0gMSApLnRyYW5zZm9ybURpcmVjdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUmF5Y2FzdGVyOiBVbnN1cHBvcnRlZCBjYW1lcmEgdHlwZS4nICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRpbnRlcnNlY3RPYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0LCByZWN1cnNpdmUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGludGVyc2VjdHMgPSBvcHRpb25hbFRhcmdldCB8fCBbXTtcblxuXHRcdGludGVyc2VjdE9iamVjdCggb2JqZWN0LCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTtcblxuXHRcdGludGVyc2VjdHMuc29ydCggYXNjU29ydCApO1xuXG5cdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RPYmplY3RzOiBmdW5jdGlvbiAoIG9iamVjdHMsIHJlY3Vyc2l2ZSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgaW50ZXJzZWN0cyA9IG9wdGlvbmFsVGFyZ2V0IHx8IFtdO1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBvYmplY3RzICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0czogb2JqZWN0cyBpcyBub3QgYW4gQXJyYXkuJyApO1xuXHRcdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBvYmplY3RzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGludGVyc2VjdE9iamVjdCggb2JqZWN0c1sgaSBdLCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTtcblxuXHRcdH1cblxuXHRcdGludGVyc2VjdHMuc29ydCggYXNjU29ydCApO1xuXG5cdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDbG9jayggYXV0b1N0YXJ0ICkge1xuXG5cdHRoaXMuYXV0b1N0YXJ0ID0gKCBhdXRvU3RhcnQgIT09IHVuZGVmaW5lZCApID8gYXV0b1N0YXJ0IDogdHJ1ZTtcblxuXHR0aGlzLnN0YXJ0VGltZSA9IDA7XG5cdHRoaXMub2xkVGltZSA9IDA7XG5cdHRoaXMuZWxhcHNlZFRpbWUgPSAwO1xuXG5cdHRoaXMucnVubmluZyA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENsb2NrLnByb3RvdHlwZSwge1xuXG5cdHN0YXJ0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnN0YXJ0VGltZSA9ICggdHlwZW9mIHBlcmZvcm1hbmNlID09PSAndW5kZWZpbmVkJyA/IERhdGUgOiBwZXJmb3JtYW5jZSApLm5vdygpOyAvLyBzZWUgIzEwNzMyXG5cblx0XHR0aGlzLm9sZFRpbWUgPSB0aGlzLnN0YXJ0VGltZTtcblx0XHR0aGlzLmVsYXBzZWRUaW1lID0gMDtcblx0XHR0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuXG5cdH0sXG5cblx0c3RvcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5nZXRFbGFwc2VkVGltZSgpO1xuXHRcdHRoaXMucnVubmluZyA9IGZhbHNlO1xuXHRcdHRoaXMuYXV0b1N0YXJ0ID0gZmFsc2U7XG5cblx0fSxcblxuXHRnZXRFbGFwc2VkVGltZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5nZXREZWx0YSgpO1xuXHRcdHJldHVybiB0aGlzLmVsYXBzZWRUaW1lO1xuXG5cdH0sXG5cblx0Z2V0RGVsdGE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkaWZmID0gMDtcblxuXHRcdGlmICggdGhpcy5hdXRvU3RhcnQgJiYgISB0aGlzLnJ1bm5pbmcgKSB7XG5cblx0XHRcdHRoaXMuc3RhcnQoKTtcblx0XHRcdHJldHVybiAwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnJ1bm5pbmcgKSB7XG5cblx0XHRcdHZhciBuZXdUaW1lID0gKCB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICd1bmRlZmluZWQnID8gRGF0ZSA6IHBlcmZvcm1hbmNlICkubm93KCk7XG5cblx0XHRcdGRpZmYgPSAoIG5ld1RpbWUgLSB0aGlzLm9sZFRpbWUgKSAvIDEwMDA7XG5cdFx0XHR0aGlzLm9sZFRpbWUgPSBuZXdUaW1lO1xuXG5cdFx0XHR0aGlzLmVsYXBzZWRUaW1lICs9IGRpZmY7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGlmZjtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NwaGVyaWNhbF9jb29yZGluYXRlX3N5c3RlbVxuICpcbiAqIFRoZSBwb2xlcyAocGhpKSBhcmUgYXQgdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB5IGF4aXMuXG4gKiBUaGUgZXF1YXRvciBzdGFydHMgYXQgcG9zaXRpdmUgei5cbiAqL1xuXG5mdW5jdGlvbiBTcGhlcmljYWwoIHJhZGl1cywgcGhpLCB0aGV0YSApIHtcblxuXHR0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDEuMDtcblx0dGhpcy5waGkgPSAoIHBoaSAhPT0gdW5kZWZpbmVkICkgPyBwaGkgOiAwOyAvLyB1cCAvIGRvd24gdG93YXJkcyB0b3AgYW5kIGJvdHRvbSBwb2xlXG5cdHRoaXMudGhldGEgPSAoIHRoZXRhICE9PSB1bmRlZmluZWQgKSA/IHRoZXRhIDogMDsgLy8gYXJvdW5kIHRoZSBlcXVhdG9yIG9mIHRoZSBzcGhlcmVcblxuXHRyZXR1cm4gdGhpcztcblxufVxuXG5PYmplY3QuYXNzaWduKCBTcGhlcmljYWwucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHJhZGl1cywgcGhpLCB0aGV0YSApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXHRcdHRoaXMucGhpID0gcGhpO1xuXHRcdHRoaXMudGhldGEgPSB0aGV0YTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggb3RoZXIgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcblx0XHR0aGlzLnBoaSA9IG90aGVyLnBoaTtcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIHJlc3RyaWN0IHBoaSB0byBiZSBiZXR3ZWUgRVBTIGFuZCBQSS1FUFNcblx0bWFrZVNhZmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBFUFMgPSAwLjAwMDAwMTtcblx0XHR0aGlzLnBoaSA9IE1hdGgubWF4KCBFUFMsIE1hdGgubWluKCBNYXRoLlBJIC0gRVBTLCB0aGlzLnBoaSApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHZlYzMgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IHZlYzMubGVuZ3RoKCk7XG5cblx0XHRpZiAoIHRoaXMucmFkaXVzID09PSAwICkge1xuXG5cdFx0XHR0aGlzLnRoZXRhID0gMDtcblx0XHRcdHRoaXMucGhpID0gMDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMudGhldGEgPSBNYXRoLmF0YW4yKCB2ZWMzLngsIHZlYzMueiApOyAvLyBlcXVhdG9yIGFuZ2xlIGFyb3VuZCB5LXVwIGF4aXNcblx0XHRcdHRoaXMucGhpID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdmVjMy55IC8gdGhpcy5yYWRpdXMsIC0gMSwgMSApICk7IC8vIHBvbGFyIGFuZ2xlXG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqIFJlZjogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3lsaW5kcmljYWxfY29vcmRpbmF0ZV9zeXN0ZW1cbiAqXG4gKi9cblxuZnVuY3Rpb24gQ3lsaW5kcmljYWwoIHJhZGl1cywgdGhldGEsIHkgKSB7XG5cblx0dGhpcy5yYWRpdXMgPSAoIHJhZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAxLjA7IC8vIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiB0byBhIHBvaW50IGluIHRoZSB4LXogcGxhbmVcblx0dGhpcy50aGV0YSA9ICggdGhldGEgIT09IHVuZGVmaW5lZCApID8gdGhldGEgOiAwOyAvLyBjb3VudGVyY2xvY2t3aXNlIGFuZ2xlIGluIHRoZSB4LXogcGxhbmUgbWVhc3VyZWQgaW4gcmFkaWFucyBmcm9tIHRoZSBwb3NpdGl2ZSB6LWF4aXNcblx0dGhpcy55ID0gKCB5ICE9PSB1bmRlZmluZWQgKSA/IHkgOiAwOyAvLyBoZWlnaHQgYWJvdmUgdGhlIHgteiBwbGFuZVxuXG5cdHJldHVybiB0aGlzO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEN5bGluZHJpY2FsLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCByYWRpdXMsIHRoZXRhLCB5ICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cdFx0dGhpcy50aGV0YSA9IHRoZXRhO1xuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIG90aGVyICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSBvdGhlci5yYWRpdXM7XG5cdFx0dGhpcy50aGV0YSA9IG90aGVyLnRoZXRhO1xuXHRcdHRoaXMueSA9IG90aGVyLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHZlYzMgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IE1hdGguc3FydCggdmVjMy54ICogdmVjMy54ICsgdmVjMy56ICogdmVjMy56ICk7XG5cdFx0dGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHZlYzMueCwgdmVjMy56ICk7XG5cdFx0dGhpcy55ID0gdmVjMy55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIEJveDIoIG1pbiwgbWF4ICkge1xuXG5cdHRoaXMubWluID0gKCBtaW4gIT09IHVuZGVmaW5lZCApID8gbWluIDogbmV3IFZlY3RvcjIoICsgSW5maW5pdHksICsgSW5maW5pdHkgKTtcblx0dGhpcy5tYXggPSAoIG1heCAhPT0gdW5kZWZpbmVkICkgPyBtYXggOiBuZXcgVmVjdG9yMiggLSBJbmZpbml0eSwgLSBJbmZpbml0eSApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEJveDIucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggbWluICk7XG5cdFx0dGhpcy5tYXguY29weSggbWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNlbnRlckFuZFNpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNlbnRlckFuZFNpemUoIGNlbnRlciwgc2l6ZSApIHtcblxuXHRcdFx0dmFyIGhhbGZTaXplID0gdjEuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblx0XHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcblx0XHRcdHRoaXMubWF4LmNvcHkoIGNlbnRlciApLmFkZCggaGFsZlNpemUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXguY29weSggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubWluLnggPSB0aGlzLm1pbi55ID0gKyBJbmZpbml0eTtcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IC0gSW5maW5pdHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGlzRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRoaXMgaXMgYSBtb3JlIHJvYnVzdCBjaGVjayBmb3IgZW1wdHkgdGhhbiAoIHZvbHVtZSA8PSAwICkgYmVjYXVzZSB2b2x1bWUgY2FuIGdldCBwb3NpdGl2ZSB3aXRoIHR3byBuZWdhdGl2ZSBheGVzXG5cblx0XHRyZXR1cm4gKCB0aGlzLm1heC54IDwgdGhpcy5taW4ueCApIHx8ICggdGhpcy5tYXgueSA8IHRoaXMubWluLnkgKTtcblxuXHR9LFxuXG5cdGdldENlbnRlcjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZ2V0Q2VudGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwICkgOiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRoaXMubWF4ICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdH0sXG5cblx0Z2V0U2l6ZTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCggMCwgMCApIDogdGFyZ2V0LnN1YlZlY3RvcnMoIHRoaXMubWF4LCB0aGlzLm1pbiApO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggcG9pbnQgKTtcblx0XHR0aGlzLm1heC5tYXgoIHBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5VmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHRoaXMubWluLnN1YiggdmVjdG9yICk7XG5cdFx0dGhpcy5tYXguYWRkKCB2ZWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciApO1xuXHRcdHRoaXMubWF4LmFkZFNjYWxhciggc2NhbGFyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gcG9pbnQueCA8IHRoaXMubWluLnggfHwgcG9pbnQueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdHBvaW50LnkgPCB0aGlzLm1pbi55IHx8IHBvaW50LnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y29udGFpbnNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmXG5cdFx0XHR0aGlzLm1pbi55IDw9IGJveC5taW4ueSAmJiBib3gubWF4LnkgPD0gdGhpcy5tYXgueTtcblxuXHR9LFxuXG5cdGdldFBhcmFtZXRlcjogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0Ly8gVGhpcyBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBib3hcblx0XHQvLyBoYXMgYSBzaXplIGRpbWVuc2lvbiBvZiAwLlxuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoXG5cdFx0XHQoIHBvaW50LnggLSB0aGlzLm1pbi54ICkgLyAoIHRoaXMubWF4LnggLSB0aGlzLm1pbi54ICksXG5cdFx0XHQoIHBvaW50LnkgLSB0aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55IClcblx0XHQpO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHQvLyB1c2luZyA0IHNwbGl0dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50ZXJzZWN0aW9uc1xuXG5cdFx0cmV0dXJuIGJveC5tYXgueCA8IHRoaXMubWluLnggfHwgYm94Lm1pbi54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0Ym94Lm1heC55IDwgdGhpcy5taW4ueSB8fCBib3gubWluLnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGNsYW1wZWRQb2ludCA9IHYxLmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXHRcdFx0cmV0dXJuIGNsYW1wZWRQb2ludC5zdWIoIHBvaW50ICkubGVuZ3RoKCk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3Q6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWF4KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWluKCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVuaW9uOiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1heCggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5taW4uYWRkKCBvZmZzZXQgKTtcblx0XHR0aGlzLm1heC5hZGQoIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5taW4uZXF1YWxzKCB0aGlzLm1pbiApICYmIGJveC5tYXguZXF1YWxzKCB0aGlzLm1heCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gSW1tZWRpYXRlUmVuZGVyT2JqZWN0KCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggLyogcmVuZGVyQ2FsbGJhY2sgKi8gKSB7fTtcblxufVxuXG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW1tZWRpYXRlUmVuZGVyT2JqZWN0O1xuXG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gVmVydGV4Tm9ybWFsc0hlbHBlciggb2JqZWN0LCBzaXplLCBoZXgsIGxpbmV3aWR0aCApIHtcblxuXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblxuXHR0aGlzLnNpemUgPSAoIHNpemUgIT09IHVuZGVmaW5lZCApID8gc2l6ZSA6IDE7XG5cblx0dmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZjAwMDA7XG5cblx0dmFyIHdpZHRoID0gKCBsaW5ld2lkdGggIT09IHVuZGVmaW5lZCApID8gbGluZXdpZHRoIDogMTtcblxuXHQvL1xuXG5cdHZhciBuTm9ybWFscyA9IDA7XG5cblx0dmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7XG5cblx0aWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0bk5vcm1hbHMgPSBvYmpHZW9tZXRyeS5mYWNlcy5sZW5ndGggKiAzO1xuXG5cdH0gZWxzZSBpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRuTm9ybWFscyA9IG9iakdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsLmNvdW50O1xuXG5cdH1cblxuXHQvL1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbk5vcm1hbHMgKiAyICogMywgMyApO1xuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgcG9zaXRpb25zICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCBsaW5ld2lkdGg6IHdpZHRoIH0gKSApO1xuXG5cdC8vXG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5WZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcblZlcnRleE5vcm1hbHNIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVmVydGV4Tm9ybWFsc0hlbHBlcjtcblxuVmVydGV4Tm9ybWFsc0hlbHBlci5wcm90b3R5cGUudXBkYXRlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHZhciBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cblx0XHR0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0bm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdGhpcy5vYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkO1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgdmVydGljZXMgPSBvYmpHZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdFx0dmFyIGZhY2VzID0gb2JqR2VvbWV0cnkuZmFjZXM7XG5cblx0XHRcdHZhciBpZHggPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHZlcnRleCA9IHZlcnRpY2VzWyBmYWNlWyBrZXlzWyBqIF0gXSBdO1xuXG5cdFx0XHRcdFx0dmFyIG5vcm1hbCA9IGZhY2UudmVydGV4Tm9ybWFsc1sgaiBdO1xuXG5cdFx0XHRcdFx0djEuY29weSggdmVydGV4ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdFx0djIuY29weSggbm9ybWFsICkuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggdGhpcy5zaXplICkuYWRkKCB2MSApO1xuXG5cdFx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjIueCwgdjIueSwgdjIueiApO1xuXG5cdFx0XHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBvYmpQb3MgPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHR2YXIgb2JqTm9ybSA9IG9iakdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0XHR2YXIgaWR4ID0gMDtcblxuXHRcdFx0Ly8gZm9yIHNpbXBsaWNpdHksIGlnbm9yZSBpbmRleCBhbmQgZHJhd2NhbGxzLCBhbmQgcmVuZGVyIGV2ZXJ5IG5vcm1hbFxuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gb2JqUG9zLmNvdW50OyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0djEuc2V0KCBvYmpQb3MuZ2V0WCggaiApLCBvYmpQb3MuZ2V0WSggaiApLCBvYmpQb3MuZ2V0WiggaiApICkuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdHYyLnNldCggb2JqTm9ybS5nZXRYKCBqICksIG9iak5vcm0uZ2V0WSggaiApLCBvYmpOb3JtLmdldFooIGogKSApO1xuXG5cdFx0XHRcdHYyLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHRoaXMuc2l6ZSApLmFkZCggdjEgKTtcblxuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYyLngsIHYyLnksIHYyLnogKTtcblxuXHRcdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fTtcblxufSgpICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBTcG90TGlnaHRIZWxwZXIoIGxpZ2h0LCBjb2xvciApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5jb2xvciA9IGNvbG9yO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBbXG5cdFx0MCwgMCwgMCwgXHQwLCAwLCAxLFxuXHRcdDAsIDAsIDAsIFx0MSwgMCwgMSxcblx0XHQwLCAwLCAwLFx0LSAxLCAwLCAxLFxuXHRcdDAsIDAsIDAsIFx0MCwgMSwgMSxcblx0XHQwLCAwLCAwLCBcdDAsIC0gMSwgMVxuXHRdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgaiA9IDEsIGwgPSAzMjsgaSA8IGw7IGkgKyssIGogKysgKSB7XG5cblx0XHR2YXIgcDEgPSAoIGkgLyBsICkgKiBNYXRoLlBJICogMjtcblx0XHR2YXIgcDIgPSAoIGogLyBsICkgKiBNYXRoLlBJICogMjtcblxuXHRcdHBvc2l0aW9ucy5wdXNoKFxuXHRcdFx0TWF0aC5jb3MoIHAxICksIE1hdGguc2luKCBwMSApLCAxLFxuXHRcdFx0TWF0aC5jb3MoIHAyICksIE1hdGguc2luKCBwMiApLCAxXG5cdFx0KTtcblxuXHR9XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7XG5cblx0dGhpcy5jb25lID0gbmV3IExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cdHRoaXMuYWRkKCB0aGlzLmNvbmUgKTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcG90TGlnaHRIZWxwZXI7XG5cblNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmNvbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5TcG90TGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHZlY3RvcjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHR2YXIgY29uZUxlbmd0aCA9IHRoaXMubGlnaHQuZGlzdGFuY2UgPyB0aGlzLmxpZ2h0LmRpc3RhbmNlIDogMTAwMDtcblx0XHR2YXIgY29uZVdpZHRoID0gY29uZUxlbmd0aCAqIE1hdGgudGFuKCB0aGlzLmxpZ2h0LmFuZ2xlICk7XG5cblx0XHR0aGlzLmNvbmUuc2NhbGUuc2V0KCBjb25lV2lkdGgsIGNvbmVXaWR0aCwgY29uZUxlbmd0aCApO1xuXG5cdFx0dmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdHZlY3RvcjIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0dGhpcy5jb25lLmxvb2tBdCggdmVjdG9yMi5zdWIoIHZlY3RvciApICk7XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHRcdH1cblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBTZWFuIEdyaWZmaW4gLyBodHRwOi8vdHdpdHRlci5jb20vc2dyaWZcbiAqIEBhdXRob3IgTWljaGFlbCBHdWVycmVybyAvIGh0dHA6Ly9yZWFsaXR5bWVsdGRvd24uY29tXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmZ1bmN0aW9uIGdldEJvbmVMaXN0KCBvYmplY3QgKSB7XG5cblx0dmFyIGJvbmVMaXN0ID0gW107XG5cblx0aWYgKCBvYmplY3QgJiYgb2JqZWN0LmlzQm9uZSApIHtcblxuXHRcdGJvbmVMaXN0LnB1c2goIG9iamVjdCApO1xuXG5cdH1cblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBvYmplY3QuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0Ym9uZUxpc3QucHVzaC5hcHBseSggYm9uZUxpc3QsIGdldEJvbmVMaXN0KCBvYmplY3QuY2hpbGRyZW5bIGkgXSApICk7XG5cblx0fVxuXG5cdHJldHVybiBib25lTGlzdDtcblxufVxuXG5mdW5jdGlvbiBTa2VsZXRvbkhlbHBlciggb2JqZWN0ICkge1xuXG5cdHZhciBib25lcyA9IGdldEJvbmVMaXN0KCBvYmplY3QgKTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIGNvbG9ycyA9IFtdO1xuXG5cdHZhciBjb2xvcjEgPSBuZXcgQ29sb3IoIDAsIDAsIDEgKTtcblx0dmFyIGNvbG9yMiA9IG5ldyBDb2xvciggMCwgMSwgMCApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IGJvbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdHZhciBib25lID0gYm9uZXNbIGkgXTtcblxuXHRcdGlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkge1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IxLnIsIGNvbG9yMS5nLCBjb2xvcjEuYiApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yMi5yLCBjb2xvcjIuZywgY29sb3IyLmIgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycywgZGVwdGhUZXN0OiBmYWxzZSwgZGVwdGhXcml0ZTogZmFsc2UsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy5yb290ID0gb2JqZWN0O1xuXHR0aGlzLmJvbmVzID0gYm9uZXM7XG5cblx0dGhpcy5tYXRyaXggPSBvYmplY3QubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG59XG5cblNrZWxldG9uSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcblNrZWxldG9uSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNrZWxldG9uSGVscGVyO1xuXG5Ta2VsZXRvbkhlbHBlci5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGJvbmVNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR2YXIgbWF0cml4V29ybGRJbnYgPSBuZXcgTWF0cml4NCgpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XG5cblx0XHR2YXIgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRcdG1hdHJpeFdvcmxkSW52LmdldEludmVyc2UoIHRoaXMucm9vdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8IGJvbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGJvbmUgPSBib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcblxuXHRcdFx0XHRib25lTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeFdvcmxkSW52LCBib25lLm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGJvbmVNYXRyaXggKTtcblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBqLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0Ym9uZU1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXhXb3JsZEludiwgYm9uZS5wYXJlbnQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggYm9uZU1hdHJpeCApO1xuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGogKyAxLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0aiArPSAyO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gUG9pbnRMaWdodEhlbHBlciggbGlnaHQsIHNwaGVyZVNpemUsIGNvbG9yICkge1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHNwaGVyZVNpemUsIDQsIDIgKTtcblx0dmFyIG1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHdpcmVmcmFtZTogdHJ1ZSwgZm9nOiBmYWxzZSB9ICk7XG5cblx0TWVzaC5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLm1hdHJpeCA9IHRoaXMubGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cblxuXHQvKlxuXHR2YXIgZGlzdGFuY2VHZW9tZXRyeSA9IG5ldyBUSFJFRS5JY29zYWhlZHJvbkdlb21ldHJ5KCAxLCAyICk7XG5cdHZhciBkaXN0YW5jZU1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXhDb2xvciwgZm9nOiBmYWxzZSwgd2lyZWZyYW1lOiB0cnVlLCBvcGFjaXR5OiAwLjEsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTtcblxuXHR0aGlzLmxpZ2h0U3BoZXJlID0gbmV3IFRIUkVFLk1lc2goIGJ1bGJHZW9tZXRyeSwgYnVsYk1hdGVyaWFsICk7XG5cdHRoaXMubGlnaHREaXN0YW5jZSA9IG5ldyBUSFJFRS5NZXNoKCBkaXN0YW5jZUdlb21ldHJ5LCBkaXN0YW5jZU1hdGVyaWFsICk7XG5cblx0dmFyIGQgPSBsaWdodC5kaXN0YW5jZTtcblxuXHRpZiAoIGQgPT09IDAuMCApIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gZmFsc2U7XG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMubGlnaHREaXN0YW5jZS5zY2FsZS5zZXQoIGQsIGQsIGQgKTtcblxuXHR9XG5cblx0dGhpcy5hZGQoIHRoaXMubGlnaHREaXN0YW5jZSApO1xuXHQqL1xuXG59XG5cblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKTtcblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9pbnRMaWdodEhlbHBlcjtcblxuUG9pbnRMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdH1cblxuXHQvKlxuXHR2YXIgZCA9IHRoaXMubGlnaHQuZGlzdGFuY2U7XG5cblx0aWYgKCBkID09PSAwLjAgKSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IHRydWU7XG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnNjYWxlLnNldCggZCwgZCwgZCApO1xuXG5cdH1cblx0Ki9cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0aW9uXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBSZWN0QXJlYUxpZ2h0SGVscGVyKCBsaWdodCwgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCA1ICogMyApLCAzICkgKTtcblxuXHR0aGlzLmxpbmUgPSBuZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cdHRoaXMuYWRkKCB0aGlzLmxpbmUgKTtcblxuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcblJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVjdEFyZWFMaWdodEhlbHBlcjtcblxuUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmNoaWxkcmVuWyAwIF0uZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmNoaWxkcmVuWyAwIF0ubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5SZWN0QXJlYUxpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0Ly8gY2FsY3VsYXRlIG5ldyBkaW1lbnNpb25zIG9mIHRoZSBoZWxwZXJcblxuXHR2YXIgaHggPSB0aGlzLmxpZ2h0LndpZHRoICogMC41O1xuXHR2YXIgaHkgPSB0aGlzLmxpZ2h0LmhlaWdodCAqIDAuNTtcblxuXHR2YXIgcG9zaXRpb24gPSB0aGlzLmxpbmUuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0dmFyIGFycmF5ID0gcG9zaXRpb24uYXJyYXk7XG5cblx0Ly8gdXBkYXRlIHZlcnRpY2VzXG5cblx0YXJyYXlbIDAgXSA9IGh4OyBhcnJheVsgMSBdID0gLSBoeTsgYXJyYXlbIDIgXSA9IDA7XG5cdGFycmF5WyAzIF0gPSBoeDsgYXJyYXlbIDQgXSA9IGh5OyBhcnJheVsgNSBdID0gMDtcblx0YXJyYXlbIDYgXSA9IC0gaHg7IGFycmF5WyA3IF0gPSBoeTsgYXJyYXlbIDggXSA9IDA7XG5cdGFycmF5WyA5IF0gPSAtIGh4OyBhcnJheVsgMTAgXSA9IC0gaHk7IGFycmF5WyAxMSBdID0gMDtcblx0YXJyYXlbIDEyIF0gPSBoeDsgYXJyYXlbIDEzIF0gPSAtIGh5OyBhcnJheVsgMTQgXSA9IDA7XG5cblx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0dGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gSGVtaXNwaGVyZUxpZ2h0SGVscGVyKCBsaWdodCwgc2l6ZSwgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCBzaXplICk7XG5cdGdlb21ldHJ5LnJvdGF0ZVkoIE1hdGguUEkgKiAwLjUgKTtcblxuXHR0aGlzLm1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHdpcmVmcmFtZTogdHJ1ZSwgZm9nOiBmYWxzZSB9ICk7XG5cdGlmICggdGhpcy5jb2xvciA9PT0gdW5kZWZpbmVkICkgdGhpcy5tYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSBWZXJ0ZXhDb2xvcnM7XG5cblx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XG5cdHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvbi5jb3VudCAqIDMgKTtcblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApICk7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSGVtaXNwaGVyZUxpZ2h0SGVscGVyO1xuXG5IZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5jaGlsZHJlblsgMCBdLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5jaGlsZHJlblsgMCBdLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGNvbG9yMSA9IG5ldyBDb2xvcigpO1xuXHR2YXIgY29sb3IyID0gbmV3IENvbG9yKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHZhciBtZXNoID0gdGhpcy5jaGlsZHJlblsgMCBdO1xuXG5cdFx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgY29sb3JzID0gbWVzaC5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdjb2xvcicgKTtcblxuXHRcdFx0Y29sb3IxLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblx0XHRcdGNvbG9yMi5jb3B5KCB0aGlzLmxpZ2h0Lmdyb3VuZENvbG9yICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNvbG9ycy5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGNvbG9yID0gKCBpIDwgKCBsIC8gMiApICkgPyBjb2xvcjEgOiBjb2xvcjI7XG5cblx0XHRcdFx0Y29sb3JzLnNldFhZWiggaSwgY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbG9ycy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRtZXNoLmxvb2tBdCggdmVjdG9yLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApLm5lZ2F0ZSgpICk7XG5cblx0fTtcblxufSgpO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gR3JpZEhlbHBlciggc2l6ZSwgZGl2aXNpb25zLCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRzaXplID0gc2l6ZSB8fCAxMDtcblx0ZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDEwO1xuXHRjb2xvcjEgPSBuZXcgQ29sb3IoIGNvbG9yMSAhPT0gdW5kZWZpbmVkID8gY29sb3IxIDogMHg0NDQ0NDQgKTtcblx0Y29sb3IyID0gbmV3IENvbG9yKCBjb2xvcjIgIT09IHVuZGVmaW5lZCA/IGNvbG9yMiA6IDB4ODg4ODg4ICk7XG5cblx0dmFyIGNlbnRlciA9IGRpdmlzaW9ucyAvIDI7XG5cdHZhciBzdGVwID0gc2l6ZSAvIGRpdmlzaW9ucztcblx0dmFyIGhhbGZTaXplID0gc2l6ZSAvIDI7XG5cblx0dmFyIHZlcnRpY2VzID0gW10sIGNvbG9ycyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgaiA9IDAsIGsgPSAtIGhhbGZTaXplOyBpIDw9IGRpdmlzaW9uczsgaSArKywgayArPSBzdGVwICkge1xuXG5cdFx0dmVydGljZXMucHVzaCggLSBoYWxmU2l6ZSwgMCwgaywgaGFsZlNpemUsIDAsIGsgKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCBrLCAwLCAtIGhhbGZTaXplLCBrLCAwLCBoYWxmU2l6ZSApO1xuXG5cdFx0dmFyIGNvbG9yID0gaSA9PT0gY2VudGVyID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblxuXHR9XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5HcmlkSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkdyaWRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR3JpZEhlbHBlcjtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1Yi5jb20vTXVnZW44N1xuICogQGF1dGhvciBIZWN0YXRlIC8gaHR0cDovL3d3dy5naXRodWIuY29tL0hlY3RhdGVcbiAqL1xuXG5mdW5jdGlvbiBQb2xhckdyaWRIZWxwZXIoIHJhZGl1cywgcmFkaWFscywgY2lyY2xlcywgZGl2aXNpb25zLCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTA7XG5cdHJhZGlhbHMgPSByYWRpYWxzIHx8IDE2O1xuXHRjaXJjbGVzID0gY2lyY2xlcyB8fCA4O1xuXHRkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgNjQ7XG5cdGNvbG9yMSA9IG5ldyBDb2xvciggY29sb3IxICE9PSB1bmRlZmluZWQgPyBjb2xvcjEgOiAweDQ0NDQ0NCApO1xuXHRjb2xvcjIgPSBuZXcgQ29sb3IoIGNvbG9yMiAhPT0gdW5kZWZpbmVkID8gY29sb3IyIDogMHg4ODg4ODggKTtcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIGNvbG9ycyA9IFtdO1xuXG5cdHZhciB4LCB6O1xuXHR2YXIgdiwgaSwgaiwgciwgY29sb3I7XG5cblx0Ly8gY3JlYXRlIHRoZSByYWRpYWxzXG5cblx0Zm9yICggaSA9IDA7IGkgPD0gcmFkaWFsczsgaSArKyApIHtcblxuXHRcdHYgPSAoIGkgLyByYWRpYWxzICkgKiAoIE1hdGguUEkgKiAyICk7XG5cblx0XHR4ID0gTWF0aC5zaW4oIHYgKSAqIHJhZGl1cztcblx0XHR6ID0gTWF0aC5jb3MoIHYgKSAqIHJhZGl1cztcblxuXHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XG5cblx0XHRjb2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHR9XG5cblx0Ly8gY3JlYXRlIHRoZSBjaXJjbGVzXG5cblx0Zm9yICggaSA9IDA7IGkgPD0gY2lyY2xlczsgaSArKyApIHtcblxuXHRcdGNvbG9yID0gKCBpICYgMSApID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0ciA9IHJhZGl1cyAtICggcmFkaXVzIC8gY2lyY2xlcyAqIGkgKTtcblxuXHRcdGZvciAoIGogPSAwOyBqIDwgZGl2aXNpb25zOyBqICsrICkge1xuXG5cdFx0XHQvLyBmaXJzdCB2ZXJ0ZXhcblxuXHRcdFx0diA9ICggaiAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJICogMiApO1xuXG5cdFx0XHR4ID0gTWF0aC5zaW4oIHYgKSAqIHI7XG5cdFx0XHR6ID0gTWF0aC5jb3MoIHYgKSAqIHI7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHRcdC8vIHNlY29uZCB2ZXJ0ZXhcblxuXHRcdFx0diA9ICggKCBqICsgMSApIC8gZGl2aXNpb25zICkgKiAoIE1hdGguUEkgKiAyICk7XG5cblx0XHRcdHggPSBNYXRoLnNpbiggdiApICogcjtcblx0XHRcdHogPSBNYXRoLmNvcyggdiApICogcjtcblxuXHRcdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5Qb2xhckdyaWRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuUG9sYXJHcmlkSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbGFyR3JpZEhlbHBlcjtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gRmFjZU5vcm1hbHNIZWxwZXIoIG9iamVjdCwgc2l6ZSwgaGV4LCBsaW5ld2lkdGggKSB7XG5cblx0Ly8gRmFjZU5vcm1hbHNIZWxwZXIgb25seSBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeVxuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXG5cdHRoaXMuc2l6ZSA9ICggc2l6ZSAhPT0gdW5kZWZpbmVkICkgPyBzaXplIDogMTtcblxuXHR2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmZmYwMDtcblxuXHR2YXIgd2lkdGggPSAoIGxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgPyBsaW5ld2lkdGggOiAxO1xuXG5cdC8vXG5cblx0dmFyIG5Ob3JtYWxzID0gMDtcblxuXHR2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTtcblxuXHRpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRuTm9ybWFscyA9IG9iakdlb21ldHJ5LmZhY2VzLmxlbmd0aDtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmFjZU5vcm1hbHNIZWxwZXI6IG9ubHkgVEhSRUUuR2VvbWV0cnkgaXMgc3VwcG9ydGVkLiBVc2UgVEhSRUUuVmVydGV4Tm9ybWFsc0hlbHBlciwgaW5zdGVhZC4nICk7XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBuTm9ybWFscyAqIDIgKiAzLCAzICk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBwb3NpdGlvbnMgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIGxpbmV3aWR0aDogd2lkdGggfSApICk7XG5cblx0Ly9cblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5GYWNlTm9ybWFsc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5GYWNlTm9ybWFsc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGYWNlTm9ybWFsc0hlbHBlcjtcblxuRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR0aGlzLm9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0bm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggdGhpcy5vYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkO1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gb2JqR2VvbWV0cnkudmVydGljZXM7XG5cblx0XHR2YXIgZmFjZXMgPSBvYmpHZW9tZXRyeS5mYWNlcztcblxuXHRcdHZhciBpZHggPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHR2YXIgbm9ybWFsID0gZmFjZS5ub3JtYWw7XG5cblx0XHRcdHYxLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmEgXSApXG5cdFx0XHRcdC5hZGQoIHZlcnRpY2VzWyBmYWNlLmIgXSApXG5cdFx0XHRcdC5hZGQoIHZlcnRpY2VzWyBmYWNlLmMgXSApXG5cdFx0XHRcdC5kaXZpZGVTY2FsYXIoIDMgKVxuXHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR2Mi5jb3B5KCBub3JtYWwgKS5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIHYxICk7XG5cblx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2Mi54LCB2Mi55LCB2Mi56ICk7XG5cblx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHR9XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fTtcblxufSgpICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0SGVscGVyKCBsaWdodCwgc2l6ZSwgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHRpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbXG5cdFx0LSBzaXplLCBzaXplLCAwLFxuXHRcdHNpemUsIHNpemUsIDAsXG5cdFx0c2l6ZSwgLSBzaXplLCAwLFxuXHRcdC0gc2l6ZSwgLSBzaXplLCAwLFxuXHRcdC0gc2l6ZSwgc2l6ZSwgMFxuXHRdLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7XG5cblx0dGhpcy5saWdodFBsYW5lID0gbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXHR0aGlzLmFkZCggdGhpcy5saWdodFBsYW5lICk7XG5cblx0Z2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAwLCAxIF0sIDMgKSApO1xuXG5cdHRoaXMudGFyZ2V0TGluZSA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblx0dGhpcy5hZGQoIHRoaXMudGFyZ2V0TGluZSApO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGlyZWN0aW9uYWxMaWdodEhlbHBlcjtcblxuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXHR0aGlzLnRhcmdldExpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5EaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0djEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0djIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRcdHYzLnN1YlZlY3RvcnMoIHYyLCB2MSApO1xuXG5cdFx0dGhpcy5saWdodFBsYW5lLmxvb2tBdCggdjMgKTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cdFx0XHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXHRcdFx0dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudGFyZ2V0TGluZS5sb29rQXQoIHYzICk7XG5cdFx0dGhpcy50YXJnZXRMaW5lLnNjYWxlLnogPSB2My5sZW5ndGgoKTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICpcdC0gc2hvd3MgZnJ1c3R1bSwgbGluZSBvZiBzaWdodCBhbmQgdXAgb2YgdGhlIGNhbWVyYVxuICpcdC0gc3VpdGFibGUgZm9yIGZhc3QgdXBkYXRlc1xuICogXHQtIGJhc2VkIG9uIGZydXN0dW0gdmlzdWFsaXphdGlvbiBpbiBsaWdodGdsLmpzIHNoYWRvd21hcCBleGFtcGxlXG4gKlx0XHRodHRwOi8vZXZhbncuZ2l0aHViLmNvbS9saWdodGdsLmpzL3Rlc3RzL3NoYWRvd21hcC5odG1sXG4gKi9cblxuZnVuY3Rpb24gQ2FtZXJhSGVscGVyKCBjYW1lcmEgKSB7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmZmYsIHZlcnRleENvbG9yczogRmFjZUNvbG9ycyB9ICk7XG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBjb2xvcnMgPSBbXTtcblxuXHR2YXIgcG9pbnRNYXAgPSB7fTtcblxuXHQvLyBjb2xvcnNcblxuXHR2YXIgY29sb3JGcnVzdHVtID0gbmV3IENvbG9yKCAweGZmYWEwMCApO1xuXHR2YXIgY29sb3JDb25lID0gbmV3IENvbG9yKCAweGZmMDAwMCApO1xuXHR2YXIgY29sb3JVcCA9IG5ldyBDb2xvciggMHgwMGFhZmYgKTtcblx0dmFyIGNvbG9yVGFyZ2V0ID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXHR2YXIgY29sb3JDcm9zcyA9IG5ldyBDb2xvciggMHgzMzMzMzMgKTtcblxuXHQvLyBuZWFyXG5cblx0YWRkTGluZSggJ24xJywgJ24yJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduMicsICduNCcsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjQnLCAnbjMnLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ24zJywgJ24xJywgY29sb3JGcnVzdHVtICk7XG5cblx0Ly8gZmFyXG5cblx0YWRkTGluZSggJ2YxJywgJ2YyJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICdmMicsICdmNCcsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnZjQnLCAnZjMnLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ2YzJywgJ2YxJywgY29sb3JGcnVzdHVtICk7XG5cblx0Ly8gc2lkZXNcblxuXHRhZGRMaW5lKCAnbjEnLCAnZjEnLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ24yJywgJ2YyJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduMycsICdmMycsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjQnLCAnZjQnLCBjb2xvckZydXN0dW0gKTtcblxuXHQvLyBjb25lXG5cblx0YWRkTGluZSggJ3AnLCAnbjEnLCBjb2xvckNvbmUgKTtcblx0YWRkTGluZSggJ3AnLCAnbjInLCBjb2xvckNvbmUgKTtcblx0YWRkTGluZSggJ3AnLCAnbjMnLCBjb2xvckNvbmUgKTtcblx0YWRkTGluZSggJ3AnLCAnbjQnLCBjb2xvckNvbmUgKTtcblxuXHQvLyB1cFxuXG5cdGFkZExpbmUoICd1MScsICd1MicsIGNvbG9yVXAgKTtcblx0YWRkTGluZSggJ3UyJywgJ3UzJywgY29sb3JVcCApO1xuXHRhZGRMaW5lKCAndTMnLCAndTEnLCBjb2xvclVwICk7XG5cblx0Ly8gdGFyZ2V0XG5cblx0YWRkTGluZSggJ2MnLCAndCcsIGNvbG9yVGFyZ2V0ICk7XG5cdGFkZExpbmUoICdwJywgJ2MnLCBjb2xvckNyb3NzICk7XG5cblx0Ly8gY3Jvc3NcblxuXHRhZGRMaW5lKCAnY24xJywgJ2NuMicsIGNvbG9yQ3Jvc3MgKTtcblx0YWRkTGluZSggJ2NuMycsICdjbjQnLCBjb2xvckNyb3NzICk7XG5cblx0YWRkTGluZSggJ2NmMScsICdjZjInLCBjb2xvckNyb3NzICk7XG5cdGFkZExpbmUoICdjZjMnLCAnY2Y0JywgY29sb3JDcm9zcyApO1xuXG5cdGZ1bmN0aW9uIGFkZExpbmUoIGEsIGIsIGNvbG9yICkge1xuXG5cdFx0YWRkUG9pbnQoIGEsIGNvbG9yICk7XG5cdFx0YWRkUG9pbnQoIGIsIGNvbG9yICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFkZFBvaW50KCBpZCwgY29sb3IgKSB7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdGlmICggcG9pbnRNYXBbIGlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cG9pbnRNYXBbIGlkIF0gPSBbXTtcblxuXHRcdH1cblxuXHRcdHBvaW50TWFwWyBpZCBdLnB1c2goICggdmVydGljZXMubGVuZ3RoIC8gMyApIC0gMSApO1xuXG5cdH1cblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xuXHRpZiAoIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXggKSB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0dGhpcy5tYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMucG9pbnRNYXAgPSBwb2ludE1hcDtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkNhbWVyYUhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5DYW1lcmFIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2FtZXJhSGVscGVyO1xuXG5DYW1lcmFIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZ2VvbWV0cnksIHBvaW50TWFwO1xuXG5cdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgY2FtZXJhID0gbmV3IENhbWVyYSgpO1xuXG5cdGZ1bmN0aW9uIHNldFBvaW50KCBwb2ludCwgeCwgeSwgeiApIHtcblxuXHRcdHZlY3Rvci5zZXQoIHgsIHksIHogKS51bnByb2plY3QoIGNhbWVyYSApO1xuXG5cdFx0dmFyIHBvaW50cyA9IHBvaW50TWFwWyBwb2ludCBdO1xuXG5cdFx0aWYgKCBwb2ludHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggcG9pbnRzWyBpIF0sIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0Z2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdHBvaW50TWFwID0gdGhpcy5wb2ludE1hcDtcblxuXHRcdHZhciB3ID0gMSwgaCA9IDE7XG5cblx0XHQvLyB3ZSBuZWVkIGp1c3QgY2FtZXJhIHByb2plY3Rpb24gbWF0cml4XG5cdFx0Ly8gd29ybGQgbWF0cml4IG11c3QgYmUgaWRlbnRpdHlcblxuXHRcdGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdC8vIGNlbnRlciAvIHRhcmdldFxuXG5cdFx0c2V0UG9pbnQoICdjJywgMCwgMCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICd0JywgMCwgMCwgMSApO1xuXG5cdFx0Ly8gbmVhclxuXG5cdFx0c2V0UG9pbnQoICduMScsIC0gdywgLSBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ24yJywgdywgLSBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ24zJywgLSB3LCBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ240JywgdywgaCwgLSAxICk7XG5cblx0XHQvLyBmYXJcblxuXHRcdHNldFBvaW50KCAnZjEnLCAtIHcsIC0gaCwgMSApO1xuXHRcdHNldFBvaW50KCAnZjInLCB3LCAtIGgsIDEgKTtcblx0XHRzZXRQb2ludCggJ2YzJywgLSB3LCBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdmNCcsIHcsIGgsIDEgKTtcblxuXHRcdC8vIHVwXG5cblx0XHRzZXRQb2ludCggJ3UxJywgdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICd1MicsIC0gdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICd1MycsIDAsIGggKiAyLCAtIDEgKTtcblxuXHRcdC8vIGNyb3NzXG5cblx0XHRzZXRQb2ludCggJ2NmMScsIC0gdywgMCwgMSApO1xuXHRcdHNldFBvaW50KCAnY2YyJywgdywgMCwgMSApO1xuXHRcdHNldFBvaW50KCAnY2YzJywgMCwgLSBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdjZjQnLCAwLCBoLCAxICk7XG5cblx0XHRzZXRQb2ludCggJ2NuMScsIC0gdywgMCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICdjbjInLCB3LCAwLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ2NuMycsIDAsIC0gaCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICdjbjQnLCAwLCBoLCAtIDEgKTtcblxuXHRcdGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBCb3hIZWxwZXIoIG9iamVjdCwgY29sb3IgKSB7XG5cblx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cblx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkgY29sb3IgPSAweGZmZmYwMDtcblxuXHR2YXIgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSggWyAwLCAxLCAxLCAyLCAyLCAzLCAzLCAwLCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA0LCAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IF0gKTtcblx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoIDggKiAzICk7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkJveEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5Cb3hIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94SGVscGVyO1xuXG5Cb3hIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciBib3ggPSBuZXcgQm94MygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCApIHtcblxuXHRcdGlmICggb2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLicgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5vYmplY3QgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ym94LnNldEZyb21PYmplY3QoIHRoaXMub2JqZWN0ICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGJveC5pc0VtcHR5KCkgKSByZXR1cm47XG5cblx0XHR2YXIgbWluID0gYm94Lm1pbjtcblx0XHR2YXIgbWF4ID0gYm94Lm1heDtcblxuXHRcdC8qXG5cdFx0ICA1X19fXzRcblx0XHQxL19fXzAvfFxuXHRcdHwgNl9ffF83XG5cdFx0Mi9fX18zL1xuXG5cdFx0MDogbWF4LngsIG1heC55LCBtYXguelxuXHRcdDE6IG1pbi54LCBtYXgueSwgbWF4Lnpcblx0XHQyOiBtaW4ueCwgbWluLnksIG1heC56XG5cdFx0MzogbWF4LngsIG1pbi55LCBtYXguelxuXHRcdDQ6IG1heC54LCBtYXgueSwgbWluLnpcblx0XHQ1OiBtaW4ueCwgbWF4LnksIG1pbi56XG5cdFx0NjogbWluLngsIG1pbi55LCBtaW4uelxuXHRcdDc6IG1heC54LCBtaW4ueSwgbWluLnpcblx0XHQqL1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdHZhciBhcnJheSA9IHBvc2l0aW9uLmFycmF5O1xuXG5cdFx0YXJyYXlbIDAgXSA9IG1heC54OyBhcnJheVsgMSBdID0gbWF4Lnk7IGFycmF5WyAyIF0gPSBtYXguejtcblx0XHRhcnJheVsgMyBdID0gbWluLng7IGFycmF5WyA0IF0gPSBtYXgueTsgYXJyYXlbIDUgXSA9IG1heC56O1xuXHRcdGFycmF5WyA2IF0gPSBtaW4ueDsgYXJyYXlbIDcgXSA9IG1pbi55OyBhcnJheVsgOCBdID0gbWF4Lno7XG5cdFx0YXJyYXlbIDkgXSA9IG1heC54OyBhcnJheVsgMTAgXSA9IG1pbi55OyBhcnJheVsgMTEgXSA9IG1heC56O1xuXHRcdGFycmF5WyAxMiBdID0gbWF4Lng7IGFycmF5WyAxMyBdID0gbWF4Lnk7IGFycmF5WyAxNCBdID0gbWluLno7XG5cdFx0YXJyYXlbIDE1IF0gPSBtaW4ueDsgYXJyYXlbIDE2IF0gPSBtYXgueTsgYXJyYXlbIDE3IF0gPSBtaW4uejtcblx0XHRhcnJheVsgMTggXSA9IG1pbi54OyBhcnJheVsgMTkgXSA9IG1pbi55OyBhcnJheVsgMjAgXSA9IG1pbi56O1xuXHRcdGFycmF5WyAyMSBdID0gbWF4Lng7IGFycmF5WyAyMiBdID0gbWluLnk7IGFycmF5WyAyMyBdID0gbWluLno7XG5cblx0XHRwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdH07XG5cbn0gKSgpO1xuXG5Cb3hIZWxwZXIucHJvdG90eXBlLnNldEZyb21PYmplY3QgPSBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0dGhpcy51cGRhdGUoKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBCb3gzSGVscGVyKCBib3gsIGhleCApIHtcblxuXHR0aGlzLnR5cGUgPSAnQm94M0hlbHBlcic7XG5cblx0dGhpcy5ib3ggPSBib3g7XG5cblx0dmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZmZmMDA7XG5cblx0dmFyIGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoIFsgMCwgMSwgMSwgMiwgMiwgMywgMywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyBdICk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IFsgMSwgMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgLSAxLCAtIDEsIC0gMSwgLSAxLCAxLCAtIDEsIC0gMSBdO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkgKTtcblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblxuXHR0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG59XG5cbkJveDNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuQm94M0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3gzSGVscGVyO1xuXG5Cb3gzSGVscGVyLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZCA9IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0dmFyIGJveCA9IHRoaXMuYm94O1xuXG5cdGlmICggYm94LmlzRW1wdHkoKSApIHJldHVybjtcblxuXHRib3guZ2V0Q2VudGVyKCB0aGlzLnBvc2l0aW9uICk7XG5cblx0Ym94LmdldFNpemUoIHRoaXMuc2NhbGUgKTtcblxuXHR0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBQbGFuZUhlbHBlciggcGxhbmUsIHNpemUsIGhleCApIHtcblxuXHR0aGlzLnR5cGUgPSAnUGxhbmVIZWxwZXInO1xuXG5cdHRoaXMucGxhbmUgPSBwbGFuZTtcblxuXHR0aGlzLnNpemUgPSAoIHNpemUgPT09IHVuZGVmaW5lZCApID8gMSA6IHNpemU7XG5cblx0dmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZmZmMDA7XG5cblx0dmFyIHBvc2l0aW9ucyA9IFsgMSwgLSAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAtIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDEsIDAsIDAsIDAgXTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0TGluZS5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblxuXHQvL1xuXG5cdHZhciBwb3NpdGlvbnMyID0gWyAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxIF07XG5cblx0dmFyIGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeTIuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zMiwgMyApICk7XG5cdGdlb21ldHJ5Mi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHR0aGlzLmFkZCggbmV3IE1lc2goIGdlb21ldHJ5MiwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgb3BhY2l0eTogMC4yLCB0cmFuc3BhcmVudDogdHJ1ZSwgZGVwdGhXcml0ZTogZmFsc2UgfSApICkgKTtcblxufVxuXG5QbGFuZUhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApO1xuUGxhbmVIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVIZWxwZXI7XG5cblBsYW5lSGVscGVyLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZCA9IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0dmFyIHNjYWxlID0gLSB0aGlzLnBsYW5lLmNvbnN0YW50O1xuXG5cdGlmICggTWF0aC5hYnMoIHNjYWxlICkgPCAxZS04ICkgc2NhbGUgPSAxZS04OyAvLyBzaWduIGRvZXMgbm90IG1hdHRlclxuXG5cdHRoaXMuc2NhbGUuc2V0KCAwLjUgKiB0aGlzLnNpemUsIDAuNSAqIHRoaXMuc2l6ZSwgc2NhbGUgKTtcblxuXHR0aGlzLmxvb2tBdCggdGhpcy5wbGFuZS5ub3JtYWwgKTtcblxuXHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly9naXRodWIuY29tL3p6ODVcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqXG4gKiBDcmVhdGVzIGFuIGFycm93IGZvciB2aXN1YWxpemluZyBkaXJlY3Rpb25zXG4gKlxuICogUGFyYW1ldGVyczpcbiAqICBkaXIgLSBWZWN0b3IzXG4gKiAgb3JpZ2luIC0gVmVjdG9yM1xuICogIGxlbmd0aCAtIE51bWJlclxuICogIGNvbG9yIC0gY29sb3IgaW4gaGV4IHZhbHVlXG4gKiAgaGVhZExlbmd0aCAtIE51bWJlclxuICogIGhlYWRXaWR0aCAtIE51bWJlclxuICovXG5cbnZhciBsaW5lR2VvbWV0cnk7XG52YXIgY29uZUdlb21ldHJ5O1xuXG5mdW5jdGlvbiBBcnJvd0hlbHBlciggZGlyLCBvcmlnaW4sIGxlbmd0aCwgY29sb3IsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApIHtcblxuXHQvLyBkaXIgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIGNvbG9yID0gMHhmZmZmMDA7XG5cdGlmICggbGVuZ3RoID09PSB1bmRlZmluZWQgKSBsZW5ndGggPSAxO1xuXHRpZiAoIGhlYWRMZW5ndGggPT09IHVuZGVmaW5lZCApIGhlYWRMZW5ndGggPSAwLjIgKiBsZW5ndGg7XG5cdGlmICggaGVhZFdpZHRoID09PSB1bmRlZmluZWQgKSBoZWFkV2lkdGggPSAwLjIgKiBoZWFkTGVuZ3RoO1xuXG5cdGlmICggbGluZUdlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRsaW5lR2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0XHRsaW5lR2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAxLCAwIF0sIDMgKSApO1xuXG5cdFx0Y29uZUdlb21ldHJ5ID0gbmV3IEN5bGluZGVyQnVmZmVyR2VvbWV0cnkoIDAsIDAuNSwgMSwgNSwgMSApO1xuXHRcdGNvbmVHZW9tZXRyeS50cmFuc2xhdGUoIDAsIC0gMC41LCAwICk7XG5cblx0fVxuXG5cdHRoaXMucG9zaXRpb24uY29weSggb3JpZ2luICk7XG5cblx0dGhpcy5saW5lID0gbmV3IExpbmUoIGxpbmVHZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblx0dGhpcy5saW5lLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5hZGQoIHRoaXMubGluZSApO1xuXG5cdHRoaXMuY29uZSA9IG5ldyBNZXNoKCBjb25lR2VvbWV0cnksIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7XG5cdHRoaXMuY29uZS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuYWRkKCB0aGlzLmNvbmUgKTtcblxuXHR0aGlzLnNldERpcmVjdGlvbiggZGlyICk7XG5cdHRoaXMuc2V0TGVuZ3RoKCBsZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApO1xuXG59XG5cbkFycm93SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuQXJyb3dIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXJyb3dIZWxwZXI7XG5cbkFycm93SGVscGVyLnByb3RvdHlwZS5zZXREaXJlY3Rpb24gPSAoIGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgYXhpcyA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciByYWRpYW5zO1xuXG5cdHJldHVybiBmdW5jdGlvbiBzZXREaXJlY3Rpb24oIGRpciApIHtcblxuXHRcdC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdGlmICggZGlyLnkgPiAwLjk5OTk5ICkge1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0KCAwLCAwLCAwLCAxICk7XG5cblx0XHR9IGVsc2UgaWYgKCBkaXIueSA8IC0gMC45OTk5OSApIHtcblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldCggMSwgMCwgMCwgMCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YXhpcy5zZXQoIGRpci56LCAwLCAtIGRpci54ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdHJhZGlhbnMgPSBNYXRoLmFjb3MoIGRpci55ICk7XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCByYWRpYW5zICk7XG5cblx0XHR9XG5cblx0fTtcblxufSgpICk7XG5cbkFycm93SGVscGVyLnByb3RvdHlwZS5zZXRMZW5ndGggPSBmdW5jdGlvbiAoIGxlbmd0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICkge1xuXG5cdGlmICggaGVhZExlbmd0aCA9PT0gdW5kZWZpbmVkICkgaGVhZExlbmd0aCA9IDAuMiAqIGxlbmd0aDtcblx0aWYgKCBoZWFkV2lkdGggPT09IHVuZGVmaW5lZCApIGhlYWRXaWR0aCA9IDAuMiAqIGhlYWRMZW5ndGg7XG5cblx0dGhpcy5saW5lLnNjYWxlLnNldCggMSwgTWF0aC5tYXgoIDAsIGxlbmd0aCAtIGhlYWRMZW5ndGggKSwgMSApO1xuXHR0aGlzLmxpbmUudXBkYXRlTWF0cml4KCk7XG5cblx0dGhpcy5jb25lLnNjYWxlLnNldCggaGVhZFdpZHRoLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKTtcblx0dGhpcy5jb25lLnBvc2l0aW9uLnkgPSBsZW5ndGg7XG5cdHRoaXMuY29uZS51cGRhdGVNYXRyaXgoKTtcblxufTtcblxuQXJyb3dIZWxwZXIucHJvdG90eXBlLnNldENvbG9yID0gZnVuY3Rpb24gKCBjb2xvciApIHtcblxuXHR0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3IuY29weSggY29sb3IgKTtcblx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIGNvbG9yICk7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBzcm91Y2hlcmF5IC8gaHR0cDovL3Nyb3VjaGVyYXkub3JnL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBeGVzSGVscGVyKCBzaXplICkge1xuXG5cdHNpemUgPSBzaXplIHx8IDE7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdDAsIDAsIDAsXHRzaXplLCAwLCAwLFxuXHRcdDAsIDAsIDAsXHQwLCBzaXplLCAwLFxuXHRcdDAsIDAsIDAsXHQwLCAwLCBzaXplXG5cdF07XG5cblx0dmFyIGNvbG9ycyA9IFtcblx0XHQxLCAwLCAwLFx0MSwgMC42LCAwLFxuXHRcdDAsIDEsIDAsXHQwLjYsIDEsIDAsXG5cdFx0MCwgMCwgMSxcdDAsIDAuNiwgMVxuXHRdO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuQXhlc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5BeGVzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEF4ZXNIZWxwZXI7XG5cbi8vXG5cbkN1cnZlLmNyZWF0ZSA9IGZ1bmN0aW9uICggY29uc3RydWN0LCBnZXRQb2ludCApIHtcblxuXHRjb25zb2xlLmxvZyggJ1RIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQnICk7XG5cblx0Y29uc3RydWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuXHRjb25zdHJ1Y3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0O1xuXHRjb25zdHJ1Y3QucHJvdG90eXBlLmdldFBvaW50ID0gZ2V0UG9pbnQ7XG5cblx0cmV0dXJuIGNvbnN0cnVjdDtcblxufTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggQ3VydmVQYXRoLnByb3RvdHlwZSwge1xuXG5cdGNyZWF0ZVBvaW50c0dlb21ldHJ5OiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZVBvaW50c0dlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuJyApO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgZ2VvbWV0cnkgZnJvbSBwYXRoIHBvaW50cyAoZm9yIExpbmUgb3IgUG9pbnRzIG9iamVjdHMpXG5cblx0XHR2YXIgcHRzID0gdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5KCBwdHMgKTtcblxuXHR9LFxuXG5cdGNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5OiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuJyApO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgZ2VvbWV0cnkgZnJvbSBlcXVpZGlzdGFudCBzYW1wbGluZyBhbG9uZyB0aGUgcGF0aFxuXG5cdFx0dmFyIHB0cyA9IHRoaXMuZ2V0U3BhY2VkUG9pbnRzKCBkaXZpc2lvbnMgKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeSggcHRzICk7XG5cblx0fSxcblxuXHRjcmVhdGVHZW9tZXRyeTogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLicgKTtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSgpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBwb2ludCA9IHBvaW50c1sgaSBdO1xuXHRcdFx0Z2VvbWV0cnkudmVydGljZXMucHVzaCggbmV3IFZlY3RvcjMoIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIFBhdGgucHJvdG90eXBlLCB7XG5cblx0ZnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXRoOiAuZnJvbVBvaW50cygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21Qb2ludHMoKS4nICk7XG5cdFx0dGhpcy5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuZnVuY3Rpb24gU3BsaW5lKCBwb2ludHMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BsaW5lIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzIGluc3RlYWQuJyApO1xuXG5cdENhdG11bGxSb21DdXJ2ZTMuY2FsbCggdGhpcywgcG9pbnRzICk7XG5cdHRoaXMudHlwZSA9ICdjYXRtdWxscm9tJztcblxufVxuXG5TcGxpbmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUgKTtcblxuT2JqZWN0LmFzc2lnbiggU3BsaW5lLnByb3RvdHlwZSwge1xuXG5cdGluaXRGcm9tQXJyYXk6IGZ1bmN0aW9uICggLyogYSAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6IC5pbml0RnJvbUFycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0Z2V0Q29udHJvbFBvaW50c0FycmF5OiBmdW5jdGlvbiAoIC8qIG9wdGlvbmFsVGFyZ2V0ICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNwbGluZTogLmdldENvbnRyb2xQb2ludHNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJlcGFyYW1ldHJpemVCeUFyY0xlbmd0aDogZnVuY3Rpb24gKCAvKiBzYW1wbGluZ0NvZWYgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU3BsaW5lOiAucmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbkdyaWRIZWxwZXIucHJvdG90eXBlLnNldENvbG9ycyA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuR3JpZEhlbHBlcjogc2V0Q29sb3JzKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCwgcGFzcyB0aGVtIGluIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLicgKTtcblxufTtcblxuU2tlbGV0b25IZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU2tlbGV0b25IZWxwZXI6IHVwZGF0ZSgpIG5vIGxvbmdlciBuZWVkcyB0byBiZSBjYWxsZWQuJyApO1xuXG59O1xuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0ZXh0cmFjdFVybEJhc2U6IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTG9hZGVyOiAuZXh0cmFjdFVybEJhc2UoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoIHVybCApO1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBCb3gyLnByb3RvdHlwZSwge1xuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cdGVtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvbkJveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApO1xuXG5cdH0sXG5cdHNpemU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2l6ZSggb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9XG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJveDMucHJvdG90eXBlLCB7XG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRDZW50ZXIoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fSxcblx0ZW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHR9LFxuXHRzaXplOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLnNpemUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRTaXplKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldFNpemUoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fVxufSApO1xuXG5MaW5lMy5wcm90b3R5cGUuY2VudGVyID0gZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG5PYmplY3QuYXNzaWduKCBfTWF0aCwge1xuXG5cdHJhbmRvbTE2OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRoOiAucmFuZG9tMTYoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgTWF0aC5yYW5kb20oKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gTWF0aC5yYW5kb20oKTtcblxuXHR9LFxuXG5cdG5lYXJlc3RQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0aDogLm5lYXJlc3RQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZmxvb3JQb3dlck9mVHdvKCkuJyApO1xuXHRcdHJldHVybiBfTWF0aC5mbG9vclBvd2VyT2ZUd28oIHZhbHVlICk7XG5cblx0fSxcblxuXHRuZXh0UG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGg6IC5uZXh0UG93ZXJPZlR3bygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNlaWxQb3dlck9mVHdvKCkuJyApO1xuXHRcdHJldHVybiBfTWF0aC5jZWlsUG93ZXJPZlR3byggdmFsdWUgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggTWF0cml4My5wcm90b3R5cGUsIHtcblxuXHRmbGF0dGVuVG9BcnJheU9mZnNldDogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuXCIgKTtcblx0XHRyZXR1cm4gdGhpcy50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3IzOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDMoIHRoaXMgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGFwcGx5VG9CdWZmZXI6IGZ1bmN0aW9uICggYnVmZmVyIC8qLCBvZmZzZXQsIGxlbmd0aCAqLyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBidWZmZXIgKTtcblxuXHR9LFxuXHRhcHBseVRvVmVjdG9yM0FycmF5OiBmdW5jdGlvbiAoIC8qIGFycmF5LCBvZmZzZXQsIGxlbmd0aCAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBNYXRyaXg0LnByb3RvdHlwZSwge1xuXG5cdGV4dHJhY3RQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmV4dHJhY3RQb3NpdGlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmNvcHlQb3NpdGlvbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5jb3B5UG9zaXRpb24oIG0gKTtcblxuXHR9LFxuXHRmbGF0dGVuVG9BcnJheU9mZnNldDogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLk1hdHJpeDQ6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuXCIgKTtcblx0XHRyZXR1cm4gdGhpcy50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblx0Z2V0UG9zaXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRQb3NpdGlvbigpIHtcblxuXHRcdFx0aWYgKCB2MSA9PT0gdW5kZWZpbmVkICkgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmdldFBvc2l0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAzICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblx0c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcSApO1xuXG5cdH0sXG5cdG11bHRpcGx5VG9BcnJheTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VG9BcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yMzogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3I0OiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjQoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZUF4aXM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHR2LnRyYW5zZm9ybURpcmVjdGlvbiggdGhpcyApO1xuXG5cdH0sXG5cdGNyb3NzVmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5jcm9zc1ZlY3RvcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdH0sXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVYOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVgoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZVooKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVCeUF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlQnlBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YXBwbHlUb0J1ZmZlcjogZnVuY3Rpb24gKCBidWZmZXIgLyosIG9mZnNldCwgbGVuZ3RoICovICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlciApO1xuXG5cdH0sXG5cdGFwcGx5VG9WZWN0b3IzQXJyYXk6IGZ1bmN0aW9uICggLyogYXJyYXksIG9mZnNldCwgbGVuZ3RoICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0bWFrZUZydXN0dW06IGZ1bmN0aW9uICggbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubWFrZUZydXN0dW0oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICk7XG5cblx0fVxuXG59ICk7XG5cblBsYW5lLnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbkxpbmUgPSBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5pc0ludGVyc2VjdGlvbkxpbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzTGluZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0xpbmUoIGxpbmUgKTtcblxufTtcblxuUXVhdGVybmlvbi5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzID0gZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggdGhpcyApO1xuXG59O1xuXG5PYmplY3QuYXNzaWduKCBSYXkucHJvdG90eXBlLCB7XG5cblx0aXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblBsYW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1BsYW5lKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNQbGFuZSggcGxhbmUgKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvblNwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFRyaWFuZ2xlLnByb3RvdHlwZSwge1xuXG5cdGFyZWE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuYXJlYSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEFyZWEoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QXJlYSgpO1xuXG5cdH0sXG5cdGJhcnljb29yZEZyb21Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKCBwb2ludCwgdGFyZ2V0ICk7XG5cblx0fSxcblx0bWlkcG9pbnQ6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5taWRwb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE1pZHBvaW50KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldE1pZHBvaW50KCB0YXJnZXQgKTtcblxuXHR9LFxuXHRub3JtYWw6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Tm9ybWFsKCB0YXJnZXQgKTtcblxuXHR9LFxuXHRwbGFuZTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLnBsYW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0UGxhbmUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UGxhbmUoIHRhcmdldCApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBUcmlhbmdsZSwge1xuXG5cdGJhcnljb29yZEZyb21Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4nICk7XG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIGEsIGIsIGMsIHRhcmdldCApO1xuXG5cdH0sXG5cdG5vcm1hbDogZnVuY3Rpb24gKCBhLCBiLCBjLCB0YXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLicgKTtcblx0XHRyZXR1cm4gVHJpYW5nbGUuZ2V0Tm9ybWFsKCBhLCBiLCBjLCB0YXJnZXQgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggU2hhcGUucHJvdG90eXBlLCB7XG5cblx0ZXh0cmFjdEFsbFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLmV4dHJhY3RBbGxQb2ludHMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmV4dHJhY3RQb2ludHMoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRyYWN0UG9pbnRzKCBkaXZpc2lvbnMgKTtcblxuXHR9LFxuXHRleHRydWRlOiBmdW5jdGlvbiAoIG9wdGlvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLmV4dHJ1ZGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXh0cnVkZUdlb21ldHJ5KCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIG5ldyBFeHRydWRlR2VvbWV0cnkoIHRoaXMsIG9wdGlvbnMgKTtcblxuXHR9LFxuXHRtYWtlR2VvbWV0cnk6IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAubWFrZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFNoYXBlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gbmV3IFNoYXBlR2VvbWV0cnkoIHRoaXMsIG9wdGlvbnMgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMi5wcm90b3R5cGUsIHtcblxuXHRmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRkaXN0YW5jZVRvTWFuaGF0dGFuOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyggdiApO1xuXG5cdH0sXG5cdGxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMy5wcm90b3R5cGUsIHtcblxuXHRzZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBpbnN0ZWFkLicgKTtcblxuXHR9LFxuXHRzZXRFdWxlckZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVF1YXRlcm5pb24oKSBpbnN0ZWFkLicgKTtcblxuXHR9LFxuXHRnZXRQb3NpdGlvbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRQb3NpdGlvbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4UG9zaXRpb24oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtICk7XG5cblx0fSxcblx0Z2V0U2NhbGVGcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0U2NhbGVGcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFNjYWxlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhTY2FsZSggbSApO1xuXG5cdH0sXG5cdGdldENvbHVtbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggaW5kZXgsIG1hdHJpeCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRDb2x1bW5Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeENvbHVtbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtYXRyaXgsIGluZGV4ICk7XG5cblx0fSxcblx0YXBwbHlQcm9qZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuYXBwbHlQcm9qZWN0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5hcHBseU1hdHJpeDQoIG0gKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG0gKTtcblxuXHR9LFxuXHRmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRkaXN0YW5jZVRvTWFuaGF0dGFuOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyggdiApO1xuXG5cdH0sXG5cdGxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yNC5wcm90b3R5cGUsIHtcblxuXHRmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIEdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGNvbXB1dGVUYW5nZW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0Y29tcHV0ZUxpbmVEaXN0YW5jZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeTogLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggT2JqZWN0M0QucHJvdG90eXBlLCB7XG5cblx0Z2V0Q2hpbGRCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlOYW1lKCBuYW1lICk7XG5cblx0fSxcblx0cmVuZGVyRGVwdGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAucmVuZGVyRGVwdGggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5yZW5kZXJPcmRlciwgaW5zdGVhZC4nICk7XG5cblx0fSxcblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIGRpc3RhbmNlLCBheGlzICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICk7XG5cblx0fSxcblx0Z2V0V29ybGRSb3RhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRSb3RhdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5PYmplY3QzRC5nZXRXb3JsZFF1YXRlcm5pb24oIHRhcmdldCApIGluc3RlYWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggT2JqZWN0M0QucHJvdG90eXBlLCB7XG5cblx0ZXVsZXJPcmRlcjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5yb3RhdGlvbi5vcmRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4nICk7XG5cdFx0XHR0aGlzLnJvdGF0aW9uLm9yZGVyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHVzZVF1YXRlcm5pb246IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuJyApO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExPRC5wcm90b3R5cGUsIHtcblxuXHRvYmplY3RzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxPRDogLm9iamVjdHMgaGFzIGJlZW4gcmVuYW1lZCB0byAubGV2ZWxzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmxldmVscztcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggU2tlbGV0b24ucHJvdG90eXBlLCAndXNlVmVydGV4VGV4dHVyZScsIHtcblxuXHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQ3VydmUucHJvdG90eXBlLCAnX19hcmNMZW5ndGhEaXZpc2lvbnMnLCB7XG5cblx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cblx0fSxcblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9ucyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4nICk7XG5cdFx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSB2YWx1ZTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlLnNldExlbnMgPSBmdW5jdGlvbiAoIGZvY2FsTGVuZ3RoLCBmaWxtR2F1Z2UgKSB7XG5cblx0Y29uc29sZS53YXJuKCBcIlRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVwcmVjYXRlZC4gXCIgK1xuXHRcdFx0XCJVc2UgLnNldEZvY2FsTGVuZ3RoIGFuZCAuZmlsbUdhdWdlIGZvciBhIHBob3RvZ3JhcGhpYyBzZXR1cC5cIiApO1xuXG5cdGlmICggZmlsbUdhdWdlICE9PSB1bmRlZmluZWQgKSB0aGlzLmZpbG1HYXVnZSA9IGZpbG1HYXVnZTtcblx0dGhpcy5zZXRGb2NhbExlbmd0aCggZm9jYWxMZW5ndGggKTtcblxufTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExpZ2h0LnByb3RvdHlwZSwge1xuXHRvbmx5U2hhZG93OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAub25seVNoYWRvdyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhRm92OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZvdiBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZm92LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5mb3YgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhTGVmdDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFMZWZ0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5sZWZ0LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5sZWZ0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVJpZ2h0OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVJpZ2h0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5yaWdodC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEucmlnaHQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhVG9wOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVRvcCBpcyBub3cgLnNoYWRvdy5jYW1lcmEudG9wLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS50b3AgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhQm90dG9tOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUJvdHRvbSBpcyBub3cgLnNoYWRvdy5jYW1lcmEuYm90dG9tLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5ib3R0b20gPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhTmVhcjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFOZWFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5uZWFyLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5uZWFyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUZhcjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEuZmFyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVZpc2libGU6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFWaXNpYmxlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQ2FtZXJhSGVscGVyKCBsaWdodC5zaGFkb3cuY2FtZXJhICkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0JpYXM6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93QmlhcyBpcyBub3cgLnNoYWRvdy5iaWFzLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmJpYXMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93RGFya25lc3M6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwV2lkdGg6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93TWFwV2lkdGggaXMgbm93IC5zaGFkb3cubWFwU2l6ZS53aWR0aC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcEhlaWdodDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBIZWlnaHQgaXMgbm93IC5zaGFkb3cubWFwU2l6ZS5oZWlnaHQuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cubWFwU2l6ZS5oZWlnaHQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxufSApO1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGxlbmd0aDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5sZW5ndGggaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5jb3VudCBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFycmF5Lmxlbmd0aDtcblxuXHRcdH1cblx0fSxcblx0Y29weUluZGljZXNBcnJheTogZnVuY3Rpb24gKCAvKiBpbmRpY2VzICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmNvcHlJbmRpY2VzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0YWRkSW5kZXg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEluZGV4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0SW5kZXgoKS4nICk7XG5cdFx0dGhpcy5zZXRJbmRleCggaW5kZXggKTtcblxuXHR9LFxuXHRhZGREcmF3Q2FsbDogZnVuY3Rpb24gKCBzdGFydCwgY291bnQsIGluZGV4T2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBpbmRleE9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIGluZGV4T2Zmc2V0LicgKTtcblxuXHRcdH1cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgaXMgbm93IC5hZGRHcm91cCgpLicgKTtcblx0XHR0aGlzLmFkZEdyb3VwKCBzdGFydCwgY291bnQgKTtcblxuXHR9LFxuXHRjbGVhckRyYXdDYWxsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jbGVhckRyYXdDYWxscygpIGlzIG5vdyAuY2xlYXJHcm91cHMoKS4nICk7XG5cdFx0dGhpcy5jbGVhckdyb3VwcygpO1xuXG5cdH0sXG5cdGNvbXB1dGVUYW5nZW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRjb21wdXRlT2Zmc2V0czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlT2Zmc2V0cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0ZHJhd2NhbGxzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmRyYXdjYWxscyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9LFxuXHRvZmZzZXRzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGdldEFycmF5czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmdldEFycmF5cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cblx0YWRkU2hhcGVMaXN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuYWRkU2hhcGVMaXN0KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblxuXHRhZGRTaGFwZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmFkZFNoYXBlKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBVbmlmb3JtLnByb3RvdHlwZSwge1xuXG5cdGR5bmFtaWM6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogLmR5bmFtaWMgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRvblVwZGF0ZToge1xuXHRcdHZhbHVlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlVuaWZvcm06IC5vblVwZGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBvYmplY3Qub25CZWZvcmVSZW5kZXIoKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdHdyYXBBcm91bmQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHR3cmFwUkdCOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAud3JhcFJHQiBoYXMgYmVlbiByZW1vdmVkLicgKTtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IoKTtcblxuXHRcdH1cblx0fSxcblxuXHRzaGFkaW5nOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLicgKTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLicgKTtcblx0XHRcdHRoaXMuZmxhdFNoYWRpbmcgPSAoIHZhbHVlID09PSBGbGF0U2hhZGluZyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdG1ldGFsOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1lc2hQaG9uZ01hdGVyaWFsOiAubWV0YWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZCcgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUsIHtcblxuXHRkZXJpdmF0aXZlczoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXM7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuJyApO1xuXHRcdFx0dGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzID0gdmFsdWU7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBXZWJHTFJlbmRlcmVyLnByb3RvdHlwZSwge1xuXG5cdGdldEN1cnJlbnRSZW5kZXJUYXJnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0KCkgaXMgbm93IC5nZXRSZW5kZXJUYXJnZXQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UmVuZGVyVGFyZ2V0KCk7XG5cblx0fSxcblxuXHRnZXRNYXhBbmlzb3Ryb3B5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0TWF4QW5pc290cm9weSgpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKTtcblxuXHR9LFxuXG5cdGdldFByZWNpc2lvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldFByZWNpc2lvbigpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnByZWNpc2lvbi4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnByZWNpc2lvbjtcblxuXHR9LFxuXG5cdHJlc2V0R0xTdGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnJlc2V0R0xTdGF0ZSgpIGlzIG5vdyAuc3RhdGUucmVzZXQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc3RhdGUucmVzZXQoKTtcblxuXHR9LFxuXG5cdHN1cHBvcnRzRmxvYXRUZXh0dXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ09FU190ZXh0dXJlX2Zsb2F0XFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICk7XG5cblx0fSxcblx0c3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0XFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblxuXHR9LFxuXHRzdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXNcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICk7XG5cblx0fSxcblx0c3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7XG5cblx0fSxcblx0c3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzQmxlbmRNaW5NYXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0JsZW5kTWluTWF4KCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnRVhUX2JsZW5kX21pbm1heFxcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICk7XG5cblx0fSxcblx0c3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMoKSBpcyBub3cgLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcy4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzO1xuXG5cdH0sXG5cdHN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNJbnN0YW5jZWRBcnJheXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHR9LFxuXHRlbmFibGVTY2lzc29yVGVzdDogZnVuY3Rpb24gKCBib29sZWFuICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmVuYWJsZVNjaXNzb3JUZXN0KCkgaXMgbm93IC5zZXRTY2lzc29yVGVzdCgpLicgKTtcblx0XHR0aGlzLnNldFNjaXNzb3JUZXN0KCBib29sZWFuICk7XG5cblx0fSxcblx0aW5pdE1hdGVyaWFsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YWRkUHJlUGx1Z2luOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUHJlUGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0YWRkUG9zdFBsdWdpbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFBvc3RQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHR1cGRhdGVTaGFkb3dNYXA6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC51cGRhdGVTaGFkb3dNYXAoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRzZXRGYWNlQ3VsbGluZzogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldEZhY2VDdWxsaW5nKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFJlbmRlcmVyLnByb3RvdHlwZSwge1xuXG5cdHNoYWRvd01hcEVuYWJsZWQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2hhZG93TWFwLmVuYWJsZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEVuYWJsZWQgaXMgbm93IC5zaGFkb3dNYXAuZW5hYmxlZC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvd01hcC5lbmFibGVkID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcFR5cGU6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2hhZG93TWFwLnR5cGU7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcFR5cGUgaXMgbm93IC5zaGFkb3dNYXAudHlwZS4nICk7XG5cdFx0XHR0aGlzLnNoYWRvd01hcC50eXBlID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcEN1bGxGYWNlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCAvKiB2YWx1ZSAqLyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9XG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFNoYWRvd01hcC5wcm90b3R5cGUsIHtcblxuXHRjdWxsRmFjZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIC8qIGN1bGxGYWNlICovICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRyZW5kZXJSZXZlcnNlU2lkZWQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHJlbmRlclNpbmdsZVNpZGVkOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyU2luZ2xlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUsIHtcblxuXHR3cmFwUzoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBTO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS53cmFwUyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHR3cmFwVDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBUO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS53cmFwVCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRtYWdGaWx0ZXI6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1hZ0ZpbHRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLm1hZ0ZpbHRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5tYWdGaWx0ZXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0bWluRmlsdGVyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5taW5GaWx0ZXI7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUubWluRmlsdGVyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdGFuaXNvdHJvcHk6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUuYW5pc290cm9weTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmFuaXNvdHJvcHkgaXMgbm93IC50ZXh0dXJlLmFuaXNvdHJvcHkuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLmFuaXNvdHJvcHkgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0b2Zmc2V0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5vZmZzZXQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUub2Zmc2V0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHJlcGVhdDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUucmVwZWF0O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLnJlcGVhdCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRmb3JtYXQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJlLmZvcm1hdC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmZvcm1hdDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5mb3JtYXQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0dHlwZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnR5cGUgaXMgbm93IC50ZXh0dXJlLnR5cGUuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS50eXBlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUudHlwZSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRnZW5lcmF0ZU1pcG1hcHM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJWUk1hbmFnZXIucHJvdG90eXBlLCB7XG5cblx0c3RhbmRpbmc6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggLyogdmFsdWUgKi8gKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYlZSTWFuYWdlcjogLnN0YW5kaW5nIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuQXVkaW8ucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAoIGZpbGUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IC5sb2FkIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5BdWRpb0xvYWRlciBpbnN0ZWFkLicgKTtcblx0dmFyIHNjb3BlID0gdGhpcztcblx0dmFyIGF1ZGlvTG9hZGVyID0gbmV3IEF1ZGlvTG9hZGVyKCk7XG5cdGF1ZGlvTG9hZGVyLmxvYWQoIGZpbGUsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0c2NvcGUuc2V0QnVmZmVyKCBidWZmZXIgKTtcblxuXHR9ICk7XG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5BdWRpb0FuYWx5c2VyLnByb3RvdHlwZS5nZXREYXRhID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvQW5hbHlzZXI6IC5nZXREYXRhKCkgaXMgbm93IC5nZXRGcmVxdWVuY3lEYXRhKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7XG5cbn07XG5cbi8vXG5cbkN1YmVDYW1lcmEucHJvdG90eXBlLnVwZGF0ZUN1YmVNYXAgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5DdWJlQ2FtZXJhOiAudXBkYXRlQ3ViZU1hcCgpIGlzIG5vdyAudXBkYXRlKCkuJyApO1xuXHRyZXR1cm4gdGhpcy51cGRhdGUoIHJlbmRlcmVyLCBzY2VuZSApO1xuXG59O1xuXG52YXIgbWluaXZlbnRzX2NvbW1vbmpzID0gZnVuY3Rpb24gRXZlbnRzKHRhcmdldCl7XG4gIHZhciBldmVudHMgPSB7fSwgZW1wdHkgPSBbXTtcbiAgdGFyZ2V0ID0gdGFyZ2V0IHx8IHRoaXM7XG4gIC8qKlxuICAgKiAgT246IGxpc3RlbiB0byBldmVudHNcbiAgICovXG4gIHRhcmdldC5vbiA9IGZ1bmN0aW9uKHR5cGUsIGZ1bmMsIGN0eCl7XG4gICAgKGV2ZW50c1t0eXBlXSA9IGV2ZW50c1t0eXBlXSB8fCBbXSkucHVzaChbZnVuYywgY3R4XSk7XG4gICAgcmV0dXJuIHRhcmdldFxuICB9O1xuICAvKipcbiAgICogIE9mZjogc3RvcCBsaXN0ZW5pbmcgdG8gZXZlbnQgLyBzcGVjaWZpYyBjYWxsYmFja1xuICAgKi9cbiAgdGFyZ2V0Lm9mZiA9IGZ1bmN0aW9uKHR5cGUsIGZ1bmMpe1xuICAgIHR5cGUgfHwgKGV2ZW50cyA9IHt9KTtcbiAgICB2YXIgbGlzdCA9IGV2ZW50c1t0eXBlXSB8fCBlbXB0eSxcbiAgICAgICAgaSA9IGxpc3QubGVuZ3RoID0gZnVuYyA/IGxpc3QubGVuZ3RoIDogMDtcbiAgICB3aGlsZShpLS0pIGZ1bmMgPT0gbGlzdFtpXVswXSAmJiBsaXN0LnNwbGljZShpLDEpO1xuICAgIHJldHVybiB0YXJnZXRcbiAgfTtcbiAgLyoqIFxuICAgKiBFbWl0OiBzZW5kIGV2ZW50LCBjYWxsYmFja3Mgd2lsbCBiZSB0cmlnZ2VyZWRcbiAgICovXG4gIHRhcmdldC5lbWl0ID0gZnVuY3Rpb24odHlwZSl7XG4gICAgdmFyIGUgPSBldmVudHNbdHlwZV0gfHwgZW1wdHksIGxpc3QgPSBlLmxlbmd0aCA+IDAgPyBlLnNsaWNlKDAsIGUubGVuZ3RoKSA6IGUsIGk9MCwgajtcbiAgICB3aGlsZShqPWxpc3RbaSsrXSkgalswXS5hcHBseShqWzFdLCBlbXB0eS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpO1xuICAgIHJldHVybiB0YXJnZXRcbiAgfTtcbn07XG5cbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuX2V4cG9ydChfZXhwb3J0LlMsICdPYmplY3QnLCB7IGNyZWF0ZTogX29iamVjdENyZWF0ZSB9KTtcblxudmFyICRPYmplY3QkMiA9IF9jb3JlLk9iamVjdDtcbnZhciBjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoUCwgRCkge1xuICByZXR1cm4gJE9iamVjdCQyLmNyZWF0ZShQLCBEKTtcbn07XG5cbnZhciBjcmVhdGUkMSA9IGNyZWF0ZTtcblxudmFyIF92YWxpZGF0ZUNvbGxlY3Rpb24gPSBmdW5jdGlvbiAoaXQsIFRZUEUpIHtcbiAgaWYgKCFfaXNPYmplY3QoaXQpIHx8IGl0Ll90ICE9PSBUWVBFKSB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkIScpO1xuICByZXR1cm4gaXQ7XG59O1xuXG52YXIgZFAkMiA9IF9vYmplY3REcC5mO1xuXG5cblxuXG5cblxuXG5cblxudmFyIGZhc3RLZXkgPSBfbWV0YS5mYXN0S2V5O1xuXG52YXIgU0laRSA9IF9kZXNjcmlwdG9ycyA/ICdfcycgOiAnc2l6ZSc7XG5cbnZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgLy8gZmFzdCBjYXNlXG4gIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgdmFyIGVudHJ5O1xuICBpZiAoaW5kZXggIT09ICdGJykgcmV0dXJuIHRoYXQuX2lbaW5kZXhdO1xuICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgZm9yIChlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICBpZiAoZW50cnkuayA9PSBrZXkpIHJldHVybiBlbnRyeTtcbiAgfVxufTtcblxudmFyIF9jb2xsZWN0aW9uU3Ryb25nID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBfYW5JbnN0YW5jZSh0aGF0LCBDLCBOQU1FLCAnX2knKTtcbiAgICAgIHRoYXQuX3QgPSBOQU1FOyAgICAgICAgIC8vIGNvbGxlY3Rpb24gdHlwZVxuICAgICAgdGhhdC5faSA9IF9vYmplY3RDcmVhdGUobnVsbCk7IC8vIGluZGV4XG4gICAgICB0aGF0Ll9mID0gdW5kZWZpbmVkOyAgICAvLyBmaXJzdCBlbnRyeVxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgICAgLy8gbGFzdCBlbnRyeVxuICAgICAgdGhhdFtTSVpFXSA9IDA7ICAgICAgICAgLy8gc2l6ZVxuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgX2Zvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICBfcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHtcbiAgICAgIC8vIDIzLjEuMy4xIE1hcC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgLy8gMjMuMi4zLjIgU2V0LnByb3RvdHlwZS5jbGVhcigpXG4gICAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICAgIGZvciAodmFyIHRoYXQgPSBfdmFsaWRhdGVDb2xsZWN0aW9uKHRoaXMsIE5BTUUpLCBkYXRhID0gdGhhdC5faSwgZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKSB7XG4gICAgICAgICAgZW50cnkuciA9IHRydWU7XG4gICAgICAgICAgaWYgKGVudHJ5LnApIGVudHJ5LnAgPSBlbnRyeS5wLm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIGRhdGFbZW50cnkuaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5fZiA9IHRoYXQuX2wgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoYXRbU0laRV0gPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHRoYXQgPSBfdmFsaWRhdGVDb2xsZWN0aW9uKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm47XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wO1xuICAgICAgICAgIGRlbGV0ZSB0aGF0Ll9pW2VudHJ5LmldO1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm4gPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnAgPSBwcmV2O1xuICAgICAgICAgIGlmICh0aGF0Ll9mID09IGVudHJ5KSB0aGF0Ll9mID0gbmV4dDtcbiAgICAgICAgICBpZiAodGhhdC5fbCA9PSBlbnRyeSkgdGhhdC5fbCA9IHByZXY7XG4gICAgICAgICAgdGhhdFtTSVpFXS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjIuMy42IFNldC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgLy8gMjMuMS4zLjUgTWFwLnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIF92YWxpZGF0ZUNvbGxlY3Rpb24odGhpcywgTkFNRSk7XG4gICAgICAgIHZhciBmID0gX2N0eChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhpcy5fZikge1xuICAgICAgICAgIGYoZW50cnkudiwgZW50cnkuaywgdGhpcyk7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnIpIGVudHJ5ID0gZW50cnkucDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KF92YWxpZGF0ZUNvbGxlY3Rpb24odGhpcywgTkFNRSksIGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKF9kZXNjcmlwdG9ycykgZFAkMihDLnByb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF92YWxpZGF0ZUNvbGxlY3Rpb24odGhpcywgTkFNRSlbU0laRV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgIHZhciBwcmV2LCBpbmRleDtcbiAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGVudHJ5LnYgPSB2YWx1ZTtcbiAgICAvLyBjcmVhdGUgbmV3IGVudHJ5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoYXQuX2wgPSBlbnRyeSA9IHtcbiAgICAgICAgaTogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksIC8vIDwtIGluZGV4XG4gICAgICAgIGs6IGtleSwgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBrZXlcbiAgICAgICAgdjogdmFsdWUsICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHZhbHVlXG4gICAgICAgIHA6IHByZXYgPSB0aGF0Ll9sLCAgICAgICAgICAgICAvLyA8LSBwcmV2aW91cyBlbnRyeVxuICAgICAgICBuOiB1bmRlZmluZWQsICAgICAgICAgICAgICAgICAgLy8gPC0gbmV4dCBlbnRyeVxuICAgICAgICByOiBmYWxzZSAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gcmVtb3ZlZFxuICAgICAgfTtcbiAgICAgIGlmICghdGhhdC5fZikgdGhhdC5fZiA9IGVudHJ5O1xuICAgICAgaWYgKHByZXYpIHByZXYubiA9IGVudHJ5O1xuICAgICAgdGhhdFtTSVpFXSsrO1xuICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICBpZiAoaW5kZXggIT09ICdGJykgdGhhdC5faVtpbmRleF0gPSBlbnRyeTtcbiAgICB9IHJldHVybiB0aGF0O1xuICB9LFxuICBnZXRFbnRyeTogZ2V0RW50cnksXG4gIHNldFN0cm9uZzogZnVuY3Rpb24gKEMsIE5BTUUsIElTX01BUCkge1xuICAgIC8vIGFkZCAua2V5cywgLnZhbHVlcywgLmVudHJpZXMsIFtAQGl0ZXJhdG9yXVxuICAgIC8vIDIzLjEuMy40LCAyMy4xLjMuOCwgMjMuMS4zLjExLCAyMy4xLjMuMTIsIDIzLjIuMy41LCAyMy4yLjMuOCwgMjMuMi4zLjEwLCAyMy4yLjMuMTFcbiAgICBfaXRlckRlZmluZShDLCBOQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHRoaXMuX3QgPSBfdmFsaWRhdGVDb2xsZWN0aW9uKGl0ZXJhdGVkLCBOQU1FKTsgLy8gdGFyZ2V0XG4gICAgICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgICAgICAvLyBraW5kXG4gICAgICB0aGlzLl9sID0gdW5kZWZpbmVkOyAgICAgICAgICAgICAgICAvLyBwcmV2aW91c1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciBraW5kID0gdGhhdC5faztcbiAgICAgIHZhciBlbnRyeSA9IHRoYXQuX2w7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYgKCF0aGF0Ll90IHx8ICEodGhhdC5fbCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhhdC5fdC5fZikpIHtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgdGhhdC5fdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIF9pdGVyU3RlcCgxKTtcbiAgICAgIH1cbiAgICAgIC8vIHJldHVybiBzdGVwIGJ5IGtpbmRcbiAgICAgIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIF9pdGVyU3RlcCgwLCBlbnRyeS5rKTtcbiAgICAgIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gX2l0ZXJTdGVwKDAsIGVudHJ5LnYpO1xuICAgICAgcmV0dXJuIF9pdGVyU3RlcCgwLCBbZW50cnkuaywgZW50cnkudl0pO1xuICAgIH0sIElTX01BUCA/ICdlbnRyaWVzJyA6ICd2YWx1ZXMnLCAhSVNfTUFQLCB0cnVlKTtcblxuICAgIC8vIGFkZCBbQEBzcGVjaWVzXSwgMjMuMS4yLjIsIDIzLjIuMi4yXG4gICAgX3NldFNwZWNpZXMoTkFNRSk7XG4gIH1cbn07XG5cbnZhciBTUEVDSUVTJDIgPSBfd2tzKCdzcGVjaWVzJyk7XG5cbnZhciBfYXJyYXlTcGVjaWVzQ29uc3RydWN0b3IgPSBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgdmFyIEM7XG4gIGlmIChfaXNBcnJheShvcmlnaW5hbCkpIHtcbiAgICBDID0gb3JpZ2luYWwuY29uc3RydWN0b3I7XG4gICAgLy8gY3Jvc3MtcmVhbG0gZmFsbGJhY2tcbiAgICBpZiAodHlwZW9mIEMgPT0gJ2Z1bmN0aW9uJyAmJiAoQyA9PT0gQXJyYXkgfHwgX2lzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBpZiAoX2lzT2JqZWN0KEMpKSB7XG4gICAgICBDID0gQ1tTUEVDSUVTJDJdO1xuICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEM7XG59O1xuXG4vLyA5LjQuMi4zIEFycmF5U3BlY2llc0NyZWF0ZShvcmlnaW5hbEFycmF5LCBsZW5ndGgpXG5cblxudmFyIF9hcnJheVNwZWNpZXNDcmVhdGUgPSBmdW5jdGlvbiAob3JpZ2luYWwsIGxlbmd0aCkge1xuICByZXR1cm4gbmV3IChfYXJyYXlTcGVjaWVzQ29uc3RydWN0b3Iob3JpZ2luYWwpKShsZW5ndGgpO1xufTtcblxuLy8gMCAtPiBBcnJheSNmb3JFYWNoXG4vLyAxIC0+IEFycmF5I21hcFxuLy8gMiAtPiBBcnJheSNmaWx0ZXJcbi8vIDMgLT4gQXJyYXkjc29tZVxuLy8gNCAtPiBBcnJheSNldmVyeVxuLy8gNSAtPiBBcnJheSNmaW5kXG4vLyA2IC0+IEFycmF5I2ZpbmRJbmRleFxuXG5cblxuXG5cbnZhciBfYXJyYXlNZXRob2RzID0gZnVuY3Rpb24gKFRZUEUsICRjcmVhdGUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICB2YXIgY3JlYXRlID0gJGNyZWF0ZSB8fCBfYXJyYXlTcGVjaWVzQ3JlYXRlO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0KSB7XG4gICAgdmFyIE8gPSBfdG9PYmplY3QoJHRoaXMpO1xuICAgIHZhciBzZWxmID0gX2lvYmplY3QoTyk7XG4gICAgdmFyIGYgPSBfY3R4KGNhbGxiYWNrZm4sIHRoYXQsIDMpO1xuICAgIHZhciBsZW5ndGggPSBfdG9MZW5ndGgoc2VsZi5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIHJlc3VsdCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHZhbCwgcmVzO1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoTk9fSE9MRVMgfHwgaW5kZXggaW4gc2VsZikge1xuICAgICAgdmFsID0gc2VsZltpbmRleF07XG4gICAgICByZXMgPSBmKHZhbCwgaW5kZXgsIE8pO1xuICAgICAgaWYgKFRZUEUpIHtcbiAgICAgICAgaWYgKElTX01BUCkgcmVzdWx0W2luZGV4XSA9IHJlczsgICAvLyBtYXBcbiAgICAgICAgZWxzZSBpZiAocmVzKSBzd2l0Y2ggKFRZUEUpIHtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiB0cnVlOyAgICAgICAgICAgICAvLyBzb21lXG4gICAgICAgICAgY2FzZSA1OiByZXR1cm4gdmFsOyAgICAgICAgICAgICAgLy8gZmluZFxuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIGluZGV4OyAgICAgICAgICAgIC8vIGZpbmRJbmRleFxuICAgICAgICAgIGNhc2UgMjogcmVzdWx0LnB1c2godmFsKTsgICAgICAgIC8vIGZpbHRlclxuICAgICAgICB9IGVsc2UgaWYgKElTX0VWRVJZKSByZXR1cm4gZmFsc2U7IC8vIGV2ZXJ5XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJU19GSU5EX0lOREVYID8gLTEgOiBJU19TT01FIHx8IElTX0VWRVJZID8gSVNfRVZFUlkgOiByZXN1bHQ7XG4gIH07XG59O1xuXG52YXIgZFAkMyA9IF9vYmplY3REcC5mO1xudmFyIGVhY2ggPSBfYXJyYXlNZXRob2RzKDApO1xuXG5cbnZhciBfY29sbGVjdGlvbiA9IGZ1bmN0aW9uIChOQU1FLCB3cmFwcGVyLCBtZXRob2RzLCBjb21tb24sIElTX01BUCwgSVNfV0VBSykge1xuICB2YXIgQmFzZSA9IF9nbG9iYWxbTkFNRV07XG4gIHZhciBDID0gQmFzZTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIHByb3RvID0gQyAmJiBDLnByb3RvdHlwZTtcbiAgdmFyIE8gPSB7fTtcbiAgaWYgKCFfZGVzY3JpcHRvcnMgfHwgdHlwZW9mIEMgIT0gJ2Z1bmN0aW9uJyB8fCAhKElTX1dFQUsgfHwgcHJvdG8uZm9yRWFjaCAmJiAhX2ZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgQygpLmVudHJpZXMoKS5uZXh0KCk7XG4gIH0pKSkge1xuICAgIC8vIGNyZWF0ZSBjb2xsZWN0aW9uIGNvbnN0cnVjdG9yXG4gICAgQyA9IGNvbW1vbi5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBOQU1FLCBJU19NQVAsIEFEREVSKTtcbiAgICBfcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICAgIF9tZXRhLk5FRUQgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0YXJnZXQsIGl0ZXJhYmxlKSB7XG4gICAgICBfYW5JbnN0YW5jZSh0YXJnZXQsIEMsIE5BTUUsICdfYycpO1xuICAgICAgdGFyZ2V0Ll9jID0gbmV3IEJhc2UoKTtcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIF9mb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0YXJnZXRbQURERVJdLCB0YXJnZXQpO1xuICAgIH0pO1xuICAgIGVhY2goJ2FkZCxjbGVhcixkZWxldGUsZm9yRWFjaCxnZXQsaGFzLHNldCxrZXlzLHZhbHVlcyxlbnRyaWVzLHRvSlNPTicuc3BsaXQoJywnKSwgZnVuY3Rpb24gKEtFWSkge1xuICAgICAgdmFyIElTX0FEREVSID0gS0VZID09ICdhZGQnIHx8IEtFWSA9PSAnc2V0JztcbiAgICAgIGlmIChLRVkgaW4gcHJvdG8gJiYgIShJU19XRUFLICYmIEtFWSA9PSAnY2xlYXInKSkgX2hpZGUoQy5wcm90b3R5cGUsIEtFWSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgX2FuSW5zdGFuY2UodGhpcywgQywgS0VZKTtcbiAgICAgICAgaWYgKCFJU19BRERFUiAmJiBJU19XRUFLICYmICFfaXNPYmplY3QoYSkpIHJldHVybiBLRVkgPT0gJ2dldCcgPyB1bmRlZmluZWQgOiBmYWxzZTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2NbS0VZXShhID09PSAwID8gMCA6IGEsIGIpO1xuICAgICAgICByZXR1cm4gSVNfQURERVIgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgSVNfV0VBSyB8fCBkUCQzKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYy5zaXplO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX3NldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICBfZXhwb3J0KF9leHBvcnQuRyArIF9leHBvcnQuVyArIF9leHBvcnQuRiwgTyk7XG5cbiAgaWYgKCFJU19XRUFLKSBjb21tb24uc2V0U3Ryb25nKEMsIE5BTUUsIElTX01BUCk7XG5cbiAgcmV0dXJuIEM7XG59O1xuXG52YXIgTUFQID0gJ01hcCc7XG5cbi8vIDIzLjEgTWFwIE9iamVjdHNcbnZhciBlczZfbWFwID0gX2NvbGxlY3Rpb24oTUFQLCBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBNYXAoKSB7IHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwge1xuICAvLyAyMy4xLjMuNiBNYXAucHJvdG90eXBlLmdldChrZXkpXG4gIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgIHZhciBlbnRyeSA9IF9jb2xsZWN0aW9uU3Ryb25nLmdldEVudHJ5KF92YWxpZGF0ZUNvbGxlY3Rpb24odGhpcywgTUFQKSwga2V5KTtcbiAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudjtcbiAgfSxcbiAgLy8gMjMuMS4zLjkgTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBfY29sbGVjdGlvblN0cm9uZy5kZWYoX3ZhbGlkYXRlQ29sbGVjdGlvbih0aGlzLCBNQVApLCBrZXkgPT09IDAgPyAwIDoga2V5LCB2YWx1ZSk7XG4gIH1cbn0sIF9jb2xsZWN0aW9uU3Ryb25nLCB0cnVlKTtcblxudmFyIF9hcnJheUZyb21JdGVyYWJsZSA9IGZ1bmN0aW9uIChpdGVyLCBJVEVSQVRPUikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIF9mb3JPZihpdGVyLCBmYWxzZSwgcmVzdWx0LnB1c2gsIHJlc3VsdCwgSVRFUkFUT1IpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxuXG5cbnZhciBfY29sbGVjdGlvblRvSnNvbiA9IGZ1bmN0aW9uIChOQU1FKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgaWYgKF9jbGFzc29mKHRoaXMpICE9IE5BTUUpIHRocm93IFR5cGVFcnJvcihOQU1FICsgXCIjdG9KU09OIGlzbid0IGdlbmVyaWNcIik7XG4gICAgcmV0dXJuIF9hcnJheUZyb21JdGVyYWJsZSh0aGlzKTtcbiAgfTtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cblxuXG5fZXhwb3J0KF9leHBvcnQuUCArIF9leHBvcnQuUiwgJ01hcCcsIHsgdG9KU09OOiBfY29sbGVjdGlvblRvSnNvbignTWFwJykgfSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS9cblxuXG52YXIgX3NldENvbGxlY3Rpb25PZiA9IGZ1bmN0aW9uIChDT0xMRUNUSU9OKSB7XG4gIF9leHBvcnQoX2V4cG9ydC5TLCBDT0xMRUNUSU9OLCB7IG9mOiBmdW5jdGlvbiBvZigpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgQSA9IG5ldyBBcnJheShsZW5ndGgpO1xuICAgIHdoaWxlIChsZW5ndGgtLSkgQVtsZW5ndGhdID0gYXJndW1lbnRzW2xlbmd0aF07XG4gICAgcmV0dXJuIG5ldyB0aGlzKEEpO1xuICB9IH0pO1xufTtcblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLm9mXG5fc2V0Q29sbGVjdGlvbk9mKCdNYXAnKTtcblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tL1xuXG5cblxuXG5cbnZhciBfc2V0Q29sbGVjdGlvbkZyb20gPSBmdW5jdGlvbiAoQ09MTEVDVElPTikge1xuICBfZXhwb3J0KF9leHBvcnQuUywgQ09MTEVDVElPTiwgeyBmcm9tOiBmdW5jdGlvbiBmcm9tKHNvdXJjZSAvKiAsIG1hcEZuLCB0aGlzQXJnICovKSB7XG4gICAgdmFyIG1hcEZuID0gYXJndW1lbnRzWzFdO1xuICAgIHZhciBtYXBwaW5nLCBBLCBuLCBjYjtcbiAgICBfYUZ1bmN0aW9uKHRoaXMpO1xuICAgIG1hcHBpbmcgPSBtYXBGbiAhPT0gdW5kZWZpbmVkO1xuICAgIGlmIChtYXBwaW5nKSBfYUZ1bmN0aW9uKG1hcEZuKTtcbiAgICBpZiAoc291cmNlID09IHVuZGVmaW5lZCkgcmV0dXJuIG5ldyB0aGlzKCk7XG4gICAgQSA9IFtdO1xuICAgIGlmIChtYXBwaW5nKSB7XG4gICAgICBuID0gMDtcbiAgICAgIGNiID0gX2N0eChtYXBGbiwgYXJndW1lbnRzWzJdLCAyKTtcbiAgICAgIF9mb3JPZihzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbiAobmV4dEl0ZW0pIHtcbiAgICAgICAgQS5wdXNoKGNiKG5leHRJdGVtLCBuKyspKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfZm9yT2Yoc291cmNlLCBmYWxzZSwgQS5wdXNoLCBBKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyB0aGlzKEEpO1xuICB9IH0pO1xufTtcblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLmZyb21cbl9zZXRDb2xsZWN0aW9uRnJvbSgnTWFwJyk7XG5cbnZhciBtYXAgPSBfY29yZS5NYXA7XG5cbnZhciBtYXAkMSA9IG1hcDtcblxudmFyIGFycmF5U2xpY2UgPSBbXS5zbGljZTtcbnZhciBmYWN0b3JpZXMgPSB7fTtcblxudmFyIGNvbnN0cnVjdCA9IGZ1bmN0aW9uIChGLCBsZW4sIGFyZ3MpIHtcbiAgaWYgKCEobGVuIGluIGZhY3RvcmllcykpIHtcbiAgICBmb3IgKHZhciBuID0gW10sIGkgPSAwOyBpIDwgbGVuOyBpKyspIG5baV0gPSAnYVsnICsgaSArICddJztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICBmYWN0b3JpZXNbbGVuXSA9IEZ1bmN0aW9uKCdGLGEnLCAncmV0dXJuIG5ldyBGKCcgKyBuLmpvaW4oJywnKSArICcpJyk7XG4gIH0gcmV0dXJuIGZhY3Rvcmllc1tsZW5dKEYsIGFyZ3MpO1xufTtcblxudmFyIF9iaW5kID0gRnVuY3Rpb24uYmluZCB8fCBmdW5jdGlvbiBiaW5kKHRoYXQgLyogLCAuLi5hcmdzICovKSB7XG4gIHZhciBmbiA9IF9hRnVuY3Rpb24odGhpcyk7XG4gIHZhciBwYXJ0QXJncyA9IGFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoLyogYXJncy4uLiAqLykge1xuICAgIHZhciBhcmdzID0gcGFydEFyZ3MuY29uY2F0KGFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGJvdW5kID8gY29uc3RydWN0KGZuLCBhcmdzLmxlbmd0aCwgYXJncykgOiBfaW52b2tlKGZuLCBhcmdzLCB0aGF0KTtcbiAgfTtcbiAgaWYgKF9pc09iamVjdChmbi5wcm90b3R5cGUpKSBib3VuZC5wcm90b3R5cGUgPSBmbi5wcm90b3R5cGU7XG4gIHJldHVybiBib3VuZDtcbn07XG5cbi8vIDI2LjEuMiBSZWZsZWN0LmNvbnN0cnVjdCh0YXJnZXQsIGFyZ3VtZW50c0xpc3QgWywgbmV3VGFyZ2V0XSlcblxuXG5cblxuXG5cblxudmFyIHJDb25zdHJ1Y3QgPSAoX2dsb2JhbC5SZWZsZWN0IHx8IHt9KS5jb25zdHJ1Y3Q7XG5cbi8vIE1TIEVkZ2Ugc3VwcG9ydHMgb25seSAyIGFyZ3VtZW50cyBhbmQgYXJndW1lbnRzTGlzdCBhcmd1bWVudCBpcyBvcHRpb25hbFxuLy8gRkYgTmlnaHRseSBzZXRzIHRoaXJkIGFyZ3VtZW50IGFzIGBuZXcudGFyZ2V0YCwgYnV0IGRvZXMgbm90IGNyZWF0ZSBgdGhpc2AgZnJvbSBpdFxudmFyIE5FV19UQVJHRVRfQlVHID0gX2ZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gIShyQ29uc3RydWN0KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgW10sIEYpIGluc3RhbmNlb2YgRik7XG59KTtcbnZhciBBUkdTX0JVRyA9ICFfZmFpbHMoZnVuY3Rpb24gKCkge1xuICByQ29uc3RydWN0KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuX2V4cG9ydChfZXhwb3J0LlMgKyBfZXhwb3J0LkYgKiAoTkVXX1RBUkdFVF9CVUcgfHwgQVJHU19CVUcpLCAnUmVmbGVjdCcsIHtcbiAgY29uc3RydWN0OiBmdW5jdGlvbiBjb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzIC8qICwgbmV3VGFyZ2V0ICovKSB7XG4gICAgX2FGdW5jdGlvbihUYXJnZXQpO1xuICAgIF9hbk9iamVjdChhcmdzKTtcbiAgICB2YXIgbmV3VGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyBUYXJnZXQgOiBfYUZ1bmN0aW9uKGFyZ3VtZW50c1syXSk7XG4gICAgaWYgKEFSR1NfQlVHICYmICFORVdfVEFSR0VUX0JVRykgcmV0dXJuIHJDb25zdHJ1Y3QoVGFyZ2V0LCBhcmdzLCBuZXdUYXJnZXQpO1xuICAgIGlmIChUYXJnZXQgPT0gbmV3VGFyZ2V0KSB7XG4gICAgICAvLyB3L28gYWx0ZXJlZCBuZXdUYXJnZXQsIG9wdGltaXphdGlvbiBmb3IgMC00IGFyZ3VtZW50c1xuICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgVGFyZ2V0KCk7XG4gICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSk7XG4gICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgIGNhc2UgMzogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgICAgIGNhc2UgNDogcmV0dXJuIG5ldyBUYXJnZXQoYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gICAgICB9XG4gICAgICAvLyB3L28gYWx0ZXJlZCBuZXdUYXJnZXQsIGxvdCBvZiBhcmd1bWVudHMgY2FzZVxuICAgICAgdmFyICRhcmdzID0gW251bGxdO1xuICAgICAgJGFyZ3MucHVzaC5hcHBseSgkYXJncywgYXJncyk7XG4gICAgICByZXR1cm4gbmV3IChfYmluZC5hcHBseShUYXJnZXQsICRhcmdzKSkoKTtcbiAgICB9XG4gICAgLy8gd2l0aCBhbHRlcmVkIG5ld1RhcmdldCwgbm90IHN1cHBvcnQgYnVpbHQtaW4gY29uc3RydWN0b3JzXG4gICAgdmFyIHByb3RvID0gbmV3VGFyZ2V0LnByb3RvdHlwZTtcbiAgICB2YXIgaW5zdGFuY2UgPSBfb2JqZWN0Q3JlYXRlKF9pc09iamVjdChwcm90bykgPyBwcm90byA6IE9iamVjdC5wcm90b3R5cGUpO1xuICAgIHZhciByZXN1bHQgPSBGdW5jdGlvbi5hcHBseS5jYWxsKFRhcmdldCwgaW5zdGFuY2UsIGFyZ3MpO1xuICAgIHJldHVybiBfaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IGluc3RhbmNlO1xuICB9XG59KTtcblxudmFyIGNvbnN0cnVjdCQxID0gX2NvcmUuUmVmbGVjdC5jb25zdHJ1Y3Q7XG5cbnZhciBjb25zdHJ1Y3QkMiA9IGNvbnN0cnVjdCQxO1xuXG52YXIgY29uc3RydWN0JDMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG5mdW5jdGlvbiBfY29uc3RydWN0KFBhcmVudCwgYXJncywgQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnN0cnVjdCQyKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0ID0gY29uc3RydWN0JDI7XG4gIH0gZWxzZSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0ID0gZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gICAgICB2YXIgYSA9IFtudWxsXTtcbiAgICAgIGEucHVzaC5hcHBseShhLCBhcmdzKTtcbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IFBhcmVudC5iaW5kLmFwcGx5KFBhcmVudCwgYSk7XG4gICAgICB2YXIgaW5zdGFuY2UgPSBuZXcgQ29uc3RydWN0b3IoKTtcbiAgICAgIGlmIChDbGFzcykgc2V0UHJvdG90eXBlT2YkMihpbnN0YW5jZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF9jb25zdHJ1Y3QuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY29uc3RydWN0O1xufSk7XG5cbnZhciB3cmFwTmF0aXZlU3VwZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG5mdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gIHZhciBfY2FjaGUgPSB0eXBlb2YgbWFwJDEgPT09IFwiZnVuY3Rpb25cIiA/IG5ldyBtYXAkMSgpIDogdW5kZWZpbmVkO1xuXG4gIG1vZHVsZS5leHBvcnRzID0gX3dyYXBOYXRpdmVTdXBlciA9IGZ1bmN0aW9uIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpIHtcbiAgICBpZiAodHlwZW9mIENsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIF9jYWNoZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKF9jYWNoZS5oYXMoQ2xhc3MpKSByZXR1cm4gX2NhY2hlLmdldChDbGFzcyk7XG5cbiAgICAgIF9jYWNoZS5zZXQoQ2xhc3MsIFdyYXBwZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFdyYXBwZXIoKSB7fVxuXG4gICAgV3JhcHBlci5wcm90b3R5cGUgPSBjcmVhdGUkMShDbGFzcy5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBXcmFwcGVyLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzZXRQcm90b3R5cGVPZiQyKFdyYXBwZXIsIHNldFByb3RvdHlwZU9mJDIoZnVuY3Rpb24gU3VwZXIoKSB7XG4gICAgICByZXR1cm4gY29uc3RydWN0JDMoQ2xhc3MsIGFyZ3VtZW50cywgZ2V0UHJvdG90eXBlT2YkMih0aGlzKS5jb25zdHJ1Y3Rvcik7XG4gICAgfSwgQ2xhc3MpKTtcbiAgfTtcblxuICByZXR1cm4gX3dyYXBOYXRpdmVTdXBlcihDbGFzcyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3dyYXBOYXRpdmVTdXBlcjtcbn0pO1xuXG52YXIgQ29tcG9zaXRpb25FcnJvciQxID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfRXJyb3IpIHtcbiAgZnVuY3Rpb24gQ29tcG9zaXRpb25FcnJvcihjbGFzc0luc3RhbmNlLCBtZXNzYWdlLCBjb21wb25lbnQpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb21wb3NpdGlvbkVycm9yKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKENvbXBvc2l0aW9uRXJyb3IpLmNhbGwodGhpcywgXCJAXCIuY29uY2F0KGNsYXNzSW5zdGFuY2UsIFwiOiBcIikuY29uY2F0KG1lc3NhZ2UpKSk7XG5cbiAgICB2YXIgc3RhY2tBcnJheSA9IF90aGlzLnN0YWNrLnNwbGl0KCdcXG4nKTtcblxuICAgIHN0YWNrQXJyYXkuc3BsaWNlKDEsIDIpO1xuICAgIF90aGlzLnN0YWNrID0gc3RhY2tBcnJheS5qb2luKCdcXG4nKTtcbiAgICBpZiAoY29uc29sZSkgY29uc29sZS5lcnJvcignQ29tcG9uZW50OicsIGNvbXBvbmVudCk7XG4gICAgX3RoaXMubmFtZSA9ICdDb21wb3NpdGlvbkVycm9yJztcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBpbmhlcml0cyhDb21wb3NpdGlvbkVycm9yLCBfRXJyb3IpO1xuXG4gIHJldHVybiBDb21wb3NpdGlvbkVycm9yO1xufSh3cmFwTmF0aXZlU3VwZXIoRXJyb3IpKTtcbnZhciBEZXBlbmRlbmN5RXJyb3IgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9FcnJvcjIpIHtcbiAgZnVuY3Rpb24gRGVwZW5kZW5jeUVycm9yKGNsYXNzSW5zdGFuY2UsIG1lc3NhZ2UsIGFjdGl2ZU1vZHVsZSkge1xuICAgIHZhciBfdGhpczI7XG5cbiAgICB2YXIgZGVwZW5kZW5jeU1vZHVsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZmFsc2U7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBEZXBlbmRlbmN5RXJyb3IpO1xuXG4gICAgX3RoaXMyID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKERlcGVuZGVuY3lFcnJvcikuY2FsbCh0aGlzLCBcIkBcIi5jb25jYXQoY2xhc3NJbnN0YW5jZSwgXCI6IFwiKS5jb25jYXQobWVzc2FnZSkpKTtcblxuICAgIHZhciBzdGFja0FycmF5ID0gX3RoaXMyLnN0YWNrLnNwbGl0KCdcXG4nKTtcblxuICAgIHN0YWNrQXJyYXkuc3BsaWNlKDEsIDIpO1xuICAgIF90aGlzMi5zdGFjayA9IHN0YWNrQXJyYXkuam9pbignXFxuJyk7XG4gICAgaWYgKGNvbnNvbGUpIGNvbnNvbGUuZXJyb3IoJ0FjdGl2ZSBtb2R1bGU6JywgYWN0aXZlTW9kdWxlKTtcbiAgICBpZiAoY29uc29sZSAmJiBkZXBlbmRlbmN5TW9kdWxlKSBjb25zb2xlLmVycm9yKCdEZXBlbmRlbmN5IHB1Ymxpc2hlZCBieSBtb2R1bGU6JywgZGVwZW5kZW5jeU1vZHVsZSk7XG4gICAgX3RoaXMyLm5hbWUgPSAnRGVwZW5kZW5jeUVycm9yJztcbiAgICByZXR1cm4gX3RoaXMyO1xuICB9XG5cbiAgaW5oZXJpdHMoRGVwZW5kZW5jeUVycm9yLCBfRXJyb3IyKTtcblxuICByZXR1cm4gRGVwZW5kZW5jeUVycm9yO1xufSh3cmFwTmF0aXZlU3VwZXIoRXJyb3IpKTtcbnZhciBNYW5hZ2VyRXJyb3IgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9FcnJvcjMpIHtcbiAgZnVuY3Rpb24gTWFuYWdlckVycm9yKGNsYXNzSW5zdGFuY2UsIG1lc3NhZ2UsIGNvbXBvbmVudCkge1xuICAgIHZhciBfdGhpczM7XG5cbiAgICB2YXIgYWN0aXZlTW9kdWxlID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBmYWxzZTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1hbmFnZXJFcnJvcik7XG5cbiAgICBfdGhpczMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoTWFuYWdlckVycm9yKS5jYWxsKHRoaXMsIFwiQFwiLmNvbmNhdChjbGFzc0luc3RhbmNlLCBcIjogXCIpLmNvbmNhdChtZXNzYWdlKSkpO1xuXG4gICAgdmFyIHN0YWNrQXJyYXkgPSBfdGhpczMuc3RhY2suc3BsaXQoJ1xcbicpO1xuXG4gICAgc3RhY2tBcnJheS5zcGxpY2UoMSwgMik7XG4gICAgX3RoaXMzLnN0YWNrID0gc3RhY2tBcnJheS5qb2luKCdcXG4nKTtcbiAgICBpZiAoY29uc29sZSkgY29uc29sZS5lcnJvcignQ29tcG9uZW50OicsIGNvbXBvbmVudCk7XG4gICAgaWYgKGNvbnNvbGUgJiYgYWN0aXZlTW9kdWxlKSBjb25zb2xlLmVycm9yKCdBY3RpdmUgbW9kdWxlOicsIGFjdGl2ZU1vZHVsZSk7XG4gICAgX3RoaXMzLm5hbWUgPSAnTWFuYWdlckVycm9yJztcbiAgICByZXR1cm4gX3RoaXMzO1xuICB9XG5cbiAgaW5oZXJpdHMoTWFuYWdlckVycm9yLCBfRXJyb3IzKTtcblxuICByZXR1cm4gTWFuYWdlckVycm9yO1xufSh3cmFwTmF0aXZlU3VwZXIoRXJyb3IpKTtcblxudmFyIHdhcm5EZXBzID0gZnVuY3Rpb24gd2FybkRlcHMoKSB7XG4gIHRocm93IG5ldyBFcnJvcignV2hpdGVzdG9ybUpTIEZyYW1ld29yayByZXF1IGlyZXMgVGhyZWUuanMgcjkyLiBodHRwczovL3RocmVlanMub3JnLycpO1xufTtcblxudHJ5IHtcbiAgaWYgKCFSRVZJU0lPTikgd2FybkRlcHMoKTtcbn0gY2F0Y2ggKGVycikge1xuICB3YXJuRGVwcygpO1xufVxuLyoqXG4gKiBAY2xhc3MgTW9kdWxlU3lzdGVtXG4gKiBAY2F0ZWdvcnkgY29yZVxuICogQGRlc2NyaXB0aW9uICBQcm92aWRlcyBBUEkgZm9yIGNsYXNzZXMgdGhhdCB3aWxsIHVzZSBNb2R1bGVzLjxici8+XG4gKiBUaGlzIGNsYXNzIGluY2x1ZGVzIGJhc2ljIGV2ZW50IHN5c3RlbSB3aXRoIHRob3NlIHN1cHBvcnRlZCBtZXRob2RzOlxuICogPHByZT4ub24oKTwvcHJlPjxwcmU+Lm9mZigpPC9wcmU+PHByZT4uZW1pdCgpPC9wcmU+XG4gKiBAZXh0ZW5kcyBFdmVudHNcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZVxuICovXG5cblxudmFyIE1vZHVsZVN5c3RlbSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0V2ZW50cykge1xuICBmdW5jdGlvbiBNb2R1bGVTeXN0ZW0oKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTW9kdWxlU3lzdGVtKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoTW9kdWxlU3lzdGVtKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKE1vZHVsZVN5c3RlbSwgW3tcbiAgICBrZXk6IFwiaW50ZWdyYXRlTW9kdWxlc1wiLFxuICAgIC8vIElOVEVHUkFUSU5HXG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGludGVncmF0ZU1vZHVsZXNcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gVGhpcyBtZXRob2QgYXBwbGllcyBhbGwgbW9kdWxlcyBmcm9tIC5tb2R1bGVzIGNvbGxlY3Rpb24uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzb3VyY2VdIElmIHNvdXJjZSAoc2hvdWxkIGJlIGEgY29tcG9uZW50KSBpcyBwcm92aWRlZCwgd2lsbCByZXBsYWNlIC5tb2R1bGVzIHdpdGggc291cmNlJ3Mgb25lIGJlZm9yZSBleGVjdXRpbmcgbW9kdWxlcy5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlU3lzdGVtXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVncmF0ZU1vZHVsZXMoc291cmNlKSB7XG4gICAgICBpZiAoIXRoaXMubW9kdWxlcyAmJiAhc291cmNlKSByZXR1cm47XG4gICAgICBpZiAoc291cmNlICYmIHNvdXJjZS5tb2R1bGVzKSB0aGlzLm1vZHVsZXMgPSBzb3VyY2UubW9kdWxlcy5zbGljZSgwKTtcblxuICAgICAgaWYgKHRoaXMubW9kdWxlcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbWF4ID0gdGhpcy5tb2R1bGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgICAgdGhpcy5hcHBseU1vZHVsZSh0aGlzLm1vZHVsZXNbaV0sIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc291cmNlKSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgb25Db3B5OiBzb3VyY2VcbiAgICAgIH0pO1xuICAgIH0gLy8gQVBQTFlJTkcgTU9EVUxFICguLi5hbmQgYSBcImJyaWRnZVwiIGZvciBtb2R1bGUpXG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGFwcGx5QnJpZGdlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIE1ha2VzIGNvbXBvbmVudC1zcGVjaWZpYyBBUEkgdG8gd29yayB3aXRoIG1vZHVsZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGJyaWRnZU1hcFxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBvYmplY3Qgd2l0aCBtb2RpZmllZCB2YWx1ZXMuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYXBwbHlCcmlkZ2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHlCcmlkZ2UoKSB7XG4gICAgICB2YXIgYnJpZGdlTWFwID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciBtb2R1bGVzID0gdGhpcy5tb2R1bGVzO1xuICAgICAgaWYgKCFtb2R1bGVzKSByZXR1cm4gYnJpZGdlTWFwO1xuXG4gICAgICBmb3IgKHZhciBpID0gMCwgbWF4ID0gbW9kdWxlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gYnJpZGdlTWFwKSB7XG4gICAgICAgICAgaWYgKGJyaWRnZU1hcFtrZXldKSB7XG4gICAgICAgICAgICB2YXIgbW9kdWxlID0gbW9kdWxlc1tpXTtcbiAgICAgICAgICAgIGlmIChtb2R1bGUgJiYgbW9kdWxlLmJyaWRnZSAmJiBtb2R1bGUuYnJpZGdlW2tleV0pIGJyaWRnZU1hcFtrZXldID0gbW9kdWxlLmJyaWRnZVtrZXldLmFwcGx5KHRoaXMsIFticmlkZ2VNYXBba2V5XSwgbW9kdWxlXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBicmlkZ2VNYXA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgYXBwbHlDb21tYW5kXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIC5hcHBseUNvbW1hbmQgcnVucyBhIG1ldGhvZCBjYWxsZWQgYG5hbWVgIG9uIGFsbCBtb2R1bGVzLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBtZXRob2QgbmFtZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2I9KGZ1bmMsIG1vZHVsZVNjb3BlKSA9PiBmdW5jLmFwcGx5KHRoaXMsIFttb2R1bGVTY29wZV0pXSBIb3cgdGhlIGZ1bmN0aW9uIGlzIHdyYXBwZWQvXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYXBwbHlDb21tYW5kXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5Q29tbWFuZChuYW1lKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgY2IgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZ1bmN0aW9uIChmdW5jLCBtb2R1bGVTY29wZSkge1xuICAgICAgICByZXR1cm4gZnVuYy5hcHBseShfdGhpcywgW21vZHVsZVNjb3BlXSk7XG4gICAgICB9O1xuICAgICAgdmFyIG1vZHVsZXMgPSB0aGlzLm1vZHVsZXM7XG4gICAgICBpZiAoIW1vZHVsZXMpIHJldHVybjtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIG1heCA9IG1vZHVsZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgICAgdmFyIG1vZHVsZSA9IG1vZHVsZXNbaV07XG4gICAgICAgIGlmIChuYW1lIGluIG1vZHVsZSkgY2IobW9kdWxlW25hbWVdLCBtb2R1bGUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGFwcGx5TW9kdWxlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIC5hcHBseU1vZHVsZSBpcyBhbHNvIHVzZWQgaW4gLmludGVncmF0ZU1vZHVsZXMoKSBmdW5jdGlvbi5cbiAgICAgKiBJdCBkb2VzIGV4YWN0bHkgd2hhdCBpdHMgbmFtZSBzYXlzIChhcHBsaWVzIG1vZHVsZSB0byBjb21wb25lbnQgb3IgYXBwKS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gYXBwbHlcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtwdXNoPXRydWVdXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXR1cm5zIG1vZHVsZSB0aGF0IHdhcyBhcHBsaWVkLlxuICAgICAqIEB0aHJvd3Mge01hbmFnZXJFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlU3lzdGVtXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhcHBseU1vZHVsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseU1vZHVsZShtb2R1bGUpIHtcbiAgICAgIHZhciBwdXNoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICAgICAgaWYgKCFtb2R1bGUpIHJldHVybjtcbiAgICAgIGlmIChwdXNoICYmIHRoaXMubW9kdWxlcykgdGhpcy5tb2R1bGVzLnB1c2gobW9kdWxlKTtlbHNlIGlmIChwdXNoKSB0aGlzLm1vZHVsZXMgPSBbbW9kdWxlXTtcbiAgICAgIGlmICh0aGlzLm1hbmFnZXIpIHRoaXMubWFuYWdlci5hY3RpdmUobW9kdWxlKTtcbiAgICAgIGlmIChtb2R1bGUubWFuYWdlciAmJiB0aGlzLm1hbmFnZXIpIG1vZHVsZS5tYW5hZ2VyKHRoaXMubWFuYWdlcik7ZWxzZSBpZiAobW9kdWxlLm1hbmFnZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1hbmFnZXJFcnJvcignQ29tcG9uZW50JywgXCJNb2R1bGUgcmVxdWlyZXMgTW9kdWxlTWFuYWdlciB0aGF0IGlzIHR1cm5lZCBvZmYgZm9yIHRoaXMgY29tcG9uZW50XCIsIHRoaXMsIG1vZHVsZSk7XG4gICAgICB9XG4gICAgICBpZiAobW9kdWxlLmludGVncmF0ZSkgbW9kdWxlLmludGVncmF0ZS5iaW5kKHRoaXMpKG1vZHVsZSk7XG4gICAgICByZXR1cm4gbW9kdWxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGRpc3Bvc2VNb2R1bGVzXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIERpc3Bvc2VzIG9mIGFsbCBtb2R1bGVzXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzcG9zZU1vZHVsZXNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcG9zZU1vZHVsZXMoKSB7XG4gICAgICB3aGlsZSAodGhpcy5tb2R1bGVzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VNb2R1bGUodGhpcy5tb2R1bGVzWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBkaXNwb3NlTW9kdWxlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIERpc3Bvc2VzIG9mIHRoZSBnaXZlbiBtb2R1bGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gZGlzcG9zZVxuICAgICAqIEByZXR1cm4ge01vZHVsZX0gUmV0dXJucyBtb2R1bGUgdGhhdCB3YXMgcmVtb3ZlZC5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlU3lzdGVtXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkaXNwb3NlTW9kdWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRpc3Bvc2VNb2R1bGUobW9kdWxlKSB7XG4gICAgICBpZiAoIW1vZHVsZSkgcmV0dXJuO1xuICAgICAgdGhpcy5tb2R1bGVzLnNwbGljZSh0aGlzLm1vZHVsZXMuaW5kZXhPZihtb2R1bGUpLCAxKTtcbiAgICAgIGlmIChtb2R1bGUuZGlzcG9zZSkgbW9kdWxlLmRpc3Bvc2UuYmluZCh0aGlzKShtb2R1bGUpO1xuICAgICAgcmV0dXJuIG1vZHVsZTtcbiAgICB9IC8vIFBJUEVEIE1FVEhPRFxuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBtb2R1bGVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gcGlwZWQgdmVyc2lvbiBvZiAuYXBwbHlNb2R1bGUoKS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gYXBwbHlcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSByZXR1cm5zIHRoaXMgLSBhcHAvY29tcG9uZW50XG4gICAgICogQHRocm93cyB7TWFuYWdlckVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5QaXBlZCBtb2R1bGVzPC9jYXB0aW9uPlxuICAgICAqIGNvbXBvbmVudFxuICAgICAqICAgLm1vZHVsZShuZXcgTW9kdWxlMSgpKVxuICAgICAqICAgLm1vZHVsZShuZXcgTW9kdWxlMigpKVxuICAgICAqICAgLm1vZHVsZShuZXcgTW9kdWxlMygpKVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibW9kdWxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1vZHVsZShfbW9kdWxlKSB7XG4gICAgICB0aGlzLmFwcGx5TW9kdWxlKF9tb2R1bGUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoTW9kdWxlU3lzdGVtLCBfRXZlbnRzKTtcblxuICByZXR1cm4gTW9kdWxlU3lzdGVtO1xufShtaW5pdmVudHNfY29tbW9uanMpO1xuXG5mdW5jdGlvbiBfYXJyYXlXaXRoSG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBhcnI7XG59XG5cbnZhciBhcnJheVdpdGhIb2xlcyA9IF9hcnJheVdpdGhIb2xlcztcblxudmFyIGNvcmVfZ2V0SXRlcmF0b3IgPSBfY29yZS5nZXRJdGVyYXRvciA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXRlckZuID0gY29yZV9nZXRJdGVyYXRvck1ldGhvZChpdCk7XG4gIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGl0ZXJhYmxlIScpO1xuICByZXR1cm4gX2FuT2JqZWN0KGl0ZXJGbi5jYWxsKGl0KSk7XG59O1xuXG52YXIgZ2V0SXRlcmF0b3IgPSBjb3JlX2dldEl0ZXJhdG9yO1xuXG52YXIgZ2V0SXRlcmF0b3IkMSA9IGdldEl0ZXJhdG9yO1xuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIHZhciBfYXJyID0gW107XG4gIHZhciBfbiA9IHRydWU7XG4gIHZhciBfZCA9IGZhbHNlO1xuICB2YXIgX2UgPSB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKHZhciBfaSA9IGdldEl0ZXJhdG9yJDEoYXJyKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufVxuXG52YXIgaXRlcmFibGVUb0FycmF5TGltaXQgPSBfaXRlcmFibGVUb0FycmF5TGltaXQ7XG5cbmZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpO1xufVxuXG52YXIgbm9uSXRlcmFibGVSZXN0ID0gX25vbkl0ZXJhYmxlUmVzdDtcblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgbm9uSXRlcmFibGVSZXN0KCk7XG59XG5cbnZhciBzbGljZWRUb0FycmF5ID0gX3NsaWNlZFRvQXJyYXk7XG5cbmZ1bmN0aW9uIHN5bWJvbE9ic2VydmFibGVQb255ZmlsbChyb290KSB7XG5cdHZhciByZXN1bHQ7XG5cdHZhciBTeW1ib2wgPSByb290LlN5bWJvbDtcblxuXHRpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdGlmIChTeW1ib2wub2JzZXJ2YWJsZSkge1xuXHRcdFx0cmVzdWx0ID0gU3ltYm9sLm9ic2VydmFibGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdCA9IFN5bWJvbCgnb2JzZXJ2YWJsZScpO1xuXHRcdFx0U3ltYm9sLm9ic2VydmFibGUgPSByZXN1bHQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJlc3VsdCA9ICdAQG9ic2VydmFibGUnO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG52YXIgcm9vdDtcblxuaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICByb290ID0gc2VsZjtcbn0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcm9vdCA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcm9vdCA9IGdsb2JhbDtcbn0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcm9vdCA9IG1vZHVsZTtcbn0gZWxzZSB7XG4gIHJvb3QgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xufVxuXG52YXIgcmVzdWx0ID0gc3ltYm9sT2JzZXJ2YWJsZVBvbnlmaWxsKHJvb3QpO1xuXG4vKipcbiAqIFRoZXNlIGFyZSBwcml2YXRlIGFjdGlvbiB0eXBlcyByZXNlcnZlZCBieSBSZWR1eC5cbiAqIEZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB5b3UgbXVzdCByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUuXG4gKiBJZiB0aGUgY3VycmVudCBzdGF0ZSBpcyB1bmRlZmluZWQsIHlvdSBtdXN0IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS5cbiAqIERvIG5vdCByZWZlcmVuY2UgdGhlc2UgYWN0aW9uIHR5cGVzIGRpcmVjdGx5IGluIHlvdXIgY29kZS5cbiAqL1xudmFyIEFjdGlvblR5cGVzID0ge1xuICBJTklUOiAnQEByZWR1eC9JTklUJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZyg3KS5zcGxpdCgnJykuam9pbignLicpLFxuICBSRVBMQUNFOiAnQEByZWR1eC9SRVBMQUNFJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZyg3KS5zcGxpdCgnJykuam9pbignLicpXG59O1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iajtcbn0gOiBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gb2JqIFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBhcmd1bWVudCBhcHBlYXJzIHRvIGJlIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KG9iaikge1xuICBpZiAoKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG9iaikpICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB2YXIgcHJvdG8gPSBvYmo7XG4gIHdoaWxlIChPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pICE9PSBudWxsKSB7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopID09PSBwcm90bztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqIFRoZSBvbmx5IHdheSB0byBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlIHN0b3JlIGlzIHRvIGNhbGwgYGRpc3BhdGNoKClgIG9uIGl0LlxuICpcbiAqIFRoZXJlIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIHN0b3JlIGluIHlvdXIgYXBwLiBUbyBzcGVjaWZ5IGhvdyBkaWZmZXJlbnRcbiAqIHBhcnRzIG9mIHRoZSBzdGF0ZSB0cmVlIHJlc3BvbmQgdG8gYWN0aW9ucywgeW91IG1heSBjb21iaW5lIHNldmVyYWwgcmVkdWNlcnNcbiAqIGludG8gYSBzaW5nbGUgcmVkdWNlciBmdW5jdGlvbiBieSB1c2luZyBgY29tYmluZVJlZHVjZXJzYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWR1Y2VyIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBuZXh0IHN0YXRlIHRyZWUsIGdpdmVuXG4gKiB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgYWN0aW9uIHRvIGhhbmRsZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gW3ByZWxvYWRlZFN0YXRlXSBUaGUgaW5pdGlhbCBzdGF0ZS4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGh5ZHJhdGUgdGhlIHN0YXRlIGZyb20gdGhlIHNlcnZlciBpbiB1bml2ZXJzYWwgYXBwcywgb3IgdG8gcmVzdG9yZSBhXG4gKiBwcmV2aW91c2x5IHNlcmlhbGl6ZWQgdXNlciBzZXNzaW9uLlxuICogSWYgeW91IHVzZSBgY29tYmluZVJlZHVjZXJzYCB0byBwcm9kdWNlIHRoZSByb290IHJlZHVjZXIgZnVuY3Rpb24sIHRoaXMgbXVzdCBiZVxuICogYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgYGNvbWJpbmVSZWR1Y2Vyc2Aga2V5cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZW5oYW5jZXJdIFRoZSBzdG9yZSBlbmhhbmNlci4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGVuaGFuY2UgdGhlIHN0b3JlIHdpdGggdGhpcmQtcGFydHkgY2FwYWJpbGl0aWVzIHN1Y2ggYXMgbWlkZGxld2FyZSxcbiAqIHRpbWUgdHJhdmVsLCBwZXJzaXN0ZW5jZSwgZXRjLiBUaGUgb25seSBzdG9yZSBlbmhhbmNlciB0aGF0IHNoaXBzIHdpdGggUmVkdXhcbiAqIGlzIGBhcHBseU1pZGRsZXdhcmUoKWAuXG4gKlxuICogQHJldHVybnMge1N0b3JlfSBBIFJlZHV4IHN0b3JlIHRoYXQgbGV0cyB5b3UgcmVhZCB0aGUgc3RhdGUsIGRpc3BhdGNoIGFjdGlvbnNcbiAqIGFuZCBzdWJzY3JpYmUgdG8gY2hhbmdlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHZhciBfcmVmMjtcblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSBlbmhhbmNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0aGUgcmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IHByZWxvYWRlZFN0YXRlO1xuICB2YXIgY3VycmVudExpc3RlbmVycyA9IFtdO1xuICB2YXIgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnM7XG4gIHZhciBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpIHtcbiAgICBpZiAobmV4dExpc3RlbmVycyA9PT0gY3VycmVudExpc3RlbmVycykge1xuICAgICAgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMuc2xpY2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIHN0YXRlIHRyZWUgbWFuYWdlZCBieSB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBjdXJyZW50IHN0YXRlIHRyZWUgb2YgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtYXkgbm90IGNhbGwgc3RvcmUuZ2V0U3RhdGUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnVGhlIHJlZHVjZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgdGhlIHN0YXRlIGFzIGFuIGFyZ3VtZW50LiAnICsgJ1Bhc3MgaXQgZG93biBmcm9tIHRoZSB0b3AgcmVkdWNlciBpbnN0ZWFkIG9mIHJlYWRpbmcgaXQgZnJvbSB0aGUgc3RvcmUuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnRTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hhbmdlIGxpc3RlbmVyLiBJdCB3aWxsIGJlIGNhbGxlZCBhbnkgdGltZSBhbiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCxcbiAgICogYW5kIHNvbWUgcGFydCBvZiB0aGUgc3RhdGUgdHJlZSBtYXkgcG90ZW50aWFsbHkgaGF2ZSBjaGFuZ2VkLiBZb3UgbWF5IHRoZW5cbiAgICogY2FsbCBgZ2V0U3RhdGUoKWAgdG8gcmVhZCB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGluc2lkZSB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBgZGlzcGF0Y2goKWAgZnJvbSBhIGNoYW5nZSBsaXN0ZW5lciwgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAqIGNhdmVhdHM6XG4gICAqXG4gICAqIDEuIFRoZSBzdWJzY3JpcHRpb25zIGFyZSBzbmFwc2hvdHRlZCBqdXN0IGJlZm9yZSBldmVyeSBgZGlzcGF0Y2goKWAgY2FsbC5cbiAgICogSWYgeW91IHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB3aGlsZSB0aGUgbGlzdGVuZXJzIGFyZSBiZWluZyBpbnZva2VkLCB0aGlzXG4gICAqIHdpbGwgbm90IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgYGRpc3BhdGNoKClgIHRoYXQgaXMgY3VycmVudGx5IGluIHByb2dyZXNzLlxuICAgKiBIb3dldmVyLCB0aGUgbmV4dCBgZGlzcGF0Y2goKWAgY2FsbCwgd2hldGhlciBuZXN0ZWQgb3Igbm90LCB3aWxsIHVzZSBhIG1vcmVcbiAgICogcmVjZW50IHNuYXBzaG90IG9mIHRoZSBzdWJzY3JpcHRpb24gbGlzdC5cbiAgICpcbiAgICogMi4gVGhlIGxpc3RlbmVyIHNob3VsZCBub3QgZXhwZWN0IHRvIHNlZSBhbGwgc3RhdGUgY2hhbmdlcywgYXMgdGhlIHN0YXRlXG4gICAqIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBhIG5lc3RlZCBgZGlzcGF0Y2goKWAgYmVmb3JlXG4gICAqIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQuIEl0IGlzLCBob3dldmVyLCBndWFyYW50ZWVkIHRoYXQgYWxsIHN1YnNjcmliZXJzXG4gICAqIHJlZ2lzdGVyZWQgYmVmb3JlIHRoZSBgZGlzcGF0Y2goKWAgc3RhcnRlZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBsYXRlc3RcbiAgICogc3RhdGUgYnkgdGhlIHRpbWUgaXQgZXhpdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBvbiBldmVyeSBkaXNwYXRjaC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBBIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGlzIGNoYW5nZSBsaXN0ZW5lci5cbiAgICovXG4gIGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdGhlIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG1heSBub3QgY2FsbCBzdG9yZS5zdWJzY3JpYmUoKSB3aGlsZSB0aGUgcmVkdWNlciBpcyBleGVjdXRpbmcuICcgKyAnSWYgeW91IHdvdWxkIGxpa2UgdG8gYmUgbm90aWZpZWQgYWZ0ZXIgdGhlIHN0b3JlIGhhcyBiZWVuIHVwZGF0ZWQsIHN1YnNjcmliZSBmcm9tIGEgJyArICdjb21wb25lbnQgYW5kIGludm9rZSBzdG9yZS5nZXRTdGF0ZSgpIGluIHRoZSBjYWxsYmFjayB0byBhY2Nlc3MgdGhlIGxhdGVzdCBzdGF0ZS4gJyArICdTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpLXJlZmVyZW5jZS9zdG9yZSNzdWJzY3JpYmUobGlzdGVuZXIpIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gICAgfVxuXG4gICAgdmFyIGlzU3Vic2NyaWJlZCA9IHRydWU7XG5cbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgbmV4dExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgIGlmICghaXNTdWJzY3JpYmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbWF5IG5vdCB1bnN1YnNjcmliZSBmcm9tIGEgc3RvcmUgbGlzdGVuZXIgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiAnICsgJ1NlZSBodHRwczovL3JlZHV4LmpzLm9yZy9hcGktcmVmZXJlbmNlL3N0b3JlI3N1YnNjcmliZShsaXN0ZW5lcikgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgICAgIH1cblxuICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG5cbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIHZhciBpbmRleCA9IG5leHRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBuZXh0TGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbi4gSXQgaXMgdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqXG4gICAqIFRoZSBgcmVkdWNlcmAgZnVuY3Rpb24sIHVzZWQgdG8gY3JlYXRlIHRoZSBzdG9yZSwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgZ2l2ZW4gYGFjdGlvbmAuIEl0cyByZXR1cm4gdmFsdWUgd2lsbFxuICAgKiBiZSBjb25zaWRlcmVkIHRoZSAqKm5leHQqKiBzdGF0ZSBvZiB0aGUgdHJlZSwgYW5kIHRoZSBjaGFuZ2UgbGlzdGVuZXJzXG4gICAqIHdpbGwgYmUgbm90aWZpZWQuXG4gICAqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgcGxhaW4gb2JqZWN0IGFjdGlvbnMuIElmIHlvdSB3YW50IHRvXG4gICAqIGRpc3BhdGNoIGEgUHJvbWlzZSwgYW4gT2JzZXJ2YWJsZSwgYSB0aHVuaywgb3Igc29tZXRoaW5nIGVsc2UsIHlvdSBuZWVkIHRvXG4gICAqIHdyYXAgeW91ciBzdG9yZSBjcmVhdGluZyBmdW5jdGlvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1pZGRsZXdhcmUuIEZvclxuICAgKiBleGFtcGxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UuIEV2ZW4gdGhlXG4gICAqIG1pZGRsZXdhcmUgd2lsbCBldmVudHVhbGx5IGRpc3BhdGNoIHBsYWluIG9iamVjdCBhY3Rpb25zIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIEEgcGxhaW4gb2JqZWN0IHJlcHJlc2VudGluZyDigJx3aGF0IGNoYW5nZWTigJ0uIEl0IGlzXG4gICAqIGEgZ29vZCBpZGVhIHRvIGtlZXAgYWN0aW9ucyBzZXJpYWxpemFibGUgc28geW91IGNhbiByZWNvcmQgYW5kIHJlcGxheSB1c2VyXG4gICAqIHNlc3Npb25zLCBvciB1c2UgdGhlIHRpbWUgdHJhdmVsbGluZyBgcmVkdXgtZGV2dG9vbHNgLiBBbiBhY3Rpb24gbXVzdCBoYXZlXG4gICAqIGEgYHR5cGVgIHByb3BlcnR5IHdoaWNoIG1heSBub3QgYmUgYHVuZGVmaW5lZGAuIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZVxuICAgKiBzdHJpbmcgY29uc3RhbnRzIGZvciBhY3Rpb24gdHlwZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEZvciBjb252ZW5pZW5jZSwgdGhlIHNhbWUgYWN0aW9uIG9iamVjdCB5b3UgZGlzcGF0Y2hlZC5cbiAgICpcbiAgICogTm90ZSB0aGF0LCBpZiB5b3UgdXNlIGEgY3VzdG9tIG1pZGRsZXdhcmUsIGl0IG1heSB3cmFwIGBkaXNwYXRjaCgpYCB0b1xuICAgKiByZXR1cm4gc29tZXRoaW5nIGVsc2UgKGZvciBleGFtcGxlLCBhIFByb21pc2UgeW91IGNhbiBhd2FpdCkuXG4gICAqL1xuICBmdW5jdGlvbiBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3QoYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gJyArICdVc2UgY3VzdG9tIG1pZGRsZXdhcmUgZm9yIGFzeW5jIGFjdGlvbnMuJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiAnICsgJ0hhdmUgeW91IG1pc3NwZWxsZWQgYSBjb25zdGFudD8nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VycyBtYXkgbm90IGRpc3BhdGNoIGFjdGlvbnMuJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSB0cnVlO1xuICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGxpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMgPSBuZXh0TGlzdGVuZXJzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV07XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIHJlZHVjZXIgY3VycmVudGx5IHVzZWQgYnkgdGhlIHN0b3JlIHRvIGNhbGN1bGF0ZSB0aGUgc3RhdGUuXG4gICAqXG4gICAqIFlvdSBtaWdodCBuZWVkIHRoaXMgaWYgeW91ciBhcHAgaW1wbGVtZW50cyBjb2RlIHNwbGl0dGluZyBhbmQgeW91IHdhbnQgdG9cbiAgICogbG9hZCBzb21lIG9mIHRoZSByZWR1Y2VycyBkeW5hbWljYWxseS4gWW91IG1pZ2h0IGFsc28gbmVlZCB0aGlzIGlmIHlvdVxuICAgKiBpbXBsZW1lbnQgYSBob3QgcmVsb2FkaW5nIG1lY2hhbmlzbSBmb3IgUmVkdXguXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHRSZWR1Y2VyIFRoZSByZWR1Y2VyIGZvciB0aGUgc3RvcmUgdG8gdXNlIGluc3RlYWQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVJlZHVjZXIobmV4dFJlZHVjZXIpIHtcbiAgICBpZiAodHlwZW9mIG5leHRSZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSBuZXh0UmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGN1cnJlbnRSZWR1Y2VyID0gbmV4dFJlZHVjZXI7XG4gICAgZGlzcGF0Y2goeyB0eXBlOiBBY3Rpb25UeXBlcy5SRVBMQUNFIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVyb3BlcmFiaWxpdHkgcG9pbnQgZm9yIG9ic2VydmFibGUvcmVhY3RpdmUgbGlicmFyaWVzLlxuICAgKiBAcmV0dXJucyB7b2JzZXJ2YWJsZX0gQSBtaW5pbWFsIG9ic2VydmFibGUgb2Ygc3RhdGUgY2hhbmdlcy5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgb2JzZXJ2YWJsZSBwcm9wb3NhbDpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JzZXJ2YWJsZVxuICAgKi9cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZSgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBvdXRlclN1YnNjcmliZSA9IHN1YnNjcmliZTtcbiAgICByZXR1cm4gX3JlZiA9IHtcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG1pbmltYWwgb2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24gbWV0aG9kLlxuICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVyIEFueSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBvYnNlcnZlci5cbiAgICAgICAqIFRoZSBvYnNlcnZlciBvYmplY3Qgc2hvdWxkIGhhdmUgYSBgbmV4dGAgbWV0aG9kLlxuICAgICAgICogQHJldHVybnMge3N1YnNjcmlwdGlvbn0gQW4gb2JqZWN0IHdpdGggYW4gYHVuc3Vic2NyaWJlYCBtZXRob2QgdGhhdCBjYW5cbiAgICAgICAqIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgZnJvbSB0aGUgc3RvcmUsIGFuZCBwcmV2ZW50IGZ1cnRoZXJcbiAgICAgICAqIGVtaXNzaW9uIG9mIHZhbHVlcyBmcm9tIHRoZSBvYnNlcnZhYmxlLlxuICAgICAgICovXG4gICAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgICAgICBpZiAoKHR5cGVvZiBvYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JzZXJ2ZXIpKSAhPT0gJ29iamVjdCcgfHwgb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCB0aGUgb2JzZXJ2ZXIgdG8gYmUgYW4gb2JqZWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gb2JzZXJ2ZVN0YXRlKCkge1xuICAgICAgICAgIGlmIChvYnNlcnZlci5uZXh0KSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KGdldFN0YXRlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVTdGF0ZSgpO1xuICAgICAgICB2YXIgdW5zdWJzY3JpYmUgPSBvdXRlclN1YnNjcmliZShvYnNlcnZlU3RhdGUpO1xuICAgICAgICByZXR1cm4geyB1bnN1YnNjcmliZTogdW5zdWJzY3JpYmUgfTtcbiAgICAgIH1cbiAgICB9LCBfcmVmW3Jlc3VsdF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBfcmVmO1xuICB9XG5cbiAgLy8gV2hlbiBhIHN0b3JlIGlzIGNyZWF0ZWQsIGFuIFwiSU5JVFwiIGFjdGlvbiBpcyBkaXNwYXRjaGVkIHNvIHRoYXQgZXZlcnlcbiAgLy8gcmVkdWNlciByZXR1cm5zIHRoZWlyIGluaXRpYWwgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gIC8vIHRoZSBpbml0aWFsIHN0YXRlIHRyZWUuXG4gIGRpc3BhdGNoKHsgdHlwZTogQWN0aW9uVHlwZXMuSU5JVCB9KTtcblxuICByZXR1cm4gX3JlZjIgPSB7XG4gICAgZGlzcGF0Y2g6IGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZTogc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlOiBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcjogcmVwbGFjZVJlZHVjZXJcbiAgfSwgX3JlZjJbcmVzdWx0XSA9IG9ic2VydmFibGUsIF9yZWYyO1xufVxuXG4vKipcbiAqIEBjbGFzcyBNb2R1bGVNYW5hZ2VyXG4gKiBAY2F0ZWdvcnkgY29yZVxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBoYW5kbGVyXG4gKiBAZGVzY3JpcHRpb24gIFNvbHZlcyBtb2R1bGVzIGRlcGVuZGVuY2llc1xuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cblxudmFyIE1vZHVsZU1hbmFnZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBNb2R1bGVNYW5hZ2VyKG9iamVjdCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1vZHVsZU1hbmFnZXIpO1xuXG4gICAgdGhpcy5oYW5kbGVyID0gb2JqZWN0O1xuICAgIHRoaXMuY3VycmVudE1vZHVsZSA9IG51bGw7XG4gICAgdGhpcy5zdG9yZSA9IGNyZWF0ZVN0b3JlKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW3t9LCAnJ107XG4gICAgICB2YXIgYWN0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgICBzdGF0ZVswXVthY3Rpb24ua2V5XSA9IGFjdGlvbi5kYXRhO1xuICAgICAgc3RhdGVbMV0gPSBhY3Rpb24ua2V5O1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH0pO1xuICAgIHRoaXMubW9kdWxlcyA9IHt9O1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGFjdGl2ZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgLmN1cnJlbnRNb2R1bGUgdG8gcHJvdmlkZWQgbW9kdWxlLlxuICAgKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlIHRoZSBtb2R1bGUgdG8gbWFrZSBjdXJyZW50XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoTW9kdWxlTWFuYWdlciwgW3tcbiAgICBrZXk6IFwiYWN0aXZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFjdGl2ZShtb2R1bGUpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vZHVsZSA9IG1vZHVsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCByZXNldFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXQncyAuY3VycmVudE1vZHVsZSB0byBudWxsLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZXNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgIHRoaXMuY3VycmVudE1vZHVsZSA9IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgZGVmaW5lXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIERlZmluZSB0aGUgbW9kdWxlIGluIG1hbmFnZXJcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbW9kdWxlIG5hbWVcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVmaW5lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlZmluZShuYW1lKSB7XG4gICAgICB0aGlzLm1vZHVsZXNbbmFtZV0gPSB0aGlzLmN1cnJlbnRNb2R1bGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgdXNlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIEdldCB0aGUgZGVmaW5lZCBtb2R1bGUgZnJvbSBtYW5hZ2VyXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG1vZHVsZSBuYW1lXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInVzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1c2UobmFtZSkge1xuICAgICAgcmV0dXJuIHRoaXMubW9kdWxlc1tuYW1lXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBzZXRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gQW4gYWxpYXMgZm9yIC5hZGQoKSA8YnIvPjxici8+XG4gICAgICogVXNlIHRoaXMgbWV0aG9kIGlmIHlvdSBrbm93IHRoYXQgeW91IHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIGRlcGVuZGVuY3kuPGJyLz5cbiAgICAgKiBVc2UgaXQgaW4geW91ciBhcHAsIGJ1dCBub3QgaW4gbW9kdWxlIHRoYXQgeW91IHByb3ZpZGUgdG8gb3RoZXIgcGVvcGxlLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIGtleSBvZiB0aGUgZGVwZW5kZW5jeVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIHRoZSB2YWx1ZSBvZiB0aGUgZGVwZW5kZW5jeVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0KGtleSwgZGF0YSkge1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6ICdBREQnLFxuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgZGF0YTogZGF0YVxuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgZ2V0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgZGVwZW5kZW5jeSBpbiBzdG9yZSBvYmplY3QsIGJ5IGtleS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBrZXkgb2YgdGhlIGRlcGVuZGVuY3lcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgICAqIEByZXR1cm4ge09iamVjdHxNb2R1bGV9XG4gICAgICogQHRocm93cyB7RGVwZW5kZW5jeUVycm9yfSBpZiBkZXBlbmRlbmN5IGlzIG5vdCBpbiB0aGUgc3RvcmVcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5HZXQgdGhlICdoZWxsbycgZGVwZW5kZW5jeTwvY2FwdGlvbj5cbiAgICAgKiBtYW5hZ2VyLmdldCgnaGVsbG8nKTsgLy8gLT4ge3dvcmxkOiB0cnVlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIGlmICghdGhpcy5zdG9yZS5nZXRTdGF0ZSgpWzBdW2tleV0pIHtcbiAgICAgICAgdGhyb3cgbmV3IERlcGVuZGVuY3lFcnJvcignTW9kdWxlTWFuYWdlcicsIFwiTW9kdWxlIHJlcXVpcmVzICdcIi5jb25jYXQoa2V5LCBcIicgZGVwZW5kZW5jeVwiKSwgdGhpcy5jdXJyZW50TW9kdWxlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKVswXVtrZXldO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGhhc1xuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHdoZXRoZXIgbWFuYWdlciBoYXMgYSBkZXBlbmRlbmN5IHdpdGggdGhlIGdpdmVuIGtleVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIGtleSBvZiB0aGUgZGVwZW5kZW5jeVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIHdoZW4gYWxsIHByb21pc2VzIGNvbXBsZXRlZC5cbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5DaGVjayB3aGV0aGVyIHRoZSBzdG9yZSBoYXMgdGhlICdoZWxsbycgZGVwZW5kZW5jeTwvY2FwdGlvbj5cbiAgICAgKiBtYW5hZ2VyLmhhcygnaGVsbG8nKTsgLy8gLT4gdHJ1ZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaGFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuc3RvcmUuZ2V0U3RhdGUoKVswXVtrZXldKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBkZXBzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtkZXBzTWFwPXt9XVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1cGRhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGRlcHNNYXAgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdGhpcy5zdG9yZS5zdWJzY3JpYmUoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMkc3RvcmUkZ2V0U3RhdGUgPSBfdGhpcy5zdG9yZS5nZXRTdGF0ZSgpLFxuICAgICAgICAgICAgX3RoaXMkc3RvcmUkZ2V0U3RhdGUyID0gc2xpY2VkVG9BcnJheShfdGhpcyRzdG9yZSRnZXRTdGF0ZSwgMiksXG4gICAgICAgICAgICBkYXRhID0gX3RoaXMkc3RvcmUkZ2V0U3RhdGUyWzBdLFxuICAgICAgICAgICAgY2hhbmdlZEtleSA9IF90aGlzJHN0b3JlJGdldFN0YXRlMlsxXTtcblxuICAgICAgICB2YXIgY2FsbGJhY2sgPSBkZXBzTWFwW2NoYW5nZWRLZXldO1xuICAgICAgICBpZiAoY2FsbGJhY2spIGNhbGxiYWNrKGRhdGFbY2hhbmdlZEtleV0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgYWRkXG4gICAgICogQGFsaWFzIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXIjc2V0XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGQoKSB7XG4gICAgICBjb25zb2xlLndhcm4oJy5hZGQoKSBtZXRob2QgaXMgZGVwcmVjYXRlZC4gVXNlIC5zZXQoKSBpbnN0ZWFkJyk7XG4gICAgICByZXR1cm4gdGhpcy5zZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCByZXF1aXJlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFJlcXVpcmUgbW9kdWxlXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgRGVmaW5lZCBuYW1lXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbW9kdWxlRXhlY3V0b3IgRnVuY3Rpb24gdGhhdCByZXR1cm5zIGFwcGxpZWQgbW9kdWxlXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlcXVpcmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVxdWlyZShuYW1lLCBtb2R1bGVFeGVjdXRvcikge1xuICAgICAgaWYgKHRoaXMudXNlKG5hbWUpID09PSB1bmRlZmluZWQpIHRoaXMuaGFuZGxlci5hcHBseU1vZHVsZShtb2R1bGVFeGVjdXRvcigpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTW9kdWxlTWFuYWdlcjtcbn0oKTtcblxuLyoqXG4gKiBAY2xhc3MgQ29tcG9uZW50XG4gKiBAY2F0ZWdvcnkgY29yZVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtpbnN0cnVjdGlvbnNdIC0gVGhlIGluc3RydWN0aW9ucyBvYmplY3QuXG4gKiBAZXh0ZW5kcyBNb2R1bGVTeXN0ZW1cbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZVxuICovXG5cbnZhciBDb21wb25lbnQgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9Nb2R1bGVTeXN0ZW0pIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuQ29tcG9uZW50I2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQge1xuICAgKiAgIG1vZHVsZXM6IFtdLFxuICAgKiAgIG1hbmFnZXI6IHRydWVcbiAgICogfVxuICAgKi9cblxuICAvKipcbiAgICogU3RhdGljIGluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkNvbXBvbmVudCNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCB7fVxuICAgKi9cblxuICAvKipcbiAgICogQXJyYXkgb2YgcHJvbWlzZXMgdGhhdCBzaG91bGQgYmUgcmVzb2x2ZWQgYmVmb3JlIENvbXBvbmVudCBpcyByZWFkeS5cbiAgICogQG1lbWJlciB7QXJyYXl9IG1vZHVsZTpjb3JlLkNvbXBvbmVudCNfd2FpdFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgLy8gQ29sbGVjdGlvbiBvZiBwcm9taXNlcztcblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBgbW9kdWxlc2AuXG4gICAqIEBtZW1iZXIge0FycmF5fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjbW9kdWxlc1xuICAgKiBAcHVibGljXG4gICAqL1xuICAvLyBDb2xsZWN0aW9uIG9mIG1vZHVsZXM7XG5cbiAgLyoqXG4gICAqIENvbGxlY3Rpb24gb2YgYGNoaWxkYCBDb21wb25lbnRzLlxuICAgKiBAbWVtYmVyIHtBcnJheX0gbW9kdWxlOmNvcmUuQ29tcG9uZW50I2NoaWxkcmVuXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIC8vIEZvciBrZWVwaW5nIGNoaWxkcmVuIGNvbXBvbmVudHM7XG4gIGZ1bmN0aW9uIENvbXBvbmVudCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICB2YXIgZGVmYXVsdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IENvbXBvbmVudC5kZWZhdWx0cztcbiAgICB2YXIgaW5zdHJ1Y3Rpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBDb21wb25lbnQuaW5zdHJ1Y3Rpb25zO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29tcG9uZW50KTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKENvbXBvbmVudCkuY2FsbCh0aGlzKSk7IC8vIEFwcGx5IHBvbHlmaWxsZWQgcGFyYW1ldGVycyB0byAucGFyYW1zO1xuXG4gICAgZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoYXNzZXJ0VGhpc0luaXRpYWxpemVkKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLCBcIl93YWl0XCIsIFtdKSwgXCJtb2R1bGVzXCIsIFtdKSwgXCJjaGlsZHJlblwiLCBbXSk7XG5cbiAgICBfdGhpcy5wYXJhbXMgPSBleHRlbmQodHJhbnNmb3JtRGF0YShwYXJhbXMsIGluc3RydWN0aW9ucyksIGRlZmF1bHRzKTtcbiAgICBpZiAoX3RoaXMucGFyYW1zLm1hbmFnZXIpIF90aGlzLm1hbmFnZXIgPSBuZXcgTW9kdWxlTWFuYWdlcihhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkpO1xuICAgIF90aGlzLm1vZHVsZXMgPSBfdGhpcy5wYXJhbXMubW9kdWxlcztcblxuICAgIF90aGlzLmludGVncmF0ZU1vZHVsZXMoKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCB3YWl0XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gV2FpdCBmb3IgYSBwcm9taXNlLlxuICAgKiBAcGFyYW0ge1Byb21pc2V9IFtwcm9taXNlXSAtIFRoZSBwcm9taXNlIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIGEgcXVldWUuXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIGFsbCBwcm9taXNlcyBjb21wbGV0ZWQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhDb21wb25lbnQsIFt7XG4gICAga2V5OiBcIndhaXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd2FpdChwcm9taXNlKSB7XG4gICAgICBpZiAocHJvbWlzZSkgdGhpcy5fd2FpdC5wdXNoKHByb21pc2UpO1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXMuX3dhaXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGRlZmVyXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGUgYGZ1bmNgIChDYWxsYmFjaykgd2hlbiBDb21wb25lbnQgaXMgcmVhZHkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyAtIENhbGxiYWNrLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRlZmVyKGZ1bmMpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5pc0RlZmZlcmVkKSB0aGlzLndhaXQoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMoX3RoaXMyKTtcbiAgICAgIH0pO2Vsc2UgZnVuYyh0aGlzKTtcbiAgICB9IC8vIFBBUkFNRVRFUlNcblxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgdXBkYXRlUGFyYW1zXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgcGFyYW1ldGVycyBvZiB0aGUgQ29tcG9uZW50LlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUGFyYW1zIG9mIHRoaXMgQ29tcG9uZW50XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlUGFyYW1zXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZVBhcmFtcygpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdGhpcy5wYXJhbXMgPSBleHRlbmQocGFyYW1zLCB0aGlzLnBhcmFtcyk7XG4gICAgICByZXR1cm4gdGhpcy5wYXJhbXM7XG4gICAgfSAvLyBDT1BZSU5HICYgQ0xPTklOR1xuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBjbG9uZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBDbG9uZSB0aGlzIGNvbXBvbmVudFxuICAgICAqIEByZXR1cm4ge29iamVjdH0gYSBjbG9uZWQgY29tcG9uZW50IHdpdGggYWxsIGl0cyBzb3VyY2UgY29tcG9uZW50JyBwYXJhbXMgY29waWVkLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNsb25lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsb25lKCkge1xuICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMucGFyYW1zKS5jb3B5KHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGNvcHlcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29weSBzb3VyY2UgbmF0aXZlIGFuZCBpbnRlZ3JhdGUgYG1vZHVsZXNgIHRvIGl0LlxuICAgICAqIEBwYXJhbSB7Q29tcG9uZW50fSBzb3VyY2UgLSBTb3VyY2UgY29tcG9uZW50IHRoYXQgaXMgdXNlZCBmb3IgYGNvcHkoKWAgYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVdIC0gQ2FsbGJhY2sgZXhlY3V0ZWQgYmVmb3JlIG1vZHVsZXMgaW50ZWdyYXRpb24gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBDb21wb25lbnRcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjb3B5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvcHkoc291cmNlLCBjdXN0b21pemUpIHtcbiAgICAgIHRoaXMucGFyYW1zID0gb2JqZWN0U3ByZWFkKHt9LCBzb3VyY2UucGFyYW1zKTtcbiAgICAgIGlmIChzb3VyY2UubmF0aXZlKSB0aGlzLm5hdGl2ZSA9IHNvdXJjZS5uYXRpdmUuY2xvbmUoc291cmNlLnBhcmFtcyk7XG4gICAgICBpZiAoY3VzdG9taXplKSBjdXN0b21pemUoKTtcbiAgICAgIHRoaXMuaW50ZWdyYXRlTW9kdWxlcyhzb3VyY2UpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgYWRkXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZCBhIGNoaWxkIGBDb21wb25lbnRgLlxuICAgICAqIEBwYXJhbSB7Q29tcG9uZW50fSBvYmplY3QgLSBDb21wb25lbnQgdGhhdCBzaG91bGQgYmUgYWRkZWQgYXMgYSBgY2hpbGRgLlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IFJlc29sdmVkIHdoZW4gYWN0aW9uIGlzIGRvbmUuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfYWRkID0gYXN5bmNUb0dlbmVyYXRvcihcbiAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgIHJlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZShvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QucGFyZW50LnJlbW92ZShvYmplY3QpO1xuXG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53YWl0KCk7XG5cbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Qud2FpdCgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICBpZiAob2JqZWN0Lm5hdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvciQxKCdDb21wb25lbnQnLCAndGhlcmUgaXMgbm8gb2JqZWN0Lm5hdGl2ZScsIHRoaXMpO1xuXG4gICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICBvYmplY3QucGFyZW50ID0gdGhpcztcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICAgICAgICAgICAgb25BZGQ6IG9iamVjdFxuICAgICAgICAgICAgICAgIH0pLm9uQWRkO1xuXG4gICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmUuYWRkKG9iamVjdC5uYXRpdmUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChvYmplY3QpO1xuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgb2JqZWN0KTtcblxuICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gYWRkKF94KSB7XG4gICAgICAgIHJldHVybiBfYWRkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH0oKVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgcmVtb3ZlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFJlbW92ZSBhIGNoaWxkIGBDb21wb25lbnRgLlxuICAgICAqIEBwYXJhbSB7Q29tcG9uZW50fSBvYmplY3QgLSBDb21wb25lbnQgdGhhdCBzaG91bGQgYmUgYSAqKmNoaWxkKiogb2YgdGhpcyBDb21wb25lbnQuXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZWQgd2hlbiBhY3Rpb24gaXMgZG9uZS5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIF9yZW1vdmUgPSBhc3luY1RvR2VuZXJhdG9yKFxuICAgICAgLyojX19QVVJFX18qL1xuICAgICAgcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGlmICghKG9iamVjdC5wYXJlbnQgIT09IHRoaXMpKSB7XG4gICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDI7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLmFicnVwdChcInJldHVyblwiKTtcblxuICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0O1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndhaXQoKTtcblxuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA2O1xuICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Qud2FpdCgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICBvYmplY3QucGFyZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZS5yZW1vdmUob2JqZWN0Lm5hdGl2ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5zcGxpY2UodGhpcy5jaGlsZHJlbi5pbmRleE9mKG9iamVjdCksIDEpO1xuXG4gICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgX2NhbGxlZTIsIHRoaXMpO1xuICAgICAgfSkpO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24gcmVtb3ZlKF94Mikge1xuICAgICAgICByZXR1cm4gX3JlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KClcbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGFkZFRvXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZHMgYHRoaXNgIENvbXBvbmVudCB0byBzcGVjaWZpZWQgYEFwcGAvYENvbXBvbmVudGAuXG4gICAgICogQHBhcmFtIHtDb21wb25lbnR9IG9iamVjdCAtIENvbXBvbmVudCB0aGF0IHdpbGwgYmUgYSBwYXJlbnQgb2YgYHRoaXNgLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFkZFRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFRvKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdC5hZGQodGhpcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmdldChrZXkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ1c2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXNlKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci51c2Uoa2V5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBvYmplY3QgaXMgYGFzeW5jYCAoYHdhaXRgIHByb21pc2VzIGFyZSBtb3JlIHRoYW4gYDBgKS5cbiAgICAgKiBAbWVtYmVyIHtCb29sZWFufSBtb2R1bGU6Y29yZS5Db21wb25lbnQjaXNEZWZmZXJlZFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaXNEZWZmZXJlZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dhaXQubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYE1vZHVsZU1hbmFnZXJgIHVzZWQgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgICAqIEBtZW1iZXIge01vZHVsZU1hbmFnZXJ9IG1vZHVsZTpjb3JlLkNvbXBvbmVudCNtYW5hZ2VyXG4gICAgICogQHRocm93cyB7TWFuYWdlckVycm9yfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwibWFuYWdlclwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgaWYgKHRoaXMuX21hbmFnZXIpIHJldHVybiB0aGlzLl9tYW5hZ2VyO1xuICAgICAgdGhyb3cgbmV3IE1hbmFnZXJFcnJvcignQ29tcG9uZW50JywgXCJNb2R1bGVNYW5hZ2VyIGlzIG5vdCB1c2VkIGluIHRoaXMgY29tcG9uZW50LiAnbWFuYWdlcicgcGFyYW1ldGVyIHNob3VsZCBiZSBzZXQgYXMgJ3RydWUnXCIsIHRoaXMpO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQobWFuYWdlcikge1xuICAgICAgdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBuYXRpdmVgIG9iamVjdCB1c2VkIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkNvbXBvbmVudCNuYXRpdmVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm5hdGl2ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX25hdGl2ZTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KG1lc2gpIHtcbiAgICAgIHRoaXMuX25hdGl2ZSA9IG1lc2g7XG4gICAgICB0aGlzLl9uYXRpdmUuY29tcG9uZW50ID0gdGhpcztcbiAgICAgIHJldHVybiB0aGlzLl9uYXRpdmU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQ29tcG9uZW50LCBfTW9kdWxlU3lzdGVtKTtcblxuICByZXR1cm4gQ29tcG9uZW50O1xufShNb2R1bGVTeXN0ZW0pO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoQ29tcG9uZW50LCBcImRlZmF1bHRzXCIsIHtcbiAgbW9kdWxlczogbnVsbCxcbiAgbWFuYWdlcjogdHJ1ZVxufSksIFwiaW5zdHJ1Y3Rpb25zXCIsIHt9KTtcblxuLy8gMjYuMS42IFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgWywgcmVjZWl2ZXJdKVxuXG5cblxuXG5cblxuXG5mdW5jdGlvbiBnZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSAvKiAsIHJlY2VpdmVyICovKSB7XG4gIHZhciByZWNlaXZlciA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdGFyZ2V0IDogYXJndW1lbnRzWzJdO1xuICB2YXIgZGVzYywgcHJvdG87XG4gIGlmIChfYW5PYmplY3QodGFyZ2V0KSA9PT0gcmVjZWl2ZXIpIHJldHVybiB0YXJnZXRbcHJvcGVydHlLZXldO1xuICBpZiAoZGVzYyA9IF9vYmplY3RHb3BkLmYodGFyZ2V0LCBwcm9wZXJ0eUtleSkpIHJldHVybiBfaGFzKGRlc2MsICd2YWx1ZScpXG4gICAgPyBkZXNjLnZhbHVlXG4gICAgOiBkZXNjLmdldCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGRlc2MuZ2V0LmNhbGwocmVjZWl2ZXIpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgaWYgKF9pc09iamVjdChwcm90byA9IF9vYmplY3RHcG8odGFyZ2V0KSkpIHJldHVybiBnZXQocHJvdG8sIHByb3BlcnR5S2V5LCByZWNlaXZlcik7XG59XG5cbl9leHBvcnQoX2V4cG9ydC5TLCAnUmVmbGVjdCcsIHsgZ2V0OiBnZXQgfSk7XG5cbnZhciBnZXQkMSA9IF9jb3JlLlJlZmxlY3QuZ2V0O1xuXG52YXIgZ2V0JDIgPSBnZXQkMTtcblxuZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkge1xuICB3aGlsZSAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSkge1xuICAgIG9iamVjdCA9IGdldFByb3RvdHlwZU9mJDIob2JqZWN0KTtcbiAgICBpZiAob2JqZWN0ID09PSBudWxsKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBvYmplY3Q7XG59XG5cbnZhciBzdXBlclByb3BCYXNlID0gX3N1cGVyUHJvcEJhc2U7XG5cbnZhciBnZXQkMyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbmZ1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmIGdldCQyKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfZ2V0ID0gZ2V0JDI7XG4gIH0gZWxzZSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBfZ2V0ID0gZnVuY3Rpb24gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikge1xuICAgICAgdmFyIGJhc2UgPSBzdXBlclByb3BCYXNlKHRhcmdldCwgcHJvcGVydHkpO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm47XG5cbiAgICAgIHZhciBkZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDEoYmFzZSwgcHJvcGVydHkpO1xuXG4gICAgICBpZiAoZGVzYy5nZXQpIHtcbiAgICAgICAgcmV0dXJuIGRlc2MuZ2V0LmNhbGwocmVjZWl2ZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVzYy52YWx1ZTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIgfHwgdGFyZ2V0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfZ2V0O1xufSk7XG5cbmZ1bmN0aW9uIGF0dHJpYnV0ZXMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBtYXBwZXJzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIG1hcHBlcnNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG1hcHBlciA9IG1hcHBlcnNbaV07XG5cbiAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbWFwcGVyLm1hcC5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIgYXR0cmlidXRlID0gbWFwcGVyLm1hcFtrXTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldC5wcm90b3R5cGUsIGF0dHJpYnV0ZSwge1xuICAgICAgICAgIGdldDogbWFwcGVyLmdldHRlcihhdHRyaWJ1dGUpLFxuICAgICAgICAgIHNldDogbWFwcGVyLnNldHRlcihhdHRyaWJ1dGUpLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogbWFwcGVyLmNvbmZpZ3VyYWJsZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBtYXBwZXIuZW51bWVyYWJsZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBjb3B5KCkge1xuICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1hcCA9IG5ldyBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgIG1hcFtfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtYXA6IG1hcCxcbiAgICBnZXR0ZXI6IGZ1bmN0aW9uIGdldHRlcihuYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVbbmFtZV07XG4gICAgICB9O1xuICAgIH0sXG4gICAgc2V0dGVyOiBmdW5jdGlvbiBzZXR0ZXIobmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLm5hdGl2ZVtuYW1lXS5jb3B5KHZhbHVlKTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZVxuICB9O1xufVxuZnVuY3Rpb24gbWlycm9yKCkge1xuICBmb3IgKHZhciBfbGVuMyA9IGFyZ3VtZW50cy5sZW5ndGgsIG1hcCA9IG5ldyBBcnJheShfbGVuMyksIF9rZXkzID0gMDsgX2tleTMgPCBfbGVuMzsgX2tleTMrKykge1xuICAgIG1hcFtfa2V5M10gPSBhcmd1bWVudHNbX2tleTNdO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtYXA6IG1hcCxcbiAgICBnZXR0ZXI6IGZ1bmN0aW9uIGdldHRlcihuYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVbbmFtZV07XG4gICAgICB9O1xuICAgIH0sXG4gICAgc2V0dGVyOiBmdW5jdGlvbiBzZXR0ZXIobmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLm5hdGl2ZVtuYW1lXSA9IHZhbHVlO1xuICAgICAgfTtcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlXG4gIH07XG59XG5cbnZhciBfZGVjLCBfY2xhc3M7XG52YXIgXG4vKipcbiAqIEBjbGFzcyBNZXNoQ29tcG9uZW50XG4gKiBAY2F0ZWdvcnkgY29yZVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtpbnN0cnVjdGlvbnNdIC0gVGhlIGluc3RydWN0aW9ucyBvYmplY3QuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZVxuICovXG5NZXNoQ29tcG9uZW50ID0gKF9kZWMgPSBhdHRyaWJ1dGVzKGNvcHkoJ3Bvc2l0aW9uJywgJ3JvdGF0aW9uJywgJ3F1YXRlcm5pb24nLCAnc2NhbGUnKSwgbWlycm9yKCdtYXRlcmlhbCcsICdnZW9tZXRyeScpKSwgX2RlYyhfY2xhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgY3JlYXRlQ2xhc3MoTWVzaENvbXBvbmVudCwgbnVsbCwgW3tcbiAgICBrZXk6IFwiY3VzdG9tXCIsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudCNkZWZhdWx0c1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAZGVmYXVsdFxuICAgICAqIHtcbiAgICAgKiAgIGJ1aWxkOiB0cnVlLFxuICAgICAqICAgZ2VvbWV0cnk6IHt9LFxuICAgICAqICAgbWF0ZXJpYWw6IGZhbHNlLFxuICAgICAqXG4gICAgICogICBzaGFkb3c6IHtcbiAgICAgKiAgICAgY2FzdDogdHJ1ZSxcbiAgICAgKiAgICAgcmVjZWl2ZTogdHJ1ZVxuICAgICAqICAgfSxcbiAgICAgKlxuICAgICAqICAgcG9zaXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfSxcbiAgICAgKiAgIHJvdGF0aW9uOiB7eDogMCwgeTogMCwgejogMH0sXG4gICAgICogICBzY2FsZToge3g6IDEsIHk6IDEsIHo6IDF9XG4gICAgICogfVxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogU3RhdGljIGluc3RydWN0aW9uc1xuICAgICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudCNpbnN0cnVjdGlvbnNcbiAgICAgKiBAc3RhdGljXG4gICAgICogQGRlZmF1bHRcbiAgICAgKiB7XG4gICAgICogICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgICAqICAgcm90YXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgICAgKiAgIHNjYWxlOiBbJ3gnLCAneScsICd6J11cbiAgICAgKiB9XG4gICAgICovXG4gICAgLy8gQ1VTVE9NIEdFT01FVFJZIEhBTkRMSU5HXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGN1c3RvbShnZW9tKSB7XG4gICAgICB2YXIgY29uc3RydWN0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IE1lc2g7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAvKiNfX1BVUkVfXyovXG4gICAgICAgIGZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAgICAgICAgIGZ1bmN0aW9uIF9jbGFzczIoKSB7XG4gICAgICAgICAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBfY2xhc3MyKTtcblxuICAgICAgICAgICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihfY2xhc3MyKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjcmVhdGVDbGFzcyhfY2xhc3MyLCBbe1xuICAgICAgICAgICAga2V5OiBcImJ1aWxkXCIsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICAgICAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICAgICAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICAgICAgICAgIGdlb21ldHJ5OiBnZW9tLFxuICAgICAgICAgICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgICAgICAgbWVzaDogbmV3IGNvbnN0cnVjdG9yKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgICAgICAgICAgfSkubWVzaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XSk7XG5cbiAgICAgICAgICBpbmhlcml0cyhfY2xhc3MyLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgICAgICAgICByZXR1cm4gX2NsYXNzMjtcbiAgICAgICAgfShNZXNoQ29tcG9uZW50KVxuICAgICAgKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiY3JlYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZShnZW9tLCBwYXJhbXMsIGNvbnN0cnVjdG9yKSB7XG4gICAgICByZXR1cm4gbmV3IChNZXNoQ29tcG9uZW50LmN1c3RvbShnZW9tLCBjb25zdHJ1Y3RvcikpKHBhcmFtcyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImZyb21cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbShtZXNoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIHBhcmFtcy5idWlsZCA9IGZhbHNlO1xuICAgICAgdmFyIGNvbXBvbmVudCA9IG5ldyBNZXNoQ29tcG9uZW50KHBhcmFtcyk7XG4gICAgICBjb21wb25lbnQubmF0aXZlID0gbWVzaDtcbiAgICAgIGNvbXBvbmVudC53cmFwKCk7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIE1lc2hDb21wb25lbnQocGFyYW1zKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIGRlZmF1bHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBNZXNoQ29tcG9uZW50LmRlZmF1bHRzO1xuICAgIHZhciBpbnN0cnVjdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTWVzaENvbXBvbmVudCk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihNZXNoQ29tcG9uZW50KS5jYWxsKHRoaXMsIHBhcmFtcywgZGVmYXVsdHMsIGluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKF90aGlzLnBhcmFtcy5idWlsZCkge1xuICAgICAgdmFyIGJ1aWxkID0gX3RoaXMuYnVpbGQoX3RoaXMucGFyYW1zKTtcblxuICAgICAgaWYgKCFidWlsZCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvciQxKCdNZXNoQ29tcG9uZW50JywgJy5idWlsZCgpIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgVEhSRUUuT2JqZWN0M0Qgb3IgYSBQcm9taXNlIHJlc29sdmVkIHdpdGggVEhSRUUuT2JqZWN0M0QuJywgYXNzZXJ0VGhpc0luaXRpYWxpemVkKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJ1aWxkIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBfdGhpcy53YWl0KGJ1aWxkKTtcblxuICAgICAgICBfdGhpcy53YWl0KG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgYnVpbGQudGhlbihmdW5jdGlvbiAobmF0aXZlKSB7XG4gICAgICAgICAgICBfdGhpcy5uYXRpdmUgPSBuYXRpdmU7XG5cbiAgICAgICAgICAgIF90aGlzLndyYXAoKS50aGVuKHJlc29sdmUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5uYXRpdmUgPSBidWlsZDtcblxuICAgICAgICBfdGhpcy53YWl0KF90aGlzLndyYXAoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3RoaXMuYXBwbHlDb21tYW5kKCdwb3N0SW50ZWdyYXRlJyk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH0gLy8gQlVJTERJTkcgJiBXUkFQUElOR1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaXZlY3ljbGUgc2hvdWxkIHJldHVybiBhIG5hdGl2ZSBvYmplY3QuXG4gICAqIEB0aHJvd3Mge0NvbXBvc2l0aW9uRXJyb3J9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoTWVzaENvbXBvbmVudCwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvciQxKCdNZXNoQ29tcG9uZW50JywgJ0luc3RhbmNlIHNob3VsZCBoYXZlIGl0XFwncyBvd24gLmJ1aWxkKCkuJywgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgd3JhcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBXcmFwcyB0cmFuc2Zvcm1zIChgcG9zaXRpb25gICYgYHJvdGF0aW9uYClcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBjb21wbGV0ZWRcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid3JhcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB3cmFwKCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAvLyBUT0RPOiBGaXggZGVmZXIgd2l0aCBwaHlzaWNzXG4gICAgICAgIC8vIHRoaXMuZGVmZXIoKCkgPT4ge1xuICAgICAgICB2YXIgX3RoaXMyJHBhcmFtcyA9IF90aGlzMi5wYXJhbXMsXG4gICAgICAgICAgICBwb3NpdGlvbiA9IF90aGlzMiRwYXJhbXMucG9zaXRpb24sXG4gICAgICAgICAgICByb3RhdGlvbiA9IF90aGlzMiRwYXJhbXMucm90YXRpb24sXG4gICAgICAgICAgICBzY2FsZSA9IF90aGlzMiRwYXJhbXMuc2NhbGUsXG4gICAgICAgICAgICBzaGFkb3cgPSBfdGhpczIkcGFyYW1zLnNoYWRvdztcblxuICAgICAgICBfdGhpczIucG9zaXRpb24uc2V0KHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopO1xuXG4gICAgICAgIF90aGlzMi5yb3RhdGlvbi5zZXQocm90YXRpb24ueCwgcm90YXRpb24ueSwgcm90YXRpb24ueik7XG5cbiAgICAgICAgX3RoaXMyLnNjYWxlLnNldChzY2FsZS54LCBzY2FsZS55LCBzY2FsZS56KTtcblxuICAgICAgICBfdGhpczIubmF0aXZlLmNhc3RTaGFkb3cgPSBzaGFkb3cuY2FzdDtcbiAgICAgICAgX3RoaXMyLm5hdGl2ZS5yZWNlaXZlU2hhZG93ID0gc2hhZG93LnJlY2VpdmU7XG5cbiAgICAgICAgX3RoaXMyLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgICBvbldyYXA6IDFcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzb2x2ZShfdGhpczIpOyAvLyB9KTtcbiAgICAgIH0pO1xuICAgIH0gLy8gQ09QWUlORyAmIENMT05JTkdcblxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgY29weVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBDb3B5IHNvdXJjZSB0cmFuc2Zvcm1zICYgZXhlY3V0ZSBgQ29tcG9uZW50LmNvcHkoKWBcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBNZXNoQ29tcG9uZW50XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNvcHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weSQkMShzb3VyY2UpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihNZXNoQ29tcG9uZW50LnByb3RvdHlwZSksIFwiY29weVwiLCB0aGlzKS5jYWxsKHRoaXMsIHNvdXJjZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczMucG9zaXRpb24uY29weShzb3VyY2UucG9zaXRpb24pO1xuXG4gICAgICAgIF90aGlzMy5yb3RhdGlvbi5jb3B5KHNvdXJjZS5yb3RhdGlvbik7XG5cbiAgICAgICAgX3RoaXMzLnF1YXRlcm5pb24uY29weShzb3VyY2UucXVhdGVybmlvbik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBjbG9uZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBNYWtlIGEgY2xvbmUgb2YgdGhpcyBNZXNoQ29tcG9uZW50IHVzaW5nIGAuY29weSgpYFxuICAgICAqIEByZXR1cm4ge01lc2hDb21wb25lbnR9IGNsb25lIG9mIHRoaXMgb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNsb25lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsb25lKGdlb21ldHJ5LCBtYXRlcmlhbCkge1xuICAgICAgdmFyIGRlc3QgPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7XG4gICAgICAgIGJ1aWxkOiBmYWxzZVxuICAgICAgfSkuY29weSh0aGlzKTtcbiAgICAgIGlmIChnZW9tZXRyeSkgZGVzdC5nZW9tZXRyeSA9IGRlc3QuZ2VvbWV0cnkuY2xvbmUoKTtcbiAgICAgIGlmIChtYXRlcmlhbCkgZGVzdC5tYXRlcmlhbCA9IGRlc3QubWF0ZXJpYWwuY2xvbmUoKTtcbiAgICAgIHJldHVybiBkZXN0O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKE1lc2hDb21wb25lbnQsIF9Db21wb25lbnQpO1xuXG4gIHJldHVybiBNZXNoQ29tcG9uZW50O1xufShDb21wb25lbnQpKSB8fCBfY2xhc3MpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoTWVzaENvbXBvbmVudCwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIENvbXBvbmVudC5kZWZhdWx0cywge1xuICBidWlsZDogdHJ1ZSxcbiAgZ2VvbWV0cnk6IHt9LFxuICBtYXRlcmlhbDogZmFsc2UsXG4gIHNoYWRvdzoge1xuICAgIGNhc3Q6IHRydWUsXG4gICAgcmVjZWl2ZTogdHJ1ZVxuICB9LFxuICBwb3NpdGlvbjoge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB6OiAwXG4gIH0sXG4gIHJvdGF0aW9uOiB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHo6IDBcbiAgfSxcbiAgc2NhbGU6IHtcbiAgICB4OiAxLFxuICAgIHk6IDEsXG4gICAgejogMVxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIHtcbiAgcG9zaXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgcm90YXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgc2NhbGU6IFsneCcsICd5JywgJ3onXVxufSk7XG5cbnZhciBfZGVjJDEsIF9jbGFzcyQxO1xudmFyIFxuLyoqXG4gKiBAY2xhc3MgTGlnaHRDb21wb25lbnRcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW2luc3RydWN0aW9uc10gLSBUaGUgaW5zdHJ1Y3Rpb25zIG9iamVjdC5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cbkxpZ2h0Q29tcG9uZW50ID0gKF9kZWMkMSA9IGF0dHJpYnV0ZXMoY29weSgncG9zaXRpb24nLCAncm90YXRpb24nLCAncXVhdGVybmlvbicsICd0YXJnZXQnKSksIF9kZWMkMShfY2xhc3MkMSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBjcmVhdGVDbGFzcyhMaWdodENvbXBvbmVudCwgbnVsbCwgW3tcbiAgICBrZXk6IFwiZnJvbVwiLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50I2RlZmF1bHRzXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBkZWZhdWx0XG4gICAgICoge1xuICAgICAqICAgYnVpbGQ6IHRydWUsXG4gICAgICpcbiAgICAgKiAgIHNoYWRvdzoge1xuICAgICAqICAgICBjYXN0OiB0cnVlLFxuICAgICAqXG4gICAgICogICAgIGJpYXM6IDAsXG4gICAgICogICAgIHJhZGl1czogMSxcbiAgICAgKlxuICAgICAqICAgICBtYXBTaXplOiB7XG4gICAgICogICAgICAgd2lkdGg6IDEwMjQsXG4gICAgICogICAgICAgaGVpZ2h0OiAxMDI0XG4gICAgICogICAgIH0sXG4gICAgICpcbiAgICAgKiAgICAgY2FtZXJhOiB7XG4gICAgICogICAgICAgbmVhcjogdHJ1ZSxcbiAgICAgKiAgICAgICBmYXI6IDQwMCxcbiAgICAgKiAgICAgICBmb3Y6IDkwLFxuICAgICAqXG4gICAgICogICAgICAgdG9wOiAyMDAsXG4gICAgICogICAgICAgYm90dG9tOiAtMjAwLFxuICAgICAqICAgICAgIGxlZnQ6IC0yMDAsXG4gICAgICogICAgICAgcmlnaHQ6IDIwMFxuICAgICAqICAgICB9XG4gICAgICogICB9LFxuICAgICAqXG4gICAgICogICBwb3NpdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9LFxuICAgICAqICAgcm90YXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfVxuICAgICAqIH1cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFN0YXRpYyBpbnN0cnVjdGlvbnNcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50I2luc3RydWN0aW9uc1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAZGVmYXVsdFxuICAgICAqIHtcbiAgICAgKiAgIHBvc2l0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gICAgICogICByb3RhdGlvbjogWyd4JywgJ3knLCAneiddXG4gICAgICogfVxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tKGxpZ2h0KSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIHZhciB3cmFwU2hhZG93ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuICAgICAgcGFyYW1zLmJ1aWxkID0gZmFsc2U7XG4gICAgICB2YXIgY29tcG9uZW50ID0gbmV3IExpZ2h0Q29tcG9uZW50KHBhcmFtcyk7XG4gICAgICBjb21wb25lbnQubmF0aXZlID0gbGlnaHQ7XG4gICAgICBjb21wb25lbnQud3JhcCgpO1xuICAgICAgaWYgKHdyYXBTaGFkb3cpIGNvbXBvbmVudC53cmFwU2hhZG93KCk7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIExpZ2h0Q29tcG9uZW50KHBhcmFtcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBkZWZhdWx0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogTGlnaHRDb21wb25lbnQuZGVmYXVsdHM7XG4gICAgdmFyIGluc3RydWN0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogTGlnaHRDb21wb25lbnQuaW5zdHJ1Y3Rpb25zO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTGlnaHRDb21wb25lbnQpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoTGlnaHRDb21wb25lbnQpLmNhbGwodGhpcywgcGFyYW1zLCBkZWZhdWx0cywgaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAoX3RoaXMucGFyYW1zLmJ1aWxkKSB7XG4gICAgICB2YXIgYnVpbGQgPSBfdGhpcy5idWlsZChfdGhpcy5wYXJhbXMpO1xuXG4gICAgICBpZiAoIWJ1aWxkKSB7XG4gICAgICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yJDEoJ0xpZ2h0Q29tcG9uZW50JywgJy5idWlsZCgpIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgVEhSRUUuT2JqZWN0M0Qgb3IgYSBQcm9taXNlIHJlc29sdmVkIHdpdGggVEhSRUUuT2JqZWN0M0QuJywgYXNzZXJ0VGhpc0luaXRpYWxpemVkKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJ1aWxkIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBidWlsZC50aGVuKGZ1bmN0aW9uIChuYXRpdmUpIHtcbiAgICAgICAgICBfdGhpcy5uYXRpdmUgPSBuYXRpdmU7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIF90aGlzLm5hdGl2ZSA9IGJ1aWxkO1xuXG4gICAgICBfdGhpcy53YWl0KF90aGlzLndyYXAoKSk7XG4gICAgfVxuXG4gICAgX3RoaXMuYXBwbHlDb21tYW5kKCdwb3N0SW50ZWdyYXRlJyk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH0gLy8gQlVJTERJTkcgJiBXUkFQUElOR1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGl2ZWN5Y2xlIHNob3VsZCByZXR1cm4gYSBuYXRpdmUgb2JqZWN0LlxuICAgKiBAdGhyb3dzIHtDb21wb3NpdGlvbkVycm9yfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhMaWdodENvbXBvbmVudCwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvciQxKCdNZXNoQ29tcG9uZW50JywgJ0luc3RhbmNlIHNob3VsZCBoYXZlIGl0XFwncyBvd24gLmJ1aWxkKCkuJywgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgd3JhcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBXcmFwcyB0cmFuc2Zvcm1zIChgcG9zaXRpb25gICYgYHJvdGF0aW9uYClcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBjb21wbGV0ZWRcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIndyYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd3JhcCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgX3RoaXMyLmRlZmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgX3RoaXMyJHBhcmFtcyA9IF90aGlzMi5wYXJhbXMsXG4gICAgICAgICAgICAgIHBvc2l0aW9uID0gX3RoaXMyJHBhcmFtcy5wb3NpdGlvbixcbiAgICAgICAgICAgICAgcm90YXRpb24gPSBfdGhpczIkcGFyYW1zLnJvdGF0aW9uO1xuXG4gICAgICAgICAgX3RoaXMyLnBvc2l0aW9uLnNldChwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KTtcblxuICAgICAgICAgIF90aGlzMi5yb3RhdGlvbi5zZXQocm90YXRpb24ueCwgcm90YXRpb24ueSwgcm90YXRpb24ueik7XG5cbiAgICAgICAgICBfdGhpczIuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICAgICAgb25XcmFwOiAxXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXNvbHZlKF90aGlzMik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgd3JhcFNoYWRvd1xuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBXcmFwcyBzaGFkb3cgcHJvcGVydGllc1xuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5MaWdodENvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwid3JhcFNoYWRvd1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB3cmFwU2hhZG93KCkge1xuICAgICAgdmFyIG5hdGl2ZSA9IHRoaXMubmF0aXZlLFxuICAgICAgICAgIHNoYWRvdyA9IHRoaXMucGFyYW1zLnNoYWRvdztcbiAgICAgIG5hdGl2ZS5jYXN0U2hhZG93ID0gc2hhZG93LmNhc3Q7XG4gICAgICBuYXRpdmUuc2hhZG93Lm1hcFNpemUud2lkdGggPSBzaGFkb3cubWFwU2l6ZS53aWR0aDtcbiAgICAgIG5hdGl2ZS5zaGFkb3cubWFwU2l6ZS5oZWlnaHQgPSBzaGFkb3cubWFwU2l6ZS5oZWlnaHQ7XG4gICAgICBuYXRpdmUuc2hhZG93LmJpYXMgPSBzaGFkb3cuYmlhcztcbiAgICAgIG5hdGl2ZS5zaGFkb3cucmFkaXVzID0gc2hhZG93LnJhZGl1cztcbiAgICAgIHZhciBzaGFkb3dDYW1lcmEgPSBuYXRpdmUuc2hhZG93LmNhbWVyYTtcbiAgICAgIHZhciBjYW1lcmEgPSBzaGFkb3cuY2FtZXJhO1xuICAgICAgc2hhZG93Q2FtZXJhLm5lYXIgPSBjYW1lcmEubmVhcjtcbiAgICAgIHNoYWRvd0NhbWVyYS5mYXIgPSBjYW1lcmEuZmFyO1xuICAgICAgc2hhZG93Q2FtZXJhLmZvdiA9IGNhbWVyYS5mb3Y7XG4gICAgICBzaGFkb3dDYW1lcmEubGVmdCA9IGNhbWVyYS5sZWZ0O1xuICAgICAgc2hhZG93Q2FtZXJhLnJpZ2h0ID0gY2FtZXJhLnJpZ2h0O1xuICAgICAgc2hhZG93Q2FtZXJhLnRvcCA9IGNhbWVyYS50b3A7XG4gICAgICBzaGFkb3dDYW1lcmEuYm90dG9tID0gY2FtZXJhLmJvdHRvbTtcbiAgICB9IC8vIENPUFlJTkcgJiBDTE9OSU5HXG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGNvcHlcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29weSBzb3VyY2UgdHJhbnNmb3JtcyAmIGV4ZWN1dGUgYENvbXBvbmVudC5jb3B5KClgXG4gICAgICogQHJldHVybiB7dGhpc30gTGlnaHRDb21wb25lbnRcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNvcHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weSQkMShzb3VyY2UpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihMaWdodENvbXBvbmVudC5wcm90b3R5cGUpLCBcImNvcHlcIiwgdGhpcykuY2FsbCh0aGlzLCBzb3VyY2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzMy50YXJnZXQpIF90aGlzMy50YXJnZXQuY29weShzb3VyY2UudGFyZ2V0KCkpO1xuXG4gICAgICAgIF90aGlzMy5wb3NpdGlvbi5jb3B5KHNvdXJjZS5wb3NpdGlvbik7XG5cbiAgICAgICAgX3RoaXMzLnJvdGF0aW9uLmNvcHkoc291cmNlLnJvdGF0aW9uKTtcblxuICAgICAgICBfdGhpczMucXVhdGVybmlvbi5jb3B5KHNvdXJjZS5xdWF0ZXJuaW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGNsb25lXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIE1ha2UgYSBjbG9uZSBvZiB0aGlzIExpZ2h0Q29tcG9uZW50IHVzaW5nIGAuY29weSgpYFxuICAgICAqIEByZXR1cm4ge0xpZ2h0Q29tcG9uZW50fSBjbG9uZSBvZiB0aGlzIG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5MaWdodENvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY2xvbmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY2xvbmUoKSB7XG4gICAgICByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3Ioe1xuICAgICAgICBidWlsZDogZmFsc2VcbiAgICAgIH0pLmNvcHkodGhpcyk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoTGlnaHRDb21wb25lbnQsIF9Db21wb25lbnQpO1xuXG4gIHJldHVybiBMaWdodENvbXBvbmVudDtcbn0oQ29tcG9uZW50KSkgfHwgX2NsYXNzJDEpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoTGlnaHRDb21wb25lbnQsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgYnVpbGQ6IHRydWUsXG4gIHNoYWRvdzoge1xuICAgIGNhc3Q6IHRydWUsXG4gICAgYmlhczogMCxcbiAgICByYWRpdXM6IDEsXG4gICAgbWFwU2l6ZToge1xuICAgICAgd2lkdGg6IDEwMjQsXG4gICAgICBoZWlnaHQ6IDEwMjRcbiAgICB9LFxuICAgIGNhbWVyYToge1xuICAgICAgbmVhcjogdHJ1ZSxcbiAgICAgIGZhcjogNDAwLFxuICAgICAgZm92OiA5MCxcbiAgICAgIHRvcDogMjAwLFxuICAgICAgYm90dG9tOiAtMjAwLFxuICAgICAgbGVmdDogLTIwMCxcbiAgICAgIHJpZ2h0OiAyMDBcbiAgICB9XG4gIH0sXG4gIHBvc2l0aW9uOiB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHo6IDBcbiAgfSxcbiAgcm90YXRpb246IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgejogMFxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIHtcbiAgcG9zaXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgcm90YXRpb246IFsneCcsICd5JywgJ3onXVxufSk7XG5cbnZhciBfZGVjJDIsIF9jbGFzcyQyO1xudmFyIFxuLyoqXG4gKiBAY2xhc3MgQ2FtZXJhQ29tcG9uZW50XG4gKiBAY2F0ZWdvcnkgY29yZVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtpbnN0cnVjdGlvbnNdIC0gVGhlIGluc3RydWN0aW9ucyBvYmplY3QuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZVxuICovXG5DYW1lcmFDb21wb25lbnQgPSAoX2RlYyQyID0gYXR0cmlidXRlcyhjb3B5KCdwb3NpdGlvbicsICdyb3RhdGlvbicsICdxdWF0ZXJuaW9uJywgJ3RhcmdldCcpKSwgX2RlYyQyKF9jbGFzcyQyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGNyZWF0ZUNsYXNzKENhbWVyYUNvbXBvbmVudCwgbnVsbCwgW3tcbiAgICBrZXk6IFwiZnJvbVwiLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudCNkZWZhdWx0c1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAZGVmYXVsdFxuICAgICAqIHtcbiAgICAgKiAgIGJ1aWxkOiB0cnVlLFxuICAgICAqXG4gICAgICogICBwb3NpdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9LFxuICAgICAqICAgcm90YXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfVxuICAgICAqIH1cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFN0YXRpYyBpbnN0cnVjdGlvbnNcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudCNpbnN0cnVjdGlvbnNcbiAgICAgKiBAc3RhdGljXG4gICAgICogQGRlZmF1bHRcbiAgICAgKiB7XG4gICAgICogICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgICAqICAgcm90YXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgICAgKiAgIHNjYWxlOiBbJ3gnLCAneScsICd6J11cbiAgICAgKiB9XG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZyb20oY2FtZXJhKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgIHBhcmFtcy5idWlsZCA9IGZhbHNlO1xuICAgICAgdmFyIGNvbXBvbmVudCA9IG5ldyBDYW1lcmFDb21wb25lbnQocGFyYW1zKTtcbiAgICAgIGNvbXBvbmVudC5uYXRpdmUgPSBjYW1lcmE7XG4gICAgICBjb21wb25lbnQud3JhcCgpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG4gIH1dKTtcblxuICBmdW5jdGlvbiBDYW1lcmFDb21wb25lbnQocGFyYW1zKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIGRlZmF1bHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBDYW1lcmFDb21wb25lbnQuZGVmYXVsdHM7XG4gICAgdmFyIGluc3RydWN0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogQ2FtZXJhQ29tcG9uZW50Lmluc3RydWN0aW9ucztcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENhbWVyYUNvbXBvbmVudCk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihDYW1lcmFDb21wb25lbnQpLmNhbGwodGhpcywgcGFyYW1zLCBkZWZhdWx0cywgaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAoX3RoaXMucGFyYW1zLmJ1aWxkKSB7XG4gICAgICB2YXIgYnVpbGQgPSBfdGhpcy5idWlsZChfdGhpcy5wYXJhbXMpO1xuXG4gICAgICBpZiAoIWJ1aWxkKSB7XG4gICAgICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yJDEoJ0NhbWVyYUNvbXBvbmVudCcsICcuYnVpbGQoKSBtZXRob2Qgc2hvdWxkIHJldHVybiBhIFRIUkVFLk9iamVjdDNEIG9yIGEgUHJvbWlzZSByZXNvbHZlZCB3aXRoIFRIUkVFLk9iamVjdDNELicsIGFzc2VydFRoaXNJbml0aWFsaXplZChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChidWlsZCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgYnVpbGQudGhlbihmdW5jdGlvbiAobmF0aXZlKSB7XG4gICAgICAgICAgX3RoaXMubmF0aXZlID0gbmF0aXZlO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBfdGhpcy5uYXRpdmUgPSBidWlsZDtcblxuICAgICAgX3RoaXMud2FpdChfdGhpcy53cmFwKCkpO1xuICAgIH1cblxuICAgIF90aGlzLmFwcGx5Q29tbWFuZCgncG9zdEludGVncmF0ZScpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9IC8vIEJVSUxESU5HICYgV1JBUFBJTkdcblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpdmVjeWNsZSBzaG91bGQgcmV0dXJuIGEgbmF0aXZlIG9iamVjdC5cbiAgICogQHRocm93cyB7Q29tcG9zaXRpb25FcnJvcn1cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudFxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKENhbWVyYUNvbXBvbmVudCwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvciQxKCdDYW1lcmFDb21wb25lbnQnLCAnSW5zdGFuY2Ugc2hvdWxkIGhhdmUgaXRcXCdzIG93biAuYnVpbGQoKS4nLCB0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCB3cmFwXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFdyYXBzIHRyYW5zZm9ybXMgKGBwb3NpdGlvbmAgJiBgcm90YXRpb25gKVxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IFJlc29sdmVkIHdoZW4gYWN0aW9uIGlzIGNvbXBsZXRlZFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5DYW1lcmFDb21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIndyYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd3JhcCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgX3RoaXMyLmRlZmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczIucG9zaXRpb24uc2V0KF90aGlzMi5wYXJhbXMucG9zaXRpb24ueCwgX3RoaXMyLnBhcmFtcy5wb3NpdGlvbi55LCBfdGhpczIucGFyYW1zLnBvc2l0aW9uLnopO1xuXG4gICAgICAgICAgX3RoaXMyLnJvdGF0aW9uLnNldChfdGhpczIucGFyYW1zLnJvdGF0aW9uLngsIF90aGlzMi5wYXJhbXMucm90YXRpb24ueSwgX3RoaXMyLnBhcmFtcy5yb3RhdGlvbi56KTtcblxuICAgICAgICAgIF90aGlzMi5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgICBvbldyYXA6IDFcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJlc29sdmUoX3RoaXMyKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBjb3B5XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIENvcHkgc291cmNlIHRyYW5zZm9ybXMgJiBleGVjdXRlIGBDb21wb25lbnQuY29weSgpYFxuICAgICAqIEByZXR1cm4ge3RoaXN9IENhbWVyYUNvbXBvbmVudFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5DYW1lcmFDb21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNvcHlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29weSQkMShzb3VyY2UpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihDYW1lcmFDb21wb25lbnQucHJvdG90eXBlKSwgXCJjb3B5XCIsIHRoaXMpLmNhbGwodGhpcywgc291cmNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpczMudGFyZ2V0KSBfdGhpczMudGFyZ2V0LmNvcHkoc291cmNlLnRhcmdldCgpKTtcblxuICAgICAgICBfdGhpczMucG9zaXRpb24uY29weShzb3VyY2UucG9zaXRpb24pO1xuXG4gICAgICAgIF90aGlzMy5yb3RhdGlvbi5jb3B5KHNvdXJjZS5yb3RhdGlvbik7XG5cbiAgICAgICAgX3RoaXMzLnF1YXRlcm5pb24uY29weShzb3VyY2UucXVhdGVybmlvbik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBjbG9uZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBNYWtlIGEgY2xvbmUgb2YgdGhpcyBDYW1lcmFDb21wb25lbnQgdXNpbmcgYC5jb3B5KClgXG4gICAgICogQHJldHVybiB7Q2FtZXJhQ29tcG9uZW50fSBjbG9uZSBvZiB0aGlzIG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5DYW1lcmFDb21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNsb25lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsb25lKCkge1xuICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHtcbiAgICAgICAgYnVpbGQ6IGZhbHNlXG4gICAgICB9KS5jb3B5KHRoaXMpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKENhbWVyYUNvbXBvbmVudCwgX0NvbXBvbmVudCk7XG5cbiAgcmV0dXJuIENhbWVyYUNvbXBvbmVudDtcbn0oQ29tcG9uZW50KSkgfHwgX2NsYXNzJDIpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoQ2FtZXJhQ29tcG9uZW50LCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGJ1aWxkOiB0cnVlLFxuICBwb3NpdGlvbjoge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB6OiAwXG4gIH0sXG4gIHJvdGF0aW9uOiB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHo6IDBcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCB7XG4gIHBvc2l0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gIHNjYWxlOiBbJ3gnLCAneScsICd6J11cbn0pO1xuXG5jb25zdCB2ZXJzaW9uID0gXCIyLjIuMC1hbHBoYS4wXCI7XG5cbnZhciBzeXN0ZW0gPSB7XG4gIHdpbmRvdzogdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB3aW5kb3dcbn07XG5cbi8qKlxuICogQGNsYXNzIEFwcFxuICogQGNhdGVnb3J5IGNvcmVcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIGNvbXBvbmVudCBpcyB1c2VkIHRvIHByZXBhcmUgYSB3b3JsZCBzY2VuZSwgc2V0dXAgcGh5c2ljcywgY2FtZXJhLCByZW5kZXJlciBhbmQgYWxsIG90aGVyIHRoaW5ncyB0aGF0IHlvdSB1c3VhbGx5IGRvIGJlZm9yZSBtYWtpbmcgbWVzaGVzLlxuICogQHBhcmFtIHtBcnJheX0gW21vZHVsZXM9W11dIC0gQXJyYXkgb2YgTW9kdWxlc1xuICogQGV4dGVuZHMgTW9kdWxlU3lzdGVtXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmVcbiAqL1xuXG52YXIgQXBwID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTW9kdWxlU3lzdGVtKSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB3aGV0aGVyIHRoZSBzY2VuZSBzaG91bGQgcmVuZGVyIG9yIG5vdFxuICAgKiBAbWVtYmVyIHtCb29sZWFufSBtb2R1bGU6Y29yZS5BcHAjZW5hYmxlZFxuICAgKiBAcHVibGljXG4gICAqL1xuXG4gIC8qKlxuICAgKiBMb29wcyBpbiB0aGlzIGFwcFxuICAgKiBAZGVzY3JpcHRpb24gQXJyYXkgb2YgbG9vcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYnkgdGhpcyBhcHAuXG4gICAqIEBtZW1iZXIge0FycmF5fSBtb2R1bGU6Y29yZS5BcHAjbG9vcHNcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgZnVuY3Rpb24gQXBwKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBtb2R1bGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEFwcCk7XG5cbiAgICBjb25zb2xlLmxvZyhcIldIUy5BcHAgXCIuY29uY2F0KHZlcnNpb24pKTtcbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihBcHApLmNhbGwodGhpcykpO1xuXG4gICAgZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKGFzc2VydFRoaXNJbml0aWFsaXplZChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSwgXCJlbmFibGVkXCIsIHRydWUpLCBcImxvb3BzXCIsIFtdKTtcblxuICAgIF90aGlzLm1hbmFnZXIgPSBuZXcgTW9kdWxlTWFuYWdlcihhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkpO1xuICAgIF90aGlzLm1vZHVsZXMgPSBtb2R1bGVzO1xuXG4gICAgX3RoaXMuaW50ZWdyYXRlTW9kdWxlcygpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9IC8vIENPTlRST0xTICYgVVBEQVRJTkdcblxuICAvKipcbiAgICogQG1ldGhvZCBzdGFydFxuICAgKiBAZGVzY3JpcHRpb24gU3RhcnQgcmVuZGVyaW5nIGxvb3AgYW5kIHBoeXNpY3Mgc2ltdWxhdGlvbiAoaWYgeW91IHVzZSB2ZXJzaW9uIHdpdGggcGh5c2ljcykuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5BcHBcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhBcHAsIFt7XG4gICAga2V5OiBcInN0YXJ0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0YXJ0KCkge1xuICAgICAgdmFyIHJlcXVlc3RBbmltRnJhbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBzeXN0ZW0ud2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBzeXN0ZW0ud2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBzeXN0ZW0ud2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICBzeXN0ZW0ud2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIDEwMDAgLyA2MCk7XG4gICAgICAgIH07XG4gICAgICB9KCk7XG5cbiAgICAgIHZhciBsb29wcyA9IHRoaXMubG9vcHMsXG4gICAgICAgICAgZW5hYmxlZCA9IHRoaXMuZW5hYmxlZDtcblxuICAgICAgZnVuY3Rpb24gcHJvY2VzcygpIHtcbiAgICAgICAgcmVxdWVzdEFuaW1GcmFtZShwcm9jZXNzKTtcbiAgICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxsID0gbG9vcHMubGVuZ3RoOyBpIDwgbGw7IGkrKykge1xuICAgICAgICAgIHZhciBlID0gbG9vcHNbaV07XG4gICAgICAgICAgaWYgKGUuZW5hYmxlZCkgZS5leGVjdXRlKGUuY2xvY2spO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG4gICAgICBwcm9jZXNzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgc3RvcFxuICAgICAqIEBkZXNjcmlwdGlvbiBTdG9wcyByZW5kZXJpbmcgbG9vcHNcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQXBwXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzdG9wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBhZGRMb29wXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZHMgbG9vcCB0byB0aGlzIGFwcC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbG9vcCAtIHRoZSBsb29wIHRvIGFkZFxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHByb21pc2VzIGNvbXBsZXRlZC5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQXBwXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+QWRkaW5nIGEgbG9vcCB0byBhbiBhcHA8L2NhcHRpb24+XG4gICAgICogY29uc3QgbG9vcCA9IG5ldyBMb29wKCgpID0+IHtcbiAgICAgKiAgLy8gLi4uXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBjb25zdCBhcHAgPSBuZXcgQXBwKCk7XG4gICAgICpcbiAgICAgKiBhcHAuYWRkTG9vcChsb29wKTtcbiAgICAgKiBsb29wLnN0YXJ0KCk7XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhZGRMb29wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZExvb3AobG9vcCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBfdGhpczIubG9vcHMucHVzaChsb29wKTtcblxuICAgICAgICByZXNvbHZlKGxvb3ApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgcmVtb3ZlTG9vcFxuICAgICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIGxvb3AgZnJvbSB0aGlzIGFwcC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gbG9vcCAtIHRoZSBsb29wIHRvIHJlbW92ZVxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIHByb21pc2VzIGNvbXBsZXRlZC5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQXBwXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVMb29wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZUxvb3AobG9vcCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICB2YXIgaW5kZXggPSBfdGhpczMubG9vcHMuaW5kZXhPZihsb29wKTtcblxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSBfdGhpczMubG9vcHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgcmVzb2x2ZShsb29wKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5nZXQoa2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVzZShrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIudXNlKGtleSk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQXBwLCBfTW9kdWxlU3lzdGVtKTtcblxuICByZXR1cm4gQXBwO1xufShNb2R1bGVTeXN0ZW0pO1xuXG4vKipcbiAqIEBjbGFzcyBMb29wXG4gKiBAY2F0ZWdvcnkgY29yZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBmdW5jdGlvbiB0byBleGVjdXRlIG9uIGVhY2ggYW5pbWF0aW9uIGZyYW1lXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFt1c2VDbG9jaz10cnVlXSBwYXNzZXMgYSBDbG9jayB0byB0aGUgZnVuY3Rpb24gd2hlbiBjYWxsZWQsIGlmIHRydWVcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZVxuICovXG5cbnZhciBMb29wID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTG9vcChmdW5jKSB7XG4gICAgdmFyIHVzZUNsb2NrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTG9vcCk7XG5cbiAgICB0aGlzLmZ1bmMgPSBmdW5jO1xuICAgIHRoaXMuY2xvY2sgPSB1c2VDbG9jayA/IG5ldyBDbG9jaygpIDogbnVsbDtcbiAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcbiAgfSAvLyBDT05UUk9MU1xuXG4gIC8qKlxuICAgKiBAbWV0aG9kIHN0YXJ0XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gU3RhcnRzIHRoaXMgbG9vcCwgY2xvY2sgaWYgaXQgaGFzIG9uZS4gV29uJ3QgZG8gYW55dGhpbmcgaWYgbG9vcCBlbmFibGVkIGFscmVhZHkuXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50fSBbd29ybGRdIGFwcCB0byBhZGQgdGhpcyBsb29wIHRvLCBpZiBwcm92aWRlZC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxvb3BcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhMb29wLCBbe1xuICAgIGtleTogXCJzdGFydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGFydCh3b3JsZCkge1xuICAgICAgaWYgKHRoaXMuZW5hYmxlZCkgcmV0dXJuO1xuICAgICAgaWYgKHdvcmxkKSB3b3JsZC5hZGRMb29wKHRoaXMpO1xuICAgICAgaWYgKHRoaXMuY2xvY2spIHRoaXMuY2xvY2suc3RhcnQoKTtcbiAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgc3RvcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBTdG9wcyB0aGlzIGxvb3AgYW5kIGl0cyBjbG9jayBpZiBpdCBoYXMgb25lLCB3b24ndCBkbyBhbnl0aGluZyBpZiB0aGlzIGxvb3AgaXMgbm90IGVuYWJsZWQpXG4gICAgICogQHBhcmFtIHtDb21wb25lbnR9IFt3b3JsZF0gYXBwIHRvIHJlbW92ZSB0aGlzIGxvb3AgZnJvbSwgaWYgcHJvdmlkZWQuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxvb3BcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCh3b3JsZCkge1xuICAgICAgaWYgKCF0aGlzLmVuYWJsZWQpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLmNsb2NrKSB0aGlzLmNsb2NrLnN0b3AoKTtcbiAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgaWYgKHdvcmxkKSB3b3JsZC5yZW1vdmVMb29wKHRoaXMpO1xuICAgIH0gLy8gRVhFQ1VUSU9OXG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGV4ZWN1dGVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgdGhlIGZ1bmN0aW9uIG9mIHRoaXMgbG9vcFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Mb29wXG4gICAgICogQHJldHVybnMgeyp9IHdoYXRldmVyIHRoZSBmdW5jdGlvbiBvZiB0aGlzIGxvb3AgcmV0dXJuc1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZXhlY3V0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleGVjdXRlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZnVuYyh0aGlzLmNsb2NrKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gTG9vcDtcbn0oKTtcblxuLyoqIEBtb2R1bGUgY29yZSAqL1xuXG4vKipcbiAqIEBjbGFzcyBBbWJpZW50TGlnaHRcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL2xpZ2h0c1xuICogQGRlc2NyaXB0aW9uIEFtYmllbnRMaWdodCBpcyBhIHNpbXBsZSBjbGFzcywgaXQgZXh0ZW5kcyBMaWdodCBhbmQgaW5oZXJpdHMgYWxsIGl0cyBtZXRob2RzLlxuICogQW1iaWVudExpZ2h0IGNyZWF0ZXMgYmFzaWMgbGlnaHQgYXJvdW5kIGFsbCBzY2VuZSwgc28gaXQgZG9lc24ndCBuZWVkIHByb3BlcnRpZXMgbGlrZSBwb3Mgb3IgdGFyZ2V0LlxuICogSXQgc3VwcG9ydHMgb25seSBjb2xvciBhbmQgaW50ZW5zaXR5IGFzIHBhcmFtZXRlcnMsIHdoaWNoIGRlZmluZXMgdGhlIGNvbG9yIG9mIHRoZSBzdXJyb3VuZGVkIGxpZ2h0IGFuZCBpbnRlbnNpdHkgb2YgbGlnaHQuXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcz17bGlnaHQ6IHtjb2xvcjogMHhmZmZmZmYsIGludGVuc2l0eTogMX19XSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5MaWdodENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL2xpZ2h0c1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYW4gQW1iaWVudExpZ2h0IDwvY2FwdGlvbj5cbiAqIG5ldyBBbWJpZW50TGlnaHQoe1xuICogICBjb2xvcjogMHhmZmZmZmYsXG4gKiAgIGludGVuc2l0eTogMC4yXG4gKiB9KS5hZGRUbyh3b3JsZCk7XG4gKi9cblxudmFyIEFtYmllbnRMaWdodCQxID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTGlnaHRDb21wb25lbnQpIHtcbiAgZnVuY3Rpb24gQW1iaWVudExpZ2h0JCQxKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQW1iaWVudExpZ2h0JCQxKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQW1iaWVudExpZ2h0JCQxKS5jYWxsKHRoaXMsIHBhcmFtcywgQW1iaWVudExpZ2h0JCQxLmRlZmF1bHRzKSk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhBbWJpZW50TGlnaHQkJDEsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGxpZ2h0OiBuZXcgQW1iaWVudExpZ2h0KHBhcmFtcy5jb2xvciwgcGFyYW1zLmludGVuc2l0eSlcbiAgICAgIH0pLmxpZ2h0O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEFtYmllbnRMaWdodCQkMSwgX0xpZ2h0Q29tcG9uZW50KTtcblxuICByZXR1cm4gQW1iaWVudExpZ2h0JCQxO1xufShMaWdodENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoQW1iaWVudExpZ2h0JDEsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBMaWdodENvbXBvbmVudC5kZWZhdWx0cywge1xuICBjb2xvcjogMHhmZmZmZmYsXG4gIGludGVuc2l0eTogMVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBEaXJlY3Rpb25hbExpZ2h0XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9saWdodHNcbiAqIEBkZXNjcmlwdGlvbiBEaXJlY3RpbmFsTGlnaHQgY3JlYXRlcyBhIGxpZ2h0IHRoYXQgc2hpbmVzIGZyb20gYSBzcGVjaWZpYyBkaXJlY3Rpb24gbm90IGZyb20gYSBzcGVjaWZpYyBwb3NpdGlvbi48YnIvPjxici8+XG4gKiBUaGlzIGxpZ2h0IHdpbGwgYmVoYXZlIGFzIHRob3VnaCBpdCBpcyBpbmZpbml0ZWx5IGZhciBhd2F5IGFuZCB0aGUgcmF5cyBwcm9kdWNlZCBmcm9tIGl0IGFyZSBhbGwgcGFyYWxsZWwuIDxici8+PGJyLz5cbiAqIFRoZSBiZXN0IGFuYWxvZ3kgd291bGQgYmUgYSBsaWdodCBzb3VyY2UgdGhhdCBhY3RzIGxpa2UgdGhlIHN1bjogdGhlIHN1biBpcyBzbyBmYXIgYXdheSB0aGF0IGFsbCBzdW5saWdodCBoaXR0aW5nIG9iamVjdHMgY29tZXMgZnJvbSB0aGUgc2FtZSBhbmdsZS48YnIvPjxici8+XG4gKiBJdCBoYXMgdGhlIHNhbWUgb3B0aW9ucyBhcyBBbWJpZW50TGlnaHQgaW4gbGlnaHQgcGFyYW1hdGVyLCBidXQgaXQgYWxzbyBzdXBwb3J0cyBwb3MgYW5kIHRhcmdldCBwYXJhbWF0ZXJzLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2xpZ2h0OiB7Y29sb3I6IDB4ZmZmZmZmLCBpbnRlbnNpdHk6IDF9fV0gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9saWdodHNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgRGlyZWN0aW9uYWxMaWdodCB0byBmYWxsIGRvd24gZnJvbSB2ZWMzKDEwLCAyMCwgMTApIHRvIHZlYzMoMCwgMCwgMCk8L2NhcHRpb24+XG4gKiBuZXcgRGlyZWN0aW9uYWxMaWdodCh7XG4gKiAgIGNvbG9yOiAweGZmZmZmZixcbiAqICAgaW50ZW5zaXR5OiAwLjIsXG4gKlxuICogICBwb3NpdGlvbjogWzEwLCAyMCwgMTBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBEaXJlY3Rpb25hbExpZ2h0JDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MaWdodENvbXBvbmVudCkge1xuICBmdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0JCQxKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRGlyZWN0aW9uYWxMaWdodCQkMSk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihEaXJlY3Rpb25hbExpZ2h0JCQxKS5jYWxsKHRoaXMsIHBhcmFtcywgRGlyZWN0aW9uYWxMaWdodCQkMS5kZWZhdWx0cykpO1xuXG4gICAgX3RoaXMud3JhcFNoYWRvdygpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoRGlyZWN0aW9uYWxMaWdodCQkMSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbGlnaHQ6IG5ldyBEaXJlY3Rpb25hbExpZ2h0KHBhcmFtcy5jb2xvciwgcGFyYW1zLmludGVuc2l0eSlcbiAgICAgIH0pLmxpZ2h0O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKERpcmVjdGlvbmFsTGlnaHQkJDEsIF9MaWdodENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIERpcmVjdGlvbmFsTGlnaHQkJDE7XG59KExpZ2h0Q29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhEaXJlY3Rpb25hbExpZ2h0JDEsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBMaWdodENvbXBvbmVudC5kZWZhdWx0cywge1xuICBjb2xvcjogMHhmZmZmZmYsXG4gIGludGVuc2l0eTogMVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBIZW1pc3BoZXJlTGlnaHRcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL2xpZ2h0c1xuICogQGRlc2NyaXB0aW9uIEhlbWlzcGhlcmVMaWdodCBpcyBhIGxpZ2h0IHNvdXJjZSBwb3NpdGlvbmVkIGRpcmVjdGx5IGFib3ZlIHRoZSBzY2VuZS48YnIvPlxuICogSXQgYWxzbyBkb2Vzbid0IG5lZWQgcG9zaXRpb24gYW5kIHRhcmdldCBwcm9wZXJ0aWVzLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2V4YW1wbGVzL3dlYmdsX2xpZ2h0c19oZW1pc3BoZXJlLmh0bWxcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtsaWdodDoge3NreUNvbG9yOiAweGZmZmZmZiwgZ3JvdW5kQ29sb3I6IDB4ZmZmZmZmLCBpbnRlbnNpdHk6IDF9fV0gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9saWdodHNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgSGVtaXNwaGVyZUxpZ2h0PC9jYXB0aW9uPlxuICogbmV3IEhlbWlzcGhlcmVMaWdodCh7XG4gKiAgIHNreUNvbG9yOiAweGZmMDAwMCxcbiAqICAgZ3JvdW5kQ29sb3I6IDB4MDAwMGZmLFxuICogICBpbnRlbnNpdHk6IDAuMlxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgSGVtaXNwaGVyZUxpZ2h0JDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MaWdodENvbXBvbmVudCkge1xuICBmdW5jdGlvbiBIZW1pc3BoZXJlTGlnaHQkJDEoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBIZW1pc3BoZXJlTGlnaHQkJDEpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihIZW1pc3BoZXJlTGlnaHQkJDEpLmNhbGwodGhpcywgcGFyYW1zLCBIZW1pc3BoZXJlTGlnaHQkJDEuZGVmYXVsdHMpKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKEhlbWlzcGhlcmVMaWdodCQkMSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbGlnaHQ6IG5ldyBIZW1pc3BoZXJlTGlnaHQocGFyYW1zLnNreUNvbG9yLCBwYXJhbXMuZ3JvdW5kQ29sb3IsIHBhcmFtcy5pbnRlbnNpdHkpXG4gICAgICB9KS5saWdodDtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhIZW1pc3BoZXJlTGlnaHQkJDEsIF9MaWdodENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIEhlbWlzcGhlcmVMaWdodCQkMTtcbn0oTGlnaHRDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKEhlbWlzcGhlcmVMaWdodCQxLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgc2t5Q29sb3I6IDB4ZmZmZmZmLFxuICBncm91bmRDb2xvcjogMHhmZmZmZmYsXG4gIGludGVuc2l0eTogMVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBQb2ludExpZ2h0XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9saWdodHNcbiAqIEBkZXNjcmlwdGlvbiBQb2ludExpZ2h0IGNyZWF0ZXMgYSBsaWdodCBhdCBhIHNwZWNpZmljIHBvc2l0aW9uIGluIHRoZSBzY2VuZS4gVGhlIGxpZ2h0IHNoaW5lcyBpbiBhbGwgZGlyZWN0aW9ucyAocm91Z2hseSBzaW1pbGFyIHRvIGEgbGlnaHQgYnVsYi4pPGJyLz48YnIvPlxuICogSXQgaGFzIHRoZSBzYW1lIG9wdGlvbnMgYXMgQW1iaWVudExpZ2h0IGluIGxpZ2h0IHBhcmFtYXRlciwgYnV0IGl0IGFsc28gc3VwcG9ydHMgcG9zaXRpb24sIGRpc3RhbmNlIGFuZCBkZWNheS48YnIvPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2xpZ2h0OiB7Y29sb3I6IDB4ZmZmZmZmLCBpbnRlbnNpdHk6IDEsIGRpc3RhbmNlOiAxMDAsIGRlY2F5OiAxfX1dIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIExpZ2h0Q29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFBvaW50TGlnaHQ8L2NhcHRpb24+XG4gKiBuZXcgUG9pbnRMaWdodCgge1xuICogICBjb2xvcjogMHhmZjAwMDAsXG4gKiAgIGludGVuc2l0eTogMixcbiAqICAgZGlzdGFuY2U6IDMwMFxuICpcbiAqICAgcG9zaXRpb246IFsxMCwgMjAsIDEwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgUG9pbnRMaWdodCQxID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTGlnaHRDb21wb25lbnQpIHtcbiAgZnVuY3Rpb24gUG9pbnRMaWdodCQkMSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBvaW50TGlnaHQkJDEpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoUG9pbnRMaWdodCQkMSkuY2FsbCh0aGlzLCBwYXJhbXMsIFBvaW50TGlnaHQkJDEuZGVmYXVsdHMpKTtcblxuICAgIF90aGlzLndyYXBTaGFkb3coKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKFBvaW50TGlnaHQkJDEsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGxpZ2h0OiBuZXcgUG9pbnRMaWdodChwYXJhbXMuY29sb3IsIHBhcmFtcy5pbnRlbnNpdHksIHBhcmFtcy5kaXN0YW5jZSwgcGFyYW1zLmRlY2F5KVxuICAgICAgfSkubGlnaHQ7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoUG9pbnRMaWdodCQkMSwgX0xpZ2h0Q29tcG9uZW50KTtcblxuICByZXR1cm4gUG9pbnRMaWdodCQkMTtcbn0oTGlnaHRDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKFBvaW50TGlnaHQkMSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIExpZ2h0Q29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGNvbG9yOiAweGZmZmZmZixcbiAgaW50ZW5zaXR5OiAxLFxuICBkaXN0YW5jZTogMTAwLFxuICBkZWNheTogMVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBTcG90TGlnaHRcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL2xpZ2h0c1xuICogQGRlc2NyaXB0aW9uIFNwb3RMaWdodCBjcmVhdGVzIHNwb3QgbGlnaHQgdGhhdCBjYW4gY2FzdCBzaGFkb3cgaW4gb25lIGRpcmVjdGlvbi4gPGJyLz48YnIvPlxuICogSXQgaGFzIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgQW1iaWVudExpZ2h0IGluIGxpZ2h0LCBidXQgaXQgYWxzbyBzdXBwb3J0cyBwb3MgYW5kIHRhcmdldC4gPGJyLz48YnIvPlxuICogU3BvdExpZ2h0IGFmZmVjdHMgbWVzaGVzIHdpdGggbGFtYmVydCBhbmQgcGhvbmcgbWF0ZXJpYWwuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZXhhbXBsZXMvd2ViZ2xfbGlnaHRzX3Nwb3RsaWdodC5odG1sXCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcz17bGlnaHQ6IHtjb2xvcjogMHhmZmZmZmYsIGludGVuc2l0eTogMSwgZGlzdGFuY2U6IDEwMCwgYW5nbGU6IE1hdGguUEkgLyAzLCBleHBvbmVudDogMCwgZGVjYXk6IDF9fV0gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9saWdodHNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgU3BvdExpZ2h0IHRoYXQgZmFsbHMgZG93biBmcm9tIHZlYzMoMTAsIDIwLCAxMCkgdG8gdmVjMygwLCAwLCAwKTwvY2FwdGlvbj5cbiAqIG5ldyBTcG90TGlnaHQoe1xuICogICBjb2xvcjogMHgwMGZmMDAsXG4gKiAgIGludGVuc2l0eTogMyxcbiAqICAgZGlzdGFuY2U6IDEwMDBcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMTAsIDIwLCAxMF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIFNwb3RMaWdodCQxID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTGlnaHRDb21wb25lbnQpIHtcbiAgZnVuY3Rpb24gU3BvdExpZ2h0JCQxKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU3BvdExpZ2h0JCQxKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFNwb3RMaWdodCQkMSkuY2FsbCh0aGlzLCBwYXJhbXMsIFNwb3RMaWdodCQkMS5kZWZhdWx0cykpO1xuXG4gICAgX3RoaXMud3JhcFNoYWRvdygpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoU3BvdExpZ2h0JCQxLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBsaWdodDogbmV3IFNwb3RMaWdodChwYXJhbXMuY29sb3IsIHBhcmFtcy5pbnRlbnNpdHksIHBhcmFtcy5kaXN0YW5jZSwgcGFyYW1zLmFuZ2xlLCBwYXJhbXMuZXhwb25lbnQsIHBhcmFtcy5kZWNheSlcbiAgICAgIH0pLmxpZ2h0O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFNwb3RMaWdodCQkMSwgX0xpZ2h0Q29tcG9uZW50KTtcblxuICByZXR1cm4gU3BvdExpZ2h0JCQxO1xufShMaWdodENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoU3BvdExpZ2h0JDEsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBMaWdodENvbXBvbmVudC5kZWZhdWx0cywge1xuICBjb2xvcjogMHhmZmZmZmYsXG4gIGludGVuc2l0eTogMSxcbiAgZGlzdGFuY2U6IDEwMCxcbiAgYW5nbGU6IE1hdGguUEkgLyAzLFxuICBleHBvbmVudDogMCxcbiAgZGVjYXk6IDFcbn0pKTtcblxudmFyIEFyZWFMaWdodCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0xpZ2h0Q29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIEFyZWFMaWdodCgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEFyZWFMaWdodCk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEFyZWFMaWdodCkuY2FsbCh0aGlzLCBwYXJhbXMsIEFyZWFMaWdodC5kZWZhdWx0cykpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoQXJlYUxpZ2h0LCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBsaWdodDogbmV3IFJlY3RBcmVhTGlnaHQocGFyYW1zLmNvbG9yLCBwYXJhbXMuaW50ZW5zaXR5LCBwYXJhbXMud2lkdGgsIHBhcmFtcy5oZWlnaHQpXG4gICAgICB9KS5saWdodDtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhBcmVhTGlnaHQsIF9MaWdodENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIEFyZWFMaWdodDtcbn0oTGlnaHRDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKEFyZWFMaWdodCwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIExpZ2h0Q29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGNvbG9yOiAweGZmZmZmZixcbiAgaW50ZW5zaXR5OiAxLFxuICB3aWR0aDogMTAsXG4gIGhlaWdodDogMTBcbn0pKTtcblxuLyoqIEBtb2R1bGUgY29tcG9uZW50cy9saWdodHMgKi9cblxuLyoqXG4gKiBAY2xhc3MgQ3ViZUNhbWVyYVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvY2FtZXJhc1xuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgNiBjYW1lcmFzIHRoYXQgcmVuZGVyIHRvIGEgV2ViR0xSZW5kZXJUYXJnZXRDdWJlXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvY2FtZXJhc1xuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGVzIGEgQ3ViZUNhbWVyYSBhbmQgc2V0IGl0IGFzIGFwcCdzIGNhbWVyYTwvY2FwdGlvbj5cbiAqIGNvbnN0IGNhbWVyYSA9IG5ldyBDdWJlQ2FtZXJhKHtcbiAqICAgY2FtZXJhOiB7XG4gKiAgICAgY3ViZVJlc29sdXRpb246IDI1NlxuICogICB9LFxuICpcbiAqICAgcG9zaXRpb246IHtcbiAqICAgICB4OiAwLFxuICogICAgIHk6IDEwMCxcbiAqICAgICB6OiAwXG4gKiAgIH1cbiAqIH0pO1xuICpcbiAqIGFwcC5jYW1lcmEgPSBjYW1lcmE7XG4gKi9cblxudmFyIEN1YmVDYW1lcmEkMSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0NhbWVyYUNvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9jYW1lcmFzLkN1YmVDYW1lcmEjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgY2FtZXJhOiB7XG4gICAqICAgICBuZWFyOiAxLFxuICAgKiAgICAgZmFyOiAxMDAwLFxuICAgKiAgICAgY3ViZVJlc29sdXRpb246IDEyOFxuICAgKiAgIH1cbiAgICogfTwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gQ3ViZUNhbWVyYSQkMSgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEN1YmVDYW1lcmEkJDEpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihDdWJlQ2FtZXJhJCQxKS5jYWxsKHRoaXMsIHBhcmFtcywgQ3ViZUNhbWVyYSQkMS5kZWZhdWx0cykpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoQ3ViZUNhbWVyYSQkMSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgY2FtZXJhOiBuZXcgQ3ViZUNhbWVyYShwYXJhbXMubmVhciwgcGFyYW1zLmZhciwgcGFyYW1zLmN1YmVSZXNvbHV0aW9uKVxuICAgICAgfSkuY2FtZXJhO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEN1YmVDYW1lcmEkJDEsIF9DYW1lcmFDb21wb25lbnQpO1xuXG4gIHJldHVybiBDdWJlQ2FtZXJhJCQxO1xufShDYW1lcmFDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKEN1YmVDYW1lcmEkMSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIENhbWVyYUNvbXBvbmVudC5kZWZhdWx0cywge1xuICBuZWFyOiAxLFxuICBmYXI6IDEwMDAsXG4gIGN1YmVSZXNvbHV0aW9uOiAxMjhcbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgT3J0aG9ncmFwaGljQ2FtZXJhXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9jYW1lcmFzXG4gKiBAZGVzY3JpcHRpb24gQ2FtZXJhIHdpdGggb3J0aG9ncmFwaGljIHByb2plY3Rpb24uXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvY2FtZXJhc1xuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGUgYW4gT3J0aG9ncmFwaGljQ2FtZXJhIGFuZCBzZXQgaXQgYXMgYXBwJ3MgY2FtZXJhPC9jYXB0aW9uPlxuICogY29uc3QgY2FtZXJhID0gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSh7XG4gKiAgIGNhbWVyYToge1xuICogICAgIGZhcjogMTAwMDBcbiAqICAgfSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeTogNTBcbiAqICAgfVxuICogfSk7XG4gKlxuICogYXBwLmNhbWVyYSA9IGNhbWVyYTtcbiAqL1xuXG52YXIgT3J0aG9ncmFwaGljQ2FtZXJhJDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9DYW1lcmFDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvY2FtZXJhcy5PcnRob2dyYXBoaWNDYW1lcmEjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgbmVhcjogMSxcbiAgICogICBmYXI6IDEwMDAsXG4gICAqICAgbGVmdDogc3lzdGVtLndpbmRvdy5pbm5lcldpZHRoIC8gLTIsXG4gICAqICAgcmlnaHQ6IHN5c3RlbS53aW5kb3cuaW5uZXJXaWR0aCAvIDIsXG4gICAqICAgdG9wOiBzeXN0ZW0ud2luZG93LmlubmVySGVpZ2h0IC8gMixcbiAgICogICBib3R0b206IHN5c3RlbS53aW5kb3cuaW5uZXJIZWlnaHQgLyAtMlxuICAgKiB9PC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBPcnRob2dyYXBoaWNDYW1lcmEkJDEoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBPcnRob2dyYXBoaWNDYW1lcmEkJDEpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihPcnRob2dyYXBoaWNDYW1lcmEkJDEpLmNhbGwodGhpcywgcGFyYW1zLCBPcnRob2dyYXBoaWNDYW1lcmEkJDEuZGVmYXVsdHMpKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKE9ydGhvZ3JhcGhpY0NhbWVyYSQkMSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgY2FtZXJhOiBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKHBhcmFtcy5sZWZ0LCBwYXJhbXMucmlnaHQsIHBhcmFtcy50b3AsIHBhcmFtcy5ib3R0b20sIHBhcmFtcy5uZWFyLCBwYXJhbXMuZmFyKVxuICAgICAgfSkuY2FtZXJhO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKE9ydGhvZ3JhcGhpY0NhbWVyYSQkMSwgX0NhbWVyYUNvbXBvbmVudCk7XG5cbiAgcmV0dXJuIE9ydGhvZ3JhcGhpY0NhbWVyYSQkMTtcbn0oQ2FtZXJhQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhPcnRob2dyYXBoaWNDYW1lcmEkMSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIENhbWVyYUNvbXBvbmVudC5kZWZhdWx0cywge1xuICBuZWFyOiAxLFxuICBmYXI6IDEwMDAsXG4gIGxlZnQ6IHN5c3RlbS53aW5kb3cuaW5uZXJXaWR0aCAvIC0yLFxuICByaWdodDogc3lzdGVtLndpbmRvdy5pbm5lcldpZHRoIC8gMixcbiAgdG9wOiBzeXN0ZW0ud2luZG93LmlubmVySGVpZ2h0IC8gMixcbiAgYm90dG9tOiBzeXN0ZW0ud2luZG93LmlubmVySGVpZ2h0IC8gLTJcbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgUGVyc3BlY3RpdmVDYW1lcmFcbiAqIEBkZXNjcmlwdGlvbiBDYW1lcmEgd2l0aCBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uLlxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvY2FtZXJhc1xuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0LlxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL2NhbWVyYXNcbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudFxuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRlIGFuIFBlcnNwZWN0aXZlQ2FtZXJhIGFuZCBzZXQgaXQgYXMgYXBwJ3MgY2FtZXJhPC9jYXB0aW9uPlxuICogY29uc3QgY2FtZXJhID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKHtcbiAqICAgZm92OiA3NSxcbiAqICAgYXNwZWN0OiB3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy5pbm5lckhlaWdodCxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeDogMCxcbiAqICAgICB5OiAxMDAsXG4gKiAgICAgejogMFxuICogICB9XG4gKiB9KTtcbiAqXG4gKiBhcHAuY2FtZXJhID0gY2FtZXJhO1xuICovXG5cbnZhciBQZXJzcGVjdGl2ZUNhbWVyYSQxID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfQ2FtZXJhQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL2NhbWVyYXMuUGVyc3BlY3RpdmVDYW1lcmEjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgbmVhcjogMSxcbiAgICogICBmYXI6IDEwMDAsXG4gICAqICAgZm92OiA3NSxcbiAgICogICBhc3BlY3Q6IHN5c3RlbS53aW5kb3cuaW5uZXJXaWR0aCAvIHN5c3RlbS53aW5kb3cuaW5uZXJIZWlnaHRcbiAgICogfTwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gUGVyc3BlY3RpdmVDYW1lcmEkJDEoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQZXJzcGVjdGl2ZUNhbWVyYSQkMSk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFBlcnNwZWN0aXZlQ2FtZXJhJCQxKS5jYWxsKHRoaXMsIHBhcmFtcywgUGVyc3BlY3RpdmVDYW1lcmEkJDEuZGVmYXVsdHMpKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKFBlcnNwZWN0aXZlQ2FtZXJhJCQxLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBjYW1lcmE6IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYShwYXJhbXMuZm92LCBwYXJhbXMuYXNwZWN0LCBwYXJhbXMubmVhciwgcGFyYW1zLmZhcilcbiAgICAgIH0pLmNhbWVyYTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhQZXJzcGVjdGl2ZUNhbWVyYSQkMSwgX0NhbWVyYUNvbXBvbmVudCk7XG5cbiAgcmV0dXJuIFBlcnNwZWN0aXZlQ2FtZXJhJCQxO1xufShDYW1lcmFDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKFBlcnNwZWN0aXZlQ2FtZXJhJDEsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBDYW1lcmFDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgbmVhcjogMSxcbiAgZmFyOiAxMDAwLFxuICBmb3Y6IDc1LFxuICBhc3BlY3Q6IHN5c3RlbS53aW5kb3cuaW5uZXJXaWR0aCAvIHN5c3RlbS53aW5kb3cuaW5uZXJIZWlnaHRcbn0pKTtcblxuLyoqIEBtb2R1bGUgY29tcG9uZW50cy9jYW1lcmFzICovXG5cbi8qKlxuICogQGNsYXNzIEJveFxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gQXMgdG9sZCBvbiBDb21wb25lbnQgZGVmaW5pdGlvbiwgd2hpbGUgeW91IGNhbiBwYXNzIGFueSBvZiB0aGUgaW5oZXJpdGVkIHBhcmFtcyBmb3IgdGhpcyBjb21wb25lbnQgY29uc3RydWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvXG4gKiBwYXNzIHNwZWNpZmljIHBhcmFtZXRlcnMgdG8gYnVpbGQgdGhpcyBtZXNoIGFzIGEgZ2VvbWV0cnkgb2JqZWN0LlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNCb3hHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgQm94LCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqICBuZXcgQm94KHtcbiAqICAgIGdlb21ldHJ5OiB7XG4gKiAgICAgIHdpZHRoOiAyLFxuICogICAgICBoZWlnaHQ6IDIsXG4gKiAgICAgIGRlcHRoOiAyXG4gKiAgICB9LFxuICpcbiAqICAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgIH0pLFxuICpcbiAqICAgIHBvc2l0aW9uOiBbNTAsIDYwLCA3MF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIEJveCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkJveCNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgd2lkdGg6IDEsXG4gICAqICAgICBoZWlnaHQ6IDEsXG4gICAqICAgICBkZXB0aDogMSxcbiAgICogICAgIHdpZHRoU2VnbWVudHM6IDEsXG4gICAqICAgICBoZWlnaHRTZWdtZW50czogMSxcbiAgICogICAgIGRlcHRoU2VnbWVudHM6IDFcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Cb3gjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgZ2VvbWV0cnk6IFsnd2lkdGgnLCAnaGVpZ2h0JywgJ2RlcHRoJywgJ3dpZHRoU2VnbWVudHMnLCAnaGVpZ2h0U2VnbWVudHMnLCAnZGVwdGhTZWdlbWVudHMnXVxuICAgKi9cbiAgZnVuY3Rpb24gQm94KCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQm94KTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQm94KS5jYWxsKHRoaXMsIHBhcmFtcywgQm94LmRlZmF1bHRzLCBCb3guaW5zdHJ1Y3Rpb25zKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Cb3hcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhCb3gsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyAocGFyYW1zLmJ1ZmZlciA/IEJveEJ1ZmZlckdlb21ldHJ5IDogQm94R2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS53aWR0aCwgcGFyYW1zLmdlb21ldHJ5LmhlaWdodCwgcGFyYW1zLmdlb21ldHJ5LmRlcHRoLCBwYXJhbXMuZ2VvbWV0cnkud2lkdGhTZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5LmhlaWdodFNlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkuZGVwdGhTZWdtZW50cyk7XG4gICAgICByZXR1cm4gZ2VvbWV0cnk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQm94LCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIEJveDtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhCb3gsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgd2lkdGg6IDEsXG4gICAgaGVpZ2h0OiAxLFxuICAgIGRlcHRoOiAxLFxuICAgIHdpZHRoU2VnbWVudHM6IDEsXG4gICAgaGVpZ2h0U2VnbWVudHM6IDEsXG4gICAgZGVwdGhTZWdtZW50czogMVxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsnd2lkdGgnLCAnaGVpZ2h0JywgJ2RlcHRoJywgJ3dpZHRoU2VnbWVudHMnLCAnaGVpZ2h0U2VnbWVudHMnLCAnZGVwdGhTZWdlbWVudHMnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBDaXJjbGVcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEFzIHRvbGQgb24gQ29tcG9uZW50IGRlZmluaXRpb24sIHdoaWxlIHlvdSBjYW4gcGFzcyBhbnkgb2YgdGhlIGluaGVyaXRlZCBwYXJhbXMgZm9yIHRoaXMgY29tcG9uZW50IGNvbnN0cnVjdGlvbiwgeW91IHdpbGwgbmVlZCB0b1xuICogcGFzcyBzcGVjaWZpYyBwYXJhbWV0ZXJzIHRvIGJ1aWxkIHRoaXMgbWVzaCBhcyBhIGdlb21ldHJ5IG9iamVjdC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjQ2lyY2xlR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIENpcmNsZSwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiAgbmV3IENpcmNsZSh7XG4gKiAgICBnZW9tZXRyeToge1xuICogICAgICByYWRpdXM6IDQsXG4gKiAgICAgIHNlZ21lbnRzOiAxNlxuICogICAgfSxcbiAqXG4gKiAgICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgICB9KSxcbiAqXG4gKiAgICBwb3NpdGlvbjogWzUwLCA2MCwgNzBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBDaXJjbGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5DaXJjbGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogNTAsXG4gICAqICAgICBzZWdtZW50czogOCxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5DaXJjbGUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ3NlZ21lbnRzJywgJ3RoZXRhU3RhcnQnLCAndGhldGFMZW5ndGgnXVxuICAgKi9cbiAgZnVuY3Rpb24gQ2lyY2xlKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2lyY2xlKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQ2lyY2xlKS5jYWxsKHRoaXMsIHBhcmFtcywgQ2lyY2xlLmRlZmF1bHRzLCBDaXJjbGUuaW5zdHJ1Y3Rpb25zKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5DaXJjbGVcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhDaXJjbGUsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyAocGFyYW1zLmJ1ZmZlciA/IENpcmNsZUJ1ZmZlckdlb21ldHJ5IDogQ2lyY2xlR2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsIHBhcmFtcy5nZW9tZXRyeS5zZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5LnRoZXRhU3RhcnQsIHBhcmFtcy5nZW9tZXRyeS50aGV0YUxlbmd0aCk7XG4gICAgICByZXR1cm4gZ2VvbWV0cnk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQ2lyY2xlLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIENpcmNsZTtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhDaXJjbGUsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgcmFkaXVzOiA1MCxcbiAgICBzZWdtZW50czogOCxcbiAgICB0aGV0YVN0YXJ0OiAwLFxuICAgIHRoZXRhTGVuZ3RoOiBNYXRoLlBJICogMlxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ3NlZ21lbnRzJywgJ3RoZXRhU3RhcnQnLCAndGhldGFMZW5ndGgnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBDb25lXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBIGN5bGluZGVyIGlzIG9uZSBvZiB0aGUgbW9zdCBiYXNpYyBjdXJ2aWxpbmVhciBnZW9tZXRyaWMgc2hhcGVzLCB0aGUgc3VyZmFjZSBmb3JtZWQgYnkgdGhlIHBvaW50cyBhdCBhIGZpeGVkIGRpc3RhbmNlIGZyb20gYSBnaXZlbiBzdHJhaWdodCBsaW5lLCB0aGUgYXhpcyBvZiB0aGUgY3lsaW5kZXIuIDxici8+PGJyLz5cbiAqIFRoZSBzb2xpZCBlbmNsb3NlZCBieSB0aGlzIHN1cmZhY2UgYW5kIGJ5IHR3byBwbGFuZXMgcGVycGVuZGljdWxhciB0byB0aGUgYXhpcyBpcyBhbHNvIGNhbGxlZCBhIGN5bGluZGVyLjxici8+XG4gKiBUaGUgc3VyZmFjZSBhcmVhIGFuZCB0aGUgdm9sdW1lIG9mIGEgY3lsaW5kZXIgaGF2ZSBiZWVuIGtub3duIHNpbmNlIGRlZXAgYW50aXF1aXR5LlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNDb25lR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIENvbmUsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IENvbmUoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1c1RvcDogMixcbiAqICAgICByYWRpdXNCb3R0b206IDQsXG4gKiAgICAgaGVpZ2h0OiA1XG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3M6IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBDb25lID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQ29uZSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzOiAyMCxcbiAgICogICAgIGhlaWdodDogMTAwLFxuICAgKiAgICAgcmFkaXVzU2VnbWVudHM6IDMyLFxuICAgKiAgICAgaGVpZ2h0U2VnbWVudHM6IDEsXG4gICAqICAgICBvcGVuRW5kZWQ6IGZhbHNlLFxuICAgKiAgICAgdGhldGFTdGFydDogMCxcbiAgICogICAgIHRoZXRhTGVuZ3RoOiBNYXRoLlBJICogMlxuICAgKiAgIH1cbiAgICogfTwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkNvbmUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICogZ2VvbWV0cnk6IFtcbiAgICogICAncmFkaXVzJyxcbiAgICogICAnaGVpZ2h0JyxcbiAgICogICAncmFkaXVzU2VnbWVudHMnLFxuICAgKiAgICdoZWlnaHRTZWdtZW50cycsXG4gICAqICAgJ29wZW5FbmRlZCcsXG4gICAqICAgJ3RoZXRhU3RhcnQnLFxuICAgKiAgICd0aGV0YUxlbmd0aCdcbiAgICogXVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIENvbmUoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb25lKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKENvbmUpLmNhbGwodGhpcywgcGFyYW1zLCBDb25lLmRlZmF1bHRzLCBDb25lLmluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgX3RoaXMuYnVpbGQocGFyYW1zKTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihDb25lLnByb3RvdHlwZSksIFwid3JhcFwiLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKS5jYWxsKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkNvbmVcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhDb25lLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBDb25lQnVmZmVyR2VvbWV0cnkgOiBDb25lR2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHQsIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXNTZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5LmhlaWdodFNlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkub3BlbkVuZGVkLCBwYXJhbXMuZ2VvbWV0cnkudGhldGFTdGFydCwgcGFyYW1zLmdlb21ldHJ5LnRoZXRhTGVuZ3RoKTtcbiAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhDb25lLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIENvbmU7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoQ29uZSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICByYWRpdXM6IDIwLFxuICAgIGhlaWdodDogMTAwLFxuICAgIHJhZGl1c1NlZ21lbnRzOiAzMixcbiAgICBoZWlnaHRTZWdtZW50czogMSxcbiAgICBvcGVuRW5kZWQ6IGZhbHNlLFxuICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAgdGhldGFMZW5ndGg6IE1hdGguUEkgKiAyXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWydyYWRpdXMnLCAnaGVpZ2h0JywgJ3JhZGl1c1NlZ21lbnRzJywgJ2hlaWdodFNlZ21lbnRzJywgJ29wZW5FbmRlZCcsICd0aGV0YVN0YXJ0JywgJ3RoZXRhTGVuZ3RoJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgQ3lsaW5kZXJcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEEgY3lsaW5kZXIgaXMgb25lIG9mIHRoZSBtb3N0IGJhc2ljIGN1cnZpbGluZWFyIGdlb21ldHJpYyBzaGFwZXMsIHRoZSBzdXJmYWNlIGZvcm1lZCBieSB0aGUgcG9pbnRzIGF0IGEgZml4ZWQgZGlzdGFuY2UgZnJvbSBhIGdpdmVuIHN0cmFpZ2h0IGxpbmUsIHRoZSBheGlzIG9mIHRoZSBjeWxpbmRlci4gPGJyLz48YnIvPlxuICogVGhlIHNvbGlkIGVuY2xvc2VkIGJ5IHRoaXMgc3VyZmFjZSBhbmQgYnkgdHdvIHBsYW5lcyBwZXJwZW5kaWN1bGFyIHRvIHRoZSBheGlzIGlzIGFsc28gY2FsbGVkIGEgY3lsaW5kZXIuPGJyLz5cbiAqIFRoZSBzdXJmYWNlIGFyZWEgYW5kIHRoZSB2b2x1bWUgb2YgYSBjeWxpbmRlciBoYXZlIGJlZW4ga25vd24gc2luY2UgZGVlcCBhbnRpcXVpdHkuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI0N5bGluZGVyR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIEN5bGluZGVyLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBDeWxpbmRlcih7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzVG9wOiAyLFxuICogICAgIHJhZGl1c0JvdHRvbTogNCxcbiAqICAgICBoZWlnaHQ6IDVcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvczogWzAsIDEwMCwgMF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIEN5bGluZGVyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQ3lsaW5kZXIjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1c1RvcDogMjAsXG4gICAqICAgICByYWRpdXNCb3R0b206IDIwLFxuICAgKiAgICAgaGVpZ2h0OiAxMDAsXG4gICAqICAgICByYWRpdXNTZWdtZW50czogMzIsXG4gICAqICAgICBoZWlnaHRTZWdtZW50czogMSxcbiAgICogICAgIG9wZW5FbmRlZDogZmFsc2UsXG4gICAqICAgICB0aGV0YVN0YXJ0OiAwLFxuICAgKiAgICAgdGhldGFMZW5ndGg6IE1hdGguUEkgKiAyXG4gICAqICAgfVxuICAgKiB9PC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQ3lsaW5kZXIjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICogZ2VvbWV0cnk6IFtcbiAgICogICAncmFkaXVzVG9wJyxcbiAgICogICAncmFkaXVzQm90dG9tJyxcbiAgICogICAnaGVpZ2h0JyxcbiAgICogICAncmFkaXVzU2VnbWVudHMnLFxuICAgKiAgICdoZWlnaHRTZWdtZW50cycsXG4gICAqICAgJ29wZW5FbmRlZCcsXG4gICAqICAgJ3RoZXRhU3RhcnQnLFxuICAgKiAgICd0aGV0YUxlbmd0aCdcbiAgICogXVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIEN5bGluZGVyKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ3lsaW5kZXIpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQ3lsaW5kZXIpLmNhbGwodGhpcywgcGFyYW1zLCBDeWxpbmRlci5kZWZhdWx0cywgQ3lsaW5kZXIuaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICBfdGhpcy5idWlsZChwYXJhbXMpO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKEN5bGluZGVyLnByb3RvdHlwZSksIFwid3JhcFwiLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKS5jYWxsKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkN5bGluZGVyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQ3lsaW5kZXIsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyAocGFyYW1zLmJ1ZmZlciA/IEN5bGluZGVyQnVmZmVyR2VvbWV0cnkgOiBDeWxpbmRlckdlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkucmFkaXVzVG9wLCBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzQm90dG9tLCBwYXJhbXMuZ2VvbWV0cnkuaGVpZ2h0LCBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzU2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHRTZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5Lm9wZW5FbmRlZCwgcGFyYW1zLmdlb21ldHJ5LnRoZXRhU3RhcnQsIHBhcmFtcy5nZW9tZXRyeS50aGV0YUxlbmd0aCk7XG4gICAgICByZXR1cm4gZ2VvbWV0cnk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQ3lsaW5kZXIsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gQ3lsaW5kZXI7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoQ3lsaW5kZXIsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgcmFkaXVzVG9wOiAwLFxuICAgIHJhZGl1c0JvdHRvbTogMSxcbiAgICBoZWlnaHQ6IDEsXG4gICAgcmFkaXVzU2VnbWVudHM6IDMyLFxuICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgIG9wZW5FbmRlZDogZmFsc2UsXG4gICAgdGhldGFTdGFydDogMCxcbiAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3JhZGl1c1RvcCcsICdyYWRpdXNCb3R0b20nLCAnaGVpZ2h0JywgJ3JhZGl1c1NlZ21lbnRzJywgJ2hlaWdodFNlZ21lbnRzJywgJ29wZW5FbmRlZCcsICd0aGV0YVN0YXJ0JywgJ3RoZXRhTGVuZ3RoJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgRG9kZWNhaGVkcm9uXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBJbiBnZW9tZXRyeSwgYSBkb2RlY2FoZWRyb24gaXMgYW55IHBvbHloZWRyb24gd2l0aCB0d2VsdmUgZmxhdCBmYWNlcy4gPGJyLz48YnIvPlxuICogVGhlIG1vc3QgZmFtaWxpYXIgZG9kZWNhaGVkcm9uIGlzIHRoZSByZWd1bGFyIGRvZGVjYWhlZHJvbiwgd2hpY2ggaXMgYSBQbGF0b25pYyBzb2xpZC4gPGJyLz5cbiAqIFRoZXJlIGFyZSBhbHNvIHRocmVlIHJlZ3VsYXIgc3RhciBkb2RlY2FoZWRyYSwgd2hpY2ggYXJlIGNvbnN0cnVjdGVkIGFzIHN0ZWxsYXRpb25zIG9mIHRoZSBjb252ZXggZm9ybS4gPGJyLz5cbiAqIEFsbCBvZiB0aGVzZSBoYXZlIGljb3NhaGVkcmFsIHN5bW1ldHJ5LCBvcmRlciAxMjAuXG4gKiBEb2RlY2FoZWRyb24gY3JlYXRlcyBEb2RlY2FoZWRyb24gb2JqZWN0IGJ5IGl0J3MgcmFkaXVzIGFuZCBkZXRhaWwuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI0RvZGVjYWhlZHJvbkdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBEb2RlY2FoZWRyb24sIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IERvZGVjYWhlZHJvbih7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHk6IDEwXG4gKiAgIH1cbiAgKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBEb2RlY2FoZWRyb24gPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Eb2RlY2FoZWRyb24jZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiBnZW9tZXRyeToge1xuICAgKiAgIHJhZGl1czogMSxcbiAgICogICBkZXRhaWw6IDBcbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Eb2RlY2FoZWRyb24jaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICogZ2VvbWV0cnk6IFsncmFkaXVzJywgJ2RldGFpbCddXG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gRG9kZWNhaGVkcm9uKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRG9kZWNhaGVkcm9uKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKERvZGVjYWhlZHJvbikuY2FsbCh0aGlzLCBwYXJhbXMsIERvZGVjYWhlZHJvbi5kZWZhdWx0cywgRG9kZWNhaGVkcm9uLmluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgX3RoaXMuYnVpbGQocGFyYW1zKTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihEb2RlY2FoZWRyb24ucHJvdG90eXBlKSwgXCJ3cmFwXCIsIGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLmNhbGwoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuRG9kZWNhaGVkcm9uXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoRG9kZWNhaGVkcm9uLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkgOiBEb2RlY2FoZWRyb25HZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LnJhZGl1cywgcGFyYW1zLmdlb21ldHJ5LmRldGFpbCk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoRG9kZWNhaGVkcm9uLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIERvZGVjYWhlZHJvbjtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhEb2RlY2FoZWRyb24sIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgcmFkaXVzOiAxLFxuICAgIGRldGFpbDogMFxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ2RldGFpbCddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIEV4dHJ1ZGVcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEV4dHJ1ZGUgZ2VvbWV0cnkgbWVhbnMgdGhhdCB5b3UgY2FuIGNyZWF0ZSBhIDNEIG1lc2ggZnJvbSBhbnkgMkQgc2hhcGUgdXNpbmcgdGhyZWUuanMgZ2VvbWV0cnkgYmFzZWQgb24gPGEgaHJlZj0naHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzLyNhcGkvbWF0aC9WZWN0b3IyJz5USFJFRS5WZWN0b3IyLjwvYT4gPGJyLz5cbiAqIFN1Y2ggaW1wbGVtZW50YXRpb24gd2lsbCBoZWxwIHlvdSB0byBtYWtlIHZvbHVtZWQgc2hhcGVzIHRoYXQgaGF2ZSB0aGVpciBvd24gZGVwdGggYW5kIGNhbiBiZSBzZWVuIGZyb20gYWxsIGFuZ2Vscy48YnIvPjxici8+XG4gKiBZb3UgY2FuIGFsc28gZmluZCBzb21lIGludGVyZXN0aW5nIGV4YW1wbGVzIG1hZGUgdXNpbmcgPGEgaHJlZj0ndGhyZWVqcy5vcmcnPnRocmVlLmpzPC9hPiB3aGljaCBpcyBhIGNvcmUgb2Ygd2hzLmpzLCBzdWNoIGFzOlxuICogLSA8YSBocmVmPSdodHRwOi8vdGhyZWVqcy5vcmcvZXhhbXBsZXMvd2ViZ2xfZ2VvbWV0cnlfZXh0cnVkZV9zaGFwZXMuaHRtbCc+V2ViZ2wgZ2VvbWV0cnkgZXh0cnVkZTwvYT5cbiAqIC0gPGEgaHJlZj0naHR0cDovL3RocmVlanMub3JnL2V4YW1wbGVzL3dlYmdsX2dlb21ldHJ5X2V4dHJ1ZGVfc2hhcGVzMi5odG1sJz5FeHRydWRlIHNoYXBlcyBmcm9tIGdlb2RhdGE8L2E+XG4gKiAtIDxhIGhyZWY9J2h0dHA6Ly90aHJlZWpzLm9yZy9leGFtcGxlcy93ZWJnbF9nZW9tZXRyeV9leHRydWRlX3NwbGluZXMuaHRtbCc+RXh0cnVkZSBzcGxpbmVzPC9hPlxuICpcbiAqIFN1Y2ggZXhhbXBsZXMgY2FuIGJlIGVhc2lseSBpbXBsZW1lbnRlZCB1c2luZyB3aGl0ZXN0b3JtLmpzIG9yIGl0J3MgcGx1Z2lucy4gVXNlIGBFeHRydWRlYCBjbGFzcyB3aXRoIDxhIGhyZWY9J2h0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy8jYXBpL2V4dHJhcy9jb3JlL1NoYXBlJz5USFJFRS5TaGFwZTwvYT4gdG8gZ2V0IGV4dHJ1ZGUgZWZmZWN0IG9mIHNoYXBlIGRlZmluZWQgYnkgMkQgdmVjdG9ycy5cbiAqIFRoaXMgY2xhc3MgaXMgc2ltaWxhciB0byA8YSBocmVmPSdodHRwczovL3RocmVlanMub3JnL2RvY3MvI2FwaS9nZW9tZXRyaWVzL0V4dHJ1ZGVHZW9tZXRyeSc+VEhSRUUuRXh0cnVkZUdlb21ldHJ5PC9hPixcbiAqIGJ1dCBpdCBhbHNvIGNvbnRhaW5zIGFsbCBwcm9wZXJ0aWVzLCBhcHBsaWVkIGJ5IGBTaGFwZWAsIHN1Y2ggYXMgbWF0ZXJpYWwsIG1hc3MgYW5kIHZlY3RvcnMgbGlrZSBwb3NpdGlvbiAocG9zKSBhbmQgcm90YXRpb24gKHJvdCkuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI0V4dHJ1ZGVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgc2hhcGUsIHRoZW4gYW4gRXh0cnVkZSBmcm9tIGl0PC9jYXB0aW9uPlxuICogY29uc3Qgc2hhcGUgPSBuZXcgVEhSRUUuU2hhcGUoW1xuICogICBuZXcgVEhSRUUuVmVjdG9yMigtNCwtNCksXG4gKiAgIG5ldyBUSFJFRS5WZWN0b3IyKC0yLDApLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMigtNCw0KSxcbiAqICAgbmV3IFRIUkVFLlZlY3RvcjIoMCwyKSxcbiAqICAgbmV3IFRIUkVFLlZlY3RvcjIoNCw0KSxcbiAqICAgbmV3IFRIUkVFLlZlY3RvcjIoMiwwKSxcbiAqICAgbmV3IFRIUkVFLlZlY3RvcjIoNCwtNCksXG4gKiAgIG5ldyBUSFJFRS5WZWN0b3IyKDAsLTIpXG4gKiBdKTtcbiAqXG4gKiBjb25zdCBleHRydWRlID0gbmV3IEV4dHJ1ZGUoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHNoYXBlczogc2hhcGUsXG4gKiAgICAgb3B0aW9uczoge1xuICogICAgICAgYmV2ZWxFbmFibGVkOiBmYWxzZSxcbiAqICAgICAgIGJldmVsU2l6ZTogMCxcbiAqICAgICAgIGFtb3VudDogMlxuICogICAgIH1cbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAwXVxuICogfSk7XG4gKlxuICogZXh0cnVkZS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBFeHRydWRlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuRXh0cnVkZSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgc2hhcGVzOiBbXSxcbiAgICogICAgIG9wdGlvbnM6IHt9XG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkV4dHJ1ZGUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbJ3NoYXBlcycsICdvcHRpb25zJ11cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIEV4dHJ1ZGUoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBFeHRydWRlKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEV4dHJ1ZGUpLmNhbGwodGhpcywgcGFyYW1zLCBFeHRydWRlLmRlZmF1bHRzLCBFeHRydWRlLmluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgX3RoaXMuYnVpbGQocGFyYW1zKTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihFeHRydWRlLnByb3RvdHlwZSksIFwid3JhcFwiLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKS5jYWxsKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkV4dHJ1ZGVcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhFeHRydWRlLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgRXh0cnVkZUdlb21ldHJ5KHBhcmFtcy5nZW9tZXRyeS5zaGFwZXMsIHBhcmFtcy5nZW9tZXRyeS5vcHRpb25zKTtcbiAgICAgIHJldHVybiBwYXJhbXMuYnVmZmVyID8gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuZnJvbUdlb21ldHJ5KGdlb21ldHJ5KSA6IGdlb21ldHJ5O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEV4dHJ1ZGUsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gRXh0cnVkZTtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhFeHRydWRlLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHNoYXBlczogW10sXG4gICAgb3B0aW9uczoge31cbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3NoYXBlcycsICdvcHRpb25zJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgSWNvc2FoZWRyb25cbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEluIGdlb21ldHJ5LCBhbiBpY29zYWhlZHJvbiBpcyBhIHBvbHloZWRyb24gd2l0aCAyMCBmYWNlcy48YnIvPlxuICogVGhlcmUgYXJlIG1hbnkga2luZHMgb2YgaWNvc2FoZWRyYSwgd2l0aCBzb21lIGJlaW5nIG1vcmUgc3ltbWV0cmljYWwgdGhhbiBvdGhlcnMuIFRoZSBtb3N0IHdlbGwga25vd24gaXMgdGhlIFBsYXRvbmljLCBjb252ZXggcmVndWxhciBpY29zYWhlZHJvbi48YnIvPlxuICogYEljb3NhaGVkcm9uYCBjcmVhdGVzIGFuIEljb3NhaGVkcm9uIG9iamVjdCBieSBpdHMgcmFkaXVzIGFuZCBkZXRhaWwuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI0ljb3NhaGVkcm9uR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIEljb3NhaGVkcm9uLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBJY29zYWhlZHJvbih7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyLFxuICogICAgIGRldGFpbDogMVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBJY29zYWhlZHJvbiA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkljb3NhaGVkcm9uI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICByYWRpdXM6IDEsXG4gICAqICAgICBkZXRhaWw6IDBcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5JY29zYWhlZHJvbiNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCB7Z2VvbWV0cnk6IFsncmFkaXVzJywgJ2RldGFpbCddfVxuICAgKi9cbiAgZnVuY3Rpb24gSWNvc2FoZWRyb24oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBJY29zYWhlZHJvbik7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihJY29zYWhlZHJvbikuY2FsbCh0aGlzLCBwYXJhbXMsIEljb3NhaGVkcm9uLmRlZmF1bHRzLCBJY29zYWhlZHJvbi5pbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIF90aGlzLmJ1aWxkKHBhcmFtcyk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoSWNvc2FoZWRyb24ucHJvdG90eXBlKSwgXCJ3cmFwXCIsIGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLmNhbGwoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuSWNvc2FoZWRyb25cbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhJY29zYWhlZHJvbiwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIG5ldyAocGFyYW1zLmJ1ZmZlciA/IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkgOiBJY29zYWhlZHJvbkdlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLCBwYXJhbXMuZ2VvbWV0cnkuZGV0YWlsKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhJY29zYWhlZHJvbiwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBJY29zYWhlZHJvbjtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhJY29zYWhlZHJvbiwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICByYWRpdXM6IDEsXG4gICAgZGV0YWlsOiAwXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWydyYWRpdXMnLCAnZGV0YWlsJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgTGF0aGVcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEEgYExhdGhlR2VvbWV0cnlgIGFsbG93cyB5b3UgdG8gY3JlYXRlIHNoYXBlcyBmcm9tIGEgc21vb3RoIGN1cnZlLlxuICogVGhpcyBjdXJ2ZSBpcyBkZWZpbmVkIGJ5IGEgbnVtYmVyIG9mIHBvaW50cyAoYWxzbyBjYWxsZWQga25vdHMpIGFuZCBpcyBtb3N0IG9mdGVuIGNhbGxlZCBhIHNwbGluZS4gVGhpcyBzcGxpbmUgaXMgcm90YXRlZCBhcm91bmQgYSBmaXhlZCBwb2ludCBhbmQgcmVzdWx0cyBpbiB2YXNlLSBhbmQgYmVsbC1saWtlIHNoYXBlcy48YnIvPjxici8+XG4gKiBJbiAzRCBjb21wdXRlciBncmFwaGljcywgYSBsYXRoZWQgb2JqZWN0IGlzIGEgM0QgbW9kZWwgd2hvc2UgdmVydGV4IGdlb21ldHJ5IGlzIHByb2R1Y2VkIGJ5IHJvdGF0aW5nIHRoZSBwb2ludHMgb2YgYSBzcGxpbmUgb3Igb3RoZXIgcG9pbnQgc2V0IGFyb3VuZCBhIGZpeGVkIGF4aXMuXG4gKiBUaGUgbGF0aGluZyBtYXkgYmUgcGFydGlhbDsgdGhlIGFtb3VudCBvZiByb3RhdGlvbiBpcyBub3QgbmVjZXNzYXJpbHkgYSBmdWxsIDM2MCBkZWdyZWVzLlxuICogVGhlIHBvaW50IHNldCBwcm92aWRpbmcgdGhlIGluaXRpYWwgc291cmNlIGRhdGEgY2FuIGJlIHRob3VnaHQgb2YgYXMgYSBjcm9zcyBzZWN0aW9uIHRocm91Z2ggdGhlIG9iamVjdCBhbG9uZyBhIHBsYW5lIGNvbnRhaW5pbmcgaXRzIGF4aXMgb2YgcmFkaWFsIHN5bW1ldHJ5LiA8YnIvPjxici8+XG4gKiBUaGUgPGEgaHJlZj0naHR0cDovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNMYXRoZUdlb21ldHJ5Jz5mb2xsb3dpbmcgZXhhbXBsZTwvYT4gc2hvd3MgYSBnZW9tZXRyeSB3aGljaCBjYW4gYmUgZ2VuZXJhdGVkIHVzaW5nIGBMYXRoZWAgY2xhc3MuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI0xhdGhlR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIExhdGgsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogY29uc3QgcG9pbnRzID0gW107XG4gKlxuICogZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gKiAgIHBvaW50cy5wdXNoKFxuICogICAgIG5ldyBUSFJFRS5WZWN0b3IyKFxuICogICAgICAgKE1hdGguc2luKGkgKiAwLjcpICogMTUgKyA1MCkgLyAxMCxcbiAqICAgICAgIChpIC0gNSkgKiAwLjJcbiAqICAgICApXG4gKiAgICk7XG4gKiB9XG4gKlxuICogY29uc3QgbGF0aGUgPSBuZXcgTGF0aGUoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHBvaW50czogcG9pbnRzXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3NpdGlvbjogWzAsIDUwLCAxMF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIExhdGhlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuTGF0aGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHBvaW50czogW11cbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuTGF0aGUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT57XG4gICAqICAgZ2VvbWV0cnk6IFsncG9pbnRzJ11cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIExhdGhlKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgTGF0aGUpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoTGF0aGUpLmNhbGwodGhpcywgcGFyYW1zLCBMYXRoZS5kZWZhdWx0cywgTGF0aGUuaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICBfdGhpcy5idWlsZChwYXJhbXMpO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKExhdGhlLnByb3RvdHlwZSksIFwid3JhcFwiLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKS5jYWxsKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkxhdGhlXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoTGF0aGUsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiBuZXcgKHBhcmFtcy5idWZmZXIgPyBMYXRoZUJ1ZmZlckdlb21ldHJ5IDogTGF0aGVHZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LnBvaW50cyk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoTGF0aGUsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gTGF0aGU7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoTGF0aGUsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgcG9pbnRzOiBbXVxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsncG9pbnRzJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgTGluZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gTGluZSBjb21wb25lbnQgaXMgZ2VuZXJhdGVkIGZyb20gYSBjdXJ2ZS9saW5lIGFuZCBhbW91bnQgb2YgdmVjdG9ycyB0aGF0IHNob3VsZCBiZSB1c2VkIChwb2ludHMpLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgTGluZSwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgTGluZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgY3VydmU6IG5ldyBUSFJFRS5MaW5lQ3VydmUzKG5ldyBUSFJFRS5WZWN0b3IzKDEwLCAxMCwgMCksIG5ldyBUSFJFRS5WZWN0b3IzKDEwLCAzMCwgMCkpXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSlcbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIExpbmUkMSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkxpbmUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgY3VydmU6IG5ldyBMaW5lQ3VydmUzKG5ldyBWZWN0b3IzKDAsIDAsIDApLCBuZXcgVmVjdG9yMygxMCwgMCwgMCkpLFxuICAgKiAgIHBvaW50czogNTBcbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5MaW5lI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+e1xuICAgKiAgIGdlb21ldHJ5OiBbJ2N1cnZlJywgJ3BvaW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBMaW5lJCQxKHBhcmFtcykge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIExpbmUkJDEpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihMaW5lJCQxKS5jYWxsKHRoaXMsIHBhcmFtcywgTGluZSQkMS5kZWZhdWx0cywgTGluZSQkMS5pbnN0cnVjdGlvbnMpKTtcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkxpbmVcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhMaW5lJCQxLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IExpbmUoZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB2YXIgZ2VvbWV0cnkgPSBwYXJhbXMuYnVmZmVyID8gbmV3IEJ1ZmZlckdlb21ldHJ5KCkgOiBuZXcgR2VvbWV0cnkoKTtcblxuICAgICAgaWYgKHBhcmFtcy5idWZmZXIpIHtcbiAgICAgICAgdmFyIHBwID0gcGFyYW1zLmN1cnZlLmdldFBvaW50cyhwYXJhbXMucG9pbnRzKTtcbiAgICAgICAgdmFyIHZlcnRzID0gbmV3IEZsb2F0MzJBcnJheShwcC5sZW5ndGggKiAzKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbWF4ID0gcHAubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgICAgICB2YXIgaTMgPSBpICogMztcbiAgICAgICAgICB2ZXJ0c1tpM10gPSBwcFtpXS54O1xuICAgICAgICAgIHZlcnRzW2kzICsgMV0gPSBwcFtpXS55O1xuICAgICAgICAgIHZlcnRzW2kzICsgMl0gPSBwcFtpXS56O1xuICAgICAgICB9XG5cbiAgICAgICAgZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCdwb3NpdGlvbicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUodmVydHMsIDMpKTtcbiAgICAgIH0gZWxzZSBnZW9tZXRyeS52ZXJ0aWNlcyA9IHBhcmFtcy5jdXJ2ZS5nZXRQb2ludHMocGFyYW1zLnBvaW50cyk7XG5cbiAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhMaW5lJCQxLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIExpbmUkJDE7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoTGluZSQxLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBjdXJ2ZTogbnVsbCxcbiAgcG9pbnRzOiA1MFxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ2N1cnZlJywgJ3BvaW50cyddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIEltcG9ydGVyXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBJbXBvcnRlciBpcyBhIGxvYWRlciBmb3IgbWVzaGVzIGFuZCBhbnkgb3RoZXIgZGF0YSB0byB5b3VyIHNjZW5lXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBJbXBvcnRlciwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgSW1wb3J0ZXIoe1xuICogICBsb2FkZXI6IG5ldyBUSFJFRS5PQkpMb2FkZXIoKSxcbiAqXG4gKiAgIHBhcnNlcihnZW9tZXRyeSwgbWF0ZXJpYWwpIHsgLy8gZGF0YSBmcm9tIGxvYWRlclxuICogICAgIHJldHVybiBuZXcgVEhSRUUuTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpOyAvLyBzaG91bGQgcmV0dXJuIHlvdXIgLm5hdGl2ZSAobWVzaCBpbiB0aGlzIGNhc2UpXG4gKiAgIH0sXG4gKlxuICogICBwb3NpdGlvbjogWzAsIDEwMCwgMF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIEltcG9ydGVyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICBjcmVhdGVDbGFzcyhJbXBvcnRlciwgbnVsbCwgW3tcbiAgICBrZXk6IFwiZmlsdGVyXCIsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkltcG9ydGVyI2RlZmF1bHRzXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBkZWZhdWx0IDxwcmU+XG4gICAgICoge1xuICAgICAqICAgdXJsOiAnJyxcbiAgICAgKiAgIGxvYWRlcjogbmV3IEpTT05Mb2FkZXIoKSxcbiAgICAgKlxuICAgICAqICAgb25Mb2FkKCkge30sXG4gICAgICogICBvblByb2dyZXNzKCkge30sXG4gICAgICogICBvbkVycm9yKCkge30sXG4gICAgICpcbiAgICAgKiAgIHRleHR1cmVQYXRoOiBudWxsLFxuICAgICAqICAgdXNlQ3VzdG9tTWF0ZXJpYWw6IGZhbHNlLFxuICAgICAqXG4gICAgICogICBwYXJzZXIoZ2VvbWV0cnksIG1hdGVyaWFscykge1xuICAgICAqICAgICByZXR1cm4gbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFscyk7XG4gICAgICogICB9XG4gICAgICogfTwvcHJlPlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBmaWx0ZXJcbiAgICAgKiBAZGVzY3JpcHRpb24gRGVmYXVsdCB2YWx1ZXMgZm9yIGZpbHRlclxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAcGFyYW0ge1RIUkVFLk1lc2h9IG9iamVjdCBJbnN0YW5jZSBmb3IgaXRlcmF0aW5nIHRocm91Z2ggaXQncyBjaGlsZHJlbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaWx0ZXIgRnVuY3Rpb24gd2l0aCBjaGlsZCBhcyBhcmd1bWVudCwgc2hvdWxkIHJldHVybiBhIGJvb2xlYW4gd2hldGhlciBpbmNsdWRlIHRoZSBjaGlsZCBvciBub3QuXG4gICAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gb2JqZWN0IHdpdGggY2hpbGRyZW5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkltcG9ydGVyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+UmVtb3ZpbmcgdW5uZWNlc3NhcnkgbGlnaHRzIGZyb20gY2hpbGRyZW48L2NhcHRpb24+XG4gICAgICogbmV3IEltcG9ydGVyKHtcbiAgICAgKiAgIGxvYWRlcjogbmV3IFRIUkVFLk9CSkxvYWRlcigpLFxuICAgICAqXG4gICAgICogICBwYXJzZShncm91cCkgeyAvLyBkYXRhIGZyb20gbG9hZGVyXG4gICAgICogICAgIHJldHVybiBJbXBvcnRlci5maWx0ZXIoZ3JvdXAsIGNoaWxkID0+ICFjaGlsZC5pc0xpZ2h0KTsgLy8gcmVtb3ZlIGxpZ2h0c1xuICAgICAqICAgfSxcbiAgICAgKlxuICAgICAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gICAgICogfSkuYWRkVG8oYXBwKTtcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gZmlsdGVyKG9iamVjdCwgX2ZpbHRlcikge1xuICAgICAgdmFyIHByb2Nlc3NGaWx0ZXIgPSBmdW5jdGlvbiBwcm9jZXNzRmlsdGVyKG9iamVjdCkge1xuICAgICAgICBvYmplY3QuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoZWwsIGluZGV4KSB7XG4gICAgICAgICAgaWYgKGVsLmNoaWxkcmVuKSBwcm9jZXNzRmlsdGVyKGVsKTtcbiAgICAgICAgICBpZiAoIV9maWx0ZXIoZWwpKSBvYmplY3QuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcHJvY2Vzc0ZpbHRlcihvYmplY3QpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIEltcG9ydGVyKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW1wb3J0ZXIpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihJbXBvcnRlcikuY2FsbCh0aGlzLCBwYXJhbXMsIEltcG9ydGVyLmRlZmF1bHRzLCBJbXBvcnRlci5pbnN0cnVjdGlvbnMsIGZhbHNlKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5JbXBvcnRlclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEltcG9ydGVyLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIGlmIChwYXJhbXMudGV4dHVyZVBhdGgpIHBhcmFtcy5sb2FkZXIuc2V0VGV4dHVyZVBhdGgocGFyYW1zLnRleHR1cmVQYXRoKTtcbiAgICAgICAgcGFyYW1zLmxvYWRlci5sb2FkKHBhcmFtcy51cmwsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZGF0YSA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgIGRhdGFbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZ2VvbWV0cnksIG1hdGVyaWFsc1xuICAgICAgICAgIHBhcmFtcy5vbkxvYWQuYXBwbHkocGFyYW1zLCBkYXRhKTtcbiAgICAgICAgICB2YXIgb2JqZWN0ID0gcGFyYW1zLnBhcnNlci5hcHBseShfdGhpcywgZGF0YSk7XG4gICAgICAgICAgaWYgKHBhcmFtcy5tYXRlcmlhbCkgb2JqZWN0Lm1hdGVyaWFsID0gX3RoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgICAgIH0pLm1hdGVyaWFsO1xuICAgICAgICAgIHJlc29sdmUob2JqZWN0KTtcbiAgICAgICAgfSwgcGFyYW1zLm9uUHJvZ3Jlc3MsIHBhcmFtcy5vbkVycm9yKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEltcG9ydGVyLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIEltcG9ydGVyO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKEltcG9ydGVyLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICB1cmw6ICcnLFxuICBsb2FkZXI6IG5ldyBKU09OTG9hZGVyKCksXG4gIG9uTG9hZDogZnVuY3Rpb24gb25Mb2FkKCkge30sXG4gIG9uUHJvZ3Jlc3M6IGZ1bmN0aW9uIG9uUHJvZ3Jlc3MoKSB7fSxcbiAgLy8gVE9ETyBhZGQgb25Db21wbGV0ZT9cbiAgb25FcnJvcjogZnVuY3Rpb24gb25FcnJvcigpIHt9LFxuICB0ZXh0dXJlUGF0aDogbnVsbCxcbiAgdXNlQ3VzdG9tTWF0ZXJpYWw6IGZhbHNlLFxuICBwYXJzZXI6IGZ1bmN0aW9uIHBhcnNlcihnZW9tZXRyeSwgbWF0ZXJpYWwpIHtcbiAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIGdlb21ldHJ5OiBnZW9tZXRyeSxcbiAgICAgIG1hdGVyaWFsOiBtYXRlcmlhbFxuICAgIH0pLFxuICAgICAgICBnZW9tID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgIG1hdCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgbWVzaDogZ2VvbS5ib25lcyA/IG5ldyBTa2lubmVkTWVzaChnZW9tLCBtYXQpIDogbmV3IE1lc2goZ2VvbSwgbWF0KVxuICAgIH0pLm1lc2g7XG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucykpO1xuXG4vKipcbiAqIEBjbGFzcyBPY3RhaGVkcm9uXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBJbiBnZW9tZXRyeSwgYW4gb2N0YWhlZHJvbiBpcyBhIHBvbHloZWRyb24gd2l0aCBlaWdodCBmYWNlcy5cbiAqIEEgcmVndWxhciBvY3RhaGVkcm9uIGlzIGEgUGxhdG9uaWMgc29saWQgY29tcG9zZWQgb2YgZWlnaHQgZXF1aWxhdGVyYWwgdHJpYW5nbGVzLCBmb3VyIG9mIHdoaWNoIG1lZXQgYXQgZWFjaCB2ZXJ0ZXguXG4gKiA8YnIvPjxici8+XG4gKiBgT2N0YWhlZHJvbmAgY3JlYXRlcyBhbiBPY3RhaGVkcm9uIG9iamVjdCBieSBpdHMgYHJhZGl1c2AgYW5kIGBkZXRhaWxgLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNPY3RhaGVkcm9uR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhbiBPY3RhaGVkcm9uLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBPY3RhaGVkcm9uKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXM6IDIsXG4gKiAgICAgZGV0YWlsOiAxXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3NpdGlvbjogWzAsIDEwMCwgMF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIE9jdGFoZWRyb24gPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5PY3RhaGVkcm9uI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICByYWRpdXM6IDEsXG4gICAqICAgICBkZXRhaWw6IDBcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBPY3RhaGVkcm9uKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgT2N0YWhlZHJvbik7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihPY3RhaGVkcm9uKS5jYWxsKHRoaXMsIHBhcmFtcywgT2N0YWhlZHJvbi5kZWZhdWx0cywgT2N0YWhlZHJvbi5pbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIF90aGlzLmJ1aWxkKHBhcmFtcyk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoT2N0YWhlZHJvbi5wcm90b3R5cGUpLCBcIndyYXBcIiwgYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkuY2FsbChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5PY3RhaGVkcm9uXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoT2N0YWhlZHJvbiwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIG5ldyAocGFyYW1zLmJ1ZmZlciA/IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSA6IE9jdGFoZWRyb25HZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LnJhZGl1cywgcGFyYW1zLmdlb21ldHJ5LmRldGFpbCk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoT2N0YWhlZHJvbiwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBPY3RhaGVkcm9uO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhPY3RhaGVkcm9uLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHJhZGl1czogMSxcbiAgICBkZXRhaWw6IDBcbiAgfVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBQYXJhbWV0cmljXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBgUGFyYW1ldHJpY2AgZ2VuZXJhdGVzIGEgZ2VvbWV0cnkgcmVwcmVzZW50aW5nIGEgPGEgaHJlZj0naHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGFyYW1ldHJpY19zdXJmYWNlJz5QYXJhbWV0cmljIHN1cmZhY2U8L2E+XG4gKiA8YnIvPjxici8+XG4gKiBJdCBpcyB1c3VhbGx5IHVzZWQgdG8gZGV2ZWxvcCBkaWZmZXJlbnQga2luZHMgb2YgaGlnaGZpZWxkcyBvciB2aXN1YWxpemUgYSA8YSBocmVmPSdodHRwczovL3N0ZW1rb3NraS5naXRodWIuaW8vVGhyZWUuanMvR3JhcGh1bHVzLUZ1bmN0aW9uLmh0bWwnPm1hdGggZnVuY3Rpb248L2E+LlxuICogPGJyLz5cbiAqIC0gPGEgaHJlZj0naHR0cDovL21hdGguaHdzLmVkdS9ncmFwaGljc2Jvb2svc291cmNlL3RocmVlanMvY3VydmVzLWFuZC1zdXJmYWNlcy5odG1sJz5QYXJhbWV0cmljIHN1cmZhY2U8L2E+XG4gKiAtIDxhIGhyZWY9J2h0dHBzOi8vc3RlbWtvc2tpLmdpdGh1Yi5pby9UaHJlZS5qcy9HcmFwaHVsdXMtU3VyZmFjZS5odG1sJz5cIkdyYXBodWx1c1wiPC9hPlxuICogPGJyLz48YnIvPlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNQYXJhbWV0cmljR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5FeGFtcGxlIGNyZWF0aW5nIGFuIGhlaWdodGZpZWxkLWxpa2UgZ2VvbWV0cnkuIGB1YCBhbmQgYHZgIGFyZSBsaWtlIGB4YCBhbmQgYHlgIGluIHNoYXBlLCBidXQgdGhlaXIgdmFsdWVzIGFyZSBhbHdheXMgZnJvbSBgMGAgdG8gYDFgLlxuICogV2UgdXNlIHRoZW0gaW4gYFRIUkVFLlZlY3RvcjNgIGxpa2UgYHhgIGFuZCBgemAgYW5kIGBNYXRoLnJhbmRvbSgpICogNWAgZm9yIGB5YC48L2NhcHRpb24+XG4gKiBjb25zdCBjcmVhdGVQYXJhbWV0cmljID0gKHUsIHYpID0+IHtcbiAqICAgcmV0dXJuIG5ldyBUSFJFRS5WZWN0b3IzKHUgKiAzMCwgTWF0aC5yYW5kb20oKSAqIDUsIHYgKiAzMCk7XG4gKiB9XG4gKlxuICogbmV3IFBhcmFtZXRyaWMoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIGZ1bmM6IGNyZWF0ZVBhcmFtZXRyaWNcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmLFxuICogICAgIHNpZGU6IFRIUkVFLkRvdWJsZVNpZGVcbiAqICAgfSksXG4gKlxuICogICBwb3NpdGlvbjogWzAsIDEwMCwgLTEwMF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIFBhcmFtZXRyaWMgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5QYXJhbWV0cmljI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICBmdW5jOiAodSwgdikgPT4gbmV3IFZlY3RvcjModSwgdiwgMCksXG4gICAqICAgICBzbGljZXM6IDEwLFxuICAgKiAgICAgdGFja3M6IDEwXG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gUGFyYW1ldHJpYygpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBhcmFtZXRyaWMpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihQYXJhbWV0cmljKS5jYWxsKHRoaXMsIHBhcmFtcywgUGFyYW1ldHJpYy5kZWZhdWx0cywgUGFyYW1ldHJpYy5pbnN0cnVjdGlvbnMpKTtcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBhcmFtZXRyaWNcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhQYXJhbWV0cmljLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5IDogUGFyYW1ldHJpY0dlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkuZnVuYywgcGFyYW1zLmdlb21ldHJ5LnNsaWNlcywgcGFyYW1zLmdlb21ldHJ5LnN0YWNrcyk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoUGFyYW1ldHJpYywgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBQYXJhbWV0cmljO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhQYXJhbWV0cmljLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIGZ1bmM6IGZ1bmN0aW9uIGZ1bmModSwgdikge1xuICAgICAgcmV0dXJuIG5ldyBWZWN0b3IzKHUsIHYsIDApO1xuICAgIH0sXG4gICAgc2xpY2VzOiAxMCxcbiAgICBzdGFja3M6IDEwXG4gIH1cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgUGxhbmVcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIGBQbGFuZWAgaXMgdXNlZCBmb3IgY3JlYXRpbmcgcGxhbmVzIGdpdmVuIHNvbWUgYHdpZHRoYCBhbmQgYGhlaWdodGAuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1BsYW5lR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFBsYW5lLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBQbGFuZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgd2lkdGg6IDIwLFxuICogICAgIGhlaWdodDogMzBcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgUGxhbmUkMSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBsYW5lI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICB3aWR0aDogMTAsXG4gICAqICAgICBoZWlnaHQ6IDEwLFxuICAgKiAgICAgd1NlZ21lbnRzOiAxLFxuICAgKiAgICAgaFNlZ21lbnRzOiAxXG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBsYW5lI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWyd3aWR0aCcsICdoZWlnaHQnLCAnd1NlZ21lbnRzJywgJ2hTZWdtZW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBQbGFuZSQkMSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBsYW5lJCQxKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFBsYW5lJCQxKS5jYWxsKHRoaXMsIHBhcmFtcywgUGxhbmUkJDEuZGVmYXVsdHMsIFBsYW5lJCQxLmluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgX3RoaXMuYnVpbGQocGFyYW1zKTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihQbGFuZSQkMS5wcm90b3R5cGUpLCBcIndyYXBcIiwgYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkuY2FsbChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5QbGFuZVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFBsYW5lJCQxLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBQbGFuZUJ1ZmZlckdlb21ldHJ5IDogUGxhbmVHZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LndpZHRoLCBwYXJhbXMuZ2VvbWV0cnkuaGVpZ2h0LCBwYXJhbXMuZ2VvbWV0cnkud1NlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkuaFNlZ21lbnRzKTtcbiAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhQbGFuZSQkMSwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBQbGFuZSQkMTtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhQbGFuZSQxLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHdpZHRoOiAxMCxcbiAgICBoZWlnaHQ6IDEwLFxuICAgIHdTZWdtZW50czogMSxcbiAgICBoU2VnbWVudHM6IDFcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3dpZHRoJywgJ2hlaWdodCcsICd3U2VnbWVudHMnLCAnaFNlZ21lbnRzJ11cbn0pKTtcblxudmFyIHZlcnRpY2VzT2ZDdWJlID0gWy0xLCAtMSwgLTEsIDEsIC0xLCAtMSwgMSwgMSwgLTEsIC0xLCAxLCAtMSwgLTEsIC0xLCAxLCAxLCAtMSwgMSwgMSwgMSwgMSwgLTEsIDEsIDFdLFxuICAgIGluZGljZXNPZkZhY2VzID0gWzIsIDEsIDAsIDAsIDMsIDIsIDAsIDQsIDcsIDcsIDMsIDAsIDAsIDEsIDUsIDUsIDQsIDAsIDEsIDIsIDYsIDYsIDUsIDEsIDIsIDMsIDcsIDcsIDYsIDIsIDQsIDUsIDYsIDYsIDcsIDRdO1xuLyoqXG4gKiBAY2xhc3MgUG9seWhlZHJvblxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gSW4gZWxlbWVudGFyeSBnZW9tZXRyeSwgYSBwb2x5aGVkcm9uIGlzIGEgc29saWQgaW4gdGhyZWUgZGltZW5zaW9ucyB3aXRoIGZsYXQgcG9seWdvbmFsIGZhY2VzLCBzdHJhaWdodCBlZGdlcyBhbmQgc2hhcnAgY29ybmVycyBvciB2ZXJ0aWNlcy5cbiAqIDxici8+PGJyLz5cbiAqIGBQb2x5aGVkcm9uYCBjcmVhdGVzIGEgUG9seWhlZHJvbiBieSBpdHMgYHJhZGl1c2AgYW5kIGBkZXRhaWxgLlxuICogPGJyLz48YnIvPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGFuIFBvbHloZWRyb24sIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFBvbHloZWRyb24oe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1czogMixcbiAqICAgICBkZXRhaWw6IDFcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgUG9seWhlZHJvbiA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBvbHloZWRyb24jZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHZlcnRpY2VzT2ZDdWJlOiBbXG4gICAqICAgICAgIC0xLCAtMSwgLTEsIDEsIC0xLCAtMSwgMSwgMSwgLTEsIC0xLCAxLCAtMSxcbiAgICogICAgICAgLTEsIC0xLCAxLCAxLCAtMSwgMSwgMSwgMSwgMSwgLTEsIDEsIDFcbiAgICogICAgIF0sXG4gICAqXG4gICAqICAgICBpbmRpY2VzT2ZGYWNlczogW1xuICAgKiAgICAgICAyLCAxLCAwLCAwLCAzLCAyLFxuICAgKiAgICAgICAwLCA0LCA3LCA3LCAzLCAwLFxuICAgKiAgICAgICAwLCAxLCA1LCA1LCA0LCAwLFxuICAgKiAgICAgICAxLCAyLCA2LCA2LCA1LCAxLFxuICAgKiAgICAgICAyLCAzLCA3LCA3LCA2LCAyLFxuICAgKiAgICAgICA0LCA1LCA2LCA2LCA3LCA0XG4gICAqICAgICBdLFxuICAgKlxuICAgKiAgICAgcmFkaXVzOiA2LFxuICAgKiAgICAgZGV0YWlsOiAyXG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBvbHloZWRyb24jaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbJ3ZlcnRpY2VzT2ZDdWJlJywgJ2luZGljZXNPZkZhY2VzJywgJ3JhZGl1cycsICdkZXRhaWwnXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gUG9seWhlZHJvbigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBvbHloZWRyb24pO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoUG9seWhlZHJvbikuY2FsbCh0aGlzLCBwYXJhbXMsIFBvbHloZWRyb24uZGVmYXVsdHMsIFBvbHloZWRyb24uaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICBfdGhpcy5idWlsZChwYXJhbXMpO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKFBvbHloZWRyb24ucHJvdG90eXBlKSwgXCJ3cmFwXCIsIGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLmNhbGwoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUG9seWhlZHJvblxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFBvbHloZWRyb24sIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiBuZXcgKHBhcmFtcy5idWZmZXIgPyBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkgOiBQb2x5aGVkcm9uR2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS52ZXJ0aWNlc09mQ3ViZSwgcGFyYW1zLmdlb21ldHJ5LmluZGljZXNPZkZhY2VzLCBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLCBwYXJhbXMuZ2VvbWV0cnkuZGV0YWlsKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhQb2x5aGVkcm9uLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIFBvbHloZWRyb247XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKFBvbHloZWRyb24sIFwidmVydGljZXNPZkN1YmVcIiwgdmVydGljZXNPZkN1YmUpLCBcImluZGljZXNPZkZhY2VzXCIsIGluZGljZXNPZkZhY2VzKSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICB2ZXJ0aWNlc09mQ3ViZTogdmVydGljZXNPZkN1YmUsXG4gICAgaW5kaWNlc09mRmFjZXM6IGluZGljZXNPZkZhY2VzLFxuICAgIHJhZGl1czogNixcbiAgICBkZXRhaWw6IDJcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3ZlcnRpY2VzT2ZDdWJlJywgJ2luZGljZXNPZkZhY2VzJywgJ3JhZGl1cycsICdkZXRhaWwnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBSaW5nXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBSaW5nIGNsYXNzIGNyZWF0ZXMgYSBjaXJjbGUgb3IganVzdCAyRCBUb3J1cy4gRG9lcyBub3Qgc3VwcG9ydCBwaHlzaWNzLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNSaW5nR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFJpbmcsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFJpbmcoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIGlubmVyUmFkaXVzOiA1LFxuICogICAgIG91dGVyUmFkaXVzOiAyXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hMYW1iZXJ0TWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZixcbiAqICAgICBzaWRlIFRIUkVFLkRvdWJsZVNpZGVcbiAqICAgfSksXG4gKlxuICogICBwb3NpdGlvbjogWzAsIDgsIDBdLFxuICpcbiAqICAgcm90YXRpb246IHtcbiAqICAgICB4OiBNYXRoLlBJLzRcbiAqICAgfVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgUmluZyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlJpbmcjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIGlubmVyUmFkaXVzOiAwLFxuICAgKiAgICAgb3V0ZXJSYWRpdXM6IDUwLFxuICAgKiAgICAgdGhldGFTZWdtZW50czogOCxcbiAgICogICAgIHBoaVNlZ21lbnRzOiA4LFxuICAgKiAgICAgdGhldGFTdGFydDogMCxcbiAgICogICAgIHRoZXRhTGVuZ3RoOiBNYXRoLlBJICogMlxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5SaW5nI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogW1xuICAgKiAgICAgJ2lubmVyUmFkaXVzJyxcbiAgICogICAgICdvdXRlclJhZGl1cycsXG4gICAqICAgICAndGhldGFTZWdtZW50cycsXG4gICAqICAgICAncGhpU2VnbWVudHMnLFxuICAgKiAgICAgJ3RoZXRhU3RhcnQnLFxuICAgKiAgICAgJ3RoZXRhTGVuZ3RoJ1xuICAgKiAgIF1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIFJpbmcoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBSaW5nKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFJpbmcpLmNhbGwodGhpcywgcGFyYW1zLCBSaW5nLmRlZmF1bHRzLCBSaW5nLmluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgX3RoaXMuYnVpbGQocGFyYW1zKTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihSaW5nLnByb3RvdHlwZSksIFwid3JhcFwiLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKS5jYWxsKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlJpbmdcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhSaW5nLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gUmluZ0J1ZmZlckdlb21ldHJ5IDogUmluZ0dlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkuaW5uZXJSYWRpdXMsIHBhcmFtcy5nZW9tZXRyeS5vdXRlclJhZGl1cywgcGFyYW1zLmdlb21ldHJ5LnRoZXRhU2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS5waGlTZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5LnRoZXRhU3RhcnQsIHBhcmFtcy5nZW9tZXRyeS50aGV0YUxlbmd0aCk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoUmluZywgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBSaW5nO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKFJpbmcsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgaW5uZXJSYWRpdXM6IDAsXG4gICAgb3V0ZXJSYWRpdXM6IDUwLFxuICAgIHRoZXRhU2VnbWVudHM6IDgsXG4gICAgcGhpU2VnbWVudHM6IDgsXG4gICAgdGhldGFTdGFydDogMCxcbiAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IFsnaW5uZXJSYWRpdXMnLCAnb3V0ZXJSYWRpdXMnLCAndGhldGFTZWdtZW50cycsICdwaGlTZWdtZW50cycsICd0aGV0YVN0YXJ0JywgJ3RoZXRhTGVuZ3RoJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgU2hhcGVcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFNoYXBlIGlzIGEgdW5pdmVyc2FsIGNsYXNzLiBJdCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBkaWZmZXJlbnQgMkQgc2hhcGVzIGluIDNEIHNjZW5lLjxici8+XG4gKiBVbmZvcnR1bmF0ZWx5LCBub3QgYWxsIG9mIHRoZW0gc3VwcG9ydCBwaHlzaWNzLCBhbiBhbHRlcm5hdGl2ZSBpcyB0byBtYWtlIGEgc2ltaWxhciAzRCBvYmplY3QgYW5kIHNjYWxlIGl0cyB3aWR0aCBkb3duIHRvIG5lYXIgemVyby5cbiAqIDxici8+PGJyLz5cbiAqIGBTaGFwZWAgY29uc2lzdHMgb2Ygc2hhcGVzIHRoYXQgYXJlIGluIGl0cyBzaGFwZXMgcGFyYW1ldGVyLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNTaGFwZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBwbGFuZSBsb29raW5nIFNoYXBlIGZyb20gYSBUSFJFRS5TaGFwZSwgYW5kIGFkZGluZyBpdCB0byBhcHA8L2NhcHRpb24+XG4gKiBjb25zdCByZWN0V2lkdGggPSAxMCxcbiAqIHJlY3RMZW5ndGggPSA1O1xuICpcbiAqIGNvbnN0IHJlY3RTaGFwZSA9IG5ldyBUSFJFRS5TaGFwZSgpO1xuICogcmVjdFNoYXBlLm1vdmVUbygwLDApO1xuICogcmVjdFNoYXBlLmxpbmVUbygwLCByZWN0V2lkdGgpO1xuICogcmVjdFNoYXBlLmxpbmVUbyhyZWN0TGVuZ3RoLCByZWN0V2lkdGgpO1xuICogcmVjdFNoYXBlLmxpbmVUbyhyZWN0TGVuZ3RoLCAwKTtcbiAqIHJlY3RTaGFwZS5saW5lVG8oMCwgMCk7XG4gKlxuICogY29uc3QgcGxhbmUgPSBuZXcgU2hhcGUoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHNoYXBlOiByZWN0U2hhcGVcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgU2hhcGUkMSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlNoYXBlI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICBzaGFwZXM6IFtdXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU2hhcGUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbJ3NoYXBlcyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBTaGFwZSQkMSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFNoYXBlJCQxKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFNoYXBlJCQxKS5jYWxsKHRoaXMsIHBhcmFtcywgU2hhcGUkJDEuZGVmYXVsdHMsIFNoYXBlJCQxLmluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgX3RoaXMuYnVpbGQocGFyYW1zKTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihTaGFwZSQkMS5wcm90b3R5cGUpLCBcIndyYXBcIiwgYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkuY2FsbChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5TaGFwZVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFNoYXBlJCQxLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gU2hhcGVCdWZmZXJHZW9tZXRyeSA6IFNoYXBlR2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS5zaGFwZXMpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFNoYXBlJCQxLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIFNoYXBlJCQxO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKFNoYXBlJDEsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgc2hhcGVzOiBbXVxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsnc2hhcGVzJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgU3BoZXJlXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBTcGhlcmUgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgc3BoZXJlIG9iamVjdHMgYnkgaXRzIHJhZGl1cyBwcm9wZXJ0eSBhbmQgb3RoZXIgdmFsdWVzIHRoYXQgZGV0ZXJtaW5lcyBpdHMgZGV0YWxpdHkuXG4gKiA8YnIvPjxici8+XG4gKiBJdCBpcyBzaW1pbGFyIHRvIFRIUkVFLlNwaGVyZUdlb21ldHJ5LCBidXQgaXQgYWxzbyBjb250YWlucyBhbGwgYFNoYXBlYCBwcm9wZXJ0aWVzLCBzdWNoIGFzIG1hdGVyaWFsLCBtYXNzIGFuZCB2ZWN0b3JzIGxpa2UgcG9zaXRpb24gKHBvcykgYW5kIHJvdGF0aW9uIChyb3QpLlxuICogPGJyLz48YnIvPlxuICogVGhlbiBpdCBjcmVhdGVzIGFuIGBUaHJlZS5qcyBtZXNoYCBvciBhIGBQaHlzaWpzIG1lc2hgLCB0aGF0IGlzIHNpbWlsYXIgdG8gYFRocmVlLmpzIG1lc2hgLCBidXQgaXQgYWxzbyB0YWtlIGludG8gY29uc2lkZXJhdGlvbiBjb2xsaXNpb24gY2FsY3VsYXRpb25zLlxuICogVGhpcyBtZXNoIGlzIGEgY29tYmluYXRpb24gb2YgYFRocmVlLmpzIGdlb21ldHJ5YCBhbmQgYFBoeXNpanMgbWF0ZXJpYWxgIChUaGUgc2FtZSBhcyBpbiB0aHJlZS5qcywgYnV0IHdpdGggZnJpY3Rpb24gYW5kIHJlc3RpdHV0aW9uKS5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjU3BoZXJlR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFNwaGVyZSwgYW5kIGFkZGluZyBpdCB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgU3BoZXJlKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXM6IDJcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeTogMTAwXG4gKiAgIH1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIFNwaGVyZSQxID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU3BoZXJlI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICByYWRpdXM6IDEsXG4gICAqICAgICB3aWR0aFNlZ21lbnRzOiA4LFxuICAgKiAgICAgaGVpZ2h0U2VnbWVudHM6IDZcbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5TcGhlcmUjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbJ3JhZGl1cycsICd3aWR0aFNlZ21lbnRzJywgJ2hlaWdodFNlZ21lbnRzJ11cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIFNwaGVyZSQkMSgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFNwaGVyZSQkMSk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFNwaGVyZSQkMSkuY2FsbCh0aGlzLCBwYXJhbXMsIFNwaGVyZSQkMS5kZWZhdWx0cywgU3BoZXJlJCQxLmluc3RydWN0aW9ucykpO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU3BoZXJlXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoU3BoZXJlJCQxLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBTcGhlcmVCdWZmZXJHZW9tZXRyeSA6IFNwaGVyZUdlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLCBwYXJhbXMuZ2VvbWV0cnkud2lkdGhTZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5LmhlaWdodFNlZ21lbnRzKTtcbiAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhTcGhlcmUkJDEsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gU3BoZXJlJCQxO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKFNwaGVyZSQxLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHJhZGl1czogMSxcbiAgICB3aWR0aFNlZ21lbnRzOiA4LFxuICAgIGhlaWdodFNlZ21lbnRzOiA2XG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWydyYWRpdXMnLCAnd2lkdGhTZWdtZW50cycsICdoZWlnaHRTZWdtZW50cyddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIFRldHJhaGVkcm9uXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBJbiBnZW9tZXRyeSwgYSB0ZXRyYWhlZHJvbiBpcyBhIHBvbHloZWRyb24gY29tcG9zZWQgb2YgZm91ciB0cmlhbmd1bGFyIGZhY2VzLCBzaXggc3RyYWlnaHQgZWRnZXMsIGFuZCBmb3VyIHZlcnRleCBjb3JuZXJzLlxuICogVGhlIHRldHJhaGVkcm9uIGlzIHRoZSBzaW1wbGVzdCBvZiBhbGwgdGhlIG9yZGluYXJ5IGNvbnZleCBwb2x5aGVkcmEgYW5kIHRoZSBvbmx5IG9uZSB0aGF0IGhhcyBmZXdlciB0aGFuIDUgZmFjZXMuXG4gKiA8YnIvPjxici8+XG4gKiBgVGV0cmFoZWRyb25gIGNyZWF0ZXMgYSBUZXRyYWhlZHJvbiBvYmplY3QgYnkgaXRzIGByYWRpdXNgIGFuZCBgZGV0YWlsYFxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNUZXRyYWhlZHJvbkdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBUZXRyYWhlZHJvbiwgYW5kIGFkZGluZyBpdCB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgVGV0cmFoZWRyb24oe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1czogMixcbiAqICAgICBkZXRhaWw6IDFcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeDogMCxcbiAqICAgICB5OiAxMDAsXG4gKiAgICAgejogMFxuICogICB9XG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBUZXRyYWhlZHJvbiA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRldHJhaGVkcm9uI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICByYWRpdXM6IDEsXG4gICAqICAgICBkZXRhaWw6IDBcbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXRyYWhlZHJvbiNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ2RldGFpbCddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBUZXRyYWhlZHJvbigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRldHJhaGVkcm9uKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFRldHJhaGVkcm9uKS5jYWxsKHRoaXMsIHBhcmFtcywgVGV0cmFoZWRyb24uZGVmYXVsdHMsIFRldHJhaGVkcm9uLmluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgX3RoaXMuYnVpbGQocGFyYW1zKTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihUZXRyYWhlZHJvbi5wcm90b3R5cGUpLCBcIndyYXBcIiwgYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkuY2FsbChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXRyYWhlZHJvblxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFRldHJhaGVkcm9uLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSA6IFRldHJhaGVkcm9uR2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsIHBhcmFtcy5nZW9tZXRyeS5kZXRhaWwpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFRldHJhaGVkcm9uLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIFRldHJhaGVkcm9uO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKFRldHJhaGVkcm9uLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHJhZGl1czogMSxcbiAgICBkZXRhaWw6IDBcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdkZXRhaWwnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBUZXh0XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBUZXh0IGNsYXNzIGlzIG1hZGUgZm9yIGNyZWF0aW5nIDNEIHRleHQgb2JqZWN0cy5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjVGV4dEdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiA8YnIvPjxici8+XG4gKiBQaHlzaWNzIHRleHQgb2JqZWN0IGNhbiBiZSBjb252ZXggb3IgY29uY2F2ZS4gQnkgZGVmYXVsdCBpdCdzIGNvbnZleCBidXQgeW91IGNhbiBhbHNvIHN3aXRjaCB0byBjb25jYXZlLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgVGV4dCwgYW5kIGFkZGluZyBpdCB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgVGV4dCh7XG4gKiAgICAgdGV4dDogJ1NvbWUgdGV4dCcsXG4gKiAgICAgcGFyYW1ldGVyczoge1xuICogICAgICAgZm9udDogJ3BhdGgvdG8vZm9udC50eXBlZmFjZS5qcycsXG4gKiAgICAgICBzaXplOiAyMCxcbiAqICAgICAgIGhlaWdodDogNSxcbiAqICAgICAgIGN1cnZlU2VnbWVudHM6IDZcbiAqICAgICB9XG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHg6IC00MCxcbiAqICAgICB5OiAyMCxcbiAqICAgICB6OiAwXG4gKiAgIH1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIFRleHQgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIGNyZWF0ZUNsYXNzKFRleHQsIG51bGwsIFt7XG4gICAga2V5OiBcImxvYWRcIixcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV4dCNkZWZhdWx0c1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgICAqIHtcbiAgICAgKiAgIHRleHQ6ICdIZWxsbyBXb3JsZCEnLFxuICAgICAqICAgZm9udDogbnVsbCxcbiAgICAgKlxuICAgICAqICAgZ2VvbWV0cnk6IHtcbiAgICAgKiAgICAgc2l6ZTogMTIsXG4gICAgICogICAgIGhlaWdodDogNTAsXG4gICAgICogICAgIGN1cnZlU2VnbWVudHM6IDEyLFxuICAgICAqICAgICBmb250OiBuZXcgRm9udCgpLFxuICAgICAqICAgICBiZXZlbEVuYWJsZWQ6IGZhbHNlLFxuICAgICAqICAgICBiZXZlbFRoaWNrbmVzczogMTAsXG4gICAgICogICAgIGJldmVsU2l6ZTogOFxuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKiA8L3ByZT5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgRm9udExvYWRlclxuICAgICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRleHQjbG9hZGVyXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBkZWZhdWx0IG5ldyBGb250TG9hZGVyKClcbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgbG9hZFxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAZGVzY3JpcHRpb24gbG9hZCgpIHByZWxvYWRzIGEgRm9udCBvYmplY3QgYW5kIHJldHVybnMgYSBQcm9taXNlIHdpdGggaXQuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdGggUGF0aCB0byB0aGUgZm9udFxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IEEgcHJvbWlzZSByZXNvbHZlZCB3aXRoIGEgZm9udFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV4dFxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBsb2FkKHBhdGgpIHtcbiAgICAgIHZhciBsb2FkZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFRleHQubG9hZGVyO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIGxvYWRlci5sb2FkKHBhdGgsIHJlc29sdmUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gVGV4dCgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHQpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihUZXh0KS5jYWxsKHRoaXMsIHBhcmFtcywgVGV4dC5kZWZhdWx0cywgVGV4dC5pbnN0cnVjdGlvbnMpKTtcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgaXMgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIGxpZmVjeWNsZSB0byBjcmVhdGUgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRleHRcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhUZXh0LCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAocGFyYW1zLmZvbnQgaW5zdGFuY2VvZiBQcm9taXNlID8gcGFyYW1zLmZvbnQgOiBQcm9taXNlLnJlc29sdmUocGFyYW1zLmZvbnQpKS50aGVuKGZ1bmN0aW9uIChmb250KSB7XG4gICAgICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gX3RoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICAgICAgZ2VvbWV0cnk6IG5ldyBUZXh0R2VvbWV0cnkocGFyYW1zLnRleHQsIE9iamVjdC5hc3NpZ24ocGFyYW1zLmdlb21ldHJ5LCB7XG4gICAgICAgICAgICAgIGZvbnQ6IGZvbnRcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgICAgIHJlc29sdmUoX3RoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgICAgIH0pLm1lc2gpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKFRleHQucHJvdG90eXBlKSwgXCJ3YWl0XCIsIHRoaXMpLmNhbGwodGhpcywgcHJvbWlzZSk7XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFRleHQsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gVGV4dDtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKFRleHQsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIHRleHQ6ICdIZWxsbyBXb3JsZCEnLFxuICBmb250OiBudWxsLFxuICBnZW9tZXRyeToge1xuICAgIHNpemU6IDEyLFxuICAgIGhlaWdodDogNTAsXG4gICAgY3VydmVTZWdtZW50czogMTIsXG4gICAgZm9udDogbmV3IEZvbnQoKSxcbiAgICBiZXZlbEVuYWJsZWQ6IGZhbHNlLFxuICAgIGJldmVsVGhpY2tuZXNzOiAxMCxcbiAgICBiZXZlbFNpemU6IDhcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zKSksIFwibG9hZGVyXCIsIG5ldyBGb250TG9hZGVyKCkpO1xuXG4vKipcbiAqIEBjbGFzcyBUb3J1c1xuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gVG9ydXMgY2xhc3MgbWFrZXMgYSB0b3J1cyBmaWd1cmUuIEEgZG9udXQgaXMgYSB0b3J1cy5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL2luZGV4Lmh0bWwjYXBpL2dlb21ldHJpZXMvVG9ydXNHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgVG9ydXMsIGFuZCBhZGRpbmcgaXQgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFRvcnVzKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXM6IDUsXG4gKiAgICAgdHViZTogMlxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IHtcbiAqICAgICB5OiAzNVxuICogICB9XG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBUb3J1cyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRvcnVzI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICByYWRpdXM6IDEwMCxcbiAgICogICAgIHR1YmU6IDQwLFxuICAgKiAgICAgcmFkaWFsU2VnbWVudHM6IDgsXG4gICAqICAgICB0dWJ1bGFyU2VnbWVudHM6IDYsXG4gICAqICAgICBhcmM6IE1hdGguUEkgKiAyXG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRvcnVzI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogW1xuICAgKiAgICAgJ3JhZGl1cycsXG4gICAqICAgICAndHViZScsXG4gICAqICAgICAncmFkaWFsU2VnbWVudHMnLFxuICAgKiAgICAgJ3R1YnVsYXJTZWdtZW50cycsXG4gICAqICAgICAnYXJjJ1xuICAgKiAgIF1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIFRvcnVzKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVG9ydXMpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoVG9ydXMpLmNhbGwodGhpcywgcGFyYW1zLCBUb3J1cy5kZWZhdWx0cywgVG9ydXMuaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICBfdGhpcy5idWlsZChwYXJhbXMpO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKFRvcnVzLnByb3RvdHlwZSksIFwid3JhcFwiLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKS5jYWxsKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRvcnVzXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoVG9ydXMsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiBuZXcgVG9ydXNHZW9tZXRyeShwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLCBwYXJhbXMuZ2VvbWV0cnkudHViZSwgcGFyYW1zLmdlb21ldHJ5LnJhZGlhbFNlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkudHVidWxhclNlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkuYXJjKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhUb3J1cywgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBUb3J1cztcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhUb3J1cywgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICByYWRpdXM6IDEwMCxcbiAgICB0dWJlOiA0MCxcbiAgICByYWRpYWxTZWdtZW50czogOCxcbiAgICB0dWJ1bGFyU2VnbWVudHM6IDYsXG4gICAgYXJjOiBNYXRoLlBJICogMlxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ3R1YmUnLCAncmFkaWFsU2VnbWVudHMnLCAndHVidWxhclNlZ21lbnRzJywgJ2FyYyddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIFRvcnVza25vdFxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gVG9ydXNrbm90IGNsYXNzIG1ha2VzIGEgdG9ydXNrbm90IGZpZ3VyZS4gSXQncyBsaWtlIGEgY3Jvb2tlZCBkb251dCwgdmVyeSBjcm9va2VkLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNUb3J1c0tub3RHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgVG9ydXNrbm90LCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBUb3J1c2tub3Qoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1czo1LFxuICogICAgIHR1YmU6IDJcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvczoge1xuICogICAgIHk6IDEwMFxuICogICB9XG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBUb3J1c2tub3QgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Ub3J1c2tub3QjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMTAwLFxuICAgKiAgICAgdHViZTogNDAsXG4gICAqICAgICByYWRpYWxTZWdtZW50czogNjQsXG4gICAqICAgICB0dWJ1bGFyU2VnbWVudHM6IDgsXG4gICAqICAgICBwOiAyLFxuICAgKiAgICAgcTogM1xuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Ub3J1c2tub3QjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbXG4gICAqICAgICAncmFkaXVzJyxcbiAgICogICAgICd0dWJlJyxcbiAgICogICAgICdyYWRpYWxTZWdtZW50cycsXG4gICAqICAgICAndHVidWxhclNlZ21lbnRzJyxcbiAgICogICAgICdwJyxcbiAgICogICAgICdxJ1xuICAgKiAgIF1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIFRvcnVza25vdCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRvcnVza25vdCk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihUb3J1c2tub3QpLmNhbGwodGhpcywgcGFyYW1zLCBUb3J1c2tub3QuZGVmYXVsdHMsIFRvcnVza25vdC5pbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIF90aGlzLmJ1aWxkKHBhcmFtcyk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoVG9ydXNrbm90LnByb3RvdHlwZSksIFwid3JhcFwiLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKS5jYWxsKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRvcnVza25vdFxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFRvcnVza25vdCwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdmFyIEdDb25zdHJ1Y3QgPSBwYXJhbXMuYnVmZmVyID8gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkgOiBUb3J1c0tub3RHZW9tZXRyeTtcbiAgICAgIHJldHVybiBuZXcgR0NvbnN0cnVjdChwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLCBwYXJhbXMuZ2VvbWV0cnkudHViZSwgcGFyYW1zLmdlb21ldHJ5LnJhZGlhbFNlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkudHVidWxhclNlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkucCwgcGFyYW1zLmdlb21ldHJ5LnEpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFRvcnVza25vdCwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBUb3J1c2tub3Q7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoVG9ydXNrbm90LCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHJhZGl1czogMTAwLFxuICAgIHR1YmU6IDQwLFxuICAgIHJhZGlhbFNlZ21lbnRzOiA2NCxcbiAgICB0dWJ1bGFyU2VnbWVudHM6IDgsXG4gICAgcDogMixcbiAgICBxOiAzXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWydyYWRpdXMnLCAndHViZScsICdyYWRpYWxTZWdtZW50cycsICd0dWJ1bGFyU2VnbWVudHMnLCAncCcsICdxJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgVHViZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gVHViZSBjbGFzcyBtYWtlcyBhIHR1YmUgdGhhdCBleHRydWRlcyBhbG9uZyBhIDNkIGN1cnZlLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3MvaW5kZXguaHRtbCNhcGkvZ2VvbWV0cmllcy9UdWJlR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFR1YmUgZnJvbSBhIHRocmVlLmpzIEN1cnZlLCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIGNvbnN0IEN1c3RvbVNpbkN1cnZlID0gVEhSRUUuQ3VydmUuY3JlYXRlKFxuICogICBmdW5jdGlvbiAoc2NhbGUpIHsgLy8gY3VzdG9tIGN1cnZlIGNvbnN0cnVjdG9yXG4gKiAgICAgdGhpcy5zY2FsZSA9IChzY2FsZSA9PT0gdW5kZWZpbmVkKSA/IDEgOiBzY2FsZTtcbiAqICAgfSxcbiAqXG4gKiAgIGZ1bmN0aW9uICh0KSB7IC8vIGdldFBvaW50OiB0IGlzIGJldHdlZW4gMC0xXG4gKiAgICAgY29uc3QgdHggPSB0ICogMyAtIDEuNSxcbiAqICAgICB0eSA9IE1hdGguc2luKCAyICogTWF0aC5QSSAqIHQgKSxcbiAqICAgICB0eiA9IDA7XG4gKlxuICogICAgIHJldHVybiBuZXcgVEhSRUUuVmVjdG9yMyh0eCwgdHksIHR6KS5tdWx0aXBseVNjYWxhcih0aGlzLnNjYWxlKTtcbiAqICAgfVxuICogKTtcbiAqXG4gKiBjb25zdCBwYXRoID0gbmV3IEN1c3RvbVNpbkN1cnZlKDEwKTtcbiAqXG4gKiBuZXcgVHViZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcGF0aDogcGF0aFxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBUdWJlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVHViZSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcGF0aDogbmV3IFRIUkVFLkxpbmVDdXJ2ZTMobmV3IFZlY3RvcjMoMCwgMCwgMCksIG5ldyBWZWN0b3IzKDAsIDAsIDEpKSxcbiAgICogICAgIHNlZ21lbnRzOiAyMCxcbiAgICogICAgIHJhZGl1czogMixcbiAgICogICAgIHJhZGl1c1NlZ21lbnRzOiA4LFxuICAgKiAgICAgY2xvc2VkOiBmYWxzZVxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UdWJlI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogW1xuICAgKiAgICAgJ3BhdGgnLFxuICAgKiAgICAgJ3NlZ21lbnRzJyxcbiAgICogICAgICdyYWRpdXMnLFxuICAgKiAgICAgJ3JhZGl1c1NlZ21lbnRzJyxcbiAgICogICAgICdjbG9zZWQnXG4gICAqICAgXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gVHViZSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFR1YmUpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoVHViZSkuY2FsbCh0aGlzLCBwYXJhbXMsIFR1YmUuZGVmYXVsdHMsIFR1YmUuaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICBfdGhpcy5idWlsZChwYXJhbXMpO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKFR1YmUucHJvdG90eXBlKSwgXCJ3cmFwXCIsIGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLmNhbGwoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVHViZVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFR1YmUsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyAocGFyYW1zLmJ1ZmZlciA/IFR1YmVCdWZmZXJHZW9tZXRyeSA6IFR1YmVHZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LnBhdGgsIHBhcmFtcy5nZW9tZXRyeS5zZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5LnJhZGl1cywgcGFyYW1zLmdlb21ldHJ5LnJhZGl1c1NlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkuY2xvc2VkKTtcbiAgICAgIHJldHVybiBnZW9tZXRyeTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhUdWJlLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIFR1YmU7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoVHViZSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICBwYXRoOiBuZXcgTGluZUN1cnZlMyhuZXcgVmVjdG9yMygwLCAwLCAwKSwgbmV3IFZlY3RvcjMoMCwgMCwgMSkpLFxuICAgIHNlZ21lbnRzOiAyMCxcbiAgICByYWRpdXM6IDIsXG4gICAgcmFkaXVzU2VnbWVudHM6IDgsXG4gICAgY2xvc2VkOiBmYWxzZVxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsncGF0aCcsICdzZWdtZW50cycsICdyYWRpdXMnLCAncmFkaXVzU2VnbWVudHMnLCAnY2xvc2VkJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgR3JvdXBcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFNvbWV0aW1lcyB5b3UgbmVlZCB0byBtYWtlIGdyb3VwcyBvZiBvYmplY3RzIChpdCdzIG5vdCBjb252ZW5pZW50bHkgdG8gYXBwbHkgdHJhbnNmb3JtcyB0byBlYWNoIG9iamVjdCB3aGVuIGNhbiBtYWtlIGp1c3Qgb25lIHRvIGEgZ3JvdXApLjxici8+XG4gKiBJbiBUaHJlZS5qcyB5b3UgbWFrZSBpdCB1c2luZyBgVEhSRUUuT2JqZWN0M0RgIGFuZCBpdCdzIGNoaWxkcmVuLiA8YnIvPjxici8+XG4gKiBJbiB3aHMuanMgd2UgaGF2ZSBgR3JvdXBgXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5BcHByb2FjaCAyIC0gQWRkaW5nIG9iamVjdHMgdG8gYW4gZW1wdHkgZ3JvdXA8L2NhcHRpb24+XG4gKiBjb25zdCBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG4gKiBjb25zdCBib3ggPSBuZXcgQm94KCk7XG4gKiBjb25zdCBncm91cCA9IG5ldyBHcm91cCgpO1xuICpcbiAqIHNwaGVyZS5hZGRUbyhncm91cCk7XG4gKiBib3guYWRkVG8oZ3JvdXApO1xuKiBAZXhhbXBsZSA8Y2FwdGlvbj5BcHByb2FjaCAyIC0gTWFraW5nIGEgZ3JvdXAgZnJvbSBvYmplY3RzPC9jYXB0aW9uPlxuICogY29uc3Qgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuICogY29uc3QgYm94ID0gbmV3IEJveCgpO1xuICogY29uc3QgZ3JvdXAgPSBuZXcgR3JvdXAoYm94LCBzcGhlcmUpO1xuICogLy8gT1I6IGNvbnN0IGdyb3VwID0gbmV3IEdyb3VwKFtib3gsIHNwaGVyZV0pO1xuICovXG5cbnZhciBHcm91cCQxID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICBmdW5jdGlvbiBHcm91cCQkMSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBHcm91cCQkMSk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihHcm91cCQkMSkuY2FsbCh0aGlzLCB7fSkpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBvYmogPSBpIDwgMCB8fCBhcmd1bWVudHMubGVuZ3RoIDw9IGkgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbaV07XG4gICAgICBpZiAob2JqIGluc3RhbmNlb2YgQ29tcG9uZW50KSBvYmouYWRkVG8oYXNzZXJ0VGhpc0luaXRpYWxpemVkKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpKTtlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBPYmplY3QzRCkgX3RoaXMubmF0aXZlLmFkZChvYmopO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKEdyb3VwJCQxLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHJldHVybiBuZXcgT2JqZWN0M0QoKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhHcm91cCQkMSwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBHcm91cCQkMTtcbn0oTWVzaENvbXBvbmVudCk7XG5cbi8qKiBAbW9kdWxlIGNvbXBvbmVudHMvbWVzaGVzICovXG5cbi8qKlxuICogQGNsYXNzIEVsZW1lbnRNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtjb250YWluZXI9ZG9jdW1lbnQuYm9keV0gY29udGFpbmVyIGlzIHRoZSBET00gb2JqZWN0IHRvIHdoaWNoIGFwcGxpY2F0aW9uJ3MgY2FudmFzIHdpbGwgYmUgYWRkZWQgdG8uXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhbiBlbGVtZW50IG1vZHVsZSwgcGFzc2luZyBpdCB0byB0aGUgQXBwPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIG5ldyBFbGVtZW50TW9kdWxlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAnKSlcbiAqIF0pO1xuICovXG52YXIgRWxlbWVudE1vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEVsZW1lbnRNb2R1bGUoKSB7XG4gICAgdmFyIGNvbnRhaW5lciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZG9jdW1lbnQuYm9keTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEVsZW1lbnRNb2R1bGUpO1xuXG4gICAgaWYgKGNvbnRhaW5lci5jb250YWluZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybignRWxlbWVudE1vZHVsZSBub3cgYWNjZXB0cyBvbmx5IGFyZ3VtZW50IHdoaWNoIGlzIGEgRE9NIG9iamVjdCwgbm90IGEgcGFyYW1zIG9iamVjdC4nKTtcbiAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyLmNvbnRhaW5lcjtcbiAgICB9IGVsc2UgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG5cbiAgICB0aGlzLmNyZWF0ZUVsZW1lbnQoKTtcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBjcmVhdGVFbGVtZW50XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGNhbnZhcyBlbGVtZW50LlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLkVsZW1lbnRNb2R1bGVcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhFbGVtZW50TW9kdWxlLCBbe1xuICAgIGtleTogXCJjcmVhdGVFbGVtZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoKSB7XG4gICAgICB0aGlzLmVsZW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gJ3docy1hcHAnO1xuICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLndpZHRoID0gJ2luaGVyaXQnO1xuICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodCA9ICdpbmhlcml0JztcbiAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgX21hbmFnZXIuc2V0KCdlbGVtZW50JywgdGhpcy5lbGVtZW50KTtcblxuICAgICAgX21hbmFnZXIuc2V0KCdjb250YWluZXInLCB0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVncmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlZ3JhdGUoc2VsZikge1xuICAgICAgc2VsZi5jb250YWluZXIuYXBwZW5kQ2hpbGQoc2VsZi5lbGVtZW50KTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRWxlbWVudE1vZHVsZTtcbn0oKTtcblxuLyoqXG4gKiBAY2xhc3MgUmVuZGVyaW5nTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9hcHBcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXVxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICogQGV4YW1wbGUgPGNhcHRpb24+IENyZWF0aW5nIGEgcmVuZGVyaW5nIG1vZHVsZSBhbmQgcGFzc2luZyBpdCB0byBBcHAncyBtb2R1bGVzPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIG5ldyBFbGVtZW50TW9kdWxlKCksXG4gKiAgIG5ldyBTY2VuZU1vZHVsZSgpLFxuICogICBuZXcgRGVmaW5lTW9kdWxlKCdjYW1lcmEnLCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoe1xuICogICAgIHBvc2l0aW9uOiBuZXcgVEhSRUUuVmVjdG9yMygwLCA2LCAxOCksXG4gKiAgICAgZmFyOiAxMDAwMFxuICogICB9KSksXG4gKiAgIG5ldyBSZW5kZXJpbmdNb2R1bGUoe1xuICogICAgIGJnQ29sb3I6IDB4MTYyMTI5LFxuICpcbiAqICAgICByZW5kZXJlcjoge1xuICogICAgICAgYW50aWFsaWFzOiB0cnVlXG4gKiAgICAgfVxuICogICB9LCB7c2hhZG93OiB0cnVlfSlcbiAqIF0pO1xuICovXG5cbnZhciBSZW5kZXJpbmdNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogYWRkaXRpb25hbFxuICAgKiBAZGVzY3JpcHRpb24gY29sbGVjdGlvbiBvZiBhZGRpdGlvbmFsIHNjcmlwdHNcbiAgICogQHN0YXRpY1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkFwcCNhZGRpdGlvbmFsXG4gICAqIEBwdWJsaWNcbiAgICovXG5cbiAgLyoqXG4gICAqIGVuYWJsZWRcbiAgICogQHN0YXRpY1xuICAgKiBAbWVtYmVyIHtCb29sZWFufSBtb2R1bGU6Y29yZS5BcHAjZW5hYmxlZFxuICAgKiBAcHVibGljXG4gICAqL1xuICBmdW5jdGlvbiBSZW5kZXJpbmdNb2R1bGUoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgdmFyIGFkZGl0aW9uYWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFJlbmRlcmluZ01vZHVsZSk7XG5cbiAgICBkZWZpbmVQcm9wZXJ0eSQzKHRoaXMsIFwiZW5hYmxlZFwiLCB0cnVlKTtcblxuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICAgIHJlc29sdXRpb246IG5ldyBWZWN0b3IyKDEsIDEpLFxuICAgICAgcGl4ZWxSYXRpbzogd2luZG93LmRldmljZVBpeGVsUmF0aW8sXG4gICAgICBiZ0NvbG9yOiAweDAwMDAwMCxcbiAgICAgIGJnT3BhY2l0eTogMSxcbiAgICAgIHJlbmRlcmVyOiB7fSxcbiAgICAgIGZpeDogZnVuY3Rpb24gZml4KCkge31cbiAgICB9LCBwYXJhbXMpO1xuICAgIHZhciBfdGhpcyRwYXJhbXMgPSB0aGlzLnBhcmFtcyxcbiAgICAgICAgYmdDb2xvciA9IF90aGlzJHBhcmFtcy5iZ0NvbG9yLFxuICAgICAgICBiZ09wYWNpdHkgPSBfdGhpcyRwYXJhbXMuYmdPcGFjaXR5LFxuICAgICAgICBfcmVuZGVyZXIgPSBfdGhpcyRwYXJhbXMucmVuZGVyZXIsXG4gICAgICAgIHBpeGVsUmF0aW8gPSBfdGhpcyRwYXJhbXMucGl4ZWxSYXRpbyxcbiAgICAgICAgd2lkdGggPSBfdGhpcyRwYXJhbXMud2lkdGgsXG4gICAgICAgIGhlaWdodCA9IF90aGlzJHBhcmFtcy5oZWlnaHQsXG4gICAgICAgIHJlc29sdXRpb24gPSBfdGhpcyRwYXJhbXMucmVzb2x1dGlvbixcbiAgICAgICAgZml4ID0gX3RoaXMkcGFyYW1zLmZpeDtcbiAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFdlYkdMUmVuZGVyZXIoX3JlbmRlcmVyKTtcbiAgICB0aGlzLmVmZmVjdHMgPSBbXTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldENsZWFyQ29sb3IoYmdDb2xvciwgYmdPcGFjaXR5KTtcbiAgICBpZiAocGl4ZWxSYXRpbykgdGhpcy5yZW5kZXJlci5zZXRQaXhlbFJhdGlvKHBpeGVsUmF0aW8pO1xuICAgIHRoaXMuc2V0U2l6ZShOdW1iZXIod2lkdGggKiByZXNvbHV0aW9uLngpLnRvRml4ZWQoKSwgTnVtYmVyKGhlaWdodCAqIHJlc29sdXRpb24ueSkudG9GaXhlZCgpKTtcblxuICAgIGZvciAodmFyIGtleSBpbiBhZGRpdGlvbmFsKSB7XG4gICAgICBpZiAoYWRkaXRpb25hbFtrZXldKSB0aGlzLmFwcGx5QWRkaXRpb25hbChrZXkpO1xuICAgIH1cblxuICAgIGZpeCh0aGlzLnJlbmRlcmVyKTtcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBhcHBseUFkZGl0aW9uYWxcbiAgICogQGRlc2NyaXB0aW9uIEFwcGx5IGFkZGl0aW9uYWwgc2NyaXB0IGZyb20gUmVuZGVyaW5nTW9kdWxlLmFkZGl0aW9uYWxcbiAgICogQHBhcmFtIHtTdGlybmd9IG5hbWUgU2NyaXB0IG5hbWVcbiAgICogQHJldHVybiB7dGhpc31cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZW5kZXJpbmdNb2R1bGVcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhSZW5kZXJpbmdNb2R1bGUsIFt7XG4gICAga2V5OiBcImFwcGx5QWRkaXRpb25hbFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseUFkZGl0aW9uYWwobmFtZSkge1xuICAgICAgUmVuZGVyaW5nTW9kdWxlLmFkZGl0aW9uYWxbbmFtZV0uYXBwbHkodGhpcywgW3RoaXMucmVuZGVyZXJdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBpbnRlZ3JhdGVSZW5kZXJlclxuICAgICAqIEBkZXNjcmlwdGlvbiBJbnRlZ3JhdGUgcmVuZGVyZXJcbiAgICAgKiBAcGFyYW0ge05vZGVFbGVtZW50fSBlbGVtZW50IERPTSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1RIUkVFLlNjZW5lfSBzY2VuZSB1c2VkIHNjZW5lXG4gICAgICogQHBhcmFtIHtUSFJFRS5DYW1lcmF9IGNhbWVyYSB1c2VkIGNhbWVyYVxuICAgICAqIEByZXR1cm4ge0xvb3B9IHJlbmRlckxvb3BcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZWdyYXRlUmVuZGVyZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZWdyYXRlUmVuZGVyZXIoZWxlbWVudCwgc2NlbmUsIGNhbWVyYSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xuICAgICAgdGhpcy5jYW1lcmEgPSBjYW1lcmE7XG4gICAgICB0aGlzLmF0dGFjaFRvQ2FudmFzKGVsZW1lbnQpO1xuICAgICAgcmV0dXJuIG5ldyBMb29wKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnJlbmRlcmVyLnJlbmRlcihfdGhpcy5zY2VuZSwgX3RoaXMuY2FtZXJhKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGVmZmVjdFxuICAgICAqIEBkZXNjcmlwdGlvbiBBZGQgdGhyZWUuanMgZWZmZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IGVmZmVjdCB0aHJlZS5qcyBlZmZlY3RcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBlZmZlY3RMb29wIHVwZGF0ZSBmdW5jdGlvbiBmb3IgZWZmZWN0XG4gICAgICogQHJldHVybiB7dGhpc31cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZWZmZWN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGVmZmVjdChfZWZmZWN0KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGVmZmVjdExvb3AgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX2VmZmVjdC5yZW5kZXIoX3RoaXMyLnNjZW5lLCBfdGhpczIuY2FtZXJhKTtcbiAgICAgIH07XG4gICAgICB0aGlzLnJlbmRlckxvb3Auc3RvcCgpO1xuICAgICAgdmFyIHNpemUgPSB0aGlzLnJlbmRlcmVyLmdldFNpemUoKTtcblxuICAgICAgX2VmZmVjdC5zZXRTaXplKHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTtcblxuICAgICAgdmFyIGxvb3AgPSBuZXcgTG9vcChlZmZlY3RMb29wKTtcbiAgICAgIHRoaXMuZWZmZWN0cy5wdXNoKGxvb3ApO1xuICAgICAgaWYgKHRoaXMuZW5hYmxlZCkgbG9vcC5zdGFydCh0aGlzLmFwcCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBzZXRTaXplXG4gICAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZSByZW5kZXIgdGFyZ2V0IHdpZHRoIGFuZCBoZWlnaHQuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgICAgaWYgKHRoaXMucmVuZGVyZXIpIHRoaXMucmVuZGVyZXIuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBhdHRhY2hUb0NhbnZhc1xuICAgICAqIEBkZXNjcmlwdGlvbiBBdHRhY2ggcmVuZGVyZXIuZG9tRWxlbWVudCB0byBlbGVtZW50XG4gICAgICogQHBhcmFtIHtOb2RlRWxlbWVudH0gZWxlbWVudCBET00gb2JqZWN0XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZW5kZXJpbmdNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImF0dGFjaFRvQ2FudmFzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGF0dGFjaFRvQ2FudmFzKGVsZW1lbnQpIHtcbiAgICAgIHZhciBjYW52YXMgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQ7IC8vIGF0dGFjaCB0byBuZXcgcGFyZW50IHdvcmxkIGRvbVxuXG4gICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgICBjYW52YXMuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHN0b3BcbiAgICAgKiBAZGVzY3JpcHRpb24gU3RvcHMgcmVuZGVyTG9vcCBhbmQgZWZmZWN0IGxvb3BzXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZW5kZXJpbmdNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInN0b3BcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RvcCgpIHtcbiAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZW5kZXJMb29wLnN0b3AoKTtcbiAgICAgIHRoaXMuZWZmZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChsb29wKSB7XG4gICAgICAgIHJldHVybiBsb29wLnN0b3AoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHBsYXlcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVzdW1lcyByZW5kZXJMb29wIGFuZCBlZmZlY3QgbG9vcHNcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KCkge1xuICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVuZGVyTG9vcC5zdGFydCgpO1xuICAgICAgdGhpcy5lZmZlY3RzLmZvckVhY2goZnVuY3Rpb24gKGxvb3ApIHtcbiAgICAgICAgcmV0dXJuIGxvb3Auc3RhcnQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYW5hZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hbmFnZXIoX21hbmFnZXIpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICBfbWFuYWdlci5kZWZpbmUoJ3JlbmRlcmluZycpO1xuXG4gICAgICBfbWFuYWdlci5zZXQoJ3JlbmRlcmVyJywgdGhpcy5yZW5kZXJlcik7XG5cbiAgICAgIHRoaXMuYXBwID0gX21hbmFnZXIuaGFuZGxlcjtcbiAgICAgIHRoaXMucmVuZGVyTG9vcCA9IHRoaXMuaW50ZWdyYXRlUmVuZGVyZXIoX21hbmFnZXIuZ2V0KCdlbGVtZW50JyksIF9tYW5hZ2VyLmdldCgnc2NlbmUnKSwgX21hbmFnZXIuZ2V0KCdjYW1lcmEnKS5uYXRpdmUpO1xuXG4gICAgICBfbWFuYWdlci51cGRhdGUoe1xuICAgICAgICBlbGVtZW50OiBmdW5jdGlvbiBlbGVtZW50KF9lbGVtZW50KSB7XG4gICAgICAgICAgX3RoaXMzLmF0dGFjaFRvQ2FudmFzKF9lbGVtZW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2NlbmU6IGZ1bmN0aW9uIHNjZW5lKF9zY2VuZSkge1xuICAgICAgICAgIF90aGlzMy5zY2VuZSA9IF9zY2VuZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2FtZXJhOiBmdW5jdGlvbiBjYW1lcmEoX2NhbWVyYSkge1xuICAgICAgICAgIF90aGlzMy5jYW1lcmEgPSBfY2FtZXJhLm5hdGl2ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVncmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlZ3JhdGUoc2VsZikge1xuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgIHNlbGYucmVuZGVyTG9vcC5zdGFydCh0aGlzKTtcbiAgICAgIHNlbGYuZWZmZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChsb29wKSB7XG4gICAgICAgIHJldHVybiBsb29wLnN0YXJ0KF90aGlzNCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBkaXNwb3NlXG4gICAgICogQGRlc2NyaXB0aW9uIERpc3Bvc2UgcmVuZGVyaW5nIGNvbnRleHRcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzcG9zZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNwb3NlKCkge1xuICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICB0aGlzLnJlbmRlcmVyLmZvcmNlQ29udGV4dExvc3MoKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmVuZGVyaW5nTW9kdWxlO1xufSgpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKFJlbmRlcmluZ01vZHVsZSwgXCJhZGRpdGlvbmFsXCIsIHtcbiAgc2hhZG93OiBmdW5jdGlvbiBzaGFkb3cocmVuZGVyZXIpIHtcbiAgICByZW5kZXJlci5zaGFkb3dNYXAuZW5hYmxlZCA9IHRydWU7XG4gIH1cbn0pO1xuXG52YXIgU1lNQk9MX0NISUxEUkVOX0ZPUl9TQ0VORSA9IFN5bWJvbCgnU1lNQk9MX0NISUxEUkVOX0ZPUl9TQ0VORScpO1xuLyoqXG4gKiBAY2xhc3MgU2NlbmVNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtCb29sZWFufSBbd2lsbFNjZW5lQmVSZXBsYWNlZD1mYWxzZV0gd2lsbFNjZW5lQmVSZXBsYWNlZCBzaG91bGQgYmUgdHJ1ZSBvbmx5IGlmIHlvdSBhcmUgZ29pbmcgdG8gb3ZlcndyaXRlIHNjZW5lIGRlcGVuZGVuY3kgZXZlbiB3aXRob3V0IHRoZSB1c2Ugb2YgZGVmYXVsdCBvbmUuXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKi9cblxudmFyIFNjZW5lTW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2NlbmVNb2R1bGUoKSB7XG4gICAgdmFyIHdpbGxTY2VuZUJlUmVwbGFjZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU2NlbmVNb2R1bGUpO1xuXG4gICAgdGhpcy5zY2VuZSA9IHdpbGxTY2VuZUJlUmVwbGFjZWQgPyBudWxsIDogbmV3IFNjZW5lKCk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhTY2VuZU1vZHVsZSwgW3tcbiAgICBrZXk6IFwibWFuYWdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYW5hZ2VyKF9tYW5hZ2VyKSB7XG4gICAgICBfbWFuYWdlci5zZXQoJ3NjZW5lJywgdGhpcy5zY2VuZSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVncmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlZ3JhdGUoc2VsZikge1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7XG4gICAgICAgIGFkZDogZnVuY3Rpb24gYWRkKG9iamVjdCkge1xuICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICByZXR1cm4gYXN5bmNUb0dlbmVyYXRvcihcbiAgICAgICAgICAvKiNfX1BVUkVfXyovXG4gICAgICAgICAgcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZSQoX2NvbnRleHQpIHtcbiAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGlmICghb2JqZWN0LnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QucGFyZW50LnJlbW92ZShvYmplY3QpO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA1O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LndhaXQoKTtcblxuICAgICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0Lm5hdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA3O1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBvc2l0aW9uRXJyb3IoJ1NjZW5lTW9kdWxlJywgJ3RoZXJlIGlzIG5vIG9iamVjdC5uYXRpdmUnLCBfdGhpcyk7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnBhcmVudCA9IF90aGlzO1xuICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMTA7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgb25BZGQ6IG9iamVjdFxuICAgICAgICAgICAgICAgICAgICB9KS5vbkFkZDtcblxuICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zY2VuZS5hZGQob2JqZWN0Lm5hdGl2ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuY2hpbGRyZW4ucHVzaChvYmplY3QpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgb2JqZWN0KTtcblxuICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LnN0b3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIF9jYWxsZWUsIHRoaXMpO1xuICAgICAgICAgIH0pKSgpO1xuICAgICAgICB9LFxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZShvYmplY3QpIHtcbiAgICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICAgIHJldHVybiBhc3luY1RvR2VuZXJhdG9yKFxuICAgICAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgICAgICByZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yLndyYXAoZnVuY3Rpb24gX2NhbGxlZTIkKF9jb250ZXh0Mikge1xuICAgICAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkge1xuICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBpZiAoIShvYmplY3QucGFyZW50ICE9PSBfdGhpczIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoXCJyZXR1cm5cIik7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSA0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LndhaXQoKTtcblxuICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICBvYmplY3QucGFyZW50ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zY2VuZS5yZW1vdmUob2JqZWN0Lm5hdGl2ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgX3RoaXMyLmNoaWxkcmVuLnNwbGljZShfdGhpczIuY2hpbGRyZW4uaW5kZXhPZihvYmplY3QpLCAxKTtcblxuICAgICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIF9jYWxsZWUyLCB0aGlzKTtcbiAgICAgICAgICB9KSkoKTtcbiAgICAgICAgfSxcbiAgICAgICAgX3NldFNjZW5lOiBmdW5jdGlvbiBfc2V0U2NlbmUoc2NlbmUpIHtcbiAgICAgICAgICB0aGlzLmNoaWxkcmVuID0gc2NlbmVbU1lNQk9MX0NISUxEUkVOX0ZPUl9TQ0VORV0gPSBzY2VuZVtTWU1CT0xfQ0hJTERSRU5fRk9SX1NDRU5FXSB8fCBbXTtcbiAgICAgICAgICBzZWxmLnNjZW5lID0gc2NlbmU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFNjZW5lOiBmdW5jdGlvbiBzZXRTY2VuZShzY2VuZSkge1xuICAgICAgICAgIHRoaXMuX3NldFNjZW5lKHNjZW5lKTtcblxuICAgICAgICAgIHRoaXMubWFuYWdlci5zZXQoJ3NjZW5lJywgc2NlbmUpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRTY2VuZTogZnVuY3Rpb24gZ2V0U2NlbmUoKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuc2NlbmU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHNlbGYuc2NlbmUpIHRoaXMuX3NldFNjZW5lKHNlbGYuc2NlbmUpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTY2VuZU1vZHVsZTtcbn0oKTtcblxuLy8gaW1wb3J0IHthZGRSZXNpemVMaXN0ZW5lcn0gZnJvbSAnZGV0ZWN0LWVsZW1lbnQtcmVzaXplJztcblxuLyoqXG4gKiBAY2xhc3MgUmVzaXplTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9hcHBcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXthdXRvOiB0cnVlfV0gLSBJZiBhdXRvIGlzIHNldCB0byB0cnVlIC0gcmVzaXplIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gY29udGFpbmVyIHJlc2l6ZXNcbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqL1xudmFyIFJlc2l6ZU1vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJlc2l6ZU1vZHVsZSgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFJlc2l6ZU1vZHVsZSk7XG5cbiAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgYXV0bzogdHJ1ZVxuICAgIH0sIHBhcmFtcyk7XG4gICAgdGhpcy5jYWxsYmFja3MgPSBbdGhpcy5zZXRTaXplLmJpbmQodGhpcyldO1xuICB9XG4gIC8qKlxuICAgKiBAZnVuY3Rpb24gc2V0U2l6ZVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgcHJvdmlkZWQgd2lkdGggJiBoZWlnaHQgdG8gdGhlIHJlbmRlcmVyIG9iamVjdC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IFt3aWR0aD0xXSAtIFRoZSBwcm9taXNlIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIGEgcXVldWUuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbaGVpZ2h0PTFdIC0gdGhhdCBpcyByZXNvbHZlZCB3aGVuIGFsbCBwcm9taXNlcyBjb21wbGV0ZWQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVzaXplTW9kdWxlXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoUmVzaXplTW9kdWxlLCBbe1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUoKSB7XG4gICAgICB2YXIgd2lkdGggPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDE7XG4gICAgICB2YXIgaGVpZ2h0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAxO1xuICAgICAgdGhpcy5jYW1lcmEubmF0aXZlLmFzcGVjdCA9IHdpZHRoIC8gaGVpZ2h0O1xuICAgICAgdGhpcy5jYW1lcmEubmF0aXZlLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgIGlmICh0aGlzLnJlbmRlcmluZykgdGhpcy5yZW5kZXJpbmcuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCB0cmlnZ2VyXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFRyaWdnZXJzIHJlc2l6ZSB3aGVuIGNhbGxlZC4gd2lkdGggJiBoZWlnaHQgYXJlIGRldGVybWluZWQgYXV0b21hdGljYWxseVxuICAgICAqIFRoaXMgaW52b2tlcyBlYWNoIGNhbGxiYWNrcyB3aXRoIHRoZSBuZXcgd2lkdGggYW5kIGhlaWdodCBhcyBwYXJhbXNcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlc2l6ZU1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidHJpZ2dlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0cmlnZ2VyKCkge1xuICAgICAgdmFyIF90aGlzJGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyLFxuICAgICAgICAgIG9mZnNldFdpZHRoID0gX3RoaXMkY29udGFpbmVyLm9mZnNldFdpZHRoLFxuICAgICAgICAgIG9mZnNldEhlaWdodCA9IF90aGlzJGNvbnRhaW5lci5vZmZzZXRIZWlnaHQsXG4gICAgICAgICAgcmVzb2x1dGlvbiA9IHRoaXMucmVzb2x1dGlvbjtcbiAgICAgIHZhciB3aWR0aCA9IE51bWJlcihvZmZzZXRXaWR0aCAqIHJlc29sdXRpb24ueCkudG9GaXhlZCgpO1xuICAgICAgdmFyIGhlaWdodCA9IE51bWJlcihvZmZzZXRIZWlnaHQgKiByZXNvbHV0aW9uLnkpLnRvRml4ZWQoKTtcbiAgICAgIHRoaXMuY2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgIGNiKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgYWRkQXV0b3Jlc2l6ZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXRzIG1vZHVsZSB0byBhdXRvcmVzaXplLCB0aGlzIGFkZHMgYW4gZXZlbnQgbGlzdGVuZSBvbiB3aW5kb3cgcmVzaXplIHRvIHRyaWdnZXIgdGhlIHJlc2l6ZVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVzaXplTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhZGRBdXRvcmVzaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZEF1dG9yZXNpemUoKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyKCk7XG4gICAgICB0aGlzLnJlc29sdXRpb24gPSB0aGlzLmdldFJlc29sdXRpb24oKTtcbiAgICAgIGlmICh0aGlzLnBhcmFtcy5hdXRvKSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy50cmlnZ2VyLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGFkZENhbGxiYWNrXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZHMgYSBjYWxsIGJhY2sgZnVuY3Rpb24gdG8gdGhlIGV4aXN0aW5nIGNhbGxiYWNrcyBsaXN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYWRkXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZXNpemVNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFkZENhbGxiYWNrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZENhbGxiYWNrKGZ1bmMpIHtcbiAgICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goZnVuYyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgX21hbmFnZXIuZGVmaW5lKCdyZXNpemUnKTtcblxuICAgICAgdGhpcy5yZW5kZXJpbmcgPSBfbWFuYWdlci5nZXQoJ3JlbmRlcmVyJyk7XG4gICAgICB0aGlzLmNhbWVyYSA9IF9tYW5hZ2VyLmdldCgnY2FtZXJhJyk7XG5cbiAgICAgIHRoaXMuZ2V0UmVzb2x1dGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9tYW5hZ2VyLnVzZSgncmVuZGVyaW5nJykucGFyYW1zLnJlc29sdXRpb247XG4gICAgICB9O1xuXG4gICAgICB0aGlzLmdldENvbnRhaW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF9tYW5hZ2VyLmdldCgnY29udGFpbmVyJyk7XG4gICAgICB9O1xuXG4gICAgICBfbWFuYWdlci51cGRhdGUoe1xuICAgICAgICBjb250YWluZXI6IGZ1bmN0aW9uIGNvbnRhaW5lcihfY29udGFpbmVyKSB7XG4gICAgICAgICAgX3RoaXMuY29udGFpbmVyID0gX2NvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYWRkQXV0b3Jlc2l6ZSgpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSZXNpemVNb2R1bGU7XG59KCk7XG5cbnZhciBmcmFnbWVudCA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdFByZXZpb3VzTHVtO1xcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHRDdXJyZW50THVtO1xcclxcbnVuaWZvcm0gZmxvYXQgbWluTHVtaW5hbmNlO1xcclxcbnVuaWZvcm0gZmxvYXQgZGVsdGE7XFxyXFxudW5pZm9ybSBmbG9hdCB0YXU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgcHJldmlvdXNMdW0gPSB0ZXh0dXJlMkQodFByZXZpb3VzTHVtLCB2VXYsIE1JUF9MRVZFTF8xWDEpLnI7XFxyXFxuXFx0ZmxvYXQgY3VycmVudEx1bSA9IHRleHR1cmUyRCh0Q3VycmVudEx1bSwgdlV2LCBNSVBfTEVWRUxfMVgxKS5yO1xcclxcblxcclxcblxcdHByZXZpb3VzTHVtID0gbWF4KG1pbkx1bWluYW5jZSwgcHJldmlvdXNMdW0pO1xcclxcblxcdGN1cnJlbnRMdW0gPSBtYXgobWluTHVtaW5hbmNlLCBjdXJyZW50THVtKTtcXHJcXG5cXHJcXG5cXHQvLyBBZGFwdCB0aGUgbHVtaW5hbmNlIHVzaW5nIFBhdHRhbmFpaydzIHRlY2huaXF1ZS5cXHJcXG5cXHRmbG9hdCBhZGFwdGVkTHVtID0gcHJldmlvdXNMdW0gKyAoY3VycmVudEx1bSAtIHByZXZpb3VzTHVtKSAqICgxLjAgLSBleHAoLWRlbHRhICogdGF1KSk7XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yLnIgPSBhZGFwdGVkTHVtO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEFuIGFkYXB0aXZlIGx1bWlub3NpdHkgc2hhZGVyIG1hdGVyaWFsLlxyXG4gKi9cblxudmFyIEFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBhZGFwdGl2ZSBsdW1pbm9zaXR5IG1hdGVyaWFsLlxyXG4gICAqL1xuICBmdW5jdGlvbiBBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCgpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiQWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWxcIixcbiAgICAgIGRlZmluZXM6IHtcbiAgICAgICAgTUlQX0xFVkVMXzFYMTogXCIwLjBcIlxuICAgICAgfSxcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHRQcmV2aW91c0x1bTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRDdXJyZW50THVtOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgbWluTHVtaW5hbmNlOiBuZXcgVW5pZm9ybSgwLjAxKSxcbiAgICAgICAgZGVsdGE6IG5ldyBVbmlmb3JtKDAuMCksXG4gICAgICAgIHRhdTogbmV3IFVuaWZvcm0oMS4wKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4LFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuICB9XG5cbiAgaW5oZXJpdHMoQWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIEFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQxID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGVwdGg7XFxyXFxuXFxyXFxudW5pZm9ybSBmbG9hdCBmb2N1cztcXHJcXG51bmlmb3JtIGZsb2F0IGRvZjtcXHJcXG51bmlmb3JtIGZsb2F0IGFzcGVjdDtcXHJcXG51bmlmb3JtIGZsb2F0IGFwZXJ0dXJlO1xcclxcbnVuaWZvcm0gZmxvYXQgbWF4Qmx1cjtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbiNpZm5kZWYgVVNFX0xPR0RFUFRIQlVGXFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPHBhY2tpbmc+XFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBjYW1lcmFOZWFyO1xcclxcblxcdHVuaWZvcm0gZmxvYXQgY2FtZXJhRmFyO1xcclxcblxcclxcblxcdGZsb2F0IHJlYWREZXB0aChzYW1wbGVyMkQgZGVwdGhTYW1wbGVyLCB2ZWMyIGNvb3JkKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZnJhZ0Nvb3JkWiA9IHRleHR1cmUyRChkZXB0aFNhbXBsZXIsIGNvb3JkKS54O1xcclxcblxcdFxcdGZsb2F0IHZpZXdaID0gcGVyc3BlY3RpdmVEZXB0aFRvVmlld1ooZnJhZ0Nvb3JkWiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyKTtcXHJcXG5cXHJcXG5cXHRcXHRyZXR1cm4gdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoKHZpZXdaLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBhc3BlY3RDb3JyZWN0aW9uID0gdmVjMigxLjAsIGFzcGVjdCk7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRlxcclxcblxcclxcblxcdFxcdGZsb2F0IGRlcHRoID0gdGV4dHVyZTJEKHREZXB0aCwgdlV2KS54O1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZGVwdGggPSByZWFkRGVwdGgodERlcHRoLCB2VXYpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGZsb2F0IGZvY3VzTmVhciA9IGNsYW1wKGZvY3VzIC0gZG9mLCAwLjAsIDEuMCk7XFxyXFxuXFx0ZmxvYXQgZm9jdXNGYXIgPSBjbGFtcChmb2N1cyArIGRvZiwgMC4wLCAxLjApO1xcclxcblxcclxcblxcdC8vIENhbGN1bGF0ZSBhIERvRiBtYXNrLlxcclxcblxcdGZsb2F0IGxvdyA9IHN0ZXAoZGVwdGgsIGZvY3VzTmVhcik7XFxyXFxuXFx0ZmxvYXQgaGlnaCA9IHN0ZXAoZm9jdXNGYXIsIGRlcHRoKTtcXHJcXG5cXHJcXG5cXHRmbG9hdCBmYWN0b3IgPSAoZGVwdGggLSBmb2N1c05lYXIpICogbG93ICsgKGRlcHRoIC0gZm9jdXNGYXIpICogaGlnaDtcXHJcXG5cXHJcXG5cXHR2ZWMyIGRvZkJsdXIgPSB2ZWMyKGNsYW1wKGZhY3RvciAqIGFwZXJ0dXJlLCAtbWF4Qmx1ciwgbWF4Qmx1cikpO1xcclxcblxcclxcblxcdHZlYzIgZG9mYmx1cjkgPSBkb2ZCbHVyICogMC45O1xcclxcblxcdHZlYzIgZG9mYmx1cjcgPSBkb2ZCbHVyICogMC43O1xcclxcblxcdHZlYzIgZG9mYmx1cjQgPSBkb2ZCbHVyICogMC40O1xcclxcblxcclxcblxcdHZlYzQgY29sb3IgPSB2ZWM0KDAuMCk7XFxyXFxuXFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgICAwLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4xNSwgIDAuMzcpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjI5LCAgMC4yOSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMzcsICAwLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC40MCwgIDAuMCApICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjM3LCAtMC4xNSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4xNSwgLTAuMzcpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjAsICAtMC40ICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMTUsICAwLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4yOSwgIDAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjM3LCAgMC4xNSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuNCwgICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4zNywgLTAuMTUpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjI5LCAtMC4yOSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMTUsIC0wLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4xNSwgIDAuMzcpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyOSk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4zNywgIDAuMTUpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyOSk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4zNywgLTAuMTUpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyOSk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4xNSwgLTAuMzcpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyOSk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4xNSwgIDAuMzcpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyOSk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4zNywgIDAuMTUpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyOSk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4zNywgLTAuMTUpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyOSk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4xNSwgLTAuMzcpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyOSk7XFxyXFxuXFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4yOSwgIDAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNyk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC40MCwgIDAuMCApICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNyk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4yOSwgLTAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNyk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4wLCAgLTAuNCApICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNyk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4yOSwgIDAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNyk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC40LCAgIDAuMCApICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNyk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4yOSwgLTAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNyk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4wLCAgIDAuNCApICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNyk7XFxyXFxuXFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4yOSwgIDAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNCk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC40LCAgIDAuMCApICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNCk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4yOSwgLTAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNCk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4wLCAgLTAuNCApICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNCk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4yOSwgIDAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNCk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC40LCAgIDAuMCApICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNCk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4yOSwgLTAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNCk7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4wLCAgIDAuNCApICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZibHVyNCk7XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gY29sb3IgLyA0MS4wO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkMSA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogRGVwdGggb2YgRmllbGQgc2hhZGVyIChCb2tlaCkuXHJcbiAqXHJcbiAqIE9yaWdpbmFsIHNoYWRlciBjb2RlIGJ5IE1hcnRpbnMgVXBpdGlzOlxyXG4gKiAgaHR0cDovL2FydG1hcnRpbnNoLmJsb2dzcG90LmNvbS8yMDEwLzAyL2dsc2wtbGVucy1ibHVyLWZpbHRlci13aXRoLWJva2VoLmh0bWxcclxuICovXG5cbnZhciBCb2tlaE1hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBib2tlaCBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IFtjYW1lcmFdIC0gQSBjYW1lcmEuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5mb2N1cz0xLjBdIC0gVGhlIGZvY3VzIGRpc3RhbmNlLCBjb3JyZXNwb25kcyBkaXJlY3RseSB3aXRoIHRoZSBzY2VuZSBkZXB0aC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZG9mPTAuMDJdIC0gRGVwdGggb2YgZmllbGQuIEFuIGFyZWEgaW4gZnJvbnQgb2YgYW5kIGJlaGluZCB0aGUgZm9jdXMgcG9pbnQgdGhhdCBzdGlsbCBhcHBlYXJzIHNoYXJwLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hcGVydHVyZT0wLjAyNV0gLSBDYW1lcmEgYXBlcnR1cmUgc2NhbGUuIEJpZ2dlciB2YWx1ZXMgZm9yIHN0cm9uZ2VyIGJsdXIgYW5kIHNoYWxsb3dlciBkZXB0aCBvZiBmaWVsZC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4Qmx1cj0xLjBdIC0gTWF4aW11bSBibHVyIHN0cmVuZ3RoLlxyXG4gICAqL1xuICBmdW5jdGlvbiBCb2tlaE1hdGVyaWFsKGNhbWVyYSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEJva2VoTWF0ZXJpYWwpO1xuXG4gICAgdmFyIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBmb2N1czogMS4wLFxuICAgICAgZG9mOiAwLjAyLFxuICAgICAgYXBlcnR1cmU6IDAuMDI1LFxuICAgICAgbWF4Qmx1cjogMS4wXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQm9rZWhNYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIkJva2VoTWF0ZXJpYWxcIixcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIGNhbWVyYU5lYXI6IG5ldyBVbmlmb3JtKDAuMSksXG4gICAgICAgIGNhbWVyYUZhcjogbmV3IFVuaWZvcm0oMjAwMCksXG4gICAgICAgIGFzcGVjdDogbmV3IFVuaWZvcm0oMS4wKSxcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0RGVwdGg6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICBmb2N1czogbmV3IFVuaWZvcm0oc2V0dGluZ3MuZm9jdXMpLFxuICAgICAgICBkb2Y6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmRvZiksXG4gICAgICAgIGFwZXJ0dXJlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5hcGVydHVyZSksXG4gICAgICAgIG1heEJsdXI6IG5ldyBVbmlmb3JtKHNldHRpbmdzLm1heEJsdXIpXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDEsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQxLFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuXG4gICAgX3RoaXMuYWRvcHRDYW1lcmFTZXR0aW5ncyhjYW1lcmEpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIEFkb3B0cyB0aGUgc2V0dGluZ3Mgb2YgdGhlIGdpdmVuIGNhbWVyYS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IFtjYW1lcmE9bnVsbF0gLSBBIGNhbWVyYS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEJva2VoTWF0ZXJpYWwsIFt7XG4gICAga2V5OiBcImFkb3B0Q2FtZXJhU2V0dGluZ3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRvcHRDYW1lcmFTZXR0aW5ncygpIHtcbiAgICAgIHZhciBjYW1lcmEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG5cbiAgICAgIGlmIChjYW1lcmEgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy51bmlmb3Jtcy5jYW1lcmFOZWFyLnZhbHVlID0gY2FtZXJhLm5lYXI7XG4gICAgICAgIHRoaXMudW5pZm9ybXMuY2FtZXJhRmFyLnZhbHVlID0gY2FtZXJhLmZhcjtcbiAgICAgICAgdGhpcy51bmlmb3Jtcy5hc3BlY3QudmFsdWUgPSBjYW1lcmEuYXNwZWN0O1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEJva2VoTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIEJva2VoTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDIgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXRbM107XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdGNvbnN0IHZlYzIgdGhyZXNob2xkID0gdmVjMihFREdFX1RIUkVTSE9MRCk7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIGNvbG9yIGRlbHRhcy5cXHJcXG5cXHR2ZWM0IGRlbHRhO1xcclxcblxcdHZlYzMgYyA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KS5yZ2I7XFxyXFxuXFxyXFxuXFx0dmVjMyBjTGVmdCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdk9mZnNldFswXS54eSkucmdiO1xcclxcblxcdHZlYzMgdCA9IGFicyhjIC0gY0xlZnQpO1xcclxcblxcdGRlbHRhLnggPSBtYXgobWF4KHQuciwgdC5nKSwgdC5iKTtcXHJcXG5cXHJcXG5cXHR2ZWMzIGNUb3AgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZPZmZzZXRbMF0uencpLnJnYjtcXHJcXG5cXHR0ID0gYWJzKGMgLSBjVG9wKTtcXHJcXG5cXHRkZWx0YS55ID0gbWF4KG1heCh0LnIsIHQuZyksIHQuYik7XFxyXFxuXFxyXFxuXFx0Ly8gV2UgZG8gdGhlIHVzdWFsIHRocmVzaG9sZC5cXHJcXG5cXHR2ZWMyIGVkZ2VzID0gc3RlcCh0aHJlc2hvbGQsIGRlbHRhLnh5KTtcXHJcXG5cXHJcXG5cXHQvLyBUaGVuIGRpc2NhcmQgaWYgdGhlcmUgaXMgbm8gZWRnZS5cXHJcXG5cXHRpZihkb3QoZWRnZXMsIHZlYzIoMS4wKSkgPT0gMC4wKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZGlzY2FyZDtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIHJpZ2h0IGFuZCBib3R0b20gZGVsdGFzLlxcclxcblxcdHZlYzMgY1JpZ2h0ID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2T2Zmc2V0WzFdLnh5KS5yZ2I7XFxyXFxuXFx0dCA9IGFicyhjIC0gY1JpZ2h0KTtcXHJcXG5cXHRkZWx0YS56ID0gbWF4KG1heCh0LnIsIHQuZyksIHQuYik7XFxyXFxuXFxyXFxuXFx0dmVjMyBjQm90dG9tID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2T2Zmc2V0WzFdLnp3KS5yZ2I7XFxyXFxuXFx0dCA9IGFicyhjIC0gY0JvdHRvbSk7XFxyXFxuXFx0ZGVsdGEudyA9IG1heChtYXgodC5yLCB0LmcpLCB0LmIpO1xcclxcblxcclxcblxcdC8vIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBkZWx0YSBpbiB0aGUgZGlyZWN0IG5laWdoYm9yaG9vZC5cXHJcXG5cXHRmbG9hdCBtYXhEZWx0YSA9IG1heChtYXgobWF4KGRlbHRhLngsIGRlbHRhLnkpLCBkZWx0YS56KSwgZGVsdGEudyk7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIGxlZnQtbGVmdCBhbmQgdG9wLXRvcCBkZWx0YXMuXFxyXFxuXFx0dmVjMyBjTGVmdExlZnQgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZPZmZzZXRbMl0ueHkpLnJnYjtcXHJcXG5cXHR0ID0gYWJzKGMgLSBjTGVmdExlZnQpO1xcclxcblxcdGRlbHRhLnogPSBtYXgobWF4KHQuciwgdC5nKSwgdC5iKTtcXHJcXG5cXHJcXG5cXHR2ZWMzIGNUb3BUb3AgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZPZmZzZXRbMl0uencpLnJnYjtcXHJcXG5cXHR0ID0gYWJzKGMgLSBjVG9wVG9wKTtcXHJcXG5cXHRkZWx0YS53ID0gbWF4KG1heCh0LnIsIHQuZyksIHQuYik7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIHRoZSBmaW5hbCBtYXhpbXVtIGRlbHRhLlxcclxcblxcdG1heERlbHRhID0gbWF4KG1heChtYXhEZWx0YSwgZGVsdGEueiksIGRlbHRhLncpO1xcclxcblxcclxcblxcdC8vIExvY2FsIGNvbnRyYXN0IGFkYXB0YXRpb24gaW4gYWN0aW9uLlxcclxcblxcdGVkZ2VzLnh5ICo9IHN0ZXAoMC41ICogbWF4RGVsdGEsIGRlbHRhLnh5KTtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KGVkZ2VzLCAwLjAsIDAuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQyID0gXCJ1bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXRbM107XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcclxcblxcdHZPZmZzZXRbMF0gPSB1di54eXh5ICsgdGV4ZWxTaXplLnh5eHkgKiB2ZWM0KC0xLjAsIDAuMCwgMC4wLCAxLjApOyAvLyBDaGFuZ2VkIHNpZ24gaW4gVyBjb21wb25lbnQuXFxyXFxuXFx0dk9mZnNldFsxXSA9IHV2Lnh5eHkgKyB0ZXhlbFNpemUueHl4eSAqIHZlYzQoMS4wLCAwLjAsIDAuMCwgLTEuMCk7IC8vIENoYW5nZWQgc2lnbiBpbiBXIGNvbXBvbmVudC5cXHJcXG5cXHR2T2Zmc2V0WzJdID0gdXYueHl4eSArIHRleGVsU2l6ZS54eXh5ICogdmVjNCgtMi4wLCAwLjAsIDAuMCwgMi4wKTsgLy8gQ2hhbmdlZCBzaWduIGluIFcgY29tcG9uZW50LlxcclxcblxcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEEgbWF0ZXJpYWwgdGhhdCBkZXRlY3RzIGVkZ2VzIGluIGEgY29sb3IgdGV4dHVyZS5cclxuICpcclxuICogTWFpbmx5IHVzZWQgZm9yIFN1YnBpeGVsIE1vcnBob2xvZ2ljYWwgQW50aWFsaWFzaW5nLlxyXG4gKi9cblxudmFyIENvbG9yRWRnZXNNYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgY29sb3IgZWRnZXMgbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt0ZXhlbFNpemVdIC0gVGhlIGFic29sdXRlIHNjcmVlbiB0ZXhlbCBzaXplLlxyXG4gICAqL1xuICBmdW5jdGlvbiBDb2xvckVkZ2VzTWF0ZXJpYWwoKSB7XG4gICAgdmFyIHRleGVsU2l6ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbmV3IFZlY3RvcjIoKTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENvbG9yRWRnZXNNYXRlcmlhbCk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKENvbG9yRWRnZXNNYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIkNvbG9yRWRnZXNNYXRlcmlhbFwiLFxuICAgICAgZGVmaW5lczoge1xuICAgICAgICBFREdFX1RIUkVTSE9MRDogXCIwLjFcIlxuICAgICAgfSxcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdGV4ZWxTaXplOiBuZXcgVW5pZm9ybSh0ZXhlbFNpemUpXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDIsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQyLFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuICB9XG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIGVkZ2UgZGV0ZWN0aW9uIHNlbnNpdGl2aXR5LlxyXG4gICAqXHJcbiAgICogQSBsb3dlciB2YWx1ZSByZXN1bHRzIGluIG1vcmUgZWRnZXMgYmVpbmcgZGV0ZWN0ZWQgYXQgdGhlIGV4cGVuc2Ugb2ZcclxuICAgKiBwZXJmb3JtYW5jZS5cclxuICAgKlxyXG4gICAqIDAuMSBpcyBhIHJlYXNvbmFibGUgdmFsdWUsIGFuZCBhbGxvd3MgdG8gY2F0Y2ggbW9zdCB2aXNpYmxlIGVkZ2VzLlxyXG4gICAqIDAuMDUgaXMgYSByYXRoZXIgb3ZlcmtpbGwgdmFsdWUsIHRoYXQgYWxsb3dzIHRvIGNhdGNoICdlbSBhbGwuXHJcbiAgICpcclxuICAgKiBJZiB0ZW1wb3JhbCBzdXBlcnNhbXBsaW5nIGlzIHVzZWQsIDAuMiBjb3VsZCBiZSBhIHJlYXNvbmFibGUgdmFsdWUsXHJcbiAgICogYXMgbG93IGNvbnRyYXN0IGVkZ2VzIGFyZSBwcm9wZXJseSBmaWx0ZXJlZCBieSBqdXN0IDJ4LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRocmVzaG9sZCAtIFRoZSBlZGdlIGRldGVjdGlvbiBzZW5zaXRpdml0eS4gUmFuZ2U6IFswLCAwLjVdLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQ29sb3JFZGdlc01hdGVyaWFsLCBbe1xuICAgIGtleTogXCJzZXRFZGdlRGV0ZWN0aW9uVGhyZXNob2xkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEVkZ2VEZXRlY3Rpb25UaHJlc2hvbGQodGhyZXNob2xkKSB7XG4gICAgICB0aGlzLmRlZmluZXMuRURHRV9USFJFU0hPTEQgPSB0aHJlc2hvbGQudG9GaXhlZChcIjJcIik7XG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhDb2xvckVkZ2VzTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIENvbG9yRWRnZXNNYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkMyA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTE7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTI7XFxyXFxuXFxyXFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5MTtcXHJcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHkyO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzQgdGV4ZWwxID0gb3BhY2l0eTEgKiB0ZXh0dXJlMkQodGV4dHVyZTEsIHZVdik7XFxyXFxuXFx0dmVjNCB0ZXhlbDIgPSBvcGFjaXR5MiAqIHRleHR1cmUyRCh0ZXh0dXJlMiwgdlV2KTtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgU0NSRUVOX01PREVcXHJcXG5cXHJcXG5cXHRcXHR2ZWMzIGludlRleGVsMSA9IHZlYzMoMS4wKSAtIHRleGVsMS5yZ2I7XFxyXFxuXFx0XFx0dmVjMyBpbnZUZXhlbDIgPSB2ZWMzKDEuMCkgLSB0ZXhlbDIucmdiO1xcclxcblxcclxcblxcdFxcdHZlYzQgY29sb3IgPSB2ZWM0KFxcclxcblxcdFxcdFxcdHZlYzMoMS4wKSAtIGludlRleGVsMSAqIGludlRleGVsMixcXHJcXG5cXHRcXHRcXHR0ZXhlbDEuYSArIHRleGVsMi5hXFxyXFxuXFx0XFx0KTtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdHZlYzQgY29sb3IgPSB0ZXhlbDEgKyB0ZXhlbDI7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gY29sb3I7XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQzID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBBIG1hdGVyaWFsIGZvciBjb21iaW5pbmcgdHdvIHRleHR1cmVzLlxyXG4gKlxyXG4gKiBUaGlzIG1hdGVyaWFsIHN1cHBvcnRzIHRoZSB0d28gYmxlbmQgbW9kZXMgQWRkIGFuZCBTY3JlZW4uXHJcbiAqXHJcbiAqIEluIFNjcmVlbiBtb2RlLCB0aGUgdHdvIHRleHR1cmVzIGFyZSBlZmZlY3RpdmVseSBwcm9qZWN0ZWQgb24gYSB3aGl0ZSBzY3JlZW5cclxuICogc2ltdWx0YW5lb3VzbHkuIEluIEFkZCBtb2RlLCB0aGUgdGV4dHVyZXMgYXJlIHNpbXBseSBhZGRlZCB0b2dldGhlciB3aGljaFxyXG4gKiBvZnRlbiBwcm9kdWNlcyB1bmRlc2lyZWQsIHdhc2hlZCBvdXQgcmVzdWx0cy5cclxuICovXG5cbnZhciBDb21iaW5lTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbWJpbmUgbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzY3JlZW5Nb2RlPWZhbHNlXSAtIFdoZXRoZXIgdGhlIHNjcmVlbiBibGVuZCBtb2RlIHNob3VsZCBiZSB1c2VkLlxyXG4gICAqL1xuICBmdW5jdGlvbiBDb21iaW5lTWF0ZXJpYWwoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHNjcmVlbk1vZGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29tYmluZU1hdGVyaWFsKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKENvbWJpbmVNYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIkNvbWJpbmVNYXRlcmlhbFwiLFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdGV4dHVyZTE6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0ZXh0dXJlMjogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIG9wYWNpdHkxOiBuZXcgVW5pZm9ybSgxLjApLFxuICAgICAgICBvcGFjaXR5MjogbmV3IFVuaWZvcm0oMS4wKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQzLFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkMyxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcblxuICAgIF90aGlzLnNldFNjcmVlbk1vZGVFbmFibGVkKHNjcmVlbk1vZGUpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFNjcmVlbiBibGVuZCBtb2RlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgU2NyZWVuIGJsZW5kIG1vZGUgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhDb21iaW5lTWF0ZXJpYWwsIFt7XG4gICAga2V5OiBcInNldFNjcmVlbk1vZGVFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNjcmVlbk1vZGVFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5TQ1JFRU5fTU9ERSA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5TQ1JFRU5fTU9ERTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQ29tYmluZU1hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBDb21iaW5lTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDQgPSBcIiNpbmNsdWRlIDxjb21tb24+XFxyXFxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxcclxcblxcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXYwO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYxO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYyO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYzO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHQvLyBTYW1wbGUgdG9wIGxlZnQgdGV4ZWwuXFxyXFxuXFx0dmVjNCBzdW0gPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdjApO1xcclxcblxcclxcblxcdC8vIFNhbXBsZSB0b3AgcmlnaHQgdGV4ZWwuXFxyXFxuXFx0c3VtICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2MSk7XFxyXFxuXFxyXFxuXFx0Ly8gU2FtcGxlIGJvdHRvbSByaWdodCB0ZXhlbC5cXHJcXG5cXHRzdW0gKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYyKTtcXHJcXG5cXHJcXG5cXHQvLyBTYW1wbGUgYm90dG9tIGxlZnQgdGV4ZWwuXFxyXFxuXFx0c3VtICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2Myk7XFxyXFxuXFxyXFxuXFx0Ly8gQ29tcHV0ZSB0aGUgYXZlcmFnZS5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSBzdW0gKiAwLjI1O1xcclxcblxcclxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQ0ID0gXCJ1bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcbnVuaWZvcm0gdmVjMiBoYWxmVGV4ZWxTaXplO1xcclxcbnVuaWZvcm0gZmxvYXQga2VybmVsO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXYwO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYxO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYyO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYzO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGRVdiA9ICh0ZXhlbFNpemUgKiB2ZWMyKGtlcm5lbCkpICsgaGFsZlRleGVsU2l6ZTtcXHJcXG5cXHJcXG5cXHR2VXYwID0gdmVjMih1di54IC0gZFV2LngsIHV2LnkgKyBkVXYueSk7XFxyXFxuXFx0dlV2MSA9IHZlYzIodXYueCArIGRVdi54LCB1di55ICsgZFV2LnkpO1xcclxcblxcdHZVdjIgPSB2ZWMyKHV2LnggKyBkVXYueCwgdXYueSAtIGRVdi55KTtcXHJcXG5cXHR2VXYzID0gdmVjMih1di54IC0gZFV2LngsIHV2LnkgLSBkVXYueSk7XFxyXFxuXFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogQW4gb3B0aW1pc2VkIGNvbnZvbHV0aW9uIHNoYWRlciBtYXRlcmlhbC5cclxuICpcclxuICogVGhpcyBtYXRlcmlhbCBzdXBwb3J0cyBkaXRoZXJpbmcuXHJcbiAqXHJcbiAqIEJhc2VkIG9uIHRoZSBHREMyMDAzIFByZXNlbnRhdGlvbiBieSBNYXNha2kgS2F3YXNlLCBCdW5rYXNoYSBHYW1lczpcclxuICogIEZyYW1lIEJ1ZmZlciBQb3N0cHJvY2Vzc2luZyBFZmZlY3RzIGluIERPVUJMRS1TLlQuRS5BLkwgKFdyZWNrbGVzcylcclxuICogYW5kIGFuIGFydGljbGUgYnkgRmlsaXAgU3RydWdhciwgSW50ZWw6XHJcbiAqICBBbiBpbnZlc3RpZ2F0aW9uIG9mIGZhc3QgcmVhbC10aW1lIEdQVS1iYXNlZCBpbWFnZSBibHVyIGFsZ29yaXRobXNcclxuICpcclxuICogRnVydGhlciBtb2RpZmllZCBhY2NvcmRpbmcgdG8gQXBwbGUnc1xyXG4gKiBbQmVzdCBQcmFjdGljZXMgZm9yIFNoYWRlcnNdKGh0dHBzOi8vZ29vLmdsL2xtUm9NNSkuXHJcbiAqL1xuXG52YXIgQ29udm9sdXRpb25NYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgY29udm9sdXRpb24gbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt0ZXhlbFNpemVdIC0gVGhlIGFic29sdXRlIHNjcmVlbiB0ZXhlbCBzaXplLlxyXG4gICAqL1xuICBmdW5jdGlvbiBDb252b2x1dGlvbk1hdGVyaWFsKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciB0ZXhlbFNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG5ldyBWZWN0b3IyKCk7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb252b2x1dGlvbk1hdGVyaWFsKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKENvbnZvbHV0aW9uTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJDb252b2x1dGlvbk1hdGVyaWFsXCIsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRleGVsU2l6ZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSksXG4gICAgICAgIGhhbGZUZXhlbFNpemU6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKCkpLFxuICAgICAgICBrZXJuZWw6IG5ldyBVbmlmb3JtKDAuMClcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkNCxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDQsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG5cbiAgICBfdGhpcy5zZXRUZXhlbFNpemUodGV4ZWxTaXplLngsIHRleGVsU2l6ZS55KTtcbiAgICAvKipcclxuICAgICAqIFRoZSBjdXJyZW50IGtlcm5lbCBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG4gICAgICogQGRlZmF1bHQgS2VybmVsU2l6ZS5MQVJHRVxyXG4gICAgICovXG5cblxuICAgIF90aGlzLmtlcm5lbFNpemUgPSBLZXJuZWxTaXplLkxBUkdFO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBrZXJuZWwuXHJcbiAgICpcclxuICAgKiBAcmV0dXJuIHtGbG9hdDMyQXJyYXl9IFRoZSBrZXJuZWwuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhDb252b2x1dGlvbk1hdGVyaWFsLCBbe1xuICAgIGtleTogXCJnZXRLZXJuZWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0S2VybmVsKCkge1xuICAgICAgcmV0dXJuIGtlcm5lbFByZXNldHNbdGhpcy5rZXJuZWxTaXplXTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0ZXhlbCBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4IC0gVGhlIHRleGVsIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHkgLSBUaGUgdGV4ZWwgaGVpZ2h0LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRUZXhlbFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VGV4ZWxTaXplKHgsIHkpIHtcbiAgICAgIHRoaXMudW5pZm9ybXMudGV4ZWxTaXplLnZhbHVlLnNldCh4LCB5KTtcbiAgICAgIHRoaXMudW5pZm9ybXMuaGFsZlRleGVsU2l6ZS52YWx1ZS5zZXQoeCwgeSkubXVsdGlwbHlTY2FsYXIoMC41KTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhDb252b2x1dGlvbk1hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBDb252b2x1dGlvbk1hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG4vKipcclxuICogVGhlIEthd2FzZSBibHVyIGtlcm5lbCBwcmVzZXRzLlxyXG4gKlxyXG4gKiBAdHlwZSB7RmxvYXQzMkFycmF5W119XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIga2VybmVsUHJlc2V0cyA9IFtuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMF0pLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDEuMCwgMS4wXSksIG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMS4wLCAxLjAsIDIuMF0pLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDEuMCwgMi4wLCAyLjAsIDMuMF0pLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDEuMCwgMi4wLCAzLjAsIDQuMCwgNC4wLCA1LjBdKSwgbmV3IEZsb2F0MzJBcnJheShbMC4wLCAxLjAsIDIuMCwgMy4wLCA0LjAsIDUuMCwgNy4wLCA4LjAsIDkuMCwgMTAuMF0pXTtcbi8qKlxyXG4gKiBBIGtlcm5lbCBzaXplIGVudW1lcmF0aW9uLlxyXG4gKlxyXG4gKiBAdHlwZSB7T2JqZWN0fVxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gVkVSWV9TTUFMTCAtIEEgdmVyeSBzbWFsbCBrZXJuZWwgdGhhdCBtYXRjaGVzIGEgN3g3IEdhdXNzIGJsdXIga2VybmVsLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gU01BTEwgLSBBIHNtYWxsIGtlcm5lbCB0aGF0IG1hdGNoZXMgYSAxNXgxNSBHYXVzcyBibHVyIGtlcm5lbC5cclxuICogQHByb3BlcnR5IHtOdW1iZXJ9IE1FRElVTSAtIEEgbWVkaXVtIHNpemVkIGtlcm5lbCB0aGF0IG1hdGNoZXMgYSAyM3gyMyBHYXVzcyBibHVyIGtlcm5lbC5cclxuICogQHByb3BlcnR5IHtOdW1iZXJ9IExBUkdFIC0gQSBsYXJnZSBrZXJuZWwgdGhhdCBtYXRjaGVzIGEgMzV4MzUgR2F1c3MgYmx1ciBrZXJuZWwuXHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBWRVJZX0xBUkdFIC0gQSB2ZXJ5IGxhcmdlIGtlcm5lbCB0aGF0IG1hdGNoZXMgYSA2M3g2MyBHYXVzcyBibHVyIGtlcm5lbC5cclxuICogQHByb3BlcnR5IHtOdW1iZXJ9IEhVR0UgLSBBIGh1Z2Uga2VybmVsIHRoYXQgbWF0Y2hlcyBhIDEyN3gxMjcgR2F1c3MgYmx1ciBrZXJuZWwuXHJcbiAqL1xuXG52YXIgS2VybmVsU2l6ZSA9IHtcbiAgVkVSWV9TTUFMTDogMCxcbiAgU01BTEw6IDEsXG4gIE1FRElVTTogMixcbiAgTEFSR0U6IDMsXG4gIFZFUllfTEFSR0U6IDQsXG4gIEhVR0U6IDVcbn07XG5cbnZhciBmcmFnbWVudCQ1ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB0ZXhlbCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSBvcGFjaXR5ICogdGV4ZWw7XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQ1ID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBBIHNpbXBsZSBjb3B5IHNoYWRlciBtYXRlcmlhbC5cclxuICovXG5cbnZhciBDb3B5TWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvcHkgbWF0ZXJpYWwuXHJcbiAgICovXG4gIGZ1bmN0aW9uIENvcHlNYXRlcmlhbCgpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb3B5TWF0ZXJpYWwpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihDb3B5TWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJDb3B5TWF0ZXJpYWxcIixcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgb3BhY2l0eTogbmV3IFVuaWZvcm0oMS4wKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQ1LFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkNSxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcbiAgfVxuXG4gIGluaGVyaXRzKENvcHlNYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gQ29weU1hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQ2ID0gXCIjaW5jbHVkZSA8cGFja2luZz5cXHJcXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERlcHRoO1xcclxcbnVuaWZvcm0gZmxvYXQgY2FtZXJhTmVhcjtcXHJcXG51bmlmb3JtIGZsb2F0IGNhbWVyYUZhcjtcXHJcXG5cXHJcXG52YXJ5aW5nIGZsb2F0IHZWaWV3WjtcXHJcXG52YXJ5aW5nIHZlYzQgdlByb2pUZXhDb29yZDtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXHJcXG5cXHJcXG5cXHQvLyBUcmFuc2Zvcm0gaW50byBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSAobm90IG1pcnJvcmVkKS5cXHJcXG5cXHR2ZWMyIHByb2pUZXhDb29yZCA9ICh2UHJvalRleENvb3JkLnh5IC8gdlByb2pUZXhDb29yZC53KSAqIDAuNSArIDAuNTtcXHJcXG5cXHRwcm9qVGV4Q29vcmQgPSBjbGFtcChwcm9qVGV4Q29vcmQsIDAuMDAyLCAwLjk5OCk7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgZnJhZ0Nvb3JkWiA9IHVucGFja1JHQkFUb0RlcHRoKHRleHR1cmUyRCh0RGVwdGgsIHByb2pUZXhDb29yZCkpO1xcclxcblxcclxcblxcdCNpZmRlZiBQRVJTUEVDVElWRV9DQU1FUkFcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCB2aWV3WiA9IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKGZyYWdDb29yZFosIGNhbWVyYU5lYXIsIGNhbWVyYUZhcik7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCB2aWV3WiA9IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WihmcmFnQ29vcmRaLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGZsb2F0IGRlcHRoVGVzdCA9ICgtdlZpZXdaID4gLXZpZXdaKSA/IDEuMCA6IDAuMDtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IucmdiID0gdmVjMygwLjAsIGRlcHRoVGVzdCwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDYgPSBcIiNpbmNsdWRlIDxjb21tb24+XFxyXFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcclxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXHJcXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcclxcblxcclxcbnZhcnlpbmcgZmxvYXQgdlZpZXdaO1xcclxcbnZhcnlpbmcgdmVjNCB2UHJvalRleENvb3JkO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcclxcblxcclxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxyXFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXHJcXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcclxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXHJcXG5cXHJcXG5cXHR2Vmlld1ogPSBtdlBvc2l0aW9uLno7XFxyXFxuXFx0dlByb2pUZXhDb29yZCA9IGdsX1Bvc2l0aW9uO1xcclxcblxcclxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4Plxcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBBIGRlcHRoIGNvbXBhcmlzb24gc2hhZGVyIG1hdGVyaWFsLlxyXG4gKi9cblxudmFyIERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBkZXB0aCBjb21wYXJpc29uIG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtUZXh0dXJlfSBbZGVwdGhUZXh0dXJlPW51bGxdIC0gQSBkZXB0aCB0ZXh0dXJlLlxyXG4gICAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IFtjYW1lcmFdIC0gQSBjYW1lcmEuXHJcbiAgICovXG4gIGZ1bmN0aW9uIERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBkZXB0aFRleHR1cmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgdmFyIGNhbWVyYSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRGVwdGhDb21wYXJpc29uTWF0ZXJpYWwpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoRGVwdGhDb21wYXJpc29uTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJEZXB0aENvbXBhcmlzb25NYXRlcmlhbFwiLFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdERlcHRoOiBuZXcgVW5pZm9ybShkZXB0aFRleHR1cmUpLFxuICAgICAgICBjYW1lcmFOZWFyOiBuZXcgVW5pZm9ybSgwLjEpLFxuICAgICAgICBjYW1lcmFGYXI6IG5ldyBVbmlmb3JtKDIwMDApXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDYsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQ2LFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxuICAgICAgbW9ycGhUYXJnZXRzOiB0cnVlLFxuICAgICAgc2tpbm5pbmc6IHRydWVcbiAgICB9KSk7XG5cbiAgICBfdGhpcy5hZG9wdENhbWVyYVNldHRpbmdzKGNhbWVyYSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogQWRvcHRzIHRoZSBzZXR0aW5ncyBvZiB0aGUgZ2l2ZW4gY2FtZXJhLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtDYW1lcmF9IFtjYW1lcmE9bnVsbF0gLSBBIGNhbWVyYS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsLCBbe1xuICAgIGtleTogXCJhZG9wdENhbWVyYVNldHRpbmdzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkb3B0Q2FtZXJhU2V0dGluZ3MoKSB7XG4gICAgICB2YXIgY2FtZXJhID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuXG4gICAgICBpZiAoY2FtZXJhICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMudW5pZm9ybXMuY2FtZXJhTmVhci52YWx1ZSA9IGNhbWVyYS5uZWFyO1xuICAgICAgICB0aGlzLnVuaWZvcm1zLmNhbWVyYUZhci52YWx1ZSA9IGNhbWVyYS5mYXI7XG5cbiAgICAgICAgaWYgKGNhbWVyYSBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlQ2FtZXJhKSB7XG4gICAgICAgICAgdGhpcy5kZWZpbmVzLlBFUlNQRUNUSVZFX0NBTUVSQSA9IFwiMVwiO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuUEVSU1BFQ1RJVkVfQ0FNRVJBO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoRGVwdGhDb21wYXJpc29uTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQ3ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGFuZ2xlO1xcclxcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XFxyXFxudW5pZm9ybSBmbG9hdCBpbnRlbnNpdHk7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2UGF0dGVybjtcXHJcXG5cXHJcXG5mbG9hdCBwYXR0ZXJuKCkge1xcclxcblxcclxcblxcdGZsb2F0IHMgPSBzaW4oYW5nbGUpO1xcclxcblxcdGZsb2F0IGMgPSBjb3MoYW5nbGUpO1xcclxcblxcclxcblxcdHZlYzIgcG9pbnQgPSB2ZWMyKGMgKiB2VXZQYXR0ZXJuLnggLSBzICogdlV2UGF0dGVybi55LCBzICogdlV2UGF0dGVybi54ICsgYyAqIHZVdlBhdHRlcm4ueSkgKiBzY2FsZTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gKHNpbihwb2ludC54KSAqIHNpbihwb2ludC55KSkgKiA0LjA7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdHZlYzMgY29sb3IgPSB0ZXhlbC5yZ2I7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIEFWRVJBR0VcXHJcXG5cXHJcXG5cXHRcXHRjb2xvciA9IHZlYzMoKGNvbG9yLnIgKyBjb2xvci5nICsgY29sb3IuYikgLyAzLjApO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGNvbG9yID0gdmVjMyhjb2xvciAqIDEwLjAgLSA1LjAgKyBwYXR0ZXJuKCkpO1xcclxcblxcdGNvbG9yID0gdGV4ZWwucmdiICsgKGNvbG9yIC0gdGV4ZWwucmdiKSAqIGludGVuc2l0eTtcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCB0ZXhlbC5hKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDcgPSBcInVuaWZvcm0gdmVjNCBvZmZzZXRSZXBlYXQ7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2UGF0dGVybjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0dlV2UGF0dGVybiA9IHV2ICogb2Zmc2V0UmVwZWF0Lnp3ICsgb2Zmc2V0UmVwZWF0Lnh5O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEEgZG90IHNjcmVlbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqL1xuXG52YXIgRG90U2NyZWVuTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGRvdCBzY3JlZW4gbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYXZlcmFnZT1mYWxzZV0gLSBXaGV0aGVyIHRoZSBzaGFkZXIgc2hvdWxkIG91dHB1dCB0aGUgY29sb3VyIGF2ZXJhZ2UgKGJsYWNrIGFuZCB3aGl0ZSkuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5hbmdsZT0xLjU3XSAtIFRoZSBhbmdsZSBvZiB0aGUgZG90IHBhdHRlcm4uXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zY2FsZT0xLjBdIC0gVGhlIHNjYWxlIG9mIHRoZSBkb3QgcGF0dGVybi5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmludGVuc2l0eT0xLjBdIC0gVGhlIGludGVuc2l0eSBvZiB0aGUgZWZmZWN0LlxyXG4gICAqL1xuICBmdW5jdGlvbiBEb3RTY3JlZW5NYXRlcmlhbCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBEb3RTY3JlZW5NYXRlcmlhbCk7XG5cbiAgICB2YXIgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGF2ZXJhZ2U6IGZhbHNlLFxuICAgICAgYW5nbGU6IDEuNTcsXG4gICAgICBzY2FsZTogMS4wLFxuICAgICAgaW50ZW5zaXR5OiAxLjBcbiAgICB9LCBvcHRpb25zKTtcbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihEb3RTY3JlZW5NYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIkRvdFNjcmVlbk1hdGVyaWFsXCIsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIGFuZ2xlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5hbmdsZSksXG4gICAgICAgIHNjYWxlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5zY2FsZSksXG4gICAgICAgIGludGVuc2l0eTogbmV3IFVuaWZvcm0oc2V0dGluZ3MuaW50ZW5zaXR5KSxcbiAgICAgICAgb2Zmc2V0UmVwZWF0OiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yNCgwLjUsIDAuNSwgMS4wLCAxLjApKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQ3LFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkNyxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcblxuICAgIF90aGlzLnNldEF2ZXJhZ2VFbmFibGVkKHNldHRpbmdzLmF2ZXJhZ2UpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFNjcmVlbiBibGVuZCBtb2RlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgU2NyZWVuIGJsZW5kIG1vZGUgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhEb3RTY3JlZW5NYXRlcmlhbCwgW3tcbiAgICBrZXk6IFwic2V0QXZlcmFnZUVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0QXZlcmFnZUVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLkFWRVJBR0UgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuQVZFUkFHRTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoRG90U2NyZWVuTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIERvdFNjcmVlbk1hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQ4ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIGZsb2F0IHRpbWU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG4jaWZkZWYgTk9JU0VcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IG5vaXNlSW50ZW5zaXR5O1xcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbiNpZmRlZiBTQ0FOTElORVNcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IHNjYW5saW5lSW50ZW5zaXR5O1xcclxcblxcdHVuaWZvcm0gZmxvYXQgc2NhbmxpbmVDb3VudDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgR1JJRFxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgZ3JpZEludGVuc2l0eTtcXHJcXG5cXHR1bmlmb3JtIHZlYzIgZ3JpZFNjYWxlO1xcclxcblxcdHVuaWZvcm0gZmxvYXQgZ3JpZExpbmVXaWR0aDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgR1JFWVNDQUxFXFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGdyZXlzY2FsZUludGVuc2l0eTtcXHJcXG5cXHJcXG4jZWxpZiBkZWZpbmVkKFNFUElBKVxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgc2VwaWFJbnRlbnNpdHk7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxuI2lmZGVmIFZJR05FVFRFXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCB2aWduZXR0ZU9mZnNldDtcXHJcXG5cXHR1bmlmb3JtIGZsb2F0IHZpZ25ldHRlRGFya25lc3M7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzQgdGV4ZWwgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFx0dmVjMyBjb2xvciA9IHRleGVsLnJnYjtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgU0NSRUVOX01PREVcXHJcXG5cXHJcXG5cXHRcXHR2ZWMzIGludkNvbG9yO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBOT0lTRVxcclxcblxcclxcblxcdFxcdGZsb2F0IHggPSB2VXYueCAqIHZVdi55ICogdGltZSAqIDEwMDAuMDtcXHJcXG5cXHRcXHR4ID0gbW9kKHgsIDEzLjApICogbW9kKHgsIDEyMy4wKTtcXHJcXG5cXHRcXHR4ID0gbW9kKHgsIDAuMDEpO1xcclxcblxcclxcblxcdFxcdHZlYzMgbm9pc2UgPSB0ZXhlbC5yZ2IgKiBjbGFtcCgwLjEgKyB4ICogMTAwLjAsIDAuMCwgMS4wKSAqIG5vaXNlSW50ZW5zaXR5O1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBTQ1JFRU5fTU9ERVxcclxcblxcclxcblxcdFxcdFxcdGludkNvbG9yID0gdmVjMygxLjApIC0gY29sb3I7XFxyXFxuXFx0XFx0XFx0dmVjMyBpbnZOb2lzZSA9IHZlYzMoMS4wKSAtIG5vaXNlO1xcclxcblxcclxcblxcdFxcdFxcdGNvbG9yID0gdmVjMygxLjApIC0gaW52Q29sb3IgKiBpbnZOb2lzZTtcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGNvbG9yICs9IG5vaXNlO1xcclxcblxcclxcblxcdFxcdCNlbmRpZlxcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBTQ0FOTElORVNcXHJcXG5cXHJcXG5cXHRcXHR2ZWMyIHNsID0gdmVjMihzaW4odlV2LnkgKiBzY2FubGluZUNvdW50KSwgY29zKHZVdi55ICogc2NhbmxpbmVDb3VudCkpO1xcclxcblxcdFxcdHZlYzMgc2NhbmxpbmVzID0gdGV4ZWwucmdiICogdmVjMyhzbC54LCBzbC55LCBzbC54KSAqIHNjYW5saW5lSW50ZW5zaXR5O1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBTQ1JFRU5fTU9ERVxcclxcblxcclxcblxcdFxcdFxcdGludkNvbG9yID0gdmVjMygxLjApIC0gY29sb3I7XFxyXFxuXFx0XFx0XFx0dmVjMyBpbnZTY2FubGluZXMgPSB2ZWMzKDEuMCkgLSBzY2FubGluZXM7XFxyXFxuXFxyXFxuXFx0XFx0XFx0Y29sb3IgPSB2ZWMzKDEuMCkgLSBpbnZDb2xvciAqIGludlNjYW5saW5lcztcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGNvbG9yICs9IHNjYW5saW5lcztcXHJcXG5cXHJcXG5cXHRcXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgR1JJRFxcclxcblxcclxcblxcdFxcdGZsb2F0IGdyaWQgPSAwLjUgLSBtYXgoYWJzKG1vZCh2VXYueCAqIGdyaWRTY2FsZS54LCAxLjApIC0gMC41KSwgYWJzKG1vZCh2VXYueSAqIGdyaWRTY2FsZS55LCAxLjApIC0gMC41KSk7XFxyXFxuXFx0XFx0Y29sb3IgKj0gKDEuMCAtIGdyaWRJbnRlbnNpdHkpICsgdmVjMyhzbW9vdGhzdGVwKDAuMCwgZ3JpZExpbmVXaWR0aCwgZ3JpZCkpICogZ3JpZEludGVuc2l0eTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgR1JFWVNDQUxFXFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSBtaXgoY29sb3IsIHZlYzMobGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZShjb2xvcikpLCBncmV5c2NhbGVJbnRlbnNpdHkpO1xcclxcblxcclxcblxcdCNlbGlmIGRlZmluZWQoU0VQSUEpXFxyXFxuXFxyXFxuXFx0XFx0dmVjMyBjID0gY29sb3IucmdiO1xcclxcblxcclxcblxcdFxcdGNvbG9yLnIgPSBkb3QoYywgdmVjMygxLjAgLSAwLjYwNyAqIHNlcGlhSW50ZW5zaXR5LCAwLjc2OSAqIHNlcGlhSW50ZW5zaXR5LCAwLjE4OSAqIHNlcGlhSW50ZW5zaXR5KSk7XFxyXFxuXFx0XFx0Y29sb3IuZyA9IGRvdChjLCB2ZWMzKDAuMzQ5ICogc2VwaWFJbnRlbnNpdHksIDEuMCAtIDAuMzE0ICogc2VwaWFJbnRlbnNpdHksIDAuMTY4ICogc2VwaWFJbnRlbnNpdHkpKTtcXHJcXG5cXHRcXHRjb2xvci5iID0gZG90KGMsIHZlYzMoMC4yNzIgKiBzZXBpYUludGVuc2l0eSwgMC41MzQgKiBzZXBpYUludGVuc2l0eSwgMS4wIC0gMC44NjkgKiBzZXBpYUludGVuc2l0eSkpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBWSUdORVRURVxcclxcblxcclxcblxcdFxcdGNvbnN0IHZlYzIgY2VudGVyID0gdmVjMigwLjUpO1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBFU0tJTFxcclxcblxcclxcblxcdFxcdFxcdHZlYzIgdXYgPSAodlV2IC0gY2VudGVyKSAqIHZlYzIodmlnbmV0dGVPZmZzZXQpO1xcclxcblxcdFxcdFxcdGNvbG9yID0gbWl4KGNvbG9yLnJnYiwgdmVjMygxLjAgLSB2aWduZXR0ZURhcmtuZXNzKSwgZG90KHV2LCB1dikpO1xcclxcblxcclxcblxcdFxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0XFx0ZmxvYXQgZGlzdCA9IGRpc3RhbmNlKHZVdiwgY2VudGVyKTtcXHJcXG5cXHRcXHRcXHRjb2xvciAqPSBzbW9vdGhzdGVwKDAuOCwgdmlnbmV0dGVPZmZzZXQgKiAwLjc5OSwgZGlzdCAqICh2aWduZXR0ZURhcmtuZXNzICsgdmlnbmV0dGVPZmZzZXQpKTtcXHJcXG5cXHJcXG5cXHRcXHQjZW5kaWZcXHRcXHRcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KGNsYW1wKGNvbG9yLCAwLjAsIDEuMCksIHRleGVsLmEpO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkOCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogQSBjaW5lbWF0aWMgc2hhZGVyIHRoYXQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBlZmZlY3RzOlxyXG4gKiAgLSBGaWxtIEdyYWluXHJcbiAqICAtIFNjYW5saW5lc1xyXG4gKiAgLSBWaWduZXR0ZVxyXG4gKiAgLSBHcmV5c2NhbGVcclxuICogIC0gU2VwaWFcclxuICpcclxuICogT3JpZ2luYWwgc2NhbmxpbmVzIGFsZ29yaXRobSBieSBQYXQgXCJIYXd0aG9ybmVcIiBTaGVhcm9uLlxyXG4gKiAgaHR0cDovL3d3dy50cnVldmlzaW9uM2QuY29tL2ZvcnVtcy9zaG93Y2FzZS9zdGF0aWNub2lzZV9jb2xvcmJsYWNrd2hpdGVfc2NhbmxpbmVfc2hhZGVycy10MTg2OTguMC5odG1sXHJcbiAqXHJcbiAqIE9wdGltaXNlZCBzY2FubGluZXMgYW5kIG5vaXNlIHdpdGggaW50ZW5zaXR5IHNjYWxpbmcgYnkgR2VvcmcgXCJMZXZpYXRoYW5cIlxyXG4gKiBTdGVpbnJvaGRlci4gVGhpcyB2ZXJzaW9uIHdhcyBwcm92aWRlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb25cclxuICogMy4wIExpY2Vuc2U6IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMC5cclxuICpcclxuICogVGhlIHNlcGlhIGVmZmVjdCBpcyBiYXNlZCBvbjpcclxuICogIGh0dHBzOi8vZ2l0aHViLmNvbS9ldmFudy9nbGZ4LmpzXHJcbiAqXHJcbiAqIFRoZSB2aWduZXR0ZSBjb2RlIGlzIGJhc2VkIG9uIFBhaW50RWZmZWN0IHBvc3Rwcm9jZXNzIGZyb20gcm8ubWU6XHJcbiAqICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvMy1kcmVhbXMtb2YtYmxhY2svc291cmNlL2Jyb3dzZS9kZXBsb3kvanMvZWZmZWN0cy9QYWludEVmZmVjdC5qc1xyXG4gKi9cblxudmFyIEZpbG1NYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgZmlsbSBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy4gRGlzYWJsZWQgZWZmZWN0cyB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgc2hhZGVyIGFuZCBoYXZlIG5vIG5lZ2F0aXZlIGltcGFjdCBvbiBwZXJmb3JtYW5jZS5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmdyZXlzY2FsZT1mYWxzZV0gLSBFbmFibGUgZ3JleXNjYWxlIGVmZmVjdC4gR3JleXNjYWxlIGFuZCBzZXBpYSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2VwaWE9ZmFsc2VdIC0gRW5hYmxlIHNlcGlhIGVmZmVjdC4gR3JleXNjYWxlIGFuZCBzZXBpYSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudmlnbmV0dGU9ZmFsc2VdIC0gQXBwbHkgdmlnbmV0dGUgZWZmZWN0LlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZXNraWw9ZmFsc2VdIC0gVXNlIEVza2lsJ3MgdmlnbmV0dGUgYXBwcm9hY2guIFRoZSBkZWZhdWx0IGxvb2tzIGR1c3R5IHdoaWxlIEVza2lsIGxvb2tzIGJ1cm5lZCBvdXQuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zY3JlZW5Nb2RlPXRydWVdIC0gV2hldGhlciB0aGUgc2NyZWVuIGJsZW5kIG1vZGUgc2hvdWxkIGJlIHVzZWQgZm9yIG5vaXNlIGFuZCBzY2FubGluZXMuIEJvdGggb2YgdGhlc2UgZWZmZWN0cyBhcmUgY29tcHV0ZWQgaW5kZXBlbmRlbnRseS5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm5vaXNlPXRydWVdIC0gU2hvdyBub2lzZS1iYXNlZCBmaWxtIGdyYWluLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2NhbmxpbmVzPXRydWVdIC0gU2hvdyBzY2FubGluZXMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5ncmlkPXRydWVdIC0gU2hvdyBhIGdyaWQuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm5vaXNlSW50ZW5zaXR5PTAuNV0gLSBUaGUgbm9pc2UgaW50ZW5zaXR5LlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zY2FubGluZUludGVuc2l0eT0wLjA1XSAtIFRoZSBzY2FubGluZSBpbnRlbnNpdHkuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmdyaWRJbnRlbnNpdHk9MS4wXSAtIFRoZSBncmlkIHN0cmVuZ3RoLiAwLjAgdG8gMS4wLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5ncmV5c2NhbGVJbnRlbnNpdHk9MS4wXSAtIFRoZSBpbnRlbnNpdHkgb2YgdGhlIGdyZXlzY2FsZSBlZmZlY3QuIDAuMCB0byAxLjAuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNlcGlhSW50ZW5zaXR5PTEuMF0gLSBUaGUgaW50ZW5zaXR5IG9mIHRoZSBzZXBpYSBlZmZlY3QuIDAuMCB0byAxLjAuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnZpZ25ldHRlT2Zmc2V0PTEuMF0gLSBUaGUgb2Zmc2V0IG9mIHRoZSB2aWduZXR0ZSBlZmZlY3QuIDAuMCB0byAxLjAuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnZpZ25ldHRlRGFya25lc3M9MS4wXSAtIFRoZSBkYXJrbmVzcyBvZiB0aGUgdmlnbmV0dGUgZWZmZWN0LiAwLjAgdG8gMS4wLlxyXG4gICAqL1xuICBmdW5jdGlvbiBGaWxtTWF0ZXJpYWwoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRmlsbU1hdGVyaWFsKTtcblxuICAgIHZhciBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgc2NyZWVuTW9kZTogdHJ1ZSxcbiAgICAgIG5vaXNlOiB0cnVlLFxuICAgICAgc2NhbmxpbmVzOiB0cnVlLFxuICAgICAgZ3JpZDogZmFsc2UsXG4gICAgICBncmV5c2NhbGU6IGZhbHNlLFxuICAgICAgc2VwaWE6IGZhbHNlLFxuICAgICAgdmlnbmV0dGU6IGZhbHNlLFxuICAgICAgZXNraWw6IGZhbHNlLFxuICAgICAgbm9pc2VJbnRlbnNpdHk6IDAuNSxcbiAgICAgIHNjYW5saW5lSW50ZW5zaXR5OiAwLjA1LFxuICAgICAgZ3JpZEludGVuc2l0eTogMS4wLFxuICAgICAgZ3JleXNjYWxlSW50ZW5zaXR5OiAxLjAsXG4gICAgICBzZXBpYUludGVuc2l0eTogMS4wLFxuICAgICAgdmlnbmV0dGVPZmZzZXQ6IDEuMCxcbiAgICAgIHZpZ25ldHRlRGFya25lc3M6IDEuMFxuICAgIH0sIG9wdGlvbnMpO1xuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEZpbG1NYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIkZpbG1NYXRlcmlhbFwiLFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0aW1lOiBuZXcgVW5pZm9ybSgwLjApLFxuICAgICAgICBub2lzZUludGVuc2l0eTogbmV3IFVuaWZvcm0oc2V0dGluZ3Mubm9pc2VJbnRlbnNpdHkpLFxuICAgICAgICBzY2FubGluZUludGVuc2l0eTogbmV3IFVuaWZvcm0oc2V0dGluZ3Muc2NhbmxpbmVJbnRlbnNpdHkpLFxuICAgICAgICBncmlkSW50ZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5ncmlkSW50ZW5zaXR5KSxcbiAgICAgICAgc2NhbmxpbmVDb3VudDogbmV3IFVuaWZvcm0oMC4wKSxcbiAgICAgICAgZ3JpZFNjYWxlOiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yMigpKSxcbiAgICAgICAgZ3JpZExpbmVXaWR0aDogbmV3IFVuaWZvcm0oMC4wKSxcbiAgICAgICAgZ3JleXNjYWxlSW50ZW5zaXR5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5ncmV5c2NhbGVJbnRlbnNpdHkpLFxuICAgICAgICBzZXBpYUludGVuc2l0eTogbmV3IFVuaWZvcm0oc2V0dGluZ3Muc2VwaWFJbnRlbnNpdHkpLFxuICAgICAgICB2aWduZXR0ZU9mZnNldDogbmV3IFVuaWZvcm0oc2V0dGluZ3MudmlnbmV0dGVPZmZzZXQpLFxuICAgICAgICB2aWduZXR0ZURhcmtuZXNzOiBuZXcgVW5pZm9ybShzZXR0aW5ncy52aWduZXR0ZURhcmtuZXNzKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQ4LFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkOCxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcblxuICAgIF90aGlzLnNldFNjcmVlbk1vZGVFbmFibGVkKHNldHRpbmdzLnNjcmVlbk1vZGUpO1xuXG4gICAgX3RoaXMuc2V0Tm9pc2VFbmFibGVkKHNldHRpbmdzLm5vaXNlKTtcblxuICAgIF90aGlzLnNldFNjYW5saW5lc0VuYWJsZWQoc2V0dGluZ3Muc2NhbmxpbmVzKTtcblxuICAgIF90aGlzLnNldEdyaWRFbmFibGVkKHNldHRpbmdzLmdyaWQpO1xuXG4gICAgX3RoaXMuc2V0R3JleXNjYWxlRW5hYmxlZChzZXR0aW5ncy5ncmV5c2NhbGUpO1xuXG4gICAgX3RoaXMuc2V0U2VwaWFFbmFibGVkKHNldHRpbmdzLnNlcGlhKTtcblxuICAgIF90aGlzLnNldFZpZ25ldHRlRW5hYmxlZChzZXR0aW5ncy52aWduZXR0ZSk7XG5cbiAgICBfdGhpcy5zZXRFc2tpbEVuYWJsZWQoc2V0dGluZ3MuZXNraWwpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFNjcmVlbiBibGVuZCBtb2RlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgU2NyZWVuIGJsZW5kIG1vZGUgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhGaWxtTWF0ZXJpYWwsIFt7XG4gICAga2V5OiBcInNldFNjcmVlbk1vZGVFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNjcmVlbk1vZGVFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5TQ1JFRU5fTU9ERSA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5TQ1JFRU5fTU9ERTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgbm9pc2UgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIG5vaXNlIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Tm9pc2VFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldE5vaXNlRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuTk9JU0UgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuTk9JU0U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNjYW5saW5lcyBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgc2NhbmxpbmVzIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2NhbmxpbmVzRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTY2FubGluZXNFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5TQ0FOTElORVMgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuU0NBTkxJTkVTO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBncmlkIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBncmlkIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0R3JpZEVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0R3JpZEVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLkdSSUQgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuR1JJRDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZ3JleXNjYWxlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBncmV5c2NhbGUgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRHcmV5c2NhbGVFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEdyZXlzY2FsZUVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLkdSRVlTQ0FMRSA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5HUkVZU0NBTEU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNlcGlhIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBzZXBpYSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNlcGlhRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTZXBpYUVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlNFUElBID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLlNFUElBO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBWaWduZXR0ZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgVmlnbmV0dGUgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRWaWduZXR0ZUVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VmlnbmV0dGVFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5WSUdORVRURSA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5WSUdORVRURTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgRXNraWwgVmlnbmV0dGUgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEhhcyBubyBlZmZlY3QgaWYgVmlnbmV0dGUgaXMgZGlzYWJsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgRXNraWwgVmlnbmV0dGUgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRFc2tpbEVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RXNraWxFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5FU0tJTCA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5FU0tJTDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoRmlsbU1hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBGaWxtTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDkgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHRQZXJ0dXJiO1xcclxcblxcclxcbnVuaWZvcm0gYm9vbCBhY3RpdmU7XFxyXFxuXFxyXFxudW5pZm9ybSBmbG9hdCBhbW91bnQ7XFxyXFxudW5pZm9ybSBmbG9hdCBhbmdsZTtcXHJcXG51bmlmb3JtIGZsb2F0IHNlZWQ7XFxyXFxudW5pZm9ybSBmbG9hdCBzZWVkWDtcXHJcXG51bmlmb3JtIGZsb2F0IHNlZWRZO1xcclxcbnVuaWZvcm0gZmxvYXQgZGlzdG9ydGlvblg7XFxyXFxudW5pZm9ybSBmbG9hdCBkaXN0b3J0aW9uWTtcXHJcXG51bmlmb3JtIGZsb2F0IGNvbFM7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG5mbG9hdCByYW5kKHZlYzIgdGMpIHtcXHJcXG5cXHJcXG5cXHRjb25zdCBmbG9hdCBhID0gMTIuOTg5ODtcXHJcXG5cXHRjb25zdCBmbG9hdCBiID0gNzguMjMzO1xcclxcblxcdGNvbnN0IGZsb2F0IGMgPSA0Mzc1OC41NDUzO1xcclxcblxcclxcblxcdGZsb2F0IGR0ID0gZG90KHRjLCB2ZWMyKGEsIGIpKTtcXHJcXG5cXHRmbG9hdCBzbiA9IG1vZChkdCwgMy4xNCk7XFxyXFxuXFxyXFxuXFx0cmV0dXJuIGZyYWN0KHNpbihzbikgKiBjKTtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzIgY29vcmQgPSB2VXY7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgeHMsIHlzO1xcclxcblxcdHZlYzQgbm9ybWFsO1xcclxcblxcclxcblxcdHZlYzIgb2Zmc2V0O1xcclxcblxcdHZlYzQgY3IsIGNnYSwgY2I7XFxyXFxuXFx0dmVjNCBzbm93LCBjb2xvcjtcXHJcXG5cXHJcXG5cXHRmbG9hdCBzeCwgc3k7XFxyXFxuXFxyXFxuXFx0aWYoYWN0aXZlKSB7XFxyXFxuXFxyXFxuXFx0XFx0eHMgPSBmbG9vcihnbF9GcmFnQ29vcmQueCAvIDAuNSk7XFxyXFxuXFx0XFx0eXMgPSBmbG9vcihnbF9GcmFnQ29vcmQueSAvIDAuNSk7XFxyXFxuXFxyXFxuXFx0XFx0bm9ybWFsID0gdGV4dHVyZTJEKHRQZXJ0dXJiLCBjb29yZCAqIHNlZWQgKiBzZWVkKTtcXHJcXG5cXHJcXG5cXHRcXHRpZihjb29yZC55IDwgZGlzdG9ydGlvblggKyBjb2xTICYmIGNvb3JkLnkgPiBkaXN0b3J0aW9uWCAtIGNvbFMgKiBzZWVkKSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0c3ggPSBjbGFtcChjZWlsKHNlZWRYKSwgMC4wLCAxLjApO1xcclxcblxcdFxcdFxcdGNvb3JkLnkgPSBzeCAqICgxLjAgLSAoY29vcmQueSArIGRpc3RvcnRpb25ZKSkgKyAoMS4wIC0gc3gpICogZGlzdG9ydGlvblk7XFxyXFxuXFxyXFxuXFx0XFx0fVxcclxcblxcclxcblxcdFxcdGlmKGNvb3JkLnggPCBkaXN0b3J0aW9uWSArIGNvbFMgJiYgY29vcmQueCA+IGRpc3RvcnRpb25ZIC0gY29sUyAqIHNlZWQpIHtcXHJcXG5cXHJcXG5cXHRcXHRcXHRzeSA9IGNsYW1wKGNlaWwoc2VlZFkpLCAwLjAsIDEuMCk7XFxyXFxuXFx0XFx0XFx0Y29vcmQueCA9IHN5ICogZGlzdG9ydGlvblggKyAoMS4wIC0gc3kpICogKDEuMCAtIChjb29yZC54ICsgZGlzdG9ydGlvblgpKTtcXHJcXG5cXHJcXG5cXHRcXHR9XFxyXFxuXFxyXFxuXFx0XFx0Y29vcmQueCArPSBub3JtYWwueCAqIHNlZWRYICogKHNlZWQgLyA1LjApO1xcclxcblxcdFxcdGNvb3JkLnkgKz0gbm9ybWFsLnkgKiBzZWVkWSAqIChzZWVkIC8gNS4wKTtcXHJcXG5cXHJcXG5cXHRcXHRvZmZzZXQgPSBhbW91bnQgKiB2ZWMyKGNvcyhhbmdsZSksIHNpbihhbmdsZSkpO1xcclxcblxcclxcblxcdFxcdGNyID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZCArIG9mZnNldCk7XFxyXFxuXFx0XFx0Y2dhID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZCk7XFxyXFxuXFx0XFx0Y2IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkIC0gb2Zmc2V0KTtcXHJcXG5cXHJcXG5cXHRcXHRjb2xvciA9IHZlYzQoY3IuciwgY2dhLmcsIGNiLmIsIGNnYS5hKTtcXHJcXG5cXHRcXHRzbm93ID0gMjAwLjAgKiBhbW91bnQgKiB2ZWM0KHJhbmQodmVjMih4cyAqIHNlZWQsIHlzICogc2VlZCAqIDUwLjApKSAqIDAuMik7XFxyXFxuXFx0XFx0Y29sb3IgKz0gc25vdztcXHJcXG5cXHJcXG5cXHR9IGVsc2Uge1xcclxcblxcclxcblxcdFxcdGNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSBjb2xvcjtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDkgPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEEgZ2xpdGNoIHNoYWRlciBtYXRlcmlhbC5cclxuICpcclxuICogUmVmZXJlbmNlOlxyXG4gKiAgaHR0cHM6Ly9naXRodWIuY29tL3N0YWZmYW50YW4vdW5pdHlnbGl0Y2hcclxuICovXG5cbnZhciBHbGl0Y2hNYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgZ2xpdGNoIG1hdGVyaWFsLlxyXG4gICAqL1xuICBmdW5jdGlvbiBHbGl0Y2hNYXRlcmlhbCgpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBHbGl0Y2hNYXRlcmlhbCk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEdsaXRjaE1hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiR2xpdGNoTWF0ZXJpYWxcIixcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdFBlcnR1cmI6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICBhY3RpdmU6IG5ldyBVbmlmb3JtKDEpLFxuICAgICAgICBhbW91bnQ6IG5ldyBVbmlmb3JtKDAuOCksXG4gICAgICAgIGFuZ2xlOiBuZXcgVW5pZm9ybSgwLjAyKSxcbiAgICAgICAgc2VlZDogbmV3IFVuaWZvcm0oMC4wMiksXG4gICAgICAgIHNlZWRYOiBuZXcgVW5pZm9ybSgwLjAyKSxcbiAgICAgICAgc2VlZFk6IG5ldyBVbmlmb3JtKDAuMDIpLFxuICAgICAgICBkaXN0b3J0aW9uWDogbmV3IFVuaWZvcm0oMC41KSxcbiAgICAgICAgZGlzdG9ydGlvblk6IG5ldyBVbmlmb3JtKDAuNiksXG4gICAgICAgIGNvbFM6IG5ldyBVbmlmb3JtKDAuMDUpXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDksXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQ5LFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuICB9XG5cbiAgaW5oZXJpdHMoR2xpdGNoTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIEdsaXRjaE1hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQxMCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSB2ZWMzIGxpZ2h0UG9zaXRpb247XFxyXFxuXFxyXFxudW5pZm9ybSBmbG9hdCBleHBvc3VyZTtcXHJcXG51bmlmb3JtIGZsb2F0IGRlY2F5O1xcclxcbnVuaWZvcm0gZmxvYXQgZGVuc2l0eTtcXHJcXG51bmlmb3JtIGZsb2F0IHdlaWdodDtcXHJcXG51bmlmb3JtIGZsb2F0IGNsYW1wTWF4O1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzIgdGV4Q29vcmQgPSB2VXY7XFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIHZlY3RvciBmcm9tIHBpeGVsIHRvIGxpZ2h0IHNvdXJjZSBpbiBzY3JlZW4gc3BhY2UuXFxyXFxuXFx0dmVjMiBkZWx0YVRleENvb3JkID0gdGV4Q29vcmQgLSBsaWdodFBvc2l0aW9uLnN0O1xcclxcblxcdGRlbHRhVGV4Q29vcmQgKj0gMS4wIC8gTlVNX1NBTVBMRVNfRkxPQVQgKiBkZW5zaXR5O1xcclxcblxcclxcblxcdC8vIEEgZGVjcmVhc2luZyBpbGx1bWluYXRpb24gZmFjdG9yLlxcclxcblxcdGZsb2F0IGlsbHVtaW5hdGlvbkRlY2F5ID0gMS4wO1xcclxcblxcclxcblxcdHZlYzQgc2FtcGxlO1xcclxcblxcdHZlYzQgY29sb3IgPSB2ZWM0KDAuMCk7XFxyXFxuXFxyXFxuXFx0Ly8gRXN0aW1hdGUgdGhlIHByb2JhYmlsaXR5IG9mIG9jY2x1c2lvbiBhdCBlYWNoIHBpeGVsIGJ5IHN1bW1pbmcgc2FtcGxlcyBhbG9uZyBhIHJheSB0byB0aGUgbGlnaHQgc291cmNlLlxcclxcblxcdGZvcihpbnQgaSA9IDA7IGkgPCBOVU1fU0FNUExFU19JTlQ7ICsraSkge1xcclxcblxcclxcblxcdFxcdHRleENvb3JkIC09IGRlbHRhVGV4Q29vcmQ7XFxyXFxuXFx0XFx0c2FtcGxlID0gdGV4dHVyZTJEKHREaWZmdXNlLCB0ZXhDb29yZCk7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gQXBwbHkgc2FtcGxlIGF0dGVudWF0aW9uIHNjYWxlL2RlY2F5IGZhY3RvcnMuXFxyXFxuXFx0XFx0c2FtcGxlICo9IGlsbHVtaW5hdGlvbkRlY2F5ICogd2VpZ2h0O1xcclxcblxcclxcblxcdFxcdGNvbG9yICs9IHNhbXBsZTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBVcGRhdGUgZXhwb25lbnRpYWwgZGVjYXkgZmFjdG9yLlxcclxcblxcdFxcdGlsbHVtaW5hdGlvbkRlY2F5ICo9IGRlY2F5O1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSBjbGFtcChjb2xvciAqIGV4cG9zdXJlLCAwLjAsIGNsYW1wTWF4KTtcXHJcXG5cXHJcXG5cXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Plxcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkMTAgPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEEgY3JlcHVzY3VsYXIgcmF5cyBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgZGl0aGVyaW5nLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2VzOlxyXG4gKlxyXG4gKiBUaGliYXV0IERlc3BvdWxhaW4sIDIwMTI6XHJcbiAqICBbKFdlYkdMKSBWb2x1bWV0cmljIExpZ2h0IEFwcHJveGltYXRpb24gaW4gVGhyZWUuanNdKFxyXG4gKiAgaHR0cDovL2JrY29yZS5jb20vYmxvZy8zZC93ZWJnbC10aHJlZS1qcy12b2x1bWV0cmljLWxpZ2h0LWdvZHJheXMuaHRtbClcclxuICpcclxuICogTnZpZGlhLCBHUFUgR2VtcyAzLCAyMDA4OlxyXG4gKiAgW0NoYXB0ZXIgMTMuIFZvbHVtZXRyaWMgTGlnaHQgU2NhdHRlcmluZyBhcyBhIFBvc3QtUHJvY2Vzc10oXHJcbiAqICBodHRwczovL2RldmVsb3Blci5udmlkaWEuY29tL2dwdWdlbXMvR1BVR2VtczMvZ3B1Z2VtczNfY2gxMy5odG1sKVxyXG4gKi9cblxudmFyIEdvZFJheXNNYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgZ29kIHJheXMgbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRlbnNpdHk9MC45Nl0gLSBUaGUgZGVuc2l0eSBvZiB0aGUgbGlnaHQgcmF5cy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGVjYXk9MC45M10gLSBBbiBpbGx1bWluYXRpb24gZGVjYXkgZmFjdG9yLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy53ZWlnaHQ9MC40XSAtIEEgbGlnaHQgcmF5IHdlaWdodCBmYWN0b3IuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmV4cG9zdXJlPTAuNl0gLSBBIGNvbnN0YW50IGF0dGVudWF0aW9uIGNvZWZmaWNpZW50LlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jbGFtcE1heD0xLjBdIC0gQW4gdXBwZXIgYm91bmQgZm9yIHRoZSBzYXR1cmF0aW9uIG9mIHRoZSBvdmVyYWxsIGVmZmVjdC5cclxuICAgKi9cbiAgZnVuY3Rpb24gR29kUmF5c01hdGVyaWFsKCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEdvZFJheXNNYXRlcmlhbCk7XG5cbiAgICB2YXIgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGV4cG9zdXJlOiAwLjYsXG4gICAgICBkZW5zaXR5OiAwLjkzLFxuICAgICAgZGVjYXk6IDAuOTYsXG4gICAgICB3ZWlnaHQ6IDAuNCxcbiAgICAgIGNsYW1wTWF4OiAxLjBcbiAgICB9LCBvcHRpb25zKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEdvZFJheXNNYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIkdvZFJheXNNYXRlcmlhbFwiLFxuICAgICAgZGVmaW5lczoge1xuICAgICAgICBOVU1fU0FNUExFU19GTE9BVDogXCI2MC4wXCIsXG4gICAgICAgIE5VTV9TQU1QTEVTX0lOVDogXCI2MFwiXG4gICAgICB9LFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICBsaWdodFBvc2l0aW9uOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgZXhwb3N1cmU6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmV4cG9zdXJlKSxcbiAgICAgICAgZGVjYXk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmRlY2F5KSxcbiAgICAgICAgZGVuc2l0eTogbmV3IFVuaWZvcm0oc2V0dGluZ3MuZGVuc2l0eSksXG4gICAgICAgIHdlaWdodDogbmV3IFVuaWZvcm0oc2V0dGluZ3Mud2VpZ2h0KSxcbiAgICAgICAgY2xhbXBNYXg6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmNsYW1wTWF4KVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQxMCxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDEwLFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuICB9XG5cbiAgaW5oZXJpdHMoR29kUmF5c01hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBHb2RSYXlzTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDExID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcclxcblxcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gZmxvYXQgZGlzdGluY3Rpb247XFxyXFxudW5pZm9ybSB2ZWMyIHJhbmdlO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzQgdGV4ZWwgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFx0ZmxvYXQgbCA9IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UodGV4ZWwucmdiKTtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgUkFOR0VcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBsb3cgPSBzdGVwKHJhbmdlLngsIGwpO1xcclxcblxcdFxcdGZsb2F0IGhpZ2ggPSBzdGVwKGwsIHJhbmdlLnkpO1xcclxcblxcclxcblxcdFxcdC8vIEFwcGx5IHRoZSBtYXNrLlxcclxcblxcdFxcdGwgKj0gbG93ICogaGlnaDtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRsID0gcG93KGFicyhsKSwgZGlzdGluY3Rpb24pO1xcclxcblxcclxcblxcdCNpZmRlZiBDT0xPUlxcclxcblxcclxcblxcdFxcdGdsX0ZyYWdDb2xvciA9IHZlYzQodGV4ZWwucmdiICogbCwgdGV4ZWwuYSk7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KGwsIGwsIGwsIHRleGVsLmEpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkMTEgPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEEgbHVtaW5vc2l0eSBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFRoaXMgc2hhZGVyIHByb2R1Y2VzIGEgZ3JleXNjYWxlIGx1bWluYW5jZSBtYXAgdGhhdCBkZXNjcmliZXMgdGhlIGFic29sdXRlXHJcbiAqIGFtb3VudCBvZiBsaWdodCBlbWl0dGVkIGJ5IGEgc2NlbmUuIEl0IGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdG8gb3V0cHV0XHJcbiAqIGNvbG91cnMgdGhhdCBhcmUgc2NhbGVkIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBsdW1pbmFuY2UgdmFsdWUuIEFkZGl0aW9uYWxseSxcclxuICogYSByYW5nZSBtYXkgYmUgcHJvdmlkZWQgdG8gbWFzayBvdXQgdW5kZXNpcmVkIHRleGVscy5cclxuICpcclxuICogVGhlIGFscGhhIGNoYW5uZWwgd2lsbCByZW1haW4gdW5hZmZlY3RlZCBpbiBhbGwgY2FzZXMuXHJcbiAqXHJcbiAqIE9uIGx1bWluYW5jZSBjb2VmZmljaWVudHM6XHJcbiAqICBodHRwOi8vd3d3LnBveW50b24uY29tL25vdGVzL2NvbG91cl9hbmRfZ2FtbWEvQ29sb3JGQVEuaHRtbCNSVEZUb0M5XHJcbiAqXHJcbiAqIENvZWZmaWNpZW50cyBmb3IgZGlmZmVyZW50IGNvbG91ciBzcGFjZXM6XHJcbiAqICBodHRwczovL2hzdG8ub3JnL2dldHByby9oYWJyL3Bvc3RfaW1hZ2VzLzJhYi82OWQvMDg0LzJhYjY5ZDA4NGY5YTU5N2UwMzI2MjRiY2Q3NGQ1N2E3LnBuZ1xyXG4gKlxyXG4gKiBMdW1pbmFuY2UgcmFuZ2UgcmVmZXJlbmNlOlxyXG4gKiAgaHR0cHM6Ly9jeWNsaW5nNzQuY29tLzIwMDcvMDUvMjMveW91ci1maXJzdC1zaGFkZXIvIy5WdHk5RmZrckw0WlxyXG4gKi9cblxudmFyIEx1bWlub3NpdHlNYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgbHVtaW5vc2l0eSBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2NvbG9yT3V0cHV0PWZhbHNlXSAtIERlZmluZXMgd2hldGhlciB0aGUgc2hhZGVyIHNob3VsZCBvdXRwdXQgY29sb3VycyBzY2FsZWQgd2l0aCB0aGVpciBsdW1pbmFuY2UgdmFsdWUuXHJcbiAgICogQHBhcmFtIHtWZWN0b3IyfSBbbHVtaW5hbmNlUmFuZ2VdIC0gSWYgcHJvdmlkZWQsIHRoZSBzaGFkZXIgd2lsbCBtYXNrIG91dCB0ZXhlbHMgdGhhdCBhcmVuJ3QgaW4gdGhlIHNwZWNpZmllZCBsdW1pbmFuY2UgcmFuZ2UuXHJcbiAgICovXG4gIGZ1bmN0aW9uIEx1bWlub3NpdHlNYXRlcmlhbCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgY29sb3JPdXRwdXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuICAgIHZhciBsdW1pbmFuY2VSYW5nZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEx1bWlub3NpdHlNYXRlcmlhbCk7XG5cbiAgICB2YXIgbWFza0x1bWluYW5jZSA9IGx1bWluYW5jZVJhbmdlICE9PSBudWxsO1xuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEx1bWlub3NpdHlNYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIkx1bWlub3NpdHlNYXRlcmlhbFwiLFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICBkaXN0aW5jdGlvbjogbmV3IFVuaWZvcm0oMS4wKSxcbiAgICAgICAgcmFuZ2U6IG5ldyBVbmlmb3JtKG1hc2tMdW1pbmFuY2UgPyBsdW1pbmFuY2VSYW5nZSA6IG5ldyBWZWN0b3IyKCkpXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDExLFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkMTFcbiAgICB9KSk7XG5cbiAgICBfdGhpcy5zZXRDb2xvck91dHB1dEVuYWJsZWQoY29sb3JPdXRwdXQpO1xuXG4gICAgX3RoaXMuc2V0THVtaW5hbmNlUmFuZ2VFbmFibGVkKG1hc2tMdW1pbmFuY2UpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgY29sb3Igb3V0cHV0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciBjb2xvciBvdXRwdXQgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhMdW1pbm9zaXR5TWF0ZXJpYWwsIFt7XG4gICAga2V5OiBcInNldENvbG9yT3V0cHV0RW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRDb2xvck91dHB1dEVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLkNPTE9SID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLkNPTE9SO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBsdW1pbmFuY2UgbWFzay5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBsdW1pbmFuY2UgbWFzayBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0THVtaW5hbmNlUmFuZ2VFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEx1bWluYW5jZVJhbmdlRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuUkFOR0UgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuUkFOR0U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEx1bWlub3NpdHlNYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gTHVtaW5vc2l0eU1hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQxMiA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdE1hc2s7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdEVkZ2VzO1xcclxcblxcclxcbnVuaWZvcm0gdmVjMyB2aXNpYmxlRWRnZUNvbG9yO1xcclxcbnVuaWZvcm0gdmVjMyBoaWRkZW5FZGdlQ29sb3I7XFxyXFxudW5pZm9ybSBmbG9hdCBwdWxzZTtcXHJcXG51bmlmb3JtIGZsb2F0IGVkZ2VTdHJlbmd0aDtcXHJcXG5cXHJcXG4jaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCB0UGF0dGVybjtcXHJcXG5cXHR2YXJ5aW5nIHZlYzIgdlBhdHRlcm5Db29yZDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IGNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdHZlYzIgZWRnZSA9IHRleHR1cmUyRCh0RWRnZXMsIHZVdikucmc7XFxyXFxuXFx0dmVjMiBtYXNrID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYpLnJnO1xcclxcblxcclxcblxcdCNpZm5kZWYgWF9SQVlcXHJcXG5cXHJcXG5cXHRcXHRlZGdlLnkgPSAwLjA7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0ZWRnZSAqPSAoZWRnZVN0cmVuZ3RoICogbWFzay54ICogcHVsc2UpO1xcclxcblxcdHZlYzMgb3V0bGluZUNvbG9yID0gZWRnZS54ICogdmlzaWJsZUVkZ2VDb2xvciArIGVkZ2UueSAqIGhpZGRlbkVkZ2VDb2xvcjtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgQUxQSEFfQkxFTkRJTkdcXHJcXG5cXHJcXG5cXHRcXHRjb2xvci5yZ2IgPSBtaXgoY29sb3IucmdiLCBvdXRsaW5lQ29sb3IsIG1heChlZGdlLngsIGVkZ2UueSkpO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IucmdiICs9IG91dGxpbmVDb2xvcjtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHRcXHR2ZWMzIHBhdHRlcm5Db2xvciA9IHRleHR1cmUyRCh0UGF0dGVybiwgdlBhdHRlcm5Db29yZCkucmdiO1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBYX1JBWVxcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGhpZGRlbkZhY3RvciA9IDAuNTtcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGhpZGRlbkZhY3RvciA9IDAuMDtcXHJcXG5cXHJcXG5cXHRcXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCB2aXNpYmlsaXR5RmFjdG9yID0gKDEuMCAtIG1hc2sueSA+IDAuMCkgPyAxLjAgOiBoaWRkZW5GYWN0b3I7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IucmdiICs9IHZpc2liaWxpdHlGYWN0b3IgKiAoMS4wIC0gbWFzay54KSAqICgxLjAgLSBwYXR0ZXJuQ29sb3IpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkMTIgPSBcIiNpZmRlZiBVU0VfUEFUVEVSTlxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgYXNwZWN0O1xcclxcblxcdHVuaWZvcm0gZmxvYXQgcGF0dGVyblNjYWxlO1xcclxcblxcdHZhcnlpbmcgdmVjMiB2UGF0dGVybkNvb3JkO1xcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdCNpZmRlZiBVU0VfUEFUVEVSTlxcclxcblxcclxcblxcdFxcdHZlYzIgYXNwZWN0Q29ycmVjdGlvbiA9IHZlYzIoYXNwZWN0LCAxLjApO1xcclxcblxcdFxcdHZQYXR0ZXJuQ29vcmQgPSB1diAqIGFzcGVjdENvcnJlY3Rpb24gKiBwYXR0ZXJuU2NhbGU7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogQW4gb3V0bGluZSBibGVuZCBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqL1xuXG52YXIgT3V0bGluZUJsZW5kTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG91dGxpbmUgYmxlbmQgbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmVkZ2VTdHJlbmd0aD0xLjBdIC0gVGhlIGVkZ2Ugc3RyZW5ndGguXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnBhdHRlcm5TY2FsZT0xLjBdIC0gVGhlIHNjYWxlIG9mIHRoZSBwYXR0ZXJuIHRleHR1cmUuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnZpc2libGVFZGdlQ29sb3I9MHhmZmZmZmZdIC0gVGhlIGNvbG9yIG9mIHZpc2libGUgZWRnZXMuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmhpZGRlbkVkZ2VDb2xvcj0weDIyMDkwQV0gLSBUaGUgY29sb3Igb2YgaGlkZGVuIGVkZ2VzLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW2FscGhhQmxlbmRpbmc9ZmFsc2VdIC0gV2hldGhlciB0aGUgb3V0bGluZSBzaG91bGQgYmUgYmxlbmRlZCB1c2luZyBhbHBoYS5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFt4UmF5PXRydWVdIC0gV2hldGhlciBoaWRkZW4gcGFydHMgb2Ygc2VsZWN0ZWQgb2JqZWN0cyBzaG91bGQgYmUgdmlzaWJsZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gT3V0bGluZUJsZW5kTWF0ZXJpYWwoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgT3V0bGluZUJsZW5kTWF0ZXJpYWwpO1xuXG4gICAgdmFyIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBlZGdlU3RyZW5ndGg6IDEuMCxcbiAgICAgIHBhdHRlcm5TY2FsZTogMS4wLFxuICAgICAgdmlzaWJsZUVkZ2VDb2xvcjogMHhmZmZmZmYsXG4gICAgICBoaWRkZW5FZGdlQ29sb3I6IDB4MjIwOTBBLFxuICAgICAgYWxwaGFCbGVuZGluZzogZmFsc2UsXG4gICAgICB4UmF5OiB0cnVlXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoT3V0bGluZUJsZW5kTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJPdXRsaW5lQmxlbmRNYXRlcmlhbFwiLFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgcHVsc2U6IG5ldyBVbmlmb3JtKDEuMCksXG4gICAgICAgIGFzcGVjdDogbmV3IFVuaWZvcm0oMS4wKSxcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0TWFzazogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRFZGdlczogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRQYXR0ZXJuOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgZWRnZVN0cmVuZ3RoOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5lZGdlU3RyZW5ndGgpLFxuICAgICAgICBwYXR0ZXJuU2NhbGU6IG5ldyBVbmlmb3JtKHNldHRpbmdzLnBhdHRlcm5TY2FsZSksXG4gICAgICAgIHZpc2libGVFZGdlQ29sb3I6IG5ldyBVbmlmb3JtKG5ldyBDb2xvcihzZXR0aW5ncy52aXNpYmxlRWRnZUNvbG9yKSksXG4gICAgICAgIGhpZGRlbkVkZ2VDb2xvcjogbmV3IFVuaWZvcm0obmV3IENvbG9yKHNldHRpbmdzLmhpZGRlbkVkZ2VDb2xvcikpXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDEyLFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkMTIsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG5cbiAgICBfdGhpcy5zZXRBbHBoYUJsZW5kaW5nRW5hYmxlZChzZXR0aW5ncy5hbHBoYUJsZW5kaW5nKTtcblxuICAgIF90aGlzLnNldFhSYXlFbmFibGVkKHNldHRpbmdzLnhSYXkpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGFscGhhIGJsZW5kaW5nLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgYWxwaGEgYmxlbmRpbmcgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhPdXRsaW5lQmxlbmRNYXRlcmlhbCwgW3tcbiAgICBrZXk6IFwic2V0QWxwaGFCbGVuZGluZ0VuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0QWxwaGFCbGVuZGluZ0VuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLkFMUEhBX0JMRU5ESU5HID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLkFMUEhBX0JMRU5ESU5HO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHdoZXRoZXIgaGlkZGVuIHBhcnRzIG9mIHNlbGVjdGVkIG9iamVjdHMgc2hvdWxkIGJlIHZpc2libGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciBoaWRkZW4gcGFydHMgb2Ygc2VsZWN0ZWQgb2JqZWN0cyBzaG91bGQgYmUgdmlzaWJsZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0WFJheUVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0WFJheUVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlhfUkFZID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLlhfUkFZO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGEgcGF0dGVybiB0ZXh0dXJlIHRvIHVzZSBhcyBvdmVybGF5LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7VGV4dHVyZX0gW3RleHR1cmU9bnVsbF0gLSBBIHBhdHRlcm4gdGV4dHVyZS4gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSB0aGUgcGF0dGVybi5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0UGF0dGVyblRleHR1cmVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UGF0dGVyblRleHR1cmUoKSB7XG4gICAgICB2YXIgdGV4dHVyZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcblxuICAgICAgaWYgKHRleHR1cmUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlVTRV9QQVRURVJOID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLlVTRV9QQVRURVJOO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVuaWZvcm1zLnRQYXR0ZXJuLnZhbHVlID0gdGV4dHVyZTtcbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKE91dGxpbmVCbGVuZE1hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBPdXRsaW5lQmxlbmRNYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkMTMgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHRNYXNrO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXYwO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYxO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYyO1xcclxcbnZhcnlpbmcgdmVjMiB2VXYzO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGMwID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYwKS5yZztcXHJcXG5cXHR2ZWMyIGMxID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYxKS5yZztcXHJcXG5cXHR2ZWMyIGMyID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYyKS5yZztcXHJcXG5cXHR2ZWMyIGMzID0gdGV4dHVyZTJEKHRNYXNrLCB2VXYzKS5yZztcXHJcXG5cXHJcXG5cXHRmbG9hdCBkMCA9IChjMC54IC0gYzEueCkgKiAwLjU7XFxyXFxuXFx0ZmxvYXQgZDEgPSAoYzIueCAtIGMzLngpICogMC41O1xcclxcblxcdGZsb2F0IGQgPSBsZW5ndGgodmVjMihkMCwgZDEpKTtcXHJcXG5cXHJcXG5cXHRmbG9hdCBhMCA9IG1pbihjMC55LCBjMS55KTtcXHJcXG5cXHRmbG9hdCBhMSA9IG1pbihjMi55LCBjMy55KTtcXHJcXG5cXHRmbG9hdCB2aXNpYmlsaXR5RmFjdG9yID0gbWluKGEwLCBhMSk7XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yLnJnID0gKDEuMCAtIHZpc2liaWxpdHlGYWN0b3IgPiAwLjAwMSkgPyB2ZWMyKGQsIDAuMCkgOiB2ZWMyKDAuMCwgZCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQxMyA9IFwidW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2MDtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MTtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MjtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MztcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2MCA9IHZlYzIodXYueCArIHRleGVsU2l6ZS54LCB1di55KTtcXHJcXG5cXHR2VXYxID0gdmVjMih1di54IC0gdGV4ZWxTaXplLngsIHV2LnkpO1xcclxcblxcdHZVdjIgPSB2ZWMyKHV2LngsIHV2LnkgKyB0ZXhlbFNpemUueSk7XFxyXFxuXFx0dlV2MyA9IHZlYzIodXYueCwgdXYueSAtIHRleGVsU2l6ZS55KTtcXHJcXG5cXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBBbiBvdXRsaW5lIGVkZ2UgZGV0ZWN0aW9uIHNoYWRlciBtYXRlcmlhbC5cclxuICovXG5cbnZhciBPdXRsaW5lRWRnZXNNYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgb3V0bGluZSBlZGdlIGRldGVjdGlvbiBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7VmVjdG9yMn0gW3RleGVsU2l6ZV0gLSBUaGUgYWJzb2x1dGUgc2NyZWVuIHRleGVsIHNpemUuXHJcbiAgICovXG4gIGZ1bmN0aW9uIE91dGxpbmVFZGdlc01hdGVyaWFsKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciB0ZXhlbFNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG5ldyBWZWN0b3IyKCk7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBPdXRsaW5lRWRnZXNNYXRlcmlhbCk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihPdXRsaW5lRWRnZXNNYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIk91dGxpbmVFZGdlc01hdGVyaWFsXCIsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0TWFzazogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRleGVsU2l6ZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSlcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkMTMsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQxMyxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcblxuICAgIF90aGlzLnNldFRleGVsU2l6ZSh0ZXhlbFNpemUueCwgdGV4ZWxTaXplLnkpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHRleGVsIHNpemUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge051bWJlcn0geCAtIFRoZSB0ZXhlbCB3aWR0aC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0geSAtIFRoZSB0ZXhlbCBoZWlnaHQuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhPdXRsaW5lRWRnZXNNYXRlcmlhbCwgW3tcbiAgICBrZXk6IFwic2V0VGV4ZWxTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFRleGVsU2l6ZSh4LCB5KSB7XG4gICAgICB0aGlzLnVuaWZvcm1zLnRleGVsU2l6ZS52YWx1ZS5zZXQoeCwgeSk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoT3V0bGluZUVkZ2VzTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIE91dGxpbmVFZGdlc01hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQxNCA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBmbG9hdCBncmFudWxhcml0eTtcXHJcXG51bmlmb3JtIGZsb2F0IGR4O1xcclxcbnVuaWZvcm0gZmxvYXQgZHk7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB0ZXhlbDtcXHJcXG5cXHJcXG5cXHRpZihncmFudWxhcml0eSA+IDAuMCkge1xcclxcblxcclxcblxcdFxcdHZlYzIgY29vcmQgPSB2ZWMyKFxcclxcblxcdFxcdFxcdGR4ICogKGZsb29yKHZVdi54IC8gZHgpICsgMC41KSxcXHJcXG5cXHRcXHRcXHRkeSAqIChmbG9vcih2VXYueSAvIGR5KSArIDAuNSlcXHJcXG5cXHRcXHQpO1xcclxcblxcclxcblxcdFxcdHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZCk7XFxyXFxuXFxyXFxuXFx0fSBlbHNlIHtcXHJcXG5cXHJcXG5cXHRcXHR0ZXhlbCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gdGV4ZWw7XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQxNCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogQSBwaXhlbGF0aW9uIHNoYWRlciBtYXRlcmlhbC5cclxuICpcclxuICogT3JpZ2luYWwgc2hhZGVyIGNvZGUgYnkgUm9iZXJ0IENhc2Fub3ZhOlxyXG4gKiAgaHR0cHM6Ly9naXRodWIuY29tL3JvYmVydGNhc2Fub3ZhL3BpeGVsYXRlLXNoYWRlclxyXG4gKi9cblxudmFyIFBpeGVsYXRpb25NYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgcGl4ZWxhdGlvbiBtYXRlcmlhbC5cclxuICAgKi9cbiAgZnVuY3Rpb24gUGl4ZWxhdGlvbk1hdGVyaWFsKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFBpeGVsYXRpb25NYXRlcmlhbCk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFBpeGVsYXRpb25NYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIlBpeGVsYXRpb25NYXRlcmlhbFwiLFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICBncmFudWxhcml0eTogbmV3IFVuaWZvcm0oMS4wKSxcbiAgICAgICAgcmVzb2x1dGlvbjogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoMS4wLCAxLjApKSxcbiAgICAgICAgZHg6IG5ldyBVbmlmb3JtKDEuMCksXG4gICAgICAgIGR5OiBuZXcgVW5pZm9ybSgxLjApXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDE0LFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkMTQsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG4gIH1cbiAgLyoqXHJcbiAgICogVGhlIHBpeGVsIGdyYW51bGFyaXR5LlxyXG4gICAqXHJcbiAgICogQHR5cGUge051bWJlcn1cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFBpeGVsYXRpb25NYXRlcmlhbCwgW3tcbiAgICBrZXk6IFwic2V0UmVzb2x1dGlvblwiLFxuXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSByZXNvbHV0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFJlc29sdXRpb24od2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlLnNldCh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMuZ3JhbnVsYXJpdHkgPSB0aGlzLmdyYW51bGFyaXR5O1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJncmFudWxhcml0eVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudW5pZm9ybXMuZ3JhbnVsYXJpdHkudmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQSBoaWdoZXIgdmFsdWUgeWllbGRzIGNvYXJzZXIgdmlzdWFscy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHgpIHtcbiAgICAgIHZhciB1bmlmb3JtcyA9IHRoaXMudW5pZm9ybXM7XG4gICAgICB2YXIgcmVzb2x1dGlvbiA9IHVuaWZvcm1zLnJlc29sdXRpb24udmFsdWU7XG4gICAgICB1bmlmb3Jtcy5ncmFudWxhcml0eS52YWx1ZSA9IHg7XG4gICAgICB1bmlmb3Jtcy5keC52YWx1ZSA9IHggLyByZXNvbHV0aW9uLng7XG4gICAgICB1bmlmb3Jtcy5keS52YWx1ZSA9IHggLyByZXNvbHV0aW9uLnk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoUGl4ZWxhdGlvbk1hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBQaXhlbGF0aW9uTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDE1ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcclxcblxcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHREZXB0aDtcXHJcXG5cXHJcXG51bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcbnVuaWZvcm0gdmVjMiBoYWxmVGV4ZWxTaXplO1xcclxcblxcclxcbnVuaWZvcm0gZmxvYXQgY2FtZXJhTmVhcjtcXHJcXG51bmlmb3JtIGZsb2F0IGNhbWVyYUZhcjtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGZvY2FsTGVuZ3RoO1xcclxcbnVuaWZvcm0gZmxvYXQgZm9jYWxTdG9wO1xcclxcblxcclxcbnVuaWZvcm0gZmxvYXQgbWF4Qmx1cjtcXHJcXG51bmlmb3JtIGZsb2F0IGx1bWluYW5jZVRocmVzaG9sZDtcXHJcXG51bmlmb3JtIGZsb2F0IGx1bWluYW5jZUdhaW47XFxyXFxudW5pZm9ybSBmbG9hdCBiaWFzO1xcclxcbnVuaWZvcm0gZmxvYXQgZnJpbmdlO1xcclxcbnVuaWZvcm0gZmxvYXQgZGl0aGVyU3RyZW5ndGg7XFxyXFxuXFxyXFxuI2lmZGVmIFNIQURFUl9GT0NVU1xcclxcblxcclxcblxcdHVuaWZvcm0gdmVjMiBmb2N1c0Nvb3JkcztcXHJcXG5cXHJcXG4jZWxzZVxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgZm9jYWxEZXB0aDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbiNpZm5kZWYgVVNFX0xPR0RFUFRIQlVGXFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPHBhY2tpbmc+XFxyXFxuXFxyXFxuXFx0ZmxvYXQgcmVhZERlcHRoKHNhbXBsZXIyRCBkZXB0aFNhbXBsZXIsIHZlYzIgY29vcmQpIHtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBmcmFnQ29vcmRaID0gdGV4dHVyZTJEKGRlcHRoU2FtcGxlciwgY29vcmQpLng7XFxyXFxuXFx0XFx0ZmxvYXQgdmlld1ogPSBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WihmcmFnQ29vcmRaLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIpO1xcclxcblxcclxcblxcdFxcdHJldHVybiB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgodmlld1osIGNhbWVyYU5lYXIsIGNhbWVyYUZhcik7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbiNpZmRlZiBQRU5UQUdPTlxcclxcblxcclxcblxcdGZsb2F0IHBlbnRhKHZlYzIgY29vcmRzKSB7XFxyXFxuXFxyXFxuXFx0XFx0Y29uc3QgdmVjNCBIUzAgPSB2ZWM0KCAxLjAsICAgICAgICAgIDAuMCwgICAgICAgICAwLjAsIDEuMCk7XFxyXFxuXFx0XFx0Y29uc3QgdmVjNCBIUzEgPSB2ZWM0KCAwLjMwOTAxNjk5NCwgIDAuOTUxMDU2NTE2LCAwLjAsIDEuMCk7XFxyXFxuXFx0XFx0Y29uc3QgdmVjNCBIUzIgPSB2ZWM0KC0wLjgwOTAxNjk5NCwgIDAuNTg3Nzg1MjUyLCAwLjAsIDEuMCk7XFxyXFxuXFx0XFx0Y29uc3QgdmVjNCBIUzMgPSB2ZWM0KC0wLjgwOTAxNjk5NCwgLTAuNTg3Nzg1MjUyLCAwLjAsIDEuMCk7XFxyXFxuXFx0XFx0Y29uc3QgdmVjNCBIUzQgPSB2ZWM0KCAwLjMwOTAxNjk5NCwgLTAuOTUxMDU2NTE2LCAwLjAsIDEuMCk7XFxyXFxuXFx0XFx0Y29uc3QgdmVjNCBIUzUgPSB2ZWM0KCAwLjAsICAgICAgICAgIDAuMCwgICAgICAgICAxLjAsIDEuMCk7XFxyXFxuXFxyXFxuXFx0XFx0Y29uc3QgdmVjNCBPTkUgPSB2ZWM0KDEuMCk7XFxyXFxuXFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgUF9GRUFUSEVSID0gMC40O1xcclxcblxcdFxcdGNvbnN0IGZsb2F0IE5fRkVBVEhFUiA9IC1QX0ZFQVRIRVI7XFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgaW5Pck91dCA9IC00LjA7XFxyXFxuXFxyXFxuXFx0XFx0dmVjNCBQID0gdmVjNChjb29yZHMsIHZlYzIoUklOR1NfRkxPQVQgLSAxLjMpKTtcXHJcXG5cXHJcXG5cXHRcXHR2ZWM0IGRpc3QgPSB2ZWM0KFxcclxcblxcdFxcdFxcdGRvdChQLCBIUzApLFxcclxcblxcdFxcdFxcdGRvdChQLCBIUzEpLFxcclxcblxcdFxcdFxcdGRvdChQLCBIUzIpLFxcclxcblxcdFxcdFxcdGRvdChQLCBIUzMpXFxyXFxuXFx0XFx0KTtcXHJcXG5cXHJcXG5cXHRcXHRkaXN0ID0gc21vb3Roc3RlcChOX0ZFQVRIRVIsIFBfRkVBVEhFUiwgZGlzdCk7XFxyXFxuXFxyXFxuXFx0XFx0aW5Pck91dCArPSBkb3QoZGlzdCwgT05FKTtcXHJcXG5cXHJcXG5cXHRcXHRkaXN0LnggPSBkb3QoUCwgSFM0KTtcXHJcXG5cXHRcXHRkaXN0LnkgPSBIUzUudyAtIGFicyhQLnopO1xcclxcblxcclxcblxcdFxcdGRpc3QgPSBzbW9vdGhzdGVwKE5fRkVBVEhFUiwgUF9GRUFUSEVSLCBkaXN0KTtcXHJcXG5cXHRcXHRpbk9yT3V0ICs9IGRpc3QueDtcXHJcXG5cXHJcXG5cXHRcXHRyZXR1cm4gY2xhbXAoaW5Pck91dCwgMC4wLCAxLjApO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgU0hPV19GT0NVU1xcclxcblxcclxcblxcdHZlYzMgZGVidWdGb2N1cyh2ZWMzIGMsIGZsb2F0IGJsdXIsIGZsb2F0IGRlcHRoKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZWRnZSA9IDAuMDAyICogZGVwdGg7XFxyXFxuXFx0XFx0ZmxvYXQgbSA9IGNsYW1wKHNtb290aHN0ZXAoMC4wLCBlZGdlLCBibHVyKSwgMC4wLCAxLjApO1xcclxcblxcdFxcdGZsb2F0IGUgPSBjbGFtcChzbW9vdGhzdGVwKDEuMCAtIGVkZ2UsIDEuMCwgYmx1ciksIDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHRcXHRjID0gbWl4KGMsIHZlYzMoMS4wLCAwLjUsIDAuMCksICgxLjAgLSBtKSAqIDAuNik7XFxyXFxuXFx0XFx0YyA9IG1peChjLCB2ZWMzKDAuMCwgMC41LCAxLjApLCAoKDEuMCAtIGUpIC0gKDEuMCAtIG0pKSAqIDAuMik7XFxyXFxuXFxyXFxuXFx0XFx0cmV0dXJuIGM7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbiNpZmRlZiBWSUdORVRURVxcclxcblxcclxcblxcdGZsb2F0IHZpZ25ldHRlKCkge1xcclxcblxcclxcblxcdFxcdGNvbnN0IHZlYzIgQ0VOVEVSID0gdmVjMigwLjUpO1xcclxcblxcclxcblxcdFxcdGNvbnN0IGZsb2F0IFZJR05FVFRFX09VVCA9IDEuMztcXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBWSUdORVRURV9JTiA9IDAuMDtcXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBWSUdORVRURV9GQURFID0gMjIuMDsgXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZCA9IGRpc3RhbmNlKHZVdiwgQ0VOVEVSKTtcXHJcXG5cXHRcXHRkID0gc21vb3Roc3RlcChWSUdORVRURV9PVVQgKyAoZm9jYWxTdG9wIC8gVklHTkVUVEVfRkFERSksIFZJR05FVFRFX0lOICsgKGZvY2FsU3RvcCAvIFZJR05FVFRFX0ZBREUpLCBkKTtcXHJcXG5cXHJcXG5cXHRcXHRyZXR1cm4gY2xhbXAoZCwgMC4wLCAxLjApO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG52ZWMyIHJhbmQyKHZlYzIgY29vcmQpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIG5vaXNlO1xcclxcblxcclxcblxcdCNpZmRlZiBOT0lTRVxcclxcblxcclxcblxcdFxcdGNvbnN0IGZsb2F0IGEgPSAxMi45ODk4O1xcclxcblxcdFxcdGNvbnN0IGZsb2F0IGIgPSA3OC4yMzM7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgYyA9IDQzNzU4LjU0NTM7XFxyXFxuXFxyXFxuXFx0XFx0bm9pc2UueCA9IGNsYW1wKGZyYWN0KHNpbihtb2QoZG90KGNvb3JkLCB2ZWMyKGEsIGIpKSwgMy4xNCkpICogYyksIDAuMCwgMS4wKSAqIDIuMCAtIDEuMDtcXHJcXG5cXHRcXHRub2lzZS55ID0gY2xhbXAoZnJhY3Qoc2luKG1vZChkb3QoY29vcmQsIHZlYzIoYSwgYikgKiAyLjApLCAzLjE0KSkgKiBjKSwgMC4wLCAxLjApICogMi4wIC0gMS4wO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0bm9pc2UueCA9ICgoZnJhY3QoMS4wIC0gY29vcmQucyAqIGhhbGZUZXhlbFNpemUueCkgKiAwLjI1KSArIChmcmFjdChjb29yZC50ICogaGFsZlRleGVsU2l6ZS55KSAqIDAuNzUpKSAqIDIuMCAtIDEuMDtcXHJcXG5cXHRcXHRub2lzZS55ID0gKChmcmFjdCgxLjAgLSBjb29yZC5zICogaGFsZlRleGVsU2l6ZS54KSAqIDAuNzUpICsgKGZyYWN0KGNvb3JkLnQgKiBoYWxmVGV4ZWxTaXplLnkpICogMC4yNSkpICogMi4wIC0gMS4wO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdHJldHVybiBub2lzZTtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxudmVjMyBwcm9jZXNzVGV4ZWwodmVjMiBjb29yZHMsIGZsb2F0IGJsdXIpIHtcXHJcXG5cXHJcXG5cXHR2ZWMzIGM7XFxyXFxuXFx0Yy5yID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZHMgKyB2ZWMyKDAuMCwgMS4wKSAqIHRleGVsU2l6ZSAqIGZyaW5nZSAqIGJsdXIpLnI7XFxyXFxuXFx0Yy5nID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZHMgKyB2ZWMyKC0wLjg2NiwgLTAuNSkgKiB0ZXhlbFNpemUgKiBmcmluZ2UgKiBibHVyKS5nO1xcclxcblxcdGMuYiA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmRzICsgdmVjMigwLjg2NiwgLTAuNSkgKiB0ZXhlbFNpemUgKiBmcmluZ2UgKiBibHVyKS5iO1xcclxcblxcclxcblxcdC8vIENhbGN1bGF0ZSB0aGUgbHVtaW5hbmNlIG9mIHRoZSBjb25zdHJ1Y3RlZCBjb2xvdXIuXFxyXFxuXFx0ZmxvYXQgbHVtaW5hbmNlID0gbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZShjKTtcXHJcXG5cXHRmbG9hdCB0aHJlc2hvbGQgPSBtYXgoKGx1bWluYW5jZSAtIGx1bWluYW5jZVRocmVzaG9sZCkgKiBsdW1pbmFuY2VHYWluLCAwLjApO1xcclxcblxcclxcblxcdHJldHVybiBjICsgbWl4KHZlYzMoMC4wKSwgYywgdGhyZXNob2xkICogYmx1cik7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbmZsb2F0IGxpbmVhcml6ZShmbG9hdCBkZXB0aCkge1xcclxcblxcclxcblxcdHJldHVybiAtY2FtZXJhRmFyICogY2FtZXJhTmVhciAvIChkZXB0aCAqIChjYW1lcmFGYXIgLSBjYW1lcmFOZWFyKSAtIGNhbWVyYUZhcik7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbmZsb2F0IGdhdGhlcihmbG9hdCBpLCBmbG9hdCBqLCBmbG9hdCByaW5nU2FtcGxlcywgaW5vdXQgdmVjMyBjb2xvciwgZmxvYXQgdywgZmxvYXQgaCwgZmxvYXQgYmx1cikge1xcclxcblxcclxcblxcdGNvbnN0IGZsb2F0IFRXT19QSSA9IDYuMjgzMTg1MzE7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgc3RlcCA9IFRXT19QSSAvIHJpbmdTYW1wbGVzO1xcclxcblxcdGZsb2F0IHB3ID0gY29zKGogKiBzdGVwKSAqIGk7XFxyXFxuXFx0ZmxvYXQgcGggPSBzaW4oaiAqIHN0ZXApICogaTtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgUEVOVEFHT05cXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBwID0gcGVudGEodmVjMihwdywgcGgpKTtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGZsb2F0IHAgPSAxLjA7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0Y29sb3IgKz0gcHJvY2Vzc1RleGVsKHZVdiArIHZlYzIocHcgKiB3LCBwaCAqIGgpLCBibHVyKSAqIG1peCgxLjAsIGkgLyBSSU5HU19GTE9BVCwgYmlhcykgKiBwO1xcclxcblxcclxcblxcdHJldHVybiBtaXgoMS4wLCBpIC8gUklOR1NfRkxPQVQsIGJpYXMpICogcDtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBkZXB0aCA9IGxpbmVhcml6ZSh0ZXh0dXJlMkQodERlcHRoLCB2VXYpLngpO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZGVwdGggPSBsaW5lYXJpemUocmVhZERlcHRoKHREZXB0aCwgdlV2KSk7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0I2lmZGVmIFNIQURFUl9GT0NVU1xcclxcblxcclxcblxcdFxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXHJcXG5cXHJcXG5cXHRcXHRcXHRmbG9hdCBmRGVwdGggPSBsaW5lYXJpemUodGV4dHVyZTJEKHREZXB0aCwgZm9jdXNDb29yZHMpLngpO1xcclxcblxcclxcblxcdFxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0XFx0ZmxvYXQgZkRlcHRoID0gbGluZWFyaXplKHJlYWREZXB0aCh0RGVwdGgsIGZvY3VzQ29vcmRzKSk7XFxyXFxuXFxyXFxuXFx0XFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBmRGVwdGggPSBmb2NhbERlcHRoO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBNQU5VQUxfRE9GXFxyXFxuXFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgbkRvRlN0YXJ0ID0gMS4wOyBcXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBuRG9GRGlzdCA9IDIuMDtcXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBmRG9GU3RhcnQgPSAxLjA7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgZkRvRkRpc3QgPSAzLjA7XFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZm9jYWxQbGFuZSA9IGRlcHRoIC0gZkRlcHRoO1xcclxcblxcdFxcdGZsb2F0IGZhckRvRiA9IChmb2NhbFBsYW5lIC0gZkRvRlN0YXJ0KSAvIGZEb0ZEaXN0O1xcclxcblxcdFxcdGZsb2F0IG5lYXJEb0YgPSAoLWZvY2FsUGxhbmUgLSBuRG9GU3RhcnQpIC8gbkRvRkRpc3Q7XFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgYmx1ciA9IChmb2NhbFBsYW5lID4gMC4wKSA/IGZhckRvRiA6IG5lYXJEb0Y7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBDSVJDTEVfT0ZfQ09ORlVTSU9OID0gMC4wMzsgLy8gMzVtbSBmaWxtID0gMC4wM21tIENvQy5cXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBmb2NhbFBsYW5lTU0gPSBmRGVwdGggKiAxMDAwLjA7XFxyXFxuXFx0XFx0ZmxvYXQgZGVwdGhNTSA9IGRlcHRoICogMTAwMC4wO1xcclxcblxcclxcblxcdFxcdGZsb2F0IGZvY2FsUGxhbmUgPSAoZGVwdGhNTSAqIGZvY2FsTGVuZ3RoKSAvIChkZXB0aE1NIC0gZm9jYWxMZW5ndGgpO1xcclxcblxcdFxcdGZsb2F0IGZhckRvRiA9IChmb2NhbFBsYW5lTU0gKiBmb2NhbExlbmd0aCkgLyAoZm9jYWxQbGFuZU1NIC0gZm9jYWxMZW5ndGgpO1xcclxcblxcdFxcdGZsb2F0IG5lYXJEb0YgPSAoZm9jYWxQbGFuZU1NIC0gZm9jYWxMZW5ndGgpIC8gKGZvY2FsUGxhbmVNTSAqIGZvY2FsU3RvcCAqIENJUkNMRV9PRl9DT05GVVNJT04pO1xcclxcblxcclxcblxcdFxcdGZsb2F0IGJsdXIgPSBhYnMoZm9jYWxQbGFuZSAtIGZhckRvRikgKiBuZWFyRG9GO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGJsdXIgPSBjbGFtcChibHVyLCAwLjAsIDEuMCk7XFxyXFxuXFxyXFxuXFx0Ly8gRGl0aGVyaW5nLlxcclxcblxcdHZlYzIgbm9pc2UgPSByYW5kMih2VXYpICogZGl0aGVyU3RyZW5ndGggKiBibHVyO1xcclxcblxcclxcblxcdGZsb2F0IGJsdXJGYWN0b3JYID0gdGV4ZWxTaXplLnggKiBibHVyICogbWF4Qmx1ciArIG5vaXNlLng7XFxyXFxuXFx0ZmxvYXQgYmx1ckZhY3RvclkgPSB0ZXhlbFNpemUueSAqIGJsdXIgKiBtYXhCbHVyICsgbm9pc2UueTtcXHJcXG5cXHJcXG5cXHRjb25zdCBpbnQgTUFYX1JJTkdfU0FNUExFUyA9IFJJTkdTX0lOVCAqIFNBTVBMRVNfSU5UO1xcclxcblxcclxcblxcdC8vIENhbGN1bGF0aW9uIG9mIGZpbmFsIGNvbG9yLlxcclxcblxcdHZlYzQgY29sb3I7XFxyXFxuXFxyXFxuXFx0aWYoYmx1ciA8IDAuMDUpIHtcXHJcXG5cXHJcXG5cXHRcXHRjb2xvciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHJcXG5cXHR9IGVsc2Uge1xcclxcblxcclxcblxcdFxcdGNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcclxcblxcdFxcdGZsb2F0IHMgPSAxLjA7XFxyXFxuXFx0XFx0aW50IHJpbmdTYW1wbGVzO1xcclxcblxcclxcblxcdFxcdGZvcihpbnQgaSA9IDE7IGkgPD0gUklOR1NfSU5UOyArK2kpIHtcXHJcXG5cXHJcXG5cXHRcXHRcXHRyaW5nU2FtcGxlcyA9IGkgKiBTQU1QTEVTX0lOVDtcXHJcXG5cXHJcXG5cXHRcXHRcXHQvLyBDb25zdGFudCBsb29wLlxcclxcblxcdFxcdFxcdGZvcihpbnQgaiA9IDA7IGogPCBNQVhfUklOR19TQU1QTEVTOyArK2opIHtcXHJcXG5cXHJcXG5cXHRcXHRcXHRcXHQvLyBCcmVhayBlYXJsaWVyLlxcclxcblxcdFxcdFxcdFxcdGlmKGogPj0gcmluZ1NhbXBsZXMpIHsgYnJlYWs7IH1cXHJcXG5cXHJcXG5cXHRcXHRcXHRcXHRzICs9IGdhdGhlcihmbG9hdChpKSwgZmxvYXQoaiksIGZsb2F0KHJpbmdTYW1wbGVzKSwgY29sb3IucmdiLCBibHVyRmFjdG9yWCwgYmx1ckZhY3RvclksIGJsdXIpO1xcclxcblxcclxcblxcdFxcdFxcdH1cXHJcXG5cXHJcXG5cXHRcXHR9XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IucmdiIC89IHM7IC8vIERpdmlkZSBieSBzYW1wbGUgY291bnQuXFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdCNpZmRlZiBTSE9XX0ZPQ1VTXFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IucmdiID0gZGVidWdGb2N1cyhjb2xvci5yZ2IsIGJsdXIsIGRlcHRoKTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgVklHTkVUVEVcXHJcXG5cXHJcXG5cXHRcXHRjb2xvci5yZ2IgKj0gdmlnbmV0dGUoKTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSBjb2xvcjtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDE1ID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBEZXB0aCBvZiBGaWVsZCBzaGFkZXIgdjIuNC5cclxuICpcclxuICogT3JpZ2luYWwgc2hhZGVyIGNvZGUgYnkgTWFydGlucyBVcGl0aXM6XHJcbiAqICBodHRwOi8vYmxlbmRlcmFydGlzdHMub3JnL2ZvcnVtL3Nob3d0aHJlYWQucGhwPzIzNzQ4OC1HTFNMLWRlcHRoLW9mLWZpZWxkLXdpdGgtYm9rZWgtdjItNC0odXBkYXRlKVxyXG4gKi9cblxudmFyIFJlYWxpc3RpY0Jva2VoTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGJva2VoMiBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IFtjYW1lcmFdIC0gVGhlIG1haW4gY2FtZXJhLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtWZWN0b3IyfSBbb3B0aW9ucy50ZXhlbFNpemVdIC0gVGhlIGFic29sdXRlIHNjcmVlbiB0ZXhlbCBzaXplLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMucmluZ3M9M10gLSBUaGUgbnVtYmVyIG9mIGJsdXJyaW5nIGl0ZXJhdGlvbnMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zYW1wbGVzPTJdIC0gVGhlIGFtb3VudCBvZiBzYW1wbGVzIHRha2VuIHBlciByaW5nLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2hvd0ZvY3VzPWZhbHNlXSAtIFdoZXRoZXIgdGhlIGZvY3VzIHBvaW50IHNob3VsZCBiZSBoaWdobGlnaHRlZC5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1hbnVhbERvRj1mYWxzZV0gLSBFbmFibGVzIG1hbnVhbCBkZXB0aCBvZiBmaWVsZCBibHVyLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMudmlnbmV0dGU9ZmFsc2VdIC0gRW5hYmxlcyBhIHZpZ25ldHRlIGVmZmVjdC5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnBlbnRhZ29uPWZhbHNlXSAtIEVuYWJsZSB0byB1c2UgYSBwZW50YWdvbmFsIHNoYXBlIHRvIHNjYWxlIGdhdGhlcmVkIHRleGVscy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNoYWRlckZvY3VzPXRydWVdIC0gRGlzYWJsZSBpZiB5b3UgY29tcHV0ZSB5b3VyIG93biBmb2NhbERlcHRoIChpbiBtZXRyZXMhKS5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm5vaXNlPXRydWVdIC0gRGlzYWJsZSBpZiB5b3UgZG9uJ3Qgd2FudCBub2lzZSBwYXR0ZXJucyBmb3IgZGl0aGVyaW5nLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhCbHVyPTEuMF0gLSBUaGUgbWF4aW11bSBibHVyIHN0cmVuZ3RoLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5sdW1pbmFuY2VUaHJlc2hvbGQ9MC41XSAtIEEgbHVtaW5hbmNlIHRocmVzaG9sZC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubHVtaW5hbmNlR2Fpbj0yLjBdIC0gQSBsdW1pbmFuY2UgZ2FpbiBmYWN0b3IuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmJpYXM9MC41XSAtIEEgYmx1ciBiaWFzLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5mcmluZ2U9MC43XSAtIEEgYmx1ciBvZmZzZXQuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRpdGhlclN0cmVuZ3RoPTAuMDAwMV0gLSBUaGUgZGl0aGVyIHN0cmVuZ3RoLlxyXG4gICAqL1xuICBmdW5jdGlvbiBSZWFsaXN0aWNCb2tlaE1hdGVyaWFsKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBjYW1lcmEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVhbGlzdGljQm9rZWhNYXRlcmlhbCk7XG5cbiAgICB2YXIgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIHRleGVsU2l6ZTogbnVsbCxcbiAgICAgIHJpbmdzOiAzLFxuICAgICAgc2FtcGxlczogMixcbiAgICAgIHNob3dGb2N1czogZmFsc2UsXG4gICAgICBtYW51YWxEb0Y6IGZhbHNlLFxuICAgICAgdmlnbmV0dGU6IGZhbHNlLFxuICAgICAgcGVudGFnb246IGZhbHNlLFxuICAgICAgc2hhZGVyRm9jdXM6IHRydWUsXG4gICAgICBub2lzZTogdHJ1ZSxcbiAgICAgIG1heEJsdXI6IDEuMCxcbiAgICAgIGx1bWluYW5jZVRocmVzaG9sZDogMC41LFxuICAgICAgbHVtaW5hbmNlR2FpbjogMi4wLFxuICAgICAgYmlhczogMC41LFxuICAgICAgZnJpbmdlOiAwLjcsXG4gICAgICBkaXRoZXJTdHJlbmd0aDogMC4wMDAxXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoUmVhbGlzdGljQm9rZWhNYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIlJlYWxpc3RpY0Jva2VoTWF0ZXJpYWxcIixcbiAgICAgIGRlZmluZXM6IHtcbiAgICAgICAgUklOR1NfSU5UOiBzZXR0aW5ncy5yaW5ncy50b0ZpeGVkKDApLFxuICAgICAgICBSSU5HU19GTE9BVDogc2V0dGluZ3MucmluZ3MudG9GaXhlZCgxKSxcbiAgICAgICAgU0FNUExFU19JTlQ6IHNldHRpbmdzLnNhbXBsZXMudG9GaXhlZCgwKSxcbiAgICAgICAgU0FNUExFU19GTE9BVDogc2V0dGluZ3Muc2FtcGxlcy50b0ZpeGVkKDEpXG4gICAgICB9LFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0RGVwdGg6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0ZXhlbFNpemU6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKCkpLFxuICAgICAgICBoYWxmVGV4ZWxTaXplOiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yMigpKSxcbiAgICAgICAgY2FtZXJhTmVhcjogbmV3IFVuaWZvcm0oMC4xKSxcbiAgICAgICAgY2FtZXJhRmFyOiBuZXcgVW5pZm9ybSgyMDAwKSxcbiAgICAgICAgZm9jYWxMZW5ndGg6IG5ldyBVbmlmb3JtKDI0LjApLFxuICAgICAgICBmb2NhbFN0b3A6IG5ldyBVbmlmb3JtKDAuOSksXG4gICAgICAgIG1heEJsdXI6IG5ldyBVbmlmb3JtKHNldHRpbmdzLm1heEJsdXIpLFxuICAgICAgICBsdW1pbmFuY2VUaHJlc2hvbGQ6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmx1bWluYW5jZVRocmVzaG9sZCksXG4gICAgICAgIGx1bWluYW5jZUdhaW46IG5ldyBVbmlmb3JtKHNldHRpbmdzLmx1bWluYW5jZUdhaW4pLFxuICAgICAgICBiaWFzOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5iaWFzKSxcbiAgICAgICAgZnJpbmdlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5mcmluZ2UpLFxuICAgICAgICBkaXRoZXJTdHJlbmd0aDogbmV3IFVuaWZvcm0oc2V0dGluZ3MuZGl0aGVyU3RyZW5ndGgpLFxuICAgICAgICBmb2N1c0Nvb3JkczogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoMC41LCAwLjUpKSxcbiAgICAgICAgZm9jYWxEZXB0aDogbmV3IFVuaWZvcm0oMS4wKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQxNSxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDE1LFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuXG4gICAgX3RoaXMuc2V0U2hvd0ZvY3VzRW5hYmxlZChzZXR0aW5ncy5zaG93Rm9jdXMpO1xuXG4gICAgX3RoaXMuc2V0TWFudWFsRGVwdGhPZkZpZWxkRW5hYmxlZChzZXR0aW5ncy5tYW51YWxEb0YpO1xuXG4gICAgX3RoaXMuc2V0VmlnbmV0dGVFbmFibGVkKHNldHRpbmdzLnZpZ25ldHRlKTtcblxuICAgIF90aGlzLnNldFBlbnRhZ29uRW5hYmxlZChzZXR0aW5ncy5wZW50YWdvbik7XG5cbiAgICBfdGhpcy5zZXRTaGFkZXJGb2N1c0VuYWJsZWQoc2V0dGluZ3Muc2hhZGVyRm9jdXMpO1xuXG4gICAgX3RoaXMuc2V0Tm9pc2VFbmFibGVkKHNldHRpbmdzLm5vaXNlKTtcblxuICAgIGlmIChzZXR0aW5ncy50ZXhlbFNpemUgIT09IG51bGwpIHtcbiAgICAgIF90aGlzLnNldFRleGVsU2l6ZShzZXR0aW5ncy50ZXhlbFNpemUueCwgc2V0dGluZ3MudGV4ZWxTaXplLnkpO1xuICAgIH1cblxuICAgIF90aGlzLmFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIGZvY3VzIHNob3VsZCBiZSBzaG93bi5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFRydWUgaWYgdGhlIGZvY3VzIHNob3VsZCBiZSBzaG93biwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoUmVhbGlzdGljQm9rZWhNYXRlcmlhbCwgW3tcbiAgICBrZXk6IFwic2V0U2hvd0ZvY3VzRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaG93Rm9jdXNFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5TSE9XX0ZPQ1VTID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLlNIT1dfRk9DVVM7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIERlZmluZXMgd2hldGhlciBtYW51YWwgRGVwdGggb2YgRmllbGQgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciBtYW51YWwgRG9GIHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRNYW51YWxEZXB0aE9mRmllbGRFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldE1hbnVhbERlcHRoT2ZGaWVsZEVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLk1BTlVBTF9ET0YgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuTUFOVUFMX0RPRjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB3aGV0aGVyIHRoZSBWaWduZXR0ZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgVmlnbmV0dGUgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRWaWduZXR0ZUVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VmlnbmV0dGVFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5WSUdORVRURSA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5WSUdORVRURTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB3aGV0aGVyIHRoZSBwZW50YWdvbmFsIGJsdXIgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIHBlbnRhZ29uYWwgYmx1ciBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFBlbnRhZ29uRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQZW50YWdvbkVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlBFTlRBR09OID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLlBFTlRBR09OO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBhdXRvbWF0aWMgc2hhZGVyIGZvY3VzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIHNoYWRlciBmb2N1cyBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2hhZGVyRm9jdXNFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNoYWRlckZvY3VzRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuU0hBREVSX0ZPQ1VTID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLlNIQURFUl9GT0NVUztcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB3aGV0aGVyIHRoZSBkaXRoZXJpbmcgc2hvdWxkIGNvbXB1dGUgbm9pc2UuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciBub2lzZS1iYXNlZCBkaXRoZXJpbmcgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldE5vaXNlRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXROb2lzZUVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLk5PSVNFID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLk5PSVNFO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0ZXhlbCBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB4IC0gVGhlIHRleGVsIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHkgLSBUaGUgdGV4ZWwgaGVpZ2h0LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRUZXhlbFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0VGV4ZWxTaXplKHgsIHkpIHtcbiAgICAgIHRoaXMudW5pZm9ybXMudGV4ZWxTaXplLnZhbHVlLnNldCh4LCB5KTtcbiAgICAgIHRoaXMudW5pZm9ybXMuaGFsZlRleGVsU2l6ZS52YWx1ZS5zZXQoeCwgeSkubXVsdGlwbHlTY2FsYXIoMC41KTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBBZG9wdHMgdGhlIG5lYXIgYW5kIGZhciBwbGFuZSBhbmQgdGhlIGZvY2FsIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gY2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRvcHRDYW1lcmFTZXR0aW5nc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZG9wdENhbWVyYVNldHRpbmdzKGNhbWVyYSkge1xuICAgICAgaWYgKGNhbWVyYSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnVuaWZvcm1zLmNhbWVyYU5lYXIudmFsdWUgPSBjYW1lcmEubmVhcjtcbiAgICAgICAgdGhpcy51bmlmb3Jtcy5jYW1lcmFGYXIudmFsdWUgPSBjYW1lcmEuZmFyO1xuICAgICAgICB0aGlzLnVuaWZvcm1zLmZvY2FsTGVuZ3RoLnZhbHVlID0gY2FtZXJhLmdldEZvY2FsTGVuZ3RoKCk7IC8vIHVuaXQ6IG1tLlxuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFJlYWxpc3RpY0Jva2VoTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIFJlYWxpc3RpY0Jva2VoTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDE2ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcclxcblxcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gdmVjMiBjZW50ZXI7XFxyXFxudW5pZm9ybSBmbG9hdCBhc3BlY3Q7XFxyXFxudW5pZm9ybSBmbG9hdCB3YXZlU2l6ZTtcXHJcXG51bmlmb3JtIGZsb2F0IHJhZGl1cztcXHJcXG51bmlmb3JtIGZsb2F0IG1heFJhZGl1cztcXHJcXG51bmlmb3JtIGZsb2F0IGFtcGxpdHVkZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgZmxvYXQgdlNpemU7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzIgYXNwZWN0Q29ycmVjdGlvbiA9IHZlYzIoYXNwZWN0LCAxLjApO1xcclxcblxcclxcblxcdHZlYzIgZGlmZmVyZW5jZSA9IHZVdiAqIGFzcGVjdENvcnJlY3Rpb24gLSBjZW50ZXIgKiBhc3BlY3RDb3JyZWN0aW9uO1xcclxcblxcdGZsb2F0IGRpc3RhbmNlID0gc3FydChkb3QoZGlmZmVyZW5jZSwgZGlmZmVyZW5jZSkpICogdlNpemU7XFxyXFxuXFxyXFxuXFx0dmVjMiBkaXNwbGFjZW1lbnQgPSB2ZWMyKDAuMCk7XFxyXFxuXFxyXFxuXFx0aWYoZGlzdGFuY2UgPiByYWRpdXMpIHtcXHJcXG5cXHJcXG5cXHRcXHRpZihkaXN0YW5jZSA8IHJhZGl1cyArIHdhdmVTaXplKSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0ZmxvYXQgYW5nbGUgPSAoZGlzdGFuY2UgLSByYWRpdXMpICogUEkyIC8gd2F2ZVNpemU7XFxyXFxuXFx0XFx0XFx0ZmxvYXQgY29zU2luID0gKDEuMCAtIGNvcyhhbmdsZSkpICogMC41O1xcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGV4dGVudCA9IG1heFJhZGl1cyArIHdhdmVTaXplO1xcclxcblxcdFxcdFxcdGZsb2F0IGRlY2F5ID0gbWF4KGV4dGVudCAtIGRpc3RhbmNlICogZGlzdGFuY2UsIDAuMCkgLyBleHRlbnQ7XFxyXFxuXFxyXFxuXFx0XFx0XFx0ZGlzcGxhY2VtZW50ID0gKChjb3NTaW4gKiBhbXBsaXR1ZGUgKiBkaWZmZXJlbmNlKSAvIGRpc3RhbmNlKSAqIGRlY2F5O1xcclxcblxcclxcblxcdFxcdH1cXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgLSBkaXNwbGFjZW1lbnQpO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkMTYgPSBcInVuaWZvcm0gZmxvYXQgc2l6ZTtcXHJcXG51bmlmb3JtIGZsb2F0IHNjYWxlO1xcclxcbnVuaWZvcm0gZmxvYXQgY2FtZXJhRGlzdGFuY2U7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIGZsb2F0IHZTaXplO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHR2U2l6ZSA9ICgwLjEgKiBjYW1lcmFEaXN0YW5jZSkgLyBzaXplO1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEEgc2hvY2sgd2F2ZSBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIEJhc2VkIG9uIGEgR2lzdCBieSBKZWFuLVBoaWxpcHBlIFNhcmRhOlxyXG4gKiAgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vanBzYXJkYS8zM2NlYTY3YTlmMmVjYjBhMGVkYVxyXG4gKi9cblxudmFyIFNob2NrV2F2ZU1hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBzaG9jayB3YXZlIG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy53YXZlU2l6ZT0wLjJdIC0gVGhlIHdhdmUgc2l6ZS5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYW1wbGl0dWRlPTAuMDVdIC0gVGhlIGRpc3RvcnRpb24gYW1wbGl0dWRlLlxyXG4gICAqL1xuICBmdW5jdGlvbiBTaG9ja1dhdmVNYXRlcmlhbCgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTaG9ja1dhdmVNYXRlcmlhbCk7XG5cbiAgICB2YXIgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIG1heFJhZGl1czogMS4wLFxuICAgICAgd2F2ZVNpemU6IDAuMixcbiAgICAgIGFtcGxpdHVkZTogMC4wNVxuICAgIH0sIG9wdGlvbnMpO1xuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoU2hvY2tXYXZlTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJTaG9ja1dhdmVNYXRlcmlhbFwiLFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICBjZW50ZXI6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKDAuNSwgMC41KSksXG4gICAgICAgIGFzcGVjdDogbmV3IFVuaWZvcm0oMS4wKSxcbiAgICAgICAgY2FtZXJhRGlzdGFuY2U6IG5ldyBVbmlmb3JtKDEuMCksXG4gICAgICAgIHNpemU6IG5ldyBVbmlmb3JtKDEuMCksXG4gICAgICAgIHJhZGl1czogbmV3IFVuaWZvcm0oLXNldHRpbmdzLndhdmVTaXplKSxcbiAgICAgICAgbWF4UmFkaXVzOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5tYXhSYWRpdXMpLFxuICAgICAgICB3YXZlU2l6ZTogbmV3IFVuaWZvcm0oc2V0dGluZ3Mud2F2ZVNpemUpLFxuICAgICAgICBhbXBsaXR1ZGU6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmFtcGxpdHVkZSlcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkMTYsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQxNixcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcbiAgfVxuXG4gIGluaGVyaXRzKFNob2NrV2F2ZU1hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBTaG9ja1dhdmVNYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkMTcgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHRXZWlnaHRzO1xcclxcblxcclxcbnVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzQgdk9mZnNldDtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0Ly8gRmV0Y2ggdGhlIGJsZW5kaW5nIHdlaWdodHMgZm9yIGN1cnJlbnQgcGl4ZWwuXFxyXFxuXFx0dmVjNCBhO1xcclxcblxcdGEueHogPSB0ZXh0dXJlMkQodFdlaWdodHMsIHZVdikueHo7XFxyXFxuXFx0YS55ID0gdGV4dHVyZTJEKHRXZWlnaHRzLCB2T2Zmc2V0Lnp3KS5nO1xcclxcblxcdGEudyA9IHRleHR1cmUyRCh0V2VpZ2h0cywgdk9mZnNldC54eSkuYTtcXHJcXG5cXHJcXG5cXHR2ZWM0IGNvbG9yO1xcclxcblxcclxcblxcdC8vIENoZWNrIGlmIHRoZXJlIGlzIGFueSBibGVuZGluZyB3ZWlnaHQgd2l0aCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiAwLjAuXFxyXFxuXFx0aWYoZG90KGEsIHZlYzQoMS4wKSkgPCAxZS01KSB7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiwgMC4wKTtcXHJcXG5cXHJcXG5cXHR9IGVsc2Uge1xcclxcblxcclxcblxcdFxcdC8qIFVwIHRvIGZvdXIgbGluZXMgY2FuIGJlIGNyb3NzaW5nIGEgcGl4ZWwgKG9uZSB0aHJvdWdoIGVhY2ggZWRnZSkuXFxyXFxuXFx0XFx0ICogVGhlIGxpbmUgd2l0aCB0aGUgbWF4aW11bSB3ZWlnaHQgZm9yIGVhY2ggZGlyZWN0aW9uIGlzIGZhdm91cmVkLlxcclxcblxcdFxcdCAqL1xcclxcblxcclxcblxcdFxcdHZlYzIgb2Zmc2V0O1xcclxcblxcdFxcdG9mZnNldC54ID0gYS5hID4gYS5iID8gYS5hIDogLWEuYjsgLy8gTGVmdCB2cy4gcmlnaHQuXFxyXFxuXFx0XFx0b2Zmc2V0LnkgPSBhLmcgPiBhLnIgPyAtYS5nIDogYS5yOyAvLyBUb3AgdnMuIGJvdHRvbSAoY2hhbmdlZCBzaWducykuXFxyXFxuXFxyXFxuXFx0XFx0Ly8gR28gaW4gdGhlIGRpcmVjdGlvbiB3aXRoIHRoZSBtYXhpbXVtIHdlaWdodCAoaG9yaXpvbnRhbCB2cy4gdmVydGljYWwpLlxcclxcblxcdFxcdGlmKGFicyhvZmZzZXQueCkgPiBhYnMob2Zmc2V0LnkpKSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0b2Zmc2V0LnkgPSAwLjA7XFxyXFxuXFxyXFxuXFx0XFx0fSBlbHNlIHtcXHJcXG5cXHJcXG5cXHRcXHRcXHRvZmZzZXQueCA9IDAuMDtcXHJcXG5cXHJcXG5cXHRcXHR9XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmV0Y2ggdGhlIG9wcG9zaXRlIGNvbG9yIGFuZCBsZXJwIGJ5IGhhbmQuXFxyXFxuXFx0XFx0Y29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiwgMC4wKTtcXHJcXG5cXHRcXHR2ZWMyIGNvb3JkID0gdlV2ICsgc2lnbihvZmZzZXQpICogdGV4ZWxTaXplO1xcclxcblxcdFxcdHZlYzQgb3Bwb3NpdGVDb2xvciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmQsIDAuMCk7XFxyXFxuXFx0XFx0ZmxvYXQgcyA9IGFicyhvZmZzZXQueCkgPiBhYnMob2Zmc2V0LnkpID8gYWJzKG9mZnNldC54KSA6IGFicyhvZmZzZXQueSk7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gR2FtbWEgY29ycmVjdGlvbi5cXHJcXG5cXHRcXHRjb2xvci5yZ2IgPSBwb3coYWJzKGNvbG9yLnJnYiksIHZlYzMoMi4yKSk7XFxyXFxuXFx0XFx0b3Bwb3NpdGVDb2xvci5yZ2IgPSBwb3coYWJzKG9wcG9zaXRlQ29sb3IucmdiKSwgdmVjMygyLjIpKTtcXHJcXG5cXHRcXHRjb2xvciA9IG1peChjb2xvciwgb3Bwb3NpdGVDb2xvciwgcyk7XFxyXFxuXFx0XFx0Y29sb3IucmdiID0gcG93KGFicyhjb2xvci5yZ2IpLCB2ZWMzKDEuMCAvIDIuMikpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSBjb2xvcjtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDE3ID0gXCJ1bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXQ7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcclxcblxcdHZPZmZzZXQgPSB1di54eXh5ICsgdGV4ZWxTaXplLnh5eHkgKiB2ZWM0KDEuMCwgMC4wLCAwLjAsIC0xLjApOyAvLyBDaGFuZ2VkIHNpZ24gaW4gVyBjb21wb25lbnQuXFxyXFxuXFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogU3VicGl4ZWwgTW9ycGhvbG9naWNhbCBBbnRpYWxpYXNpbmcuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgaXMgdXNlZCB0byByZW5kZXIgdGhlIGZpbmFsIGFudGlhbGlhc2luZy5cclxuICovXG5cbnZhciBTTUFBQmxlbmRNYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgU01BQSBibGVuZCBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7VmVjdG9yMn0gW3RleGVsU2l6ZV0gLSBUaGUgYWJzb2x1dGUgc2NyZWVuIHRleGVsIHNpemUuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFNNQUFCbGVuZE1hdGVyaWFsKCkge1xuICAgIHZhciB0ZXhlbFNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG5ldyBWZWN0b3IyKCk7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTTUFBQmxlbmRNYXRlcmlhbCk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFNNQUFCbGVuZE1hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiU01BQUJsZW5kTWF0ZXJpYWxcIixcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdFdlaWdodHM6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0ZXhlbFNpemU6IG5ldyBVbmlmb3JtKHRleGVsU2l6ZSlcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkMTcsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQxNyxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcbiAgfVxuXG4gIGluaGVyaXRzKFNNQUFCbGVuZE1hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBTTUFBQmxlbmRNYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkMTggPSBcIiNkZWZpbmUgc2FtcGxlTGV2ZWxaZXJvT2Zmc2V0KHQsIGNvb3JkLCBvZmZzZXQpIHRleHR1cmUyRCh0LCBjb29yZCArIGZsb2F0KG9mZnNldCkgKiB0ZXhlbFNpemUsIDAuMClcXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0QXJlYTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0U2VhcmNoO1xcclxcblxcclxcbnVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzQgdk9mZnNldFszXTtcXHJcXG52YXJ5aW5nIHZlYzIgdlBpeENvb3JkO1xcclxcblxcclxcbnZlYzIgcm91bmQodmVjMiB4KSB7XFxyXFxuXFxyXFxuXFx0cmV0dXJuIHNpZ24oeCkgKiBmbG9vcihhYnMoeCkgKyAwLjUpO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBzZWFyY2hMZW5ndGgodmVjMiBlLCBmbG9hdCBiaWFzLCBmbG9hdCBzY2FsZSkge1xcclxcblxcclxcblxcdC8vIE5vdCByZXF1aXJlZCBpZiB0U2VhcmNoIGFjY2Vzc2VzIGFyZSBzZXQgdG8gcG9pbnQuXFxyXFxuXFx0Ly8gY29uc3QgdmVjMiBTRUFSQ0hfVEVYX1BJWEVMX1NJWkUgPSAxLjAgLyB2ZWMyKDY2LjAsIDMzLjApO1xcclxcblxcdC8vIGUgPSB2ZWMyKGJpYXMsIDAuMCkgKyAwLjUgKiBTRUFSQ0hfVEVYX1BJWEVMX1NJWkUgKyBlICogdmVjMihzY2FsZSwgMS4wKSAqIHZlYzIoNjQuMCwgMzIuMCkgKiBTRUFSQ0hfVEVYX1BJWEVMX1NJWkU7XFxyXFxuXFxyXFxuXFx0ZS5yID0gYmlhcyArIGUuciAqIHNjYWxlO1xcclxcblxcclxcblxcdHJldHVybiAyNTUuMCAqIHRleHR1cmUyRCh0U2VhcmNoLCBlLCAwLjApLnI7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbmZsb2F0IHNlYXJjaFhMZWZ0KHZlYzIgdGV4Q29vcmQsIGZsb2F0IGVuZCkge1xcclxcblxcclxcblxcdC8qIEBQU0VVRE9fR0FUSEVSNFxcclxcblxcdCAqIFRoaXMgdGV4Q29vcmQgaGFzIGJlZW4gb2Zmc2V0IGJ5ICgtMC4yNSwgLTAuMTI1KSBpbiB0aGUgdmVydGV4IHNoYWRlciB0b1xcclxcblxcdCAqIHNhbXBsZSBiZXR3ZWVuIGVkZ2UsIHRodXMgZmV0Y2hpbmcgZm91ciBlZGdlcyBpbiBhIHJvdy5cXHJcXG5cXHQgKiBTYW1wbGluZyB3aXRoIGRpZmZlcmVudCBvZmZzZXRzIGluIGVhY2ggZGlyZWN0aW9uIGFsbG93cyB0byBkaXNhbWJpZ3VhdGVcXHJcXG5cXHQgKiB3aGljaCBlZGdlcyBhcmUgYWN0aXZlIGZyb20gdGhlIGZvdXIgZmV0Y2hlZCBvbmVzLlxcclxcblxcdCAqL1xcclxcblxcclxcblxcdHZlYzIgZSA9IHZlYzIoMC4wLCAxLjApO1xcclxcblxcclxcblxcdGZvcihpbnQgaSA9IDA7IGkgPCBNQVhfU0VBUkNIX1NURVBTX0lOVDsgKytpKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdGV4Q29vcmQsIDAuMCkucmc7XFxyXFxuXFx0XFx0dGV4Q29vcmQgLT0gdmVjMigyLjAsIDAuMCkgKiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxuXFx0XFx0aWYoISh0ZXhDb29yZC54ID4gZW5kICYmIGUuZyA+IDAuODI4MSAmJiBlLnIgPT0gMC4wKSkgeyBicmVhazsgfVxcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHQvLyBDb3JyZWN0IHRoZSBwcmV2aW91c2x5IGFwcGxpZWQgb2Zmc2V0ICgtMC4yNSwgLTAuMTI1KS5cXHJcXG5cXHR0ZXhDb29yZC54ICs9IDAuMjUgKiB0ZXhlbFNpemUueDtcXHJcXG5cXHJcXG5cXHQvLyBUaGUgc2VhcmNoZXMgYXJlIGJpYXNlZCBieSAxLCBzbyBhZGp1c3QgdGhlIGNvb3JkcyBhY2NvcmRpbmdseS5cXHJcXG5cXHR0ZXhDb29yZC54ICs9IHRleGVsU2l6ZS54O1xcclxcblxcclxcblxcdC8vIERpc2FtYmlndWF0ZSB0aGUgbGVuZ3RoIGFkZGVkIGJ5IHRoZSBsYXN0IHN0ZXAuXFxyXFxuXFx0dGV4Q29vcmQueCArPSAyLjAgKiB0ZXhlbFNpemUueDsgLy8gVW5kbyBsYXN0IHN0ZXAuXFxyXFxuXFx0dGV4Q29vcmQueCAtPSB0ZXhlbFNpemUueCAqIHNlYXJjaExlbmd0aChlLCAwLjAsIDAuNSk7XFxyXFxuXFxyXFxuXFx0cmV0dXJuIHRleENvb3JkLng7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbmZsb2F0IHNlYXJjaFhSaWdodCh2ZWMyIHRleENvb3JkLCBmbG9hdCBlbmQpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGUgPSB2ZWMyKDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHRmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1NFQVJDSF9TVEVQU19JTlQ7ICsraSkge1xcclxcblxcclxcblxcdFxcdGUgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHRleENvb3JkLCAwLjApLnJnO1xcclxcblxcdFxcdHRleENvb3JkICs9IHZlYzIoMi4wLCAwLjApICogdGV4ZWxTaXplO1xcclxcblxcclxcblxcdFxcdGlmKCEodGV4Q29vcmQueCA8IGVuZCAmJiBlLmcgPiAwLjgyODEgJiYgZS5yID09IDAuMCkpIHsgYnJlYWs7IH1cXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0dGV4Q29vcmQueCAtPSAwLjI1ICogdGV4ZWxTaXplLng7XFxyXFxuXFx0dGV4Q29vcmQueCAtPSB0ZXhlbFNpemUueDtcXHJcXG5cXHR0ZXhDb29yZC54IC09IDIuMCAqIHRleGVsU2l6ZS54O1xcclxcblxcdHRleENvb3JkLnggKz0gdGV4ZWxTaXplLnggKiBzZWFyY2hMZW5ndGgoZSwgMC41LCAwLjUpO1xcclxcblxcclxcblxcdHJldHVybiB0ZXhDb29yZC54O1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBzZWFyY2hZVXAodmVjMiB0ZXhDb29yZCwgZmxvYXQgZW5kKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBlID0gdmVjMigxLjAsIDAuMCk7XFxyXFxuXFxyXFxuXFx0Zm9yKGludCBpID0gMDsgaSA8IE1BWF9TRUFSQ0hfU1RFUFNfSU5UOyArK2kpIHtcXHJcXG5cXHJcXG5cXHRcXHRlID0gdGV4dHVyZTJEKHREaWZmdXNlLCB0ZXhDb29yZCwgMC4wKS5yZztcXHJcXG5cXHRcXHR0ZXhDb29yZCArPSB2ZWMyKDAuMCwgMi4wKSAqIHRleGVsU2l6ZTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcclxcblxcdFxcdGlmKCEodGV4Q29vcmQueSA+IGVuZCAmJiBlLnIgPiAwLjgyODEgJiYgZS5nID09IDAuMCkpIHsgYnJlYWs7IH1cXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0dGV4Q29vcmQueSAtPSAwLjI1ICogdGV4ZWxTaXplLnk7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHR0ZXhDb29yZC55IC09IHRleGVsU2l6ZS55OyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFx0dGV4Q29vcmQueSAtPSAyLjAgKiB0ZXhlbFNpemUueTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcdHRleENvb3JkLnkgKz0gdGV4ZWxTaXplLnkgKiBzZWFyY2hMZW5ndGgoZS5nciwgMC4wLCAwLjUpOyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFxyXFxuXFx0cmV0dXJuIHRleENvb3JkLnk7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbmZsb2F0IHNlYXJjaFlEb3duKHZlYzIgdGV4Q29vcmQsIGZsb2F0IGVuZCkge1xcclxcblxcclxcblxcdHZlYzIgZSA9IHZlYzIoMS4wLCAwLjApO1xcclxcblxcclxcblxcdGZvcihpbnQgaSA9IDA7IGkgPCBNQVhfU0VBUkNIX1NURVBTX0lOVDsgKytpICkge1xcclxcblxcclxcblxcdFxcdGUgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHRleENvb3JkLCAwLjApLnJnO1xcclxcblxcdFxcdHRleENvb3JkIC09IHZlYzIoMC4wLCAyLjApICogdGV4ZWxTaXplOyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFxyXFxuXFx0XFx0aWYoISh0ZXhDb29yZC55IDwgZW5kICYmIGUuciA+IDAuODI4MSAmJiBlLmcgPT0gMC4wKSkgeyBicmVhazsgfVxcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHR0ZXhDb29yZC55ICs9IDAuMjUgKiB0ZXhlbFNpemUueTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcdHRleENvb3JkLnkgKz0gdGV4ZWxTaXplLnk7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHR0ZXhDb29yZC55ICs9IDIuMCAqIHRleGVsU2l6ZS55OyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFx0dGV4Q29vcmQueSAtPSB0ZXhlbFNpemUueSAqIHNlYXJjaExlbmd0aChlLmdyLCAwLjUsIDAuNSk7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHJcXG5cXHRyZXR1cm4gdGV4Q29vcmQueTtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxudmVjMiBhcmVhKHZlYzIgZGlzdCwgZmxvYXQgZTEsIGZsb2F0IGUyLCBmbG9hdCBvZmZzZXQpIHtcXHJcXG5cXHJcXG5cXHQvLyBSb3VuZGluZyBwcmV2ZW50cyBwcmVjaXNpb24gZXJyb3JzIG9mIGJpbGluZWFyIGZpbHRlcmluZy5cXHJcXG5cXHR2ZWMyIHRleENvb3JkID0gQVJFQVRFWF9NQVhfRElTVEFOQ0UgKiByb3VuZCg0LjAgKiB2ZWMyKGUxLCBlMikpICsgZGlzdDtcXHJcXG5cXHJcXG5cXHQvLyBTY2FsZSBhbmQgYmlhcyBmb3IgdGV4ZWwgc3BhY2UgdHJhbnNsYXRpb24uXFxyXFxuXFx0dGV4Q29vcmQgPSBBUkVBVEVYX1BJWEVMX1NJWkUgKiB0ZXhDb29yZCArICgwLjUgKiBBUkVBVEVYX1BJWEVMX1NJWkUpO1xcclxcblxcclxcblxcdC8vIE1vdmUgdG8gcHJvcGVyIHBsYWNlLCBhY2NvcmRpbmcgdG8gdGhlIHN1YnBpeGVsIG9mZnNldC5cXHJcXG5cXHR0ZXhDb29yZC55ICs9IEFSRUFURVhfU1VCVEVYX1NJWkUgKiBvZmZzZXQ7XFxyXFxuXFxyXFxuXFx0cmV0dXJuIHRleHR1cmUyRCh0QXJlYSwgdGV4Q29vcmQsIDAuMCkucmc7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHdlaWdodHMgPSB2ZWM0KDAuMCk7XFxyXFxuXFx0dmVjNCBzdWJzYW1wbGVJbmRpY2VzID0gdmVjNCgwLjApO1xcclxcblxcdHZlYzIgZSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KS5yZztcXHJcXG5cXHJcXG5cXHRpZihlLmcgPiAwLjApIHtcXHJcXG5cXHJcXG5cXHRcXHQvLyBFZGdlIGF0IG5vcnRoLlxcclxcblxcdFxcdHZlYzIgZDtcXHJcXG5cXHJcXG5cXHRcXHQvLyBGaW5kIHRoZSBkaXN0YW5jZSB0byB0aGUgbGVmdC5cXHJcXG5cXHRcXHR2ZWMyIGNvb3JkcztcXHJcXG5cXHRcXHRjb29yZHMueCA9IHNlYXJjaFhMZWZ0KHZPZmZzZXRbMF0ueHksIHZPZmZzZXRbMl0ueCk7XFxyXFxuXFx0XFx0Y29vcmRzLnkgPSB2T2Zmc2V0WzFdLnk7IC8vIHZPZmZzZXRbMV0ueSA9IHZVdi55IC0gMC4yNSAqIHRleGVsU2l6ZS55IChAQ1JPU1NJTkdfT0ZGU0VUKVxcclxcblxcdFxcdGQueCA9IGNvb3Jkcy54O1xcclxcblxcclxcblxcdFxcdC8qIE5vdyBmZXRjaCB0aGUgbGVmdCBjcm9zc2luZyBlZGdlcywgdHdvIGF0IGEgdGltZSB1c2luZyBiaWxpbmVhclxcclxcblxcdFxcdGZpbHRlcmluZy4gU2FtcGxpbmcgYXQgLTAuMjUgKHNlZSBAQ1JPU1NJTkdfT0ZGU0VUKSBlbmFibGVzIHRvIGRpc2Nlcm4gd2hhdFxcclxcblxcdFxcdHZhbHVlIGVhY2ggZWRnZSBoYXMuICovXFxyXFxuXFx0XFx0ZmxvYXQgZTEgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkcywgMC4wKS5yO1xcclxcblxcclxcblxcdFxcdC8vIEZpbmQgdGhlIGRpc3RhbmNlIHRvIHRoZSByaWdodC5cXHJcXG5cXHRcXHRjb29yZHMueCA9IHNlYXJjaFhSaWdodCh2T2Zmc2V0WzBdLnp3LCB2T2Zmc2V0WzJdLnkpO1xcclxcblxcdFxcdGQueSA9IGNvb3Jkcy54O1xcclxcblxcclxcblxcdFxcdC8qIFRyYW5zbGF0ZSBkaXN0YW5jZXMgdG8gcGl4ZWwgdW5pdHMgZm9yIGJldHRlciBpbnRlcmxlYXZlIGFyaXRobWV0aWMgYW5kXFxyXFxuXFx0XFx0bWVtb3J5IGFjY2Vzc2VzLiAqL1xcclxcblxcdFxcdGQgPSBkIC8gdGV4ZWxTaXplLnggLSB2UGl4Q29vcmQueDtcXHJcXG5cXHJcXG5cXHRcXHQvLyBUaGUgYXJlYSB0ZXh0dXJlIGlzIGNvbXByZXNzZWQgcXVhZHJhdGljYWxseS5cXHJcXG5cXHRcXHR2ZWMyIHNxcnREID0gc3FydChhYnMoZCkpO1xcclxcblxcclxcblxcdFxcdC8vIEZldGNoIHRoZSByaWdodCBjcm9zc2luZyBlZGdlcy5cXHJcXG5cXHRcXHRjb29yZHMueSAtPSB0ZXhlbFNpemUueTsgLy8gV2ViR0wgcG9ydCBub3RlOiBBZGRlZC5cXHJcXG5cXHRcXHRmbG9hdCBlMiA9IHNhbXBsZUxldmVsWmVyb09mZnNldCh0RGlmZnVzZSwgY29vcmRzLCBpdmVjMigxLCAwKSkucjtcXHJcXG5cXHJcXG5cXHRcXHQvLyBQYXR0ZXJuIHJlY29nbmlzZWQsIG5vdyBnZXQgdGhlIGFjdHVhbCBhcmVhLlxcclxcblxcdFxcdHdlaWdodHMucmcgPSBhcmVhKHNxcnRELCBlMSwgZTIsIHN1YnNhbXBsZUluZGljZXMueSk7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGlmKGUuciA+IDAuMCkge1xcclxcblxcclxcblxcdFxcdC8vIEVkZ2UgYXQgd2VzdC5cXHJcXG5cXHRcXHR2ZWMyIGQ7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmluZCB0aGUgZGlzdGFuY2UgdG8gdGhlIHRvcC5cXHJcXG5cXHRcXHR2ZWMyIGNvb3JkcztcXHJcXG5cXHRcXHRjb29yZHMueSA9IHNlYXJjaFlVcCh2T2Zmc2V0WzFdLnh5LCB2T2Zmc2V0WzJdLnopO1xcclxcblxcdFxcdGNvb3Jkcy54ID0gdk9mZnNldFswXS54OyAvLyB2T2Zmc2V0WzFdLnggPSB2VXYueCAtIDAuMjUgKiB0ZXhlbFNpemUueDtcXHJcXG5cXHRcXHRkLnggPSBjb29yZHMueTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBGZXRjaCB0aGUgdG9wIGNyb3NzaW5nIGVkZ2VzLlxcclxcblxcdFxcdGZsb2F0IGUxID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZHMsIDAuMCkuZztcXHJcXG5cXHJcXG5cXHRcXHQvLyBGaW5kIHRoZSBkaXN0YW5jZSB0byB0aGUgYm90dG9tLlxcclxcblxcdFxcdGNvb3Jkcy55ID0gc2VhcmNoWURvd24odk9mZnNldFsxXS56dywgdk9mZnNldFsyXS53KTtcXHJcXG5cXHRcXHRkLnkgPSBjb29yZHMueTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBEaXN0YW5jZXMgaW4gcGl4ZWwgdW5pdHMuXFxyXFxuXFx0XFx0ZCA9IGQgLyB0ZXhlbFNpemUueSAtIHZQaXhDb29yZC55O1xcclxcblxcclxcblxcdFxcdC8vIFRoZSBhcmVhIHRleHR1cmUgaXMgY29tcHJlc3NlZCBxdWFkcmF0aWNhbGx5LlxcclxcblxcdFxcdHZlYzIgc3FydEQgPSBzcXJ0KGFicyhkKSk7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmV0Y2ggdGhlIGJvdHRvbSBjcm9zc2luZyBlZGdlcy5cXHJcXG5cXHRcXHRjb29yZHMueSAtPSB0ZXhlbFNpemUueTsgLy8gV2ViR0wgcG9ydCBub3RlOiBBZGRlZC5cXHJcXG5cXHRcXHRmbG9hdCBlMiA9IHNhbXBsZUxldmVsWmVyb09mZnNldCh0RGlmZnVzZSwgY29vcmRzLCBpdmVjMigwLCAxKSkuZztcXHJcXG5cXHJcXG5cXHRcXHQvLyBHZXQgdGhlIGFyZWEgZm9yIHRoaXMgZGlyZWN0aW9uLlxcclxcblxcdFxcdHdlaWdodHMuYmEgPSBhcmVhKHNxcnRELCBlMSwgZTIsIHN1YnNhbXBsZUluZGljZXMueCk7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IHdlaWdodHM7XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQxOCA9IFwidW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgdmVjNCB2T2Zmc2V0WzNdO1xcclxcbnZhcnlpbmcgdmVjMiB2UGl4Q29vcmQ7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcclxcblxcdHZQaXhDb29yZCA9IHV2IC8gdGV4ZWxTaXplO1xcclxcblxcclxcblxcdC8vIE9mZnNldHMgZm9yIHRoZSBzZWFyY2hlcyAoc2VlIEBQU0VVRE9fR0FUSEVSNCkuXFxyXFxuXFx0dk9mZnNldFswXSA9IHV2Lnh5eHkgKyB0ZXhlbFNpemUueHl4eSAqIHZlYzQoLTAuMjUsIDAuMTI1LCAxLjI1LCAwLjEyNSk7IC8vIENoYW5nZWQgc2lnbiBpbiBZIGFuZCBXIGNvbXBvbmVudHMuXFxyXFxuXFx0dk9mZnNldFsxXSA9IHV2Lnh5eHkgKyB0ZXhlbFNpemUueHl4eSAqIHZlYzQoLTAuMTI1LCAwLjI1LCAtMC4xMjUsIC0xLjI1KTsgLy9DaGFuZ2VkIHNpZ24gaW4gWSBhbmQgVyBjb21wb25lbnRzLlxcclxcblxcclxcblxcdC8vIFRoaXMgaW5kaWNhdGVzIHRoZSBlbmRzIG9mIHRoZSBsb29wcy5cXHJcXG5cXHR2T2Zmc2V0WzJdID0gdmVjNCh2T2Zmc2V0WzBdLnh6LCB2T2Zmc2V0WzFdLnl3KSArIHZlYzQoLTIuMCwgMi4wLCAtMi4wLCAyLjApICogdGV4ZWxTaXplLnh4eXkgKiBNQVhfU0VBUkNIX1NURVBTX0ZMT0FUO1xcclxcblxcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIFN1YnBpeGVsIE1vcnBob2xvZ2ljYWwgQW50aWFsaWFzaW5nLlxyXG4gKlxyXG4gKiBUaGlzIG1hdGVyaWFsIGNvbXB1dGVzIHdlaWdodHMgZm9yIGRldGVjdGVkIGVkZ2VzLlxyXG4gKi9cblxudmFyIFNNQUFXZWlnaHRzTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFNNQUEgd2VpZ2h0cyBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7VmVjdG9yMn0gW3RleGVsU2l6ZV0gLSBUaGUgYWJzb2x1dGUgc2NyZWVuIHRleGVsIHNpemUuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFNNQUFXZWlnaHRzTWF0ZXJpYWwoKSB7XG4gICAgdmFyIHRleGVsU2l6ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbmV3IFZlY3RvcjIoKTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFNNQUFXZWlnaHRzTWF0ZXJpYWwpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihTTUFBV2VpZ2h0c01hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiU01BQVdlaWdodHNNYXRlcmlhbFwiLFxuICAgICAgZGVmaW5lczoge1xuICAgICAgICAvLyBDb25maWd1cmFibGUgc2V0dGluZ3M6XG4gICAgICAgIE1BWF9TRUFSQ0hfU1RFUFNfSU5UOiBcIjhcIixcbiAgICAgICAgTUFYX1NFQVJDSF9TVEVQU19GTE9BVDogXCI4LjBcIixcbiAgICAgICAgLy8gTm9uLWNvbmZpZ3VyYWJsZSBzZXR0aW5nczpcbiAgICAgICAgQVJFQVRFWF9NQVhfRElTVEFOQ0U6IFwiMTYuMFwiLFxuICAgICAgICBBUkVBVEVYX1BJWEVMX1NJWkU6IFwiKDEuMCAvIHZlYzIoMTYwLjAsIDU2MC4wKSlcIixcbiAgICAgICAgQVJFQVRFWF9TVUJURVhfU0laRTogXCIoMS4wIC8gNy4wKVwiLFxuICAgICAgICBTRUFSQ0hURVhfU0laRTogXCJ2ZWMyKDY2LjAsIDMzLjApXCIsXG4gICAgICAgIFNFQVJDSFRFWF9QQUNLRURfU0laRTogXCJ2ZWMyKDY0LjAsIDE2LjApXCJcbiAgICAgIH0sXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRBcmVhOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdFNlYXJjaDogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRleGVsU2l6ZTogbmV3IFVuaWZvcm0odGV4ZWxTaXplKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQxOCxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDE4LFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuICB9XG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIG1heGltdW0gYW1vdW50IG9mIHN0ZXBzIHBlcmZvcm1lZCBpbiB0aGUgaG9yaXpvbnRhbC92ZXJ0aWNhbFxyXG4gICAqIHBhdHRlcm4gc2VhcmNoZXMsIGF0IGVhY2ggc2lkZSBvZiB0aGUgcGl4ZWwuXHJcbiAgICpcclxuICAgKiBJbiBudW1iZXIgb2YgcGl4ZWxzLCBpdCdzIGFjdHVhbGx5IHRoZSBkb3VibGUuIFNvIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoXHJcbiAgICogcGVyZmVjdGx5IGhhbmRsZWQgYnksIGZvciBleGFtcGxlIDE2LCBpcyA2NCAocGVyZmVjdGx5IG1lYW5zIHRoYXQgbG9uZ2VyXHJcbiAgICogbGluZXMgd29uJ3QgbG9vayBhcyBnb29kLCBidXQgYXJlIHN0aWxsIGFudGlhbGlhc2VkKS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBzdGVwcyAtIFRoZSBzZWFyY2ggc3RlcHMuIFJhbmdlOiBbMCwgMTEyXS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFNNQUFXZWlnaHRzTWF0ZXJpYWwsIFt7XG4gICAga2V5OiBcInNldE9ydGhvZ29uYWxTZWFyY2hTdGVwc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRPcnRob2dvbmFsU2VhcmNoU3RlcHMoc3RlcHMpIHtcbiAgICAgIHRoaXMuZGVmaW5lcy5NQVhfU0VBUkNIX1NURVBTX0lOVCA9IHN0ZXBzLnRvRml4ZWQoXCIwXCIpO1xuICAgICAgdGhpcy5kZWZpbmVzLk1BWF9TRUFSQ0hfU1RFUFNfRkxPQVQgPSBzdGVwcy50b0ZpeGVkKFwiMVwiKTtcbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFNNQUFXZWlnaHRzTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIFNNQUFXZWlnaHRzTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDE5ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcclxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIGZsb2F0IG1pZGRsZUdyZXk7XFxyXFxudW5pZm9ybSBmbG9hdCBtYXhMdW1pbmFuY2U7XFxyXFxuXFxyXFxuI2lmZGVmIEFEQVBURURfTFVNSU5BTkNFXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbHVtaW5hbmNlTWFwO1xcclxcblxcclxcbiNlbHNlXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBhdmVyYWdlTHVtaW5hbmNlO1xcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudmVjMyB0b25lTWFwKHZlYzMgYykge1xcclxcblxcclxcblxcdCNpZmRlZiBBREFQVEVEX0xVTUlOQU5DRVxcclxcblxcclxcblxcdFxcdC8vIEdldCB0aGUgY2FsY3VsYXRlZCBhdmVyYWdlIGx1bWluYW5jZSBieSBzYW1wbGluZyB0aGUgY2VudGVyLlxcclxcblxcdFxcdGZsb2F0IGx1bUF2ZyA9IHRleHR1cmUyRChsdW1pbmFuY2VNYXAsIHZlYzIoMC41KSkucjtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGZsb2F0IGx1bUF2ZyA9IGF2ZXJhZ2VMdW1pbmFuY2U7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0Ly8gQ2FsY3VsYXRlIHRoZSBsdW1pbmFuY2Ugb2YgdGhlIGN1cnJlbnQgcGl4ZWwuXFxyXFxuXFx0ZmxvYXQgbHVtUGl4ZWwgPSBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKGMpO1xcclxcblxcclxcblxcdC8vIEFwcGx5IHRoZSBtb2RpZmllZCBvcGVyYXRvciAoUmVpbmhhcmQgRXEuIDQpLlxcclxcblxcdGZsb2F0IGx1bVNjYWxlZCA9IChsdW1QaXhlbCAqIG1pZGRsZUdyZXkpIC8gbHVtQXZnO1xcclxcblxcclxcblxcdGZsb2F0IGx1bUNvbXByZXNzZWQgPSAobHVtU2NhbGVkICogKDEuMCArIChsdW1TY2FsZWQgLyAobWF4THVtaW5hbmNlICogbWF4THVtaW5hbmNlKSkpKSAvICgxLjAgKyBsdW1TY2FsZWQpO1xcclxcblxcclxcblxcdHJldHVybiBsdW1Db21wcmVzc2VkICogYztcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzQgdGV4ZWwgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCh0b25lTWFwKHRleGVsLnJnYiksIHRleGVsLmEpO1xcclxcblxcclxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQxOSA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogRnVsbC1zY3JlZW4gdG9uZS1tYXBwaW5nIHNoYWRlciBtYXRlcmlhbC5cclxuICpcclxuICogVGhpcyBtYXRlcmlhbCBzdXBwb3J0cyBkaXRoZXJpbmcuXHJcbiAqXHJcbiAqIFJlZmVyZW5jZTpcclxuICogIGh0dHA6Ly93d3cuY2lzLnJpdC5lZHUvcGVvcGxlL2ZhY3VsdHkvZmVyd2VyZGEvcHVibGljYXRpb25zL3NpZzAyX3BhcGVyLnBkZlxyXG4gKi9cblxudmFyIFRvbmVNYXBwaW5nTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHRvbmUgbWFwcGluZyBtYXRlcmlhbC5cclxuICAgKi9cbiAgZnVuY3Rpb24gVG9uZU1hcHBpbmdNYXRlcmlhbCgpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUb25lTWFwcGluZ01hdGVyaWFsKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoVG9uZU1hcHBpbmdNYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIlRvbmVNYXBwaW5nTWF0ZXJpYWxcIixcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgbHVtaW5hbmNlTWFwOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgYXZlcmFnZUx1bWluYW5jZTogbmV3IFVuaWZvcm0oMS4wKSxcbiAgICAgICAgbWF4THVtaW5hbmNlOiBuZXcgVW5pZm9ybSgxNi4wKSxcbiAgICAgICAgbWlkZGxlR3JleTogbmV3IFVuaWZvcm0oMC42KVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQxOSxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDE5LFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuICB9XG5cbiAgaW5oZXJpdHMoVG9uZU1hcHBpbmdNYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gVG9uZU1hcHBpbmdNYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG4vKipcclxuICogQSBjb2xsZWN0aW9uIG9mIHNoYWRlciBtYXRlcmlhbHMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgcG9zdCBwcm9jZXNzaW5nIHBhc3Nlcy5cclxuICpcclxuICogQG1vZHVsZSBwb3N0cHJvY2Vzc2luZy9tYXRlcmlhbHNcclxuICovXG5cbi8qKlxyXG4gKiBBbiBhYnN0cmFjdCBwYXNzLlxyXG4gKlxyXG4gKiBQYXNzZXMgdGhhdCBkbyBub3QgcmVseSBvbiB0aGUgZGVwdGggYnVmZmVyIHNob3VsZCBleHBsaWNpdGx5IGRpc2FibGUgdGhlXHJcbiAqIGRlcHRoIHRlc3QgYW5kIGRlcHRoIHdyaXRlIGluIHRoZWlyIHJlc3BlY3RpdmUgc2hhZGVyIG1hdGVyaWFscy5cclxuICpcclxuICogQGltcGxlbWVudHMge1Jlc2l6YWJsZX1cclxuICogQGltcGxlbWVudHMge0Rpc3Bvc2FibGV9XHJcbiAqL1xuXG52YXIgUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZV0gLSBUaGUgbmFtZSBvZiB0aGlzIHBhc3MuXHJcbiAgICogQHBhcmFtIHtTY2VuZX0gW3NjZW5lXSAtIFRoZSBzY2VuZSB0byByZW5kZXIuXHJcbiAgICogQHBhcmFtIHtDYW1lcmF9IFtjYW1lcmFdIC0gVGhlIGNhbWVyYS5cclxuICAgKiBAcGFyYW0ge01lc2h9IFtxdWFkXSAtIEEgcXVhZCB0aGF0IGZpbGxzIHRoZSBzY3JlZW4gdG8gcmVuZGVyIDJEIGZpbHRlciBlZmZlY3RzLiBTZXQgdGhpcyB0byBudWxsLCBpZiB5b3UgZG9uJ3QgbmVlZCBpdCAoc2VlIHtAbGluayBSZW5kZXJQYXNzfSkuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFBhc3MoKSB7XG4gICAgdmFyIG5hbWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFwiUGFzc1wiO1xuICAgIHZhciBzY2VuZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbmV3IFNjZW5lKCk7XG4gICAgdmFyIGNhbWVyYSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSgtMSwgMSwgMSwgLTEsIDAsIDEpO1xuICAgIHZhciBxdWFkID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBuZXcgTWVzaChuZXcgUGxhbmVCdWZmZXJHZW9tZXRyeSgyLCAyKSwgbnVsbCk7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQYXNzKTtcblxuICAgIC8qKlxyXG4gICAgICogVGhlIG5hbWUgb2YgdGhpcyBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtTdHJpbmd9XHJcbiAgICAgKi9cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIC8qKlxyXG4gICAgICogVGhlIHNjZW5lIHRvIHJlbmRlci5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7U2NlbmV9XHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKi9cblxuICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICAvKipcclxuICAgICAqIFRoZSBjYW1lcmEuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0NhbWVyYX1cclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqL1xuXG4gICAgdGhpcy5jYW1lcmEgPSBjYW1lcmE7XG4gICAgLyoqXHJcbiAgICAgKiBBIHF1YWQgbWVzaCB0aGF0IGZpbGxzIHRoZSBzY3JlZW4uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge01lc2h9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLnF1YWQgPSBxdWFkO1xuXG4gICAgaWYgKHRoaXMucXVhZCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5xdWFkLmZydXN0dW1DdWxsZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKHRoaXMuc2NlbmUgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5zY2VuZS5hZGQodGhpcy5xdWFkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHBhc3Mgc2hvdWxkIHJlbmRlciB0byBzY3JlZW4uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuXG4gICAgdGhpcy5yZW5kZXJUb1NjcmVlbiA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBwYXNzIHNob3VsZCBiZSBleGVjdXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB7QGxpbmsgRWZmZWN0Q29tcG9zZXJ9IHNob3VsZCBzd2FwIHRoZSBmcmFtZVxyXG4gICAgICogYnVmZmVycyBhZnRlciB0aGlzIHBhc3MgaGFzIGZpbmlzaGVkIHJlbmRlcmluZy5cclxuICAgICAqXHJcbiAgICAgKiBTZXQgdGhpcyB0byBgZmFsc2VgIGlmIHRoaXMgcGFzcyBkb2Vzbid0IHJlbmRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlciBvclxyXG4gICAgICogdGhlIHNjcmVlbi4gT3RoZXJ3aXNlLCB0aGUgY29udGVudHMgb2YgdGhlIGlucHV0IGJ1ZmZlciB3aWxsIGJlIGxvc3QuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICAgIHRoaXMubmVlZHNTd2FwID0gdHJ1ZTtcbiAgfVxuICAvKipcclxuICAgKiBUaGUgZnVsbHNjcmVlbiBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtNYXRlcmlhbH1cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFBhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuXG4gICAgLyoqXHJcbiAgICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBpcyBhbiBhYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIG92ZXJyaWRkZW4uXHJcbiAgICAgKlxyXG4gICAgICogQGFic3RyYWN0XHJcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gQW4gZXJyb3IgaXMgdGhyb3duIGlmIHRoZSBtZXRob2QgaXMgbm90IG92ZXJyaWRkZW4uXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlJlbmRlciBtZXRob2Qgbm90IGltcGxlbWVudGVkIVwiKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoaXMgcGFzcyB3aXRoIHRoZSByZW5kZXJlcidzIHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogWW91IG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBjYXNlIHlvdSB3YW50IHRvIGJlIGluZm9ybWVkIGFib3V0IHRoZSBtYWluXHJcbiAgICAgKiByZW5kZXIgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGUge0BsaW5rIEVmZmVjdENvbXBvc2VyfSBjYWxscyB0aGlzIG1ldGhvZCBiZWZvcmUgdGhpcyBwYXNzIGlzXHJcbiAgICAgKiBpbml0aWFsaXplZCBhbmQgZXZlcnkgdGltZSBpdHMgb3duIHNpemUgaXMgdXBkYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgcmVuZGVyZXIncyB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgcmVuZGVyZXIncyBoZWlnaHQuXHJcbiAgICAgKiBAZXhhbXBsZSB0aGlzLm15UmVuZGVyVGFyZ2V0LnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7fVxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gdGFza3MuXHJcbiAgICAgKlxyXG4gICAgICogQnkgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB5b3UgZ2FpbiBhY2Nlc3MgdG8gdGhlIHJlbmRlcmVyLiBZb3UnbGwgYWxzbyBiZVxyXG4gICAgICogYWJsZSB0byBjb25maWd1cmUgeW91ciBjdXN0b20gcmVuZGVyIHRhcmdldHMgdG8gdXNlIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXRcclxuICAgICAqIChSR0Igb3IgUkdCQSkuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHByb3ZpZGVkIHJlbmRlcmVyIGNhbiBiZSB1c2VkIHRvIHdhcm0gdXAgc3BlY2lhbCBvZmYtc2NyZWVuIHJlbmRlclxyXG4gICAgICogdGFyZ2V0cyBieSBwZXJmb3JtaW5nIGEgcHJlbGltaW5hcnkgcmVuZGVyIG9wZXJhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBUaGUge0BsaW5rIEVmZmVjdENvbXBvc2VyfSBjYWxscyB0aGlzIG1ldGhvZCB3aGVuIHRoaXMgcGFzcyBpcyBhZGRlZCB0byBpdHNcclxuICAgICAqIHF1ZXVlLCBidXQgbm90IGJlZm9yZSBpdHMgc2l6ZSBoYXMgYmVlbiBzZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxwaGEgLSBXaGV0aGVyIHRoZSByZW5kZXJlciB1c2VzIHRoZSBhbHBoYSBjaGFubmVsIG9yIG5vdC5cclxuICAgICAqIEBleGFtcGxlIGlmKCFhbHBoYSkgeyB0aGlzLm15UmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0OyB9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImluaXRpYWxpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpIHt9XG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyBhIHNoYWxsb3cgc2VhcmNoIGZvciBwcm9wZXJ0aWVzIHRoYXQgZGVmaW5lIGEgZGlzcG9zZSBtZXRob2QgYW5kXHJcbiAgICAgKiBkZWxldGVzIHRoZW0uIFRoZSBwYXNzIHdpbGwgYmUgaW5vcGVyYXRpdmUgYWZ0ZXIgdGhpcyBtZXRob2Qgd2FzIGNhbGxlZCFcclxuICAgICAqXHJcbiAgICAgKiBEaXNwb3NhYmxlIG9iamVjdHM6XHJcbiAgICAgKiAgLSByZW5kZXIgdGFyZ2V0c1xyXG4gICAgICogIC0gbWF0ZXJpYWxzXHJcbiAgICAgKiAgLSB0ZXh0dXJlc1xyXG4gICAgICpcclxuICAgICAqIFRoZSB7QGxpbmsgRWZmZWN0Q29tcG9zZXJ9IGNhbGxzIHRoaXMgbWV0aG9kIHdoZW4gaXQgaXMgYmVpbmcgZGVzdHJveWVkLlxyXG4gICAgICogWW91IG1heSwgaG93ZXZlciwgdXNlIGl0IGluZGVwZW5kZW50bHkgdG8gZnJlZSBtZW1vcnkgd2hlbiB5b3UgYXJlIGNlcnRhaW5cclxuICAgICAqIHRoYXQgeW91IGRvbid0IG5lZWQgdGhpcyBwYXNzIGFueW1vcmUuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRpc3Bvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgIHZhciBrZXk7XG5cbiAgICAgIHZhciBfYXJyID0gT2JqZWN0LmtleXModGhpcyk7XG5cbiAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBfYXJyLmxlbmd0aDsgX2krKykge1xuICAgICAgICBrZXkgPSBfYXJyW19pXTtcblxuICAgICAgICBpZiAodGhpc1trZXldICE9PSBudWxsICYmIHR5cGVvZiB0aGlzW2tleV0uZGlzcG9zZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgdGhpc1trZXldLmRpc3Bvc2UoKTtcbiAgICAgICAgICB0aGlzW2tleV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm1hdGVyaWFsICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYXRlcmlhbFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucXVhZCAhPT0gbnVsbCA/IHRoaXMucXVhZC5tYXRlcmlhbCA6IG51bGw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgZnVsbHNjcmVlbiBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgbWF0ZXJpYWwgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgcXVhZCBtZXNoIHRoYXQgZmlsbHMgdGhlIHNjcmVlbi5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TWF0ZXJpYWx9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLnF1YWQgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5xdWFkLm1hdGVyaWFsID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBhc3M7XG59KCk7XG5cbi8qKlxyXG4gKiBBbiBlZmZpY2llbnQsIGluY3JlbWVudGFsIGJsdXIgcGFzcy5cclxuICpcclxuICogTm90ZTogVGhpcyBwYXNzIGFsbG93cyB0aGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgdG8gYmUgdGhlIHNhbWUuXHJcbiAqL1xuXG52YXIgQmx1clBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgYmx1ciBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5yZXNvbHV0aW9uU2NhbGU9MC41XSAtIFRoZSByZW5kZXIgdGV4dHVyZSByZXNvbHV0aW9uIHNjYWxlLCByZWxhdGl2ZSB0byB0aGUgc2NyZWVuIHJlbmRlciBzaXplLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5rZXJuZWxTaXplPUtlcm5lbFNpemUuTEFSR0VdIC0gVGhlIGJsdXIga2VybmVsIHNpemUuXHJcbiAgICovXG4gIGZ1bmN0aW9uIEJsdXJQYXNzKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEJsdXJQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEJsdXJQYXNzKS5jYWxsKHRoaXMsIFwiQmx1clBhc3NcIikpO1xuICAgIC8qKlxyXG4gICAgICogQSByZW5kZXIgdGFyZ2V0LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldFggPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSwge1xuICAgICAgbWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICBtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgIHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxuICAgICAgZGVwdGhCdWZmZXI6IGZhbHNlXG4gICAgfSk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0WC50ZXh0dXJlLm5hbWUgPSBcIkJsdXIuVGFyZ2V0WFwiO1xuICAgIF90aGlzLnJlbmRlclRhcmdldFgudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEEgc2Vjb25kIHJlbmRlciB0YXJnZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0WSA9IF90aGlzLnJlbmRlclRhcmdldFguY2xvbmUoKTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRZLnRleHR1cmUubmFtZSA9IFwiQmx1ci5UYXJnZXRZXCI7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmVzb2x1dGlvbiBzY2FsZS5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgbmVlZCB0byBjYWxsIHtAbGluayBFZmZlY3RDb21wb3NlciNzZXRTaXplfSBhZnRlciBjaGFuZ2luZyB0aGlzXHJcbiAgICAgKiB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZXNvbHV0aW9uU2NhbGUgPSBvcHRpb25zLnJlc29sdXRpb25TY2FsZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5yZXNvbHV0aW9uU2NhbGUgOiAwLjU7XG4gICAgLyoqXHJcbiAgICAgKiBBIGNvbnZvbHV0aW9uIHNoYWRlciBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Q29udm9sdXRpb25NYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwgPSBuZXcgQ29udm9sdXRpb25NYXRlcmlhbCgpO1xuICAgIC8qKlxyXG4gICAgICogQSBjb252b2x1dGlvbiBzaGFkZXIgbWF0ZXJpYWwgdGhhdCB1c2VzIGRpdGhlcmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Q29udm9sdXRpb25NYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmRpdGhlcmVkQ29udm9sdXRpb25NYXRlcmlhbCA9IG5ldyBDb252b2x1dGlvbk1hdGVyaWFsKCk7XG4gICAgX3RoaXMuZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsLmRpdGhlcmluZyA9IHRydWU7XG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoZSBibHVycmVkIHJlc3VsdCBzaG91bGQgYWxzbyBiZSBkaXRoZXJlZCB1c2luZyBub2lzZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gICAgX3RoaXMuZGl0aGVyaW5nID0gZmFsc2U7XG4gICAgX3RoaXMua2VybmVsU2l6ZSA9IG9wdGlvbnMua2VybmVsU2l6ZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogVGhlIGFic29sdXRlIHdpZHRoIG9mIHRoZSBpbnRlcm5hbCByZW5kZXIgdGFyZ2V0cy5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhCbHVyUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG5cbiAgICAvKipcclxuICAgICAqIEJsdXJzIHRoZSBpbnB1dCBidWZmZXIgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IHRvIHRoZSBvdXRwdXQgYnVmZmVyLiBUaGVcclxuICAgICAqIGlucHV0IGJ1ZmZlciByZW1haW5zIGludGFjdCwgdW5sZXNzIGl0cyBhbHNvIHRoZSBvdXRwdXQgYnVmZmVyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdmFyIHNjZW5lID0gdGhpcy5zY2VuZTtcbiAgICAgIHZhciBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcbiAgICAgIHZhciByZW5kZXJUYXJnZXRYID0gdGhpcy5yZW5kZXJUYXJnZXRYO1xuICAgICAgdmFyIHJlbmRlclRhcmdldFkgPSB0aGlzLnJlbmRlclRhcmdldFk7XG4gICAgICB2YXIgbWF0ZXJpYWwgPSB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWw7XG4gICAgICB2YXIgdW5pZm9ybXMgPSBtYXRlcmlhbC51bmlmb3JtcztcbiAgICAgIHZhciBrZXJuZWwgPSBtYXRlcmlhbC5nZXRLZXJuZWwoKTtcbiAgICAgIHZhciBsYXN0UlQgPSBpbnB1dEJ1ZmZlcjtcbiAgICAgIHZhciBkZXN0UlQ7XG4gICAgICB2YXIgaSwgbDtcbiAgICAgIHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDsgLy8gQXBwbHkgdGhlIG11bHRpLXBhc3MgYmx1ci5cblxuICAgICAgZm9yIChpID0gMCwgbCA9IGtlcm5lbC5sZW5ndGggLSAxOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIC8vIEFsdGVybmF0ZSBiZXR3ZWVuIHRhcmdldHMuXG4gICAgICAgIGRlc3RSVCA9IGkgJSAyID09PSAwID8gcmVuZGVyVGFyZ2V0WCA6IHJlbmRlclRhcmdldFk7XG4gICAgICAgIHVuaWZvcm1zLmtlcm5lbC52YWx1ZSA9IGtlcm5lbFtpXTtcbiAgICAgICAgdW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBsYXN0UlQudGV4dHVyZTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIGRlc3RSVCk7XG4gICAgICAgIGxhc3RSVCA9IGRlc3RSVDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGl0aGVyaW5nKSB7XG4gICAgICAgIG1hdGVyaWFsID0gdGhpcy5kaXRoZXJlZENvbnZvbHV0aW9uTWF0ZXJpYWw7XG4gICAgICAgIHVuaWZvcm1zID0gbWF0ZXJpYWwudW5pZm9ybXM7XG4gICAgICAgIHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcbiAgICAgIH1cblxuICAgICAgdW5pZm9ybXMua2VybmVsLnZhbHVlID0ga2VybmVsW2ldO1xuICAgICAgdW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBsYXN0UlQudGV4dHVyZTtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB3aWR0aCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iod2lkdGggKiB0aGlzLnJlc29sdXRpb25TY2FsZSkpO1xuICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgTWF0aC5mbG9vcihoZWlnaHQgKiB0aGlzLnJlc29sdXRpb25TY2FsZSkpO1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXRYLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLnJlbmRlclRhcmdldFkuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbC5zZXRUZXhlbFNpemUoMS4wIC8gd2lkdGgsIDEuMCAvIGhlaWdodCk7XG4gICAgICB0aGlzLmRpdGhlcmVkQ29udm9sdXRpb25NYXRlcmlhbC5zZXRUZXhlbFNpemUoMS4wIC8gd2lkdGgsIDEuMCAvIGhlaWdodCk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gdGFza3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxwaGEgLSBXaGV0aGVyIHRoZSByZW5kZXJlciB1c2VzIHRoZSBhbHBoYSBjaGFubmVsIG9yIG5vdC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdGlhbGl6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSkge1xuICAgICAgaWYgKCFhbHBoYSkge1xuICAgICAgICB0aGlzLnJlbmRlclRhcmdldFgudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XG4gICAgICAgIHRoaXMucmVuZGVyVGFyZ2V0WS50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwid2lkdGhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclRhcmdldFgud2lkdGg7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIGFic29sdXRlIGhlaWdodCBvZiB0aGUgaW50ZXJuYWwgcmVuZGVyIHRhcmdldHMuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaGVpZ2h0XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJUYXJnZXRYLmhlaWdodDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUga2VybmVsIHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0tlcm5lbFNpemV9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImtlcm5lbFNpemVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwua2VybmVsU2l6ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogS2VybmVsU2l6ZS5MQVJHRTtcbiAgICAgIHRoaXMuY29udm9sdXRpb25NYXRlcmlhbC5rZXJuZWxTaXplID0gdmFsdWU7XG4gICAgICB0aGlzLmRpdGhlcmVkQ29udm9sdXRpb25NYXRlcmlhbC5rZXJuZWxTaXplID0gdmFsdWU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQmx1clBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gQmx1clBhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogQSBibG9vbSBwYXNzLlxyXG4gKlxyXG4gKiBUaGlzIHBhc3MgcmVuZGVycyBhIHNjZW5lIHdpdGggc3VwZXJpbXBvc2VkIGJsdXIgYnkgdXRpbGl6aW5nIHRoZSBmYXN0IEthd2FzZVxyXG4gKiBjb252b2x1dGlvbiBhcHByb2FjaC5cclxuICovXG5cbnZhciBCbG9vbVBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgYmxvb20gcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucmVzb2x1dGlvblNjYWxlPTAuNV0gLSBUaGUgcmVuZGVyIHRleHR1cmUgcmVzb2x1dGlvbiBzY2FsZSwgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbiByZW5kZXIgc2l6ZS5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMua2VybmVsU2l6ZT1LZXJuZWxTaXplLkxBUkdFXSAtIFRoZSBibHVyIGtlcm5lbCBzaXplLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5pbnRlbnNpdHk9MS4wXSAtIFRoZSBzdHJlbmd0aCBvZiB0aGUgYmxvb20gZWZmZWN0LlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kaXN0aW5jdGlvbj0xLjBdIC0gVGhlIGx1bWluYW5jZSBkaXN0aW5jdGlvbiBmYWN0b3IuIFJhaXNlIHRoaXMgdmFsdWUgdG8gYnJpbmcgb3V0IHRoZSBicmlnaHRlciBlbGVtZW50cyBpbiB0aGUgc2NlbmUuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNjcmVlbk1vZGU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBzY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgdXNlZCBmb3IgY29tYmluaW5nIHRoZSBibG9vbSB0ZXh0dXJlIHdpdGggdGhlIHNjZW5lIGNvbG9ycy5cclxuICAgKi9cbiAgZnVuY3Rpb24gQmxvb21QYXNzKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEJsb29tUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihCbG9vbVBhc3MpLmNhbGwodGhpcywgXCJCbG9vbVBhc3NcIikpO1xuICAgIC8qKlxyXG4gICAgICogQSByZW5kZXIgdGFyZ2V0LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XG4gICAgICBtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgc3RlbmNpbEJ1ZmZlcjogZmFsc2UsXG4gICAgICBkZXB0aEJ1ZmZlcjogZmFsc2VcbiAgICB9KTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lID0gXCJCbG9vbS5UYXJnZXRcIjtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEEgYmx1ciBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCbHVyUGFzc31cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmJsdXJQYXNzID0gbmV3IEJsdXJQYXNzKG9wdGlvbnMpO1xuICAgIC8qKlxyXG4gICAgICogQSBjb21iaW5lIHNoYWRlciBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Q29tYmluZU1hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuY29tYmluZU1hdGVyaWFsID0gbmV3IENvbWJpbmVNYXRlcmlhbChvcHRpb25zLnNjcmVlbk1vZGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc2NyZWVuTW9kZSA6IHRydWUpO1xuICAgIF90aGlzLmludGVuc2l0eSA9IG9wdGlvbnMuaW50ZW5zaXR5O1xuICAgIC8qKlxyXG4gICAgICogQSBsdW1pbm9zaXR5IHNoYWRlciBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7THVtaW5vc2l0eU1hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMubHVtaW5vc2l0eU1hdGVyaWFsID0gbmV3IEx1bWlub3NpdHlNYXRlcmlhbCh0cnVlKTtcbiAgICBfdGhpcy5kaXN0aW5jdGlvbiA9IG9wdGlvbnMuZGlzdGluY3Rpb247XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFRoZSByZXNvbHV0aW9uIHNjYWxlLlxyXG4gICAqXHJcbiAgICogQHR5cGUge051bWJlcn1cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEJsb29tUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG5cbiAgICAvKipcclxuICAgICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHZhciBzY2VuZSA9IHRoaXMuc2NlbmU7XG4gICAgICB2YXIgY2FtZXJhID0gdGhpcy5jYW1lcmE7XG4gICAgICB2YXIgYmx1clBhc3MgPSB0aGlzLmJsdXJQYXNzO1xuICAgICAgdmFyIGx1bWlub3NpdHlNYXRlcmlhbCA9IHRoaXMubHVtaW5vc2l0eU1hdGVyaWFsO1xuICAgICAgdmFyIGNvbWJpbmVNYXRlcmlhbCA9IHRoaXMuY29tYmluZU1hdGVyaWFsO1xuICAgICAgdmFyIHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0OyAvLyBMdW1pbmFuY2UgZmlsdGVyLlxuXG4gICAgICB0aGlzLm1hdGVyaWFsID0gbHVtaW5vc2l0eU1hdGVyaWFsO1xuICAgICAgbHVtaW5vc2l0eU1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXQpOyAvLyBDb252b2x1dGlvbiBwaGFzZS5cblxuICAgICAgYmx1clBhc3MucmVuZGVyKHJlbmRlcmVyLCByZW5kZXJUYXJnZXQsIHJlbmRlclRhcmdldCk7XG5cbiAgICAgIGlmICh0aGlzLmJsZW5kKSB7XG4gICAgICAgIC8vIFJlbmRlciB0aGUgb3JpZ2luYWwgc2NlbmUgd2l0aCBzdXBlcmltcG9zZWQgYmx1ci5cbiAgICAgICAgdGhpcy5tYXRlcmlhbCA9IGNvbWJpbmVNYXRlcmlhbDtcbiAgICAgICAgY29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUxLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgICAgY29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUyLnZhbHVlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLmJsdXJQYXNzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB3aWR0aCA9IHRoaXMuYmx1clBhc3Mud2lkdGg7XG4gICAgICBoZWlnaHQgPSB0aGlzLmJsdXJQYXNzLmhlaWdodDtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0LnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gdGFza3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxwaGEgLSBXaGV0aGVyIHRoZSByZW5kZXJlciB1c2VzIHRoZSBhbHBoYSBjaGFubmVsIG9yIG5vdC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdGlhbGl6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSkge1xuICAgICAgdGhpcy5ibHVyUGFzcy5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XG5cbiAgICAgIGlmICghYWxwaGEpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc29sdXRpb25TY2FsZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuYmx1clBhc3MucmVzb2x1dGlvblNjYWxlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEVmZmVjdENvbXBvc2VyI3NldFNpemV9IGFmdGVyIGNoYW5naW5nIHRoaXMgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMC41O1xuICAgICAgdGhpcy5ibHVyUGFzcy5yZXNvbHV0aW9uU2NhbGUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYmx1ciBrZXJuZWwgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwia2VybmVsU2l6ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuYmx1clBhc3Mua2VybmVsU2l6ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogS2VybmVsU2l6ZS5MQVJHRTtcbiAgICAgIHRoaXMuYmx1clBhc3Mua2VybmVsU2l6ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBvdmVyYWxsIGludGVuc2l0eSBvZiB0aGUgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludGVuc2l0eVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkyLnZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDEuMDtcbiAgICAgIHRoaXMuY29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkyLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIGx1bWluYW5jZSBkaXN0aW5jdGlvbiBmYWN0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzdGluY3Rpb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy5kaXN0aW5jdGlvbi52YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAxLjA7XG4gICAgICB0aGlzLmx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy5kaXN0aW5jdGlvbi52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGRpdGhlcmluZyBpcyBlbmFibGVkLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkaXRoZXJpbmdcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsdXJQYXNzLmRpdGhlcmluZztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJZiBlbmFibGVkLCB0aGUgcmVzdWx0IHdpbGwgYmUgZGl0aGVyZWQgdG8gcmVtb3ZlIGJhbmRpbmcgYXJ0aWZhY3RzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICB0aGlzLmJsdXJQYXNzLmRpdGhlcmluZyA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlZmZlY3Qgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGlucHV0IGJ1ZmZlci5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYmxlbmRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5lZWRzU3dhcDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJZiBkaXNhYmxlZCwgdGhlIGlucHV0IGJ1ZmZlciB3aWxsIHJlbWFpbiB1bmFmZmVjdGVkLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBtYXkgdXNlIHRoZSB7QGxpbmsgQmxvb21QYXNzI292ZXJsYXl9IHRleHR1cmUgdG8gYXBwbHkgdGhlIGVmZmVjdCB0b1xyXG4gICAgICogeW91ciBzY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgdGhpcy5uZWVkc1N3YXAgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZWZmZWN0IG92ZXJsYXkgdGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7VGV4dHVyZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib3ZlcmxheVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQmxvb21QYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIEJsb29tUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBBIERlcHRoIG9mIEZpZWxkIChEb0YpIHBhc3MgdXNpbmcgYSBib2tlaCBzaGFkZXIuXHJcbiAqXHJcbiAqIFRoaXMgcGFzcyByZXF1aXJlcyBhIHtAbGluayBFZmZlY3RDb21wb3NlciNkZXB0aFRleHR1cmV9LlxyXG4gKi9cblxudmFyIEJva2VoUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBib2tlaCBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gY2FtZXJhIC0gVGhlIG1haW4gY2FtZXJhLiBVc2VkIHRvIG9idGFpbiB0aGUgYXNwZWN0IHJhdGlvIGFuZCB0aGUgbmVhciBhbmQgZmFyIHBsYW5lIHNldHRpbmdzLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIHBhcmFtZXRlcnMuIFNlZSB7QGxpbmsgQm9rZWhNYXRlcmlhbH0gZm9yIGRldGFpbHMuXHJcbiAgICovXG4gIGZ1bmN0aW9uIEJva2VoUGFzcyhjYW1lcmEpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBCb2tlaFBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQm9rZWhQYXNzKS5jYWxsKHRoaXMsIFwiQm9rZWhQYXNzXCIpKTtcbiAgICBfdGhpcy5tYXRlcmlhbCA9IG5ldyBCb2tlaE1hdGVyaWFsKGNhbWVyYSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhCb2tlaFBhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnREZXB0aC52YWx1ZSA9IGlucHV0QnVmZmVyLmRlcHRoVGV4dHVyZTtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5hc3BlY3QudmFsdWUgPSB3aWR0aCAvIGhlaWdodDtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhCb2tlaFBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gQm9rZWhQYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIEEgcGFzcyB0aGF0IGRpc2FibGVzIHRoZSBzdGVuY2lsIHRlc3QuXHJcbiAqL1xuXG52YXIgQ2xlYXJNYXNrUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBjbGVhciBtYXNrIHBhc3MuXHJcbiAgICovXG4gIGZ1bmN0aW9uIENsZWFyTWFza1Bhc3MoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2xlYXJNYXNrUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihDbGVhck1hc2tQYXNzKS5jYWxsKHRoaXMsIFwiQ2xlYXJNYXNrUGFzc1wiLCBudWxsLCBudWxsLCBudWxsKSk7XG4gICAgX3RoaXMubmVlZHNTd2FwID0gZmFsc2U7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIERpc2FibGVzIHRoZSBnbG9iYWwgc3RlbmNpbCB0ZXN0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKENsZWFyTWFza1Bhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgcmVuZGVyZXIuc3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldFRlc3QoZmFsc2UpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKENsZWFyTWFza1Bhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gQ2xlYXJNYXNrUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBVc2VkIGZvciBzYXZpbmcgdGhlIG9yaWdpbmFsIGNsZWFyIGNvbG9yIG9mIHRoZSByZW5kZXJlci5cclxuICpcclxuICogQHR5cGUge0NvbG9yfVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxudmFyIGNvbG9yID0gbmV3IENvbG9yKCk7XG4vKipcclxuICogQSBwYXNzIHRoYXQgY2xlYXJzIHRoZSBpbnB1dCBidWZmZXIgb3IgdGhlIHNjcmVlbi5cclxuICpcclxuICogWW91IGNhbiBwcmV2ZW50IHNwZWNpZmljIGJpdHMgZnJvbSBiZWluZyBjbGVhcmVkIGJ5IHNldHRpbmcgZWl0aGVyIHRoZVxyXG4gKiBhdXRvQ2xlYXJDb2xvciwgYXV0b0NsZWFyU3RlbmNpbCBvciBhdXRvQ2xlYXJEZXB0aCBwcm9wZXJ0aWVzIG9mIHRoZSByZW5kZXJlclxyXG4gKiB0byBmYWxzZS5cclxuICovXG5cbnZhciBDbGVhclBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgY2xlYXIgcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtDb2xvcn0gW29wdGlvbnMuY2xlYXJDb2xvcj1udWxsXSAtIEFuIG92ZXJyaWRlIGNsZWFyIGNvbG9yLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jbGVhckFscGhhPTAuMF0gLSBBbiBvdmVycmlkZSBjbGVhciBhbHBoYS5cclxuICAgKi9cbiAgZnVuY3Rpb24gQ2xlYXJQYXNzKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENsZWFyUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihDbGVhclBhc3MpLmNhbGwodGhpcywgXCJDbGVhclBhc3NcIiwgbnVsbCwgbnVsbCwgbnVsbCkpO1xuICAgIF90aGlzLm5lZWRzU3dhcCA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogVGhlIGNsZWFyIGNvbG9yLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtDb2xvcn1cclxuICAgICAqL1xuXG4gICAgX3RoaXMuY2xlYXJDb2xvciA9IG9wdGlvbnMuY2xlYXJDb2xvciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jbGVhckNvbG9yIDogbnVsbDtcbiAgICAvKipcclxuICAgICAqIFRoZSBjbGVhciBhbHBoYS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jbGVhckFscGhhID0gb3B0aW9ucy5jbGVhckFscGhhICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNsZWFyQWxwaGEgOiAwLjA7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIENsZWFycyB0aGUgaW5wdXQgYnVmZmVyIG9yIHRoZSBzY3JlZW4uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQ2xlYXJQYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHZhciBjbGVhckNvbG9yID0gdGhpcy5jbGVhckNvbG9yO1xuICAgICAgdmFyIGNsZWFyQWxwaGE7XG5cbiAgICAgIGlmIChjbGVhckNvbG9yICE9PSBudWxsKSB7XG4gICAgICAgIGNvbG9yLmNvcHkocmVuZGVyZXIuZ2V0Q2xlYXJDb2xvcigpKTtcbiAgICAgICAgY2xlYXJBbHBoYSA9IHJlbmRlcmVyLmdldENsZWFyQWxwaGEoKTtcbiAgICAgICAgcmVuZGVyZXIuc2V0Q2xlYXJDb2xvcihjbGVhckNvbG9yLCB0aGlzLmNsZWFyQWxwaGEpO1xuICAgICAgfVxuXG4gICAgICByZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQodGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBpbnB1dEJ1ZmZlcik7XG4gICAgICByZW5kZXJlci5jbGVhcigpO1xuXG4gICAgICBpZiAoY2xlYXJDb2xvciAhPT0gbnVsbCkge1xuICAgICAgICByZW5kZXJlci5zZXRDbGVhckNvbG9yKGNvbG9yLCBjbGVhckFscGhhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhDbGVhclBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gQ2xlYXJQYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIEEgZG90IHNjcmVlbiBwYXNzLlxyXG4gKi9cblxudmFyIERvdFNjcmVlblBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgZG90IHNjcmVlbiBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYXZlcmFnZT1mYWxzZV0gLSBXaGV0aGVyIHRoZSBzaGFkZXIgc2hvdWxkIG91dHB1dCBhIGNvbG91ciBhdmVyYWdlIChibGFjayBhbmQgd2hpdGUpLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hbmdsZT0xLjU3XSAtIFRoZSBhbmdsZSBvZiB0aGUgcGF0dGVybi5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2NhbGU9MS4wXSAtIFRoZSBzY2FsZSBvZiB0aGUgb3ZlcmFsbCBlZmZlY3QuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmludGVuc2l0eT0xLjBdIC0gVGhlIGludGVuc2l0eSBvZiB0aGUgZWZmZWN0LlxyXG4gICAqL1xuICBmdW5jdGlvbiBEb3RTY3JlZW5QYXNzKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIERvdFNjcmVlblBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoRG90U2NyZWVuUGFzcykuY2FsbCh0aGlzLCBcIkRvdFNjcmVlblBhc3NcIikpO1xuICAgIF90aGlzLm1hdGVyaWFsID0gbmV3IERvdFNjcmVlbk1hdGVyaWFsKG9wdGlvbnMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoRG90U2NyZWVuUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgICAgd2lkdGggPSBNYXRoLm1heCgxLCB3aWR0aCk7XG4gICAgICBoZWlnaHQgPSBNYXRoLm1heCgxLCBoZWlnaHQpO1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5vZmZzZXRSZXBlYXQudmFsdWUueiA9IHdpZHRoO1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5vZmZzZXRSZXBlYXQudmFsdWUudyA9IGhlaWdodDtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhEb3RTY3JlZW5QYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIERvdFNjcmVlblBhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogQSBmaWxtIHBhc3MuXHJcbiAqXHJcbiAqIFByb3ZpZGVzIHZhcmlvdXMgY2luZW1hdGljIGVmZmVjdHMuXHJcbiAqL1xuXG52YXIgRmlsbVBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgZmlsbSBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLiBTZWUge0BsaW5rIEZpbG1NYXRlcmlhbH0gZm9yIG1vcmUgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2NhbmxpbmVEZW5zaXR5PTEuMjVdIC0gVGhlIHNjYW5saW5lIGRlbnNpdHksIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gaGVpZ2h0LlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5ncmlkU2NhbGU9MS4wXSAtIFRoZSBncmlkIHNjYWxlLCByZWxhdGl2ZSB0byB0aGUgc2NyZWVuIGhlaWdodC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZ3JpZExpbmVXaWR0aD0wLjBdIC0gVGhlIGdyaWQgbGluZSB3aWR0aC4gVGhpcyB2YWx1ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBiYXNlIGxpbmUgd2lkdGguXHJcbiAgICovXG4gIGZ1bmN0aW9uIEZpbG1QYXNzKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEZpbG1QYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEZpbG1QYXNzKS5jYWxsKHRoaXMsIFwiRmlsbVBhc3NcIikpO1xuICAgIF90aGlzLm1hdGVyaWFsID0gbmV3IEZpbG1NYXRlcmlhbChvcHRpb25zKTtcbiAgICAvKipcclxuICAgICAqIFRoZSBhbW91bnQgb2Ygc2NhbmxpbmVzLCByZWxhdGl2ZSB0byB0aGUgc2NyZWVuIGhlaWdodC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgbmVlZCB0byBjYWxsIHtAbGluayBFZmZlY3RDb21wb3NlciNzZXRTaXplfSBhZnRlciBjaGFuZ2luZyB0aGlzXHJcbiAgICAgKiB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5zY2FubGluZURlbnNpdHkgPSBvcHRpb25zLnNjYW5saW5lRGVuc2l0eSA9PT0gdW5kZWZpbmVkID8gMS4yNSA6IG9wdGlvbnMuc2NhbmxpbmVEZW5zaXR5O1xuICAgIC8qKlxyXG4gICAgICogVGhlIGdyaWQgc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gaGVpZ2h0LlxyXG4gICAgICpcclxuICAgICAqIFlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEVmZmVjdENvbXBvc2VyI3NldFNpemV9IGFmdGVyIGNoYW5naW5nIHRoaXNcclxuICAgICAqIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLmdyaWRTY2FsZSA9IG9wdGlvbnMuZ3JpZFNjYWxlID09PSB1bmRlZmluZWQgPyAxLjAgOiBNYXRoLm1heChvcHRpb25zLmdyaWRTY2FsZSwgMWUtNik7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZ3JpZCBsaW5lIHdpZHRoLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEVmZmVjdENvbXBvc2VyI3NldFNpemV9IGFmdGVyIGNoYW5naW5nIHRoaXNcclxuICAgICAqIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLmdyaWRMaW5lV2lkdGggPSBvcHRpb25zLmdyaWRMaW5lV2lkdGggPT09IHVuZGVmaW5lZCA/IDAuMCA6IE1hdGgubWF4KG9wdGlvbnMuZ3JpZExpbmVXaWR0aCwgMC4wKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEZpbG1QYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50aW1lLnZhbHVlICs9IGRlbHRhO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB2YXIgYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XG4gICAgICB2YXIgZ3JpZFNjYWxlID0gdGhpcy5ncmlkU2NhbGUgKiAoaGVpZ2h0ICogMC4xMjUpO1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5zY2FubGluZUNvdW50LnZhbHVlID0gTWF0aC5yb3VuZChoZWlnaHQgKiB0aGlzLnNjYW5saW5lRGVuc2l0eSk7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLmdyaWRTY2FsZS52YWx1ZS5zZXQoYXNwZWN0ICogZ3JpZFNjYWxlLCBncmlkU2NhbGUpO1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5ncmlkTGluZVdpZHRoLnZhbHVlID0gZ3JpZFNjYWxlIC8gaGVpZ2h0ICsgdGhpcy5ncmlkTGluZVdpZHRoO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEZpbG1QYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIEZpbG1QYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbG93IC0gVGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2ggLSBUaGUgaGlnaGVzdCBwb3NzaWJsZSB2YWx1ZS5cclxuICogQHJldHVybiB7TnVtYmVyfSBUaGUgcmFuZG9tIHZhbHVlLlxyXG4gKi9cblxuZnVuY3Rpb24gcmFuZG9tSW50KGxvdywgaGlnaCkge1xuICByZXR1cm4gbG93ICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGhpZ2ggLSBsb3cgKyAxKSk7XG59XG4vKipcclxuICogUmV0dXJucyBhIHJhbmRvbSBmbG9hdCBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gbG93IC0gVGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2ggLSBUaGUgaGlnaGVzdCBwb3NzaWJsZSB2YWx1ZS5cclxuICogQHJldHVybiB7TnVtYmVyfSBUaGUgcmFuZG9tIHZhbHVlLlxyXG4gKi9cblxuXG5mdW5jdGlvbiByYW5kb21GbG9hdChsb3csIGhpZ2gpIHtcbiAgcmV0dXJuIGxvdyArIE1hdGgucmFuZG9tKCkgKiAoaGlnaCAtIGxvdyk7XG59XG4vKipcclxuICogQSBnbGl0Y2ggcGFzcy5cclxuICovXG5cblxudmFyIEdsaXRjaFBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgZ2xpdGNoIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtUZXh0dXJlfSBbb3B0aW9ucy5wZXJ0dXJiTWFwXSAtIEEgcGVydHVyYmF0aW9uIG1hcC4gSWYgbm9uZSBpcyBwcm92aWRlZCwgYSBub2lzZSB0ZXh0dXJlIHdpbGwgYmUgY3JlYXRlZC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZHRTaXplPTY0XSAtIFRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgbm9pc2UgbWFwLiBXaWxsIGJlIGlnbm9yZWQgaWYgYSBwZXJ0dXJiYXRpb24gbWFwIGlzIHByb3ZpZGVkLlxyXG4gICAqL1xuICBmdW5jdGlvbiBHbGl0Y2hQYXNzKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEdsaXRjaFBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoR2xpdGNoUGFzcykuY2FsbCh0aGlzLCBcIkdsaXRjaFBhc3NcIikpO1xuICAgIF90aGlzLm1hdGVyaWFsID0gbmV3IEdsaXRjaE1hdGVyaWFsKCk7XG4gICAgLyoqXHJcbiAgICAgKiBBIHBlcnR1cmJhdGlvbiBtYXAuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1RleHR1cmV9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy50ZXh0dXJlID0gbnVsbDtcbiAgICBfdGhpcy5wZXJ0dXJiTWFwID0gb3B0aW9ucy5wZXJ0dXJiTWFwICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnBlcnR1cmJNYXAgOiBfdGhpcy5nZW5lcmF0ZVBlcnR1cmJNYXAob3B0aW9ucy5kdFNpemUpO1xuICAgIF90aGlzLnBlcnR1cmJNYXAubmFtZSA9IFwiR2xpdGNoLlBlcnR1cmJhdGlvblwiO1xuICAgIF90aGlzLnBlcnR1cmJNYXAuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZWZmZWN0IG1vZGUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0dsaXRjaE1vZGV9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLm1vZGUgPSBHbGl0Y2hNb2RlLlNQT1JBRElDO1xuICAgIC8qKlxyXG4gICAgICogQSBjb3VudGVyIGZvciB0aGUgZ2xpdGNoIGFjdGl2YXRpb24gYW5kIGRlYWN0aXZhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuY291bnRlciA9IDA7XG4gICAgLyoqXHJcbiAgICAgKiBBIHJhbmRvbSBicmVhayBwb2ludCBmb3IgdGhlIHNwb3JhZGljIGdsaXRjaCBhY3RpdmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5icmVha1BvaW50ID0gcmFuZG9tSW50KDEyMCwgMjQwKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogVGhlIGN1cnJlbnQgcGVydHVyYmF0aW9uIG1hcC5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtUZXh0dXJlfVxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoR2xpdGNoUGFzcywgW3tcbiAgICBrZXk6IFwiZ2VuZXJhdGVQZXJ0dXJiTWFwXCIsXG5cbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoZSBjdXJyZW50IHBlcnR1cmJhdGlvbiBtYXAgYW5kIHJlcGxhY2VzIGl0IHdpdGggYSBuZXcgb25lLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbc2l6ZT02NF0gLSBUaGUgdGV4dHVyZSBzaXplLlxyXG4gICAgICogQHJldHVybiB7RGF0YVRleHR1cmV9IFRoZSBwZXJ0dXJiYXRpb24gdGV4dHVyZS5cclxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBnZW5lcmF0ZVBlcnR1cmJNYXAoKSB7XG4gICAgICB2YXIgc2l6ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogNjQ7XG4gICAgICB2YXIgcGl4ZWxzID0gc2l6ZSAqIHNpemU7XG4gICAgICB2YXIgZGF0YSA9IG5ldyBGbG9hdDMyQXJyYXkocGl4ZWxzICogMyk7XG4gICAgICB2YXIgZHQgPSB0aGlzLnBlcnR1cmJNYXA7XG4gICAgICB2YXIgaSwgeDtcblxuICAgICAgZm9yIChpID0gMDsgaSA8IHBpeGVsczsgKytpKSB7XG4gICAgICAgIHggPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgICBkYXRhW2kgKiAzXSA9IHg7XG4gICAgICAgIGRhdGFbaSAqIDMgKyAxXSA9IHg7XG4gICAgICAgIGRhdGFbaSAqIDMgKyAyXSA9IHg7XG4gICAgICB9XG5cbiAgICAgIGlmIChkdCAhPT0gbnVsbCkge1xuICAgICAgICBkdC5kaXNwb3NlKCk7XG4gICAgICB9XG5cbiAgICAgIGR0ID0gbmV3IERhdGFUZXh0dXJlKGRhdGEsIHNpemUsIHNpemUsIFJHQkZvcm1hdCwgRmxvYXRUeXBlKTtcbiAgICAgIGR0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgIHRoaXMucGVydHVyYk1hcCA9IGR0O1xuICAgICAgcmV0dXJuIGR0O1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdmFyIG1vZGUgPSB0aGlzLm1vZGU7XG4gICAgICB2YXIgY291bnRlciA9IHRoaXMuY291bnRlcjtcbiAgICAgIHZhciBicmVha1BvaW50ID0gdGhpcy5icmVha1BvaW50O1xuICAgICAgdmFyIHVuaWZvcm1zID0gdGhpcy5tYXRlcmlhbC51bmlmb3JtcztcbiAgICAgIHVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgIHVuaWZvcm1zLnNlZWQudmFsdWUgPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgdW5pZm9ybXMuYWN0aXZlLnZhbHVlID0gdHJ1ZTtcblxuICAgICAgaWYgKGNvdW50ZXIgJSBicmVha1BvaW50ID09PSAwIHx8IG1vZGUgPT09IEdsaXRjaE1vZGUuQ09OU1RBTlRfV0lMRCkge1xuICAgICAgICB1bmlmb3Jtcy5hbW91bnQudmFsdWUgPSBNYXRoLnJhbmRvbSgpIC8gMzAuMDtcbiAgICAgICAgdW5pZm9ybXMuYW5nbGUudmFsdWUgPSByYW5kb21GbG9hdCgtTWF0aC5QSSwgTWF0aC5QSSk7XG4gICAgICAgIHVuaWZvcm1zLnNlZWRYLnZhbHVlID0gcmFuZG9tRmxvYXQoLTEuMCwgMS4wKTtcbiAgICAgICAgdW5pZm9ybXMuc2VlZFkudmFsdWUgPSByYW5kb21GbG9hdCgtMS4wLCAxLjApO1xuICAgICAgICB1bmlmb3Jtcy5kaXN0b3J0aW9uWC52YWx1ZSA9IHJhbmRvbUZsb2F0KDAuMCwgMS4wKTtcbiAgICAgICAgdW5pZm9ybXMuZGlzdG9ydGlvblkudmFsdWUgPSByYW5kb21GbG9hdCgwLjAsIDEuMCk7XG4gICAgICAgIHRoaXMuYnJlYWtQb2ludCA9IHJhbmRvbUludCgxMjAsIDI0MCk7XG4gICAgICAgIHRoaXMuY291bnRlciA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY291bnRlciAlIGJyZWFrUG9pbnQgPCBicmVha1BvaW50IC8gNSB8fCBtb2RlID09PSBHbGl0Y2hNb2RlLkNPTlNUQU5UX01JTEQpIHtcbiAgICAgICAgICB1bmlmb3Jtcy5hbW91bnQudmFsdWUgPSBNYXRoLnJhbmRvbSgpIC8gOTAuMDtcbiAgICAgICAgICB1bmlmb3Jtcy5hbmdsZS52YWx1ZSA9IHJhbmRvbUZsb2F0KC1NYXRoLlBJLCBNYXRoLlBJKTtcbiAgICAgICAgICB1bmlmb3Jtcy5kaXN0b3J0aW9uWC52YWx1ZSA9IHJhbmRvbUZsb2F0KDAuMCwgMS4wKTtcbiAgICAgICAgICB1bmlmb3Jtcy5kaXN0b3J0aW9uWS52YWx1ZSA9IHJhbmRvbUZsb2F0KDAuMCwgMS4wKTtcbiAgICAgICAgICB1bmlmb3Jtcy5zZWVkWC52YWx1ZSA9IHJhbmRvbUZsb2F0KC0wLjMsIDAuMyk7XG4gICAgICAgICAgdW5pZm9ybXMuc2VlZFkudmFsdWUgPSByYW5kb21GbG9hdCgtMC4zLCAwLjMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNwb3JhZGljLlxuICAgICAgICAgIHVuaWZvcm1zLmFjdGl2ZS52YWx1ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgICsrdGhpcy5jb3VudGVyO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInBlcnR1cmJNYXBcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHR1cmU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQXNzaWduaW5nIGEgbmV3IHBlcnR1cmJhdGlvbiBtYXAgZG9lcyBub3QgZGVzdHJveSB0aGUgY3VycmVudCBvbmUhXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1RleHR1cmV9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIHRoaXMudGV4dHVyZSA9IHZhbHVlO1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50UGVydHVyYi52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEdsaXRjaFBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gR2xpdGNoUGFzcztcbn0oUGFzcyk7XG4vKipcclxuICogQSBnbGl0Y2ggbW9kZSBlbnVtZXJhdGlvbi5cclxuICpcclxuICogQHR5cGUge09iamVjdH1cclxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFNQT1JBRElDIC0gU3BvcmFkaWMgZ2xpdGNoZXMuXHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBDT05TVEFOVF9NSUxEIC0gQ29uc3RhbnQgbWlsZCBnbGl0Y2hlcy5cclxuICogQHByb3BlcnR5IHtOdW1iZXJ9IENPTlNUQU5UX1dJTEQgLSBDb25zdGFudCB3aWxkIGdsaXRjaGVzLlxyXG4gKi9cblxudmFyIEdsaXRjaE1vZGUgPSB7XG4gIFNQT1JBRElDOiAwLFxuICBDT05TVEFOVF9NSUxEOiAxLFxuICBDT05TVEFOVF9XSUxEOiAyXG59O1xuXG4vKipcclxuICogQSBwYXNzIHRoYXQgcmVuZGVycyBhIGdpdmVuIHNjZW5lIGRpcmVjdGx5IG9uIHNjcmVlbiBvciBpbnRvIHRoZSByZWFkIGJ1ZmZlclxyXG4gKiBmb3IgZnVydGhlciBwcm9jZXNzaW5nLlxyXG4gKi9cblxudmFyIFJlbmRlclBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgcmVuZGVyIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBzY2VuZSB0byByZW5kZXIuXHJcbiAgICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBjYW1lcmEgdG8gdXNlIHRvIHJlbmRlciB0aGUgc2NlbmUuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge01hdGVyaWFsfSBbb3B0aW9ucy5vdmVycmlkZU1hdGVyaWFsPW51bGxdIC0gQW4gb3ZlcnJpZGUgbWF0ZXJpYWwgZm9yIHRoZSBzY2VuZS5cclxuICAgKiBAcGFyYW0ge0NvbG9yfSBbb3B0aW9ucy5jbGVhckNvbG9yPW51bGxdIC0gQW4gb3ZlcnJpZGUgY2xlYXIgY29sb3IuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmNsZWFyQWxwaGE9MS4wXSAtIEFuIG92ZXJyaWRlIGNsZWFyIGFscGhhLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2xlYXJEZXB0aD1mYWxzZV0gLSBXaGV0aGVyIGRlcHRoIHNob3VsZCBiZSBjbGVhcmVkIGV4cGxpY2l0bHkuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5jbGVhcj10cnVlXSAtIFdoZXRoZXIgYWxsIGJ1ZmZlcnMgc2hvdWxkIGJlIGNsZWFyZWQuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFJlbmRlclBhc3Moc2NlbmUsIGNhbWVyYSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFJlbmRlclBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoUmVuZGVyUGFzcykuY2FsbCh0aGlzLCBcIlJlbmRlclBhc3NcIiwgc2NlbmUsIGNhbWVyYSwgbnVsbCkpO1xuICAgIF90aGlzLm5lZWRzU3dhcCA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogQSBjbGVhciBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtDbGVhclBhc3N9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLmNsZWFyUGFzcyA9IG5ldyBDbGVhclBhc3Mob3B0aW9ucyk7XG4gICAgLyoqXHJcbiAgICAgKiBBbiBvdmVycmlkZSBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TWF0ZXJpYWx9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLm92ZXJyaWRlTWF0ZXJpYWwgPSBvcHRpb25zLm92ZXJyaWRlTWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMub3ZlcnJpZGVNYXRlcmlhbCA6IG51bGw7XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGVwdGggYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkIGV4cGxpY2l0bHkuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICAgIF90aGlzLmNsZWFyRGVwdGggPSBvcHRpb25zLmNsZWFyRGVwdGggIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2xlYXJEZXB0aCA6IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbG9yLCBkZXB0aCBhbmQgc3RlbmNpbCBidWZmZXJzIHNob3VsZCBiZSBjbGVhcmVkLlxyXG4gICAgICpcclxuICAgICAqIEV2ZW4gd2l0aCBjbGVhciBzZXQgdG8gdHJ1ZSB5b3UgY2FuIHByZXZlbnQgc3BlY2lmaWMgYnVmZmVycyBmcm9tIGJlaW5nXHJcbiAgICAgKiBjbGVhcmVkIGJ5IHNldHRpbmcgZWl0aGVyIHRoZSBhdXRvQ2xlYXJDb2xvciwgYXV0b0NsZWFyU3RlbmNpbCBvclxyXG4gICAgICogYXV0b0NsZWFyRGVwdGggcHJvcGVydGllcyBvZiB0aGUgcmVuZGVyZXIgdG8gZmFsc2UuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICAgIF90aGlzLmNsZWFyID0gb3B0aW9ucy5jbGVhciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jbGVhciA6IHRydWU7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFJlbmRlcnMgdGhlIHNjZW5lLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFJlbmRlclBhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdmFyIHNjZW5lID0gdGhpcy5zY2VuZTtcbiAgICAgIHZhciByZW5kZXJUYXJnZXQgPSB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IGlucHV0QnVmZmVyO1xuICAgICAgdmFyIG92ZXJyaWRlTWF0ZXJpYWwgPSBzY2VuZS5vdmVycmlkZU1hdGVyaWFsO1xuXG4gICAgICBpZiAodGhpcy5jbGVhcikge1xuICAgICAgICB0aGlzLmNsZWFyUGFzcy5yZW5kZXJUb1NjcmVlbiA9IHRoaXMucmVuZGVyVG9TY3JlZW47XG4gICAgICAgIHRoaXMuY2xlYXJQYXNzLnJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNsZWFyRGVwdGgpIHtcbiAgICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCk7XG4gICAgICAgIHJlbmRlcmVyLmNsZWFyRGVwdGgoKTtcbiAgICAgIH1cblxuICAgICAgc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA9IHRoaXMub3ZlcnJpZGVNYXRlcmlhbDtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgdGhpcy5jYW1lcmEsIHJlbmRlclRhcmdldCk7XG4gICAgICBzY2VuZS5vdmVycmlkZU1hdGVyaWFsID0gb3ZlcnJpZGVNYXRlcmlhbDtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhSZW5kZXJQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIFJlbmRlclBhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogQ2xhbXBzIGEgZ2l2ZW4gdmFsdWUuXHJcbiAqXHJcbiAqIEBwcml2YXRlXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjbGFtcC5cclxuICogQHBhcmFtIHtOdW1iZXJ9IG1pbiAtIFRoZSBsb3dlc3QgcG9zc2libGUgdmFsdWUuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtYXggLSBUaGUgaGlnaGVzdCBwb3NzaWJsZSB2YWx1ZS5cclxuICogQHJldHVybiB7TnVtYmVyfSBUaGUgY2xhbXBlZCB2YWx1ZS5cclxuICovXG5cbmZ1bmN0aW9uIGNsYW1wKHZhbHVlLCBtaW4sIG1heCkge1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7XG59XG4vKipcclxuICogQSBjcmVwdXNjdWxhciByYXlzIHBhc3MuXHJcbiAqL1xuXG5cbnZhciBHb2RSYXlzUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBnb2QgcmF5cyBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgbWFpbiBzY2VuZS5cclxuICAgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIG1haW4gY2FtZXJhLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0M0R9IGxpZ2h0U291cmNlIC0gVGhlIG1haW4gbGlnaHQgc291cmNlLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGVuc2l0eT0wLjk2XSAtIFRoZSBkZW5zaXR5IG9mIHRoZSBsaWdodCByYXlzLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kZWNheT0wLjkzXSAtIEFuIGlsbHVtaW5hdGlvbiBkZWNheSBmYWN0b3IuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLndlaWdodD0wLjRdIC0gQSBsaWdodCByYXkgd2VpZ2h0IGZhY3Rvci5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZXhwb3N1cmU9MC42XSAtIEEgY29uc3RhbnQgYXR0ZW51YXRpb24gY29lZmZpY2llbnQuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmNsYW1wTWF4PTEuMF0gLSBBbiB1cHBlciBib3VuZCBmb3IgdGhlIHNhdHVyYXRpb24gb2YgdGhlIG92ZXJhbGwgZWZmZWN0LlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5pbnRlbnNpdHk9MS4wXSAtIEEgY29uc3RhbnQgZmFjdG9yIGZvciBhZGRpdGl2ZSBibGVuZGluZy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucmVzb2x1dGlvblNjYWxlPTAuNV0gLSBUaGUgcmVuZGVyIHRleHR1cmUgcmVzb2x1dGlvbiBzY2FsZSwgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbiByZW5kZXIgc2l6ZS5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMua2VybmVsU2l6ZT1LZXJuZWxTaXplLkxBUkdFXSAtIFRoZSBibHVyIGtlcm5lbCBzaXplLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zYW1wbGVzPTYwXSAtIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgcGl4ZWwuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNjcmVlbk1vZGU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBzY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgdXNlZCBmb3IgY29tYmluaW5nIHRoZSBnb2QgcmF5cyB0ZXh0dXJlIHdpdGggdGhlIHNjZW5lIGNvbG9ycy5cclxuICAgKi9cbiAgZnVuY3Rpb24gR29kUmF5c1Bhc3Moc2NlbmUsIGNhbWVyYSwgbGlnaHRTb3VyY2UpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBHb2RSYXlzUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihHb2RSYXlzUGFzcykuY2FsbCh0aGlzLCBcIkdvZFJheXNQYXNzXCIpKTtcbiAgICAvKipcclxuICAgICAqIEEgc2NlbmUgdGhhdCBvbmx5IGNvbnRhaW5zIHRoZSBsaWdodCBzb3VyY2UuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1NjZW5lfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMubGlnaHRTY2VuZSA9IG5ldyBTY2VuZSgpO1xuICAgIC8qKlxyXG4gICAgICogVGhlIG1haW4gc2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1NjZW5lfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMubWFpblNjZW5lID0gc2NlbmU7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFpbiBjYW1lcmEuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0NhbWVyYX1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLm1haW5DYW1lcmEgPSBjYW1lcmE7XG4gICAgLyoqXHJcbiAgICAgKiBBIHJlbmRlciB0YXJnZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0WCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XG4gICAgICBtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgc3RlbmNpbEJ1ZmZlcjogZmFsc2UsXG4gICAgICBkZXB0aEJ1ZmZlcjogZmFsc2VcbiAgICB9KTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRYLnRleHR1cmUubmFtZSA9IFwiR29kUmF5cy5UYXJnZXRYXCI7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0WC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogQSBzZWNvbmQgcmVuZGVyIHRhcmdldC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRZID0gX3RoaXMucmVuZGVyVGFyZ2V0WC5jbG9uZSgpO1xuICAgIF90aGlzLnJlbmRlclRhcmdldFkudGV4dHVyZS5uYW1lID0gXCJHb2RSYXlzLlRhcmdldFlcIjtcbiAgICAvKipcclxuICAgICAqIEEgcmVuZGVyIHRhcmdldCBmb3IgdGhlIG1hc2tlZCBsaWdodCBzY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRNYXNrID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcbiAgICAgIG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXJcbiAgICB9KTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmUubmFtZSA9IFwiR29kUmF5cy5NYXNrXCI7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0TWFzay50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogQSBwYXNzIHRoYXQgb25seSByZW5kZXJzIHRoZSBsaWdodCBzb3VyY2UuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1JlbmRlclBhc3N9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJQYXNzTGlnaHQgPSBuZXcgUmVuZGVyUGFzcyhfdGhpcy5saWdodFNjZW5lLCBfdGhpcy5tYWluQ2FtZXJhLCB7XG4gICAgICBjbGVhckNvbG9yOiBuZXcgQ29sb3IoMHgwMDAwMDApXG4gICAgfSk7XG4gICAgLyoqXHJcbiAgICAgKiBBIHBhc3MgdGhhdCByZW5kZXJzIHRoZSBtYXNrZWQgc2NlbmUgb3ZlciB0aGUgbGlnaHQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1JlbmRlclBhc3N9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJQYXNzTWFzayA9IG5ldyBSZW5kZXJQYXNzKF90aGlzLm1haW5TY2VuZSwgX3RoaXMubWFpbkNhbWVyYSwge1xuICAgICAgb3ZlcnJpZGVNYXRlcmlhbDogbmV3IE1lc2hCYXNpY01hdGVyaWFsKHtcbiAgICAgICAgY29sb3I6IDB4MDAwMDAwXG4gICAgICB9KVxuICAgIH0pO1xuICAgIF90aGlzLnJlbmRlclBhc3NNYXNrLmNsZWFyID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBBIGJsdXIgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qmx1clBhc3N9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5ibHVyUGFzcyA9IG5ldyBCbHVyUGFzcyhvcHRpb25zKTtcbiAgICAvKipcclxuICAgICAqIFRoZSBsaWdodCBzb3VyY2UuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge09iamVjdDNEfVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5saWdodFNvdXJjZSA9IGxpZ2h0U291cmNlO1xuICAgIC8qKlxyXG4gICAgICogVGhlIGxpZ2h0IHBvc2l0aW9uIGluIHNjcmVlbiBzcGFjZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7VmVjdG9yM31cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnNjcmVlblBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcbiAgICAvKipcclxuICAgICAqIEEgZ29kIHJheXMgc2hhZGVyIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtHb2RSYXlzTWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5nb2RSYXlzTWF0ZXJpYWwgPSBuZXcgR29kUmF5c01hdGVyaWFsKG9wdGlvbnMpO1xuICAgIF90aGlzLmdvZFJheXNNYXRlcmlhbC51bmlmb3Jtcy5saWdodFBvc2l0aW9uLnZhbHVlID0gX3RoaXMuc2NyZWVuUG9zaXRpb247XG4gICAgX3RoaXMuc2FtcGxlcyA9IG9wdGlvbnMuc2FtcGxlcztcbiAgICAvKipcclxuICAgICAqIEEgY29tYmluZSBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0NvbWJpbmVNYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmNvbWJpbmVNYXRlcmlhbCA9IG5ldyBDb21iaW5lTWF0ZXJpYWwob3B0aW9ucy5zY3JlZW5Nb2RlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnNjcmVlbk1vZGUgOiB0cnVlKTtcbiAgICBfdGhpcy5pbnRlbnNpdHkgPSBvcHRpb25zLmludGVuc2l0eTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogVGhlIHJlc29sdXRpb24gc2NhbGUuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoR29kUmF5c1Bhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuXG4gICAgLyoqXHJcbiAgICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB2YXIgc2NlbmUgPSB0aGlzLnNjZW5lO1xuICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xuICAgICAgdmFyIG1haW5TY2VuZSA9IHRoaXMubWFpblNjZW5lO1xuICAgICAgdmFyIGxpZ2h0U291cmNlID0gdGhpcy5saWdodFNvdXJjZTtcbiAgICAgIHZhciBzY3JlZW5Qb3NpdGlvbiA9IHRoaXMuc2NyZWVuUG9zaXRpb247XG4gICAgICB2YXIgZ29kUmF5c01hdGVyaWFsID0gdGhpcy5nb2RSYXlzTWF0ZXJpYWw7XG4gICAgICB2YXIgY29tYmluZU1hdGVyaWFsID0gdGhpcy5jb21iaW5lTWF0ZXJpYWw7XG4gICAgICB2YXIgcmVuZGVyVGFyZ2V0TWFzayA9IHRoaXMucmVuZGVyVGFyZ2V0TWFzaztcbiAgICAgIHZhciByZW5kZXJUYXJnZXRYID0gdGhpcy5yZW5kZXJUYXJnZXRYO1xuICAgICAgdmFyIHJlbmRlclRhcmdldFkgPSB0aGlzLnJlbmRlclRhcmdldFk7XG4gICAgICB2YXIgYmFja2dyb3VuZCwgcGFyZW50OyAvLyBDb21wdXRlIHRoZSBzY3JlZW4gbGlnaHQgcG9zaXRpb24gYW5kIHRyYW5zbGF0ZSBpdCB0byBbMC4wLCAxLjBdLlxuXG4gICAgICBzY3JlZW5Qb3NpdGlvbi5jb3B5KGxpZ2h0U291cmNlLnBvc2l0aW9uKS5wcm9qZWN0KHRoaXMubWFpbkNhbWVyYSk7XG4gICAgICBzY3JlZW5Qb3NpdGlvbi54ID0gY2xhbXAoKHNjcmVlblBvc2l0aW9uLnggKyAxLjApICogMC41LCAwLjAsIDEuMCk7XG4gICAgICBzY3JlZW5Qb3NpdGlvbi55ID0gY2xhbXAoKHNjcmVlblBvc2l0aW9uLnkgKyAxLjApICogMC41LCAwLjAsIDEuMCk7XG4gICAgICBwYXJlbnQgPSBsaWdodFNvdXJjZS5wYXJlbnQ7XG4gICAgICBiYWNrZ3JvdW5kID0gbWFpblNjZW5lLmJhY2tncm91bmQ7XG4gICAgICBtYWluU2NlbmUuYmFja2dyb3VuZCA9IG51bGw7XG4gICAgICB0aGlzLmxpZ2h0U2NlbmUuYWRkKGxpZ2h0U291cmNlKTtcbiAgICAgIC8qIEZpcnN0LCByZW5kZXIgdGhlIGxpZ2h0IHNvdXJjZS4gVGhlbiByZW5kZXIgdGhlIHNjZW5lIGludG8gdGhlIHNhbWVcclxuICAgICAgYnVmZmVyIHVzaW5nIGEgbWFzayBvdmVycmlkZSBtYXRlcmlhbCB3aXRoIGRlcHRoIHRlc3QgZW5hYmxlZC4gKi9cblxuICAgICAgdGhpcy5yZW5kZXJQYXNzTGlnaHQucmVuZGVyKHJlbmRlcmVyLCByZW5kZXJUYXJnZXRNYXNrKTtcbiAgICAgIHRoaXMucmVuZGVyUGFzc01hc2sucmVuZGVyKHJlbmRlcmVyLCByZW5kZXJUYXJnZXRNYXNrKTtcblxuICAgICAgaWYgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICBwYXJlbnQuYWRkKGxpZ2h0U291cmNlKTtcbiAgICAgIH1cblxuICAgICAgbWFpblNjZW5lLmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kOyAvLyBCbHVyIHRoZSBtYXNrZWQgc2NlbmUgdG8gcmVkdWNlIGFydGlmYWN0cy5cblxuICAgICAgdGhpcy5ibHVyUGFzcy5yZW5kZXIocmVuZGVyZXIsIHRoaXMucmVuZGVyVGFyZ2V0TWFzaywgcmVuZGVyVGFyZ2V0WCk7IC8vIEJsdXIgdGhlIG1hc2tlZCBzY2VuZSBhbG9uZyByYWRpYWwgbGluZXMgdG93YXJkcyB0aGUgbGlnaHQgc291cmNlLlxuXG4gICAgICB0aGlzLm1hdGVyaWFsID0gZ29kUmF5c01hdGVyaWFsO1xuICAgICAgZ29kUmF5c01hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gcmVuZGVyVGFyZ2V0WC50ZXh0dXJlO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldFkpO1xuXG4gICAgICBpZiAodGhpcy5ibGVuZCkge1xuICAgICAgICAvLyBDb21iaW5lIHRoZSBnb2QgcmF5cyB3aXRoIHRoZSBzY2VuZSBjb2xvcnMuXG4gICAgICAgIHRoaXMubWF0ZXJpYWwgPSBjb21iaW5lTWF0ZXJpYWw7XG4gICAgICAgIGNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICAgIGNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMi52YWx1ZSA9IHJlbmRlclRhcmdldFkudGV4dHVyZTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoaXMgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMucmVuZGVyUGFzc0xpZ2h0LnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLnJlbmRlclBhc3NNYXNrLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLmJsdXJQYXNzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB3aWR0aCA9IHRoaXMuYmx1clBhc3Mud2lkdGg7XG4gICAgICBoZWlnaHQgPSB0aGlzLmJsdXJQYXNzLmhlaWdodDtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0TWFzay5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXRYLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLnJlbmRlclRhcmdldFkuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiB0YXNrcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhbHBoYSAtIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwgb3Igbm90LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbml0aWFsaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7XG4gICAgICB0aGlzLnJlbmRlclBhc3NMaWdodC5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XG4gICAgICB0aGlzLnJlbmRlclBhc3NNYXNrLmluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKTtcbiAgICAgIHRoaXMuYmx1clBhc3MuaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpO1xuXG4gICAgICBpZiAoIWFscGhhKSB7XG4gICAgICAgIHRoaXMucmVuZGVyVGFyZ2V0TWFzay50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcbiAgICAgICAgdGhpcy5yZW5kZXJUYXJnZXRYLnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0O1xuICAgICAgICB0aGlzLnJlbmRlclRhcmdldFkudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc29sdXRpb25TY2FsZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuYmx1clBhc3MucmVzb2x1dGlvblNjYWxlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEVmZmVjdENvbXBvc2VyI3NldFNpemV9IGFmdGVyIGNoYW5naW5nIHRoaXMgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMC41O1xuICAgICAgdGhpcy5ibHVyUGFzcy5yZXNvbHV0aW9uU2NhbGUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYmx1ciBrZXJuZWwgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwia2VybmVsU2l6ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuYmx1clBhc3Mua2VybmVsU2l6ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogS2VybmVsU2l6ZS5MQVJHRTtcbiAgICAgIHRoaXMuYmx1clBhc3Mua2VybmVsU2l6ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBvdmVyYWxsIGludGVuc2l0eSBvZiB0aGUgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludGVuc2l0eVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkyLnZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDEuMDtcbiAgICAgIHRoaXMuY29tYmluZU1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkyLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciBwaXhlbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzYW1wbGVzXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gTnVtYmVyLnBhcnNlSW50KHRoaXMuZ29kUmF5c01hdGVyaWFsLmRlZmluZXMuTlVNX1NBTVBMRVNfSU5UKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIHZhbHVlIG11c3QgYmUgY2FyZWZ1bGx5IGNob3Nlbi4gQSBoaWdoZXIgdmFsdWUgZGlyZWN0bHkgaW5jcmVhc2VzIHRoZVxyXG4gICAgICogR1BVIGxvYWQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogNjA7XG4gICAgICB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpO1xuICAgICAgdGhpcy5nb2RSYXlzTWF0ZXJpYWwuZGVmaW5lcy5OVU1fU0FNUExFU19GTE9BVCA9IHZhbHVlLnRvRml4ZWQoMSk7XG4gICAgICB0aGlzLmdvZFJheXNNYXRlcmlhbC5kZWZpbmVzLk5VTV9TQU1QTEVTX0lOVCA9IHZhbHVlLnRvRml4ZWQoMCk7XG4gICAgICB0aGlzLmdvZFJheXNNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgZGl0aGVyaW5nIGlzIGVuYWJsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRpdGhlcmluZ1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ29kUmF5c01hdGVyaWFsLmRpdGhlcmluZztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJZiBlbmFibGVkLCB0aGUgcmVzdWx0IHdpbGwgYmUgZGl0aGVyZWQgdG8gcmVtb3ZlIGJhbmRpbmcgYXJ0aWZhY3RzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5kaXRoZXJpbmcgIT09IHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZ29kUmF5c01hdGVyaWFsLmRpdGhlcmluZyA9IHZhbHVlO1xuICAgICAgICB0aGlzLmdvZFJheXNNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVmZmVjdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgaW5wdXQgYnVmZmVyLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJibGVuZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubmVlZHNTd2FwO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIElmIGRpc2FibGVkLCB0aGUgaW5wdXQgYnVmZmVyIHdpbGwgcmVtYWluIHVuYWZmZWN0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogWW91IG1heSB1c2UgdGhlIHtAbGluayBCbG9vbVBhc3Mjb3ZlcmxheX0gdGV4dHVyZSB0byBhcHBseSB0aGUgZWZmZWN0IHRvXHJcbiAgICAgKiB5b3VyIHNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICB0aGlzLm5lZWRzU3dhcCA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBlZmZlY3Qgb3ZlcmxheSB0ZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtUZXh0dXJlfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvdmVybGF5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJUYXJnZXRZLnRleHR1cmU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoR29kUmF5c1Bhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gR29kUmF5c1Bhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogQSBtYXNrIHBhc3MuXHJcbiAqL1xuXG52YXIgTWFza1Bhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgbWFzayBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUgdG8gcmVuZGVyLlxyXG4gICAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRvIHVzZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gTWFza1Bhc3Moc2NlbmUsIGNhbWVyYSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1hc2tQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKE1hc2tQYXNzKS5jYWxsKHRoaXMsIFwiTWFza1Bhc3NcIiwgc2NlbmUsIGNhbWVyYSwgbnVsbCkpO1xuICAgIF90aGlzLm5lZWRzU3dhcCA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogSW52ZXJzZSBmbGFnLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5pbnZlcnNlID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBTdGVuY2lsIGJ1ZmZlciBjbGVhciBmbGFnLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jbGVhclN0ZW5jaWwgPSB0cnVlO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoTWFza1Bhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdmFyIGNvbnRleHQgPSByZW5kZXJlci5jb250ZXh0O1xuICAgICAgdmFyIHN0YXRlID0gcmVuZGVyZXIuc3RhdGU7XG4gICAgICB2YXIgc2NlbmUgPSB0aGlzLnNjZW5lO1xuICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xuICAgICAgdmFyIHdyaXRlVmFsdWUgPSB0aGlzLmludmVyc2UgPyAwIDogMTtcbiAgICAgIHZhciBjbGVhclZhbHVlID0gMSAtIHdyaXRlVmFsdWU7IC8vIERvbid0IHVwZGF0ZSBjb2xvciBvciBkZXB0aC5cblxuICAgICAgc3RhdGUuYnVmZmVycy5jb2xvci5zZXRNYXNrKGZhbHNlKTtcbiAgICAgIHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayhmYWxzZSk7IC8vIExvY2sgdGhlIGJ1ZmZlcnMuXG5cbiAgICAgIHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TG9ja2VkKHRydWUpO1xuICAgICAgc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRMb2NrZWQodHJ1ZSk7IC8vIENvbmZpZ3VyZSB0aGUgc3RlbmNpbC5cblxuICAgICAgc3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldFRlc3QodHJ1ZSk7XG4gICAgICBzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0T3AoY29udGV4dC5SRVBMQUNFLCBjb250ZXh0LlJFUExBQ0UsIGNvbnRleHQuUkVQTEFDRSk7XG4gICAgICBzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0RnVuYyhjb250ZXh0LkFMV0FZUywgd3JpdGVWYWx1ZSwgMHhmZmZmZmZmZik7XG4gICAgICBzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0Q2xlYXIoY2xlYXJWYWx1ZSk7IC8vIENsZWFyIHRoZSBzdGVuY2lsLlxuXG4gICAgICBpZiAodGhpcy5jbGVhclN0ZW5jaWwpIHtcbiAgICAgICAgaWYgKHRoaXMucmVuZGVyVG9TY3JlZW4pIHtcbiAgICAgICAgICByZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQobnVsbCk7XG4gICAgICAgICAgcmVuZGVyZXIuY2xlYXJTdGVuY2lsKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KGlucHV0QnVmZmVyKTtcbiAgICAgICAgICByZW5kZXJlci5jbGVhclN0ZW5jaWwoKTtcbiAgICAgICAgICByZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQob3V0cHV0QnVmZmVyKTtcbiAgICAgICAgICByZW5kZXJlci5jbGVhclN0ZW5jaWwoKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBEcmF3IHRoZSBtYXNrLlxuXG5cbiAgICAgIGlmICh0aGlzLnJlbmRlclRvU2NyZWVuKSB7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCBpbnB1dEJ1ZmZlcik7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCBvdXRwdXRCdWZmZXIpO1xuICAgICAgfSAvLyBVbmxvY2sgdGhlIGJ1ZmZlcnMuXG5cblxuICAgICAgc3RhdGUuYnVmZmVycy5jb2xvci5zZXRMb2NrZWQoZmFsc2UpO1xuICAgICAgc3RhdGUuYnVmZmVycy5kZXB0aC5zZXRMb2NrZWQoZmFsc2UpOyAvLyBPbmx5IHJlbmRlciB3aGVyZSB0aGUgc3RlbmNpbCBpcyBzZXQgdG8gMS5cblxuICAgICAgc3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldEZ1bmMoY29udGV4dC5FUVVBTCwgMSwgMHhmZmZmZmZmZik7XG4gICAgICBzdGF0ZS5idWZmZXJzLnN0ZW5jaWwuc2V0T3AoY29udGV4dC5LRUVQLCBjb250ZXh0LktFRVAsIGNvbnRleHQuS0VFUCk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoTWFza1Bhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gTWFza1Bhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogQSBzaGFkZXIgcGFzcy5cclxuICpcclxuICogVXNlZCB0byByZW5kZXIgYW55IHNoYWRlciBtYXRlcmlhbCBhcyBhIDJEIGZpbHRlci5cclxuICovXG5cbnZhciBTaGFkZXJQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNoYWRlciBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtTaGFkZXJNYXRlcmlhbH0gbWF0ZXJpYWwgLSBUaGUgc2hhZGVyIG1hdGVyaWFsIHRvIHVzZS5cclxuICAgKiBAcGFyYW0ge1N0cmluZ30gW3RleHR1cmVJRD1cInREaWZmdXNlXCJdIC0gVGhlIHRleHR1cmUgdW5pZm9ybSBpZGVudGlmaWVyLlxyXG4gICAqL1xuICBmdW5jdGlvbiBTaGFkZXJQYXNzKG1hdGVyaWFsKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHRleHR1cmVJRCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogXCJ0RGlmZnVzZVwiO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU2hhZGVyUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihTaGFkZXJQYXNzKS5jYWxsKHRoaXMsIFwiU2hhZGVyUGFzc1wiKSk7XG4gICAgX3RoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb2xvciBzYW1wbGVyIHVuaWZvcm0gb2YgdGhlIGdpdmVuIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtTdHJpbmd9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLnRleHR1cmVJRCA9IHRleHR1cmVJRDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFNoYWRlclBhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgaWYgKHRoaXMubWF0ZXJpYWwudW5pZm9ybXNbdGhpcy50ZXh0dXJlSURdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtc1t0aGlzLnRleHR1cmVJRF0udmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgfVxuXG4gICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhTaGFkZXJQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIFNoYWRlclBhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogQW4gb3V0bGluZSBwYXNzLlxyXG4gKi9cblxudmFyIE91dGxpbmVQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG91dGxpbmUgcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIG1haW4gc2NlbmUuXHJcbiAgICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBwYXJhbWV0ZXJzLiBTZWUge0BsaW5rIEJsdXJQYXNzfSwge0BsaW5rIE91dGxpbmVCbGVuZE1hdGVyaWFsfSBhbmQge0BsaW5rIE91dGxpbmVFZGdlc01hdGVyaWFsfSBmb3IgZGV0YWlscy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucHVsc2VTcGVlZD0wLjBdIC0gVGhlIHB1bHNlIHNwZWVkLiBBIHZhbHVlIG9mIHplcm8gZGlzYWJsZXMgdGhlIHB1bHNlIGVmZmVjdC5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmJsdXI9dHJ1ZV0gLSBXaGV0aGVyIHRoZSBvdXRsaW5lIHNob3VsZCBiZSBibHVycmVkLlxyXG4gICAqL1xuICBmdW5jdGlvbiBPdXRsaW5lUGFzcyhzY2VuZSwgY2FtZXJhKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgT3V0bGluZVBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoT3V0bGluZVBhc3MpLmNhbGwodGhpcywgXCJPdXRsaW5lUGFzc1wiKSk7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFpbiBzY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7U2NlbmV9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5tYWluU2NlbmUgPSBzY2VuZTtcbiAgICAvKipcclxuICAgICAqIFRoZSBtYWluIGNhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Q2FtZXJhfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMubWFpbkNhbWVyYSA9IGNhbWVyYTtcbiAgICAvKipcclxuICAgICAqIEEgcmVuZGVyIHRhcmdldCBmb3IgZGVwdGggaW5mb3JtYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0RGVwdGggPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSwge1xuICAgICAgbWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICBtYWdGaWx0ZXI6IExpbmVhckZpbHRlclxuICAgIH0pO1xuICAgIF90aGlzLnJlbmRlclRhcmdldERlcHRoLnRleHR1cmUubmFtZSA9IFwiT3V0bGluZS5EZXB0aFwiO1xuICAgIF90aGlzLnJlbmRlclRhcmdldERlcHRoLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBvdXRsaW5lIG1hc2suXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0TWFzayA9IF90aGlzLnJlbmRlclRhcmdldERlcHRoLmNsb25lKCk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0TWFzay50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmUubmFtZSA9IFwiT3V0bGluZS5NYXNrXCI7XG4gICAgLyoqXHJcbiAgICAgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBlZGdlIGRldGVjdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRFZGdlcyA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XG4gICAgICBtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgc3RlbmNpbEJ1ZmZlcjogZmFsc2UsXG4gICAgICBkZXB0aEJ1ZmZlcjogZmFsc2UsXG4gICAgICBmb3JtYXQ6IFJHQkZvcm1hdFxuICAgIH0pO1xuICAgIF90aGlzLnJlbmRlclRhcmdldEVkZ2VzLnRleHR1cmUubmFtZSA9IFwiT3V0bGluZS5FZGdlc1wiO1xuICAgIF90aGlzLnJlbmRlclRhcmdldEVkZ2VzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBibHVycmVkIG91dGxpbmUgb3ZlcmxheS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMgPSBfdGhpcy5yZW5kZXJUYXJnZXRFZGdlcy5jbG9uZSgpO1xuICAgIF90aGlzLnJlbmRlclRhcmdldEJsdXJyZWRFZGdlcy50ZXh0dXJlLm5hbWUgPSBcIk91dGxpbmUuQmx1cnJlZEVkZ2VzXCI7XG4gICAgLyoqXHJcbiAgICAgKiBBIGRlcHRoIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1JlbmRlclBhc3N9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJQYXNzRGVwdGggPSBuZXcgUmVuZGVyUGFzcyhfdGhpcy5tYWluU2NlbmUsIF90aGlzLm1haW5DYW1lcmEsIHtcbiAgICAgIG92ZXJyaWRlTWF0ZXJpYWw6IG5ldyBNZXNoRGVwdGhNYXRlcmlhbCh7XG4gICAgICAgIGRlcHRoUGFja2luZzogUkdCQURlcHRoUGFja2luZyxcbiAgICAgICAgbW9ycGhUYXJnZXRzOiB0cnVlLFxuICAgICAgICBza2lubmluZzogdHJ1ZVxuICAgICAgfSksXG4gICAgICBjbGVhckNvbG9yOiBuZXcgQ29sb3IoMHhmZmZmZmYpLFxuICAgICAgY2xlYXJBbHBoYTogMS4wXG4gICAgfSk7XG4gICAgLyoqXHJcbiAgICAgKiBBIGRlcHRoIGNvbXBhcmlzb24gbWFzayBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtSZW5kZXJQYXNzfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyUGFzc01hc2sgPSBuZXcgUmVuZGVyUGFzcyhfdGhpcy5tYWluU2NlbmUsIF90aGlzLm1haW5DYW1lcmEsIHtcbiAgICAgIG92ZXJyaWRlTWF0ZXJpYWw6IG5ldyBEZXB0aENvbXBhcmlzb25NYXRlcmlhbChfdGhpcy5yZW5kZXJUYXJnZXREZXB0aC50ZXh0dXJlLCBfdGhpcy5tYWluQ2FtZXJhKSxcbiAgICAgIGNsZWFyQ29sb3I6IG5ldyBDb2xvcigweGZmZmZmZiksXG4gICAgICBjbGVhckFscGhhOiAxLjBcbiAgICB9KTtcbiAgICAvKipcclxuICAgICAqIEEgYmx1ciBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCbHVyUGFzc31cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmJsdXJQYXNzID0gbmV3IEJsdXJQYXNzKG9wdGlvbnMpO1xuICAgIF90aGlzLmtlcm5lbFNpemUgPSBvcHRpb25zLmtlcm5lbFNpemU7XG4gICAgLyoqXHJcbiAgICAgKiBBIGNvcHkgcGFzcyB0aGF0IHJlbmRlcnMgdGhlIHJlYWQgYnVmZmVyIHRvIHNjcmVlbiBpZiBuZWVkZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1NoYWRlclBhc3N9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jb3B5UGFzcyA9IG5ldyBTaGFkZXJQYXNzKG5ldyBDb3B5TWF0ZXJpYWwoKSk7XG4gICAgX3RoaXMuY29weVBhc3MucmVuZGVyVG9TY3JlZW4gPSB0cnVlO1xuICAgIC8qKlxyXG4gICAgICogQW4gb3V0bGluZSBlZGdlIGRldGVjdGlvbiBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7T3V0bGluZUVkZ2VzTWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5vdXRsaW5lRWRnZXNNYXRlcmlhbCA9IG5ldyBPdXRsaW5lRWRnZXNNYXRlcmlhbChvcHRpb25zKTtcbiAgICBfdGhpcy5vdXRsaW5lRWRnZXNNYXRlcmlhbC51bmlmb3Jtcy50TWFzay52YWx1ZSA9IF90aGlzLnJlbmRlclRhcmdldE1hc2sudGV4dHVyZTtcbiAgICAvKipcclxuICAgICAqIEFuIG91dGxpbmUgYmxlbmQgbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge091dGxpbmVCbGVuZE1hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMub3V0bGluZUJsZW5kTWF0ZXJpYWwgPSBuZXcgT3V0bGluZUJsZW5kTWF0ZXJpYWwob3B0aW9ucyk7XG4gICAgX3RoaXMub3V0bGluZUJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudE1hc2sudmFsdWUgPSBfdGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmU7XG4gICAgX3RoaXMuYmx1ciA9IG9wdGlvbnMuYmx1ciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5ibHVyIDogdHJ1ZTtcbiAgICAvKipcclxuICAgICAqIEEgbGlzdCBvZiBvYmplY3RzIHRvIG91dGxpbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge09iamVjdDNEW119XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5zZWxlY3Rpb24gPSBbXTtcbiAgICAvKipcclxuICAgICAqIFRoZSBjdXJyZW50IGFuaW1hdGlvbiB0aW1lLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy50aW1lID0gMC4wO1xuICAgIC8qKlxyXG4gICAgICogVGhlIHB1bHNlIHNwZWVkLiBBIHZhbHVlIG9mIHplcm8gZGlzYWJsZXMgdGhlIHB1bHNlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5wdWxzZVNwZWVkID0gb3B0aW9ucy5wdWxzZVNwZWVkICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnB1bHNlU3BlZWQgOiAwLjA7XG4gICAgLyoqXHJcbiAgICAgKiBBIGRlZGljYXRlZCByZW5kZXIgbGF5ZXIgZm9yIHNlbGVjdGVkIG9iamVjdHMuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBsYXllciBpcyBzZXQgdG8gMTAgYnkgZGVmYXVsdC4gSWYgdGhpcyBjb2xsaWRlcyB3aXRoIHlvdXIgb3duIGN1c3RvbVxyXG4gICAgICogbGF5ZXJzLCBwbGVhc2UgY2hhbmdlIGl0IHRvIGEgZnJlZSBsYXllciBiZWZvcmUgcmVuZGVyaW5nIVxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLnNlbGVjdGlvbkxheWVyID0gMTA7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFRoZSByZXNvbHV0aW9uIHNjYWxlLlxyXG4gICAqXHJcbiAgICogQHR5cGUge051bWJlcn1cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKE91dGxpbmVQYXNzLCBbe1xuICAgIGtleTogXCJzZXRQYXR0ZXJuVGV4dHVyZVwiLFxuXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIGEgcGF0dGVybiB0ZXh0dXJlIHRvIHVzZSBhcyBhbiBvdmVybGF5IGZvciBzZWxlY3RlZCBvYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7VGV4dHVyZX0gW3RleHR1cmU9bnVsbF0gLSBBIHBhdHRlcm4gdGV4dHVyZS4gU2V0IHRvIG51bGwgdG8gZGlzYWJsZSB0aGUgcGF0dGVybi5cclxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRQYXR0ZXJuVGV4dHVyZSgpIHtcbiAgICAgIHZhciB0ZXh0dXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgICAgdGhpcy5vdXRsaW5lQmxlbmRNYXRlcmlhbC5zZXRQYXR0ZXJuVGV4dHVyZSh0ZXh0dXJlKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGFuZCBzZWxlY3RzIGEgbGlzdCBvZiBvYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0M0RbXX0gb2JqZWN0cyAtIFRoZSBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIG91dGxpbmVkLiBUaGlzIGFycmF5IHdpbGwgYmUgY29waWVkLlxyXG4gICAgICogQHJldHVybiB7T3V0bGluZVBhc3N9IFRoaXMgcGFzcy5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2VsZWN0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNlbGVjdGlvbihvYmplY3RzKSB7XG4gICAgICB2YXIgc2VsZWN0aW9uID0gb2JqZWN0cy5zbGljZSgwKTtcbiAgICAgIHZhciBzZWxlY3Rpb25MYXllciA9IHRoaXMuc2VsZWN0aW9uTGF5ZXI7XG4gICAgICB2YXIgaSwgbDtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTtcblxuICAgICAgZm9yIChpID0gMCwgbCA9IHNlbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgc2VsZWN0aW9uW2ldLmxheWVycy5lbmFibGUoc2VsZWN0aW9uTGF5ZXIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIENsZWFycyB0aGUgbGlzdCBvZiBzZWxlY3RlZCBvYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4ge091dGxpbmVQYXNzfSBUaGlzIHBhc3MuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNsZWFyU2VsZWN0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uO1xuICAgICAgdmFyIHNlbGVjdGlvbkxheWVyID0gdGhpcy5zZWxlY3Rpb25MYXllcjtcbiAgICAgIHZhciBpLCBsO1xuXG4gICAgICBmb3IgKGkgPSAwLCBsID0gc2VsZWN0aW9uLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICBzZWxlY3Rpb25baV0ubGF5ZXJzLmRpc2FibGUoc2VsZWN0aW9uTGF5ZXIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbGVjdGlvbiA9IFtdO1xuICAgICAgdGhpcy50aW1lID0gMC4wO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU2VsZWN0cyBhbiBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIG9iamVjdCB0aGF0IHNob3VsZCBiZSBvdXRsaW5lZC5cclxuICAgICAqIEByZXR1cm4ge091dGxpbmVQYXNzfSBUaGlzIHBhc3MuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNlbGVjdE9iamVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZWxlY3RPYmplY3Qob2JqZWN0KSB7XG4gICAgICBvYmplY3QubGF5ZXJzLmVuYWJsZSh0aGlzLnNlbGVjdGlvbkxheWVyKTtcbiAgICAgIHRoaXMuc2VsZWN0aW9uLnB1c2gob2JqZWN0KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIERlc2VsZWN0cyBhbiBvYmplY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtPYmplY3QzRH0gb2JqZWN0IC0gVGhlIG9iamVjdCB0aGF0IHNob3VsZCBubyBsb25nZXIgYmUgb3V0bGluZWQuXHJcbiAgICAgKiBAcmV0dXJuIHtPdXRsaW5lUGFzc30gVGhpcyBwYXNzLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZXNlbGVjdE9iamVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZXNlbGVjdE9iamVjdChvYmplY3QpIHtcbiAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbjtcbiAgICAgIHZhciBpbmRleCA9IHNlbGVjdGlvbi5pbmRleE9mKG9iamVjdCk7XG5cbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHNlbGVjdGlvbltpbmRleF0ubGF5ZXJzLmRpc2FibGUodGhpcy5zZWxlY3Rpb25MYXllcik7XG4gICAgICAgIHNlbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy50aW1lID0gMC4wO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgYWxsIHNlbGVjdGVkIG9iamVjdHMuXHJcbiAgICAgKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gdmlzaWJsZSAtIFdoZXRoZXIgdGhlIHNlbGVjdGVkIG9iamVjdHMgc2hvdWxkIGJlIHZpc2libGUuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNlbGVjdGlvblZpc2libGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2VsZWN0aW9uVmlzaWJsZSh2aXNpYmxlKSB7XG4gICAgICB2YXIgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICB2YXIgaSwgbDtcblxuICAgICAgZm9yIChpID0gMCwgbCA9IHNlbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICBzZWxlY3Rpb25baV0ubGF5ZXJzLmVuYWJsZSgwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxlY3Rpb25baV0ubGF5ZXJzLmRpc2FibGUoMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHZhciBtYWluU2NlbmUgPSB0aGlzLm1haW5TY2VuZTtcbiAgICAgIHZhciBtYWluQ2FtZXJhID0gdGhpcy5tYWluQ2FtZXJhO1xuICAgICAgdmFyIHB1bHNlID0gdGhpcy5vdXRsaW5lQmxlbmRNYXRlcmlhbC51bmlmb3Jtcy5wdWxzZTtcbiAgICAgIHZhciBiYWNrZ3JvdW5kLCBtYXNrO1xuXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICBiYWNrZ3JvdW5kID0gbWFpblNjZW5lLmJhY2tncm91bmQ7XG4gICAgICAgIG1hc2sgPSBtYWluQ2FtZXJhLmxheWVycy5tYXNrO1xuICAgICAgICBtYWluU2NlbmUuYmFja2dyb3VuZCA9IG51bGw7XG4gICAgICAgIHB1bHNlLnZhbHVlID0gMS4wO1xuXG4gICAgICAgIGlmICh0aGlzLnB1bHNlU3BlZWQgPiAwLjApIHtcbiAgICAgICAgICBwdWxzZS52YWx1ZSA9IDAuNjI1ICsgTWF0aC5jb3ModGhpcy50aW1lICogdGhpcy5wdWxzZVNwZWVkICogMTAuMCkgKiAwLjM3NTtcbiAgICAgICAgICB0aGlzLnRpbWUgKz0gZGVsdGE7XG4gICAgICAgIH0gLy8gUmVuZGVyIGEgY3VzdG9tIGRlcHRoIHRleHR1cmUgYW5kIGlnbm9yZSBzZWxlY3RlZCBvYmplY3RzLlxuXG5cbiAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25WaXNpYmxlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5yZW5kZXJQYXNzRGVwdGgucmVuZGVyKHJlbmRlcmVyLCB0aGlzLnJlbmRlclRhcmdldERlcHRoKTtcbiAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25WaXNpYmxlKHRydWUpOyAvLyBDcmVhdGUgYSBtYXNrIGZvciB0aGUgc2VsZWN0ZWQgb2JqZWN0cyB1c2luZyB0aGUgZGVwdGggaW5mb3JtYXRpb24uXG5cbiAgICAgICAgbWFpbkNhbWVyYS5sYXllcnMubWFzayA9IDEgPDwgdGhpcy5zZWxlY3Rpb25MYXllcjtcbiAgICAgICAgdGhpcy5yZW5kZXJQYXNzTWFzay5yZW5kZXIocmVuZGVyZXIsIHRoaXMucmVuZGVyVGFyZ2V0TWFzayk7IC8vIFJlc3RvcmUgdGhlIGNhbWVyYSBsYXllciBtYXNrIGFuZCB0aGUgc2NlbmUgYmFja2dyb3VuZC5cblxuICAgICAgICBtYWluQ2FtZXJhLmxheWVycy5tYXNrID0gbWFzaztcbiAgICAgICAgbWFpblNjZW5lLmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kOyAvLyBEZXRlY3QgdGhlIG91dGxpbmUuXG5cbiAgICAgICAgdGhpcy5tYXRlcmlhbCA9IHRoaXMub3V0bGluZUVkZ2VzTWF0ZXJpYWw7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUYXJnZXRFZGdlcyk7XG5cbiAgICAgICAgaWYgKHRoaXMuYmx1clBhc3MuZW5hYmxlZCkge1xuICAgICAgICAgIC8vIEJsdXIgdGhlIGVkZ2VzLlxuICAgICAgICAgIHRoaXMuYmx1clBhc3MucmVuZGVyKHJlbmRlcmVyLCB0aGlzLnJlbmRlclRhcmdldEVkZ2VzLCB0aGlzLnJlbmRlclRhcmdldEJsdXJyZWRFZGdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ibGVuZCkge1xuICAgICAgICAgIC8vIERyYXcgdGhlIGZpbmFsIG92ZXJsYXkgb250byB0aGUgc2NlbmUgY29sb3Vycy5cbiAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gdGhpcy5vdXRsaW5lQmxlbmRNYXRlcmlhbDtcbiAgICAgICAgICB0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogdGhpcy5vdXRwdXRCdWZmZXIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucmVuZGVyVG9TY3JlZW4pIHtcbiAgICAgICAgLy8gRHJhdyB0aGUgcmVhZCBidWZmZXIgdG8gc2NyZWVuLlxuICAgICAgICB0aGlzLmNvcHlQYXNzLnJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXREZXB0aC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXRNYXNrLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLnJlbmRlclBhc3NEZXB0aC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5yZW5kZXJQYXNzTWFzay5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5ibHVyUGFzcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgd2lkdGggPSB0aGlzLmJsdXJQYXNzLndpZHRoO1xuICAgICAgaGVpZ2h0ID0gdGhpcy5ibHVyUGFzcy5oZWlnaHQ7XG4gICAgICB0aGlzLnJlbmRlclRhcmdldEVkZ2VzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLnJlbmRlclRhcmdldEJsdXJyZWRFZGdlcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5vdXRsaW5lQmxlbmRNYXRlcmlhbC51bmlmb3Jtcy5hc3BlY3QudmFsdWUgPSB3aWR0aCAvIGhlaWdodDtcbiAgICAgIHRoaXMub3V0bGluZUVkZ2VzTWF0ZXJpYWwuc2V0VGV4ZWxTaXplKDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImluaXRpYWxpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpIHtcbiAgICAgIHRoaXMucmVuZGVyUGFzc0RlcHRoLmluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKTtcbiAgICAgIHRoaXMucmVuZGVyUGFzc01hc2suaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpO1xuICAgICAgdGhpcy5ibHVyUGFzcy5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInJlc29sdXRpb25TY2FsZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuYmx1clBhc3MucmVzb2x1dGlvblNjYWxlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEVmZmVjdENvbXBvc2VyI3NldFNpemV9IGFmdGVyIGNoYW5naW5nIHRoaXMgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMC41O1xuICAgICAgdGhpcy5ibHVyUGFzcy5yZXNvbHV0aW9uU2NhbGUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYmx1ciBrZXJuZWwgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwia2VybmVsU2l6ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuYmx1clBhc3Mua2VybmVsU2l6ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogS2VybmVsU2l6ZS5WRVJZX1NNQUxMO1xuICAgICAgdGhpcy5ibHVyUGFzcy5rZXJuZWxTaXplID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG91dGxpbmUgb3ZlcmxheSBzaG91bGQgYmUgYmx1cnJlZC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYmx1clwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuYmx1clBhc3MuZW5hYmxlZDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgdGhpcy5ibHVyUGFzcy5lbmFibGVkID0gdmFsdWU7XG4gICAgICB0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnVuaWZvcm1zLnRFZGdlcy52YWx1ZSA9IHZhbHVlID8gdGhpcy5yZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMudGV4dHVyZSA6IHRoaXMucmVuZGVyVGFyZ2V0RWRnZXMudGV4dHVyZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBkaXRoZXJpbmcgaXMgZW5hYmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGl0aGVyaW5nXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ibHVyUGFzcy5kaXRoZXJpbmc7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSWYgZW5hYmxlZCwgdGhlIHJlc3VsdCB3aWxsIGJlIGRpdGhlcmVkIHRvIHJlbW92ZSBiYW5kaW5nIGFydGlmYWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgdGhpcy5ibHVyUGFzcy5kaXRoZXJpbmcgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZWZmZWN0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBpbnB1dCBidWZmZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImJsZW5kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZWVkc1N3YXA7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSWYgZGlzYWJsZWQsIHRoZSBpbnB1dCBidWZmZXIgd2lsbCByZW1haW4gdW5hZmZlY3RlZC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgbWF5IHVzZSB0aGUge0BsaW5rIEJsb29tUGFzcyNvdmVybGF5fSB0ZXh0dXJlIHRvIGFwcGx5IHRoZSBlZmZlY3QgdG9cclxuICAgICAqIHlvdXIgc2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIHRoaXMubmVlZHNTd2FwID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIGVmZmVjdCBvdmVybGF5IHRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1RleHR1cmV9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm92ZXJsYXlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnVuaWZvcm1zLnRFZGdlcy52YWx1ZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhPdXRsaW5lUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBPdXRsaW5lUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBBIHBpeGVsYXRpb24gcGFzcy5cclxuICovXG5cbnZhciBQaXhlbGF0aW9uUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBwaXhlbGF0aW9uIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2dyYW51bGFyaXR5PTMwLjBdIC0gVGhlIGludGVuc2l0eSBvZiB0aGUgZWZmZWN0LlxyXG4gICAqL1xuICBmdW5jdGlvbiBQaXhlbGF0aW9uUGFzcygpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgZ3JhbnVsYXJpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDMwLjA7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQaXhlbGF0aW9uUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihQaXhlbGF0aW9uUGFzcykuY2FsbCh0aGlzLCBcIlBpeGVsYXRpb25QYXNzXCIpKTtcbiAgICBfdGhpcy5tYXRlcmlhbCA9IG5ldyBQaXhlbGF0aW9uTWF0ZXJpYWwoKTtcbiAgICBfdGhpcy5ncmFudWxhcml0eSA9IGdyYW51bGFyaXR5O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBUaGUgcGl4ZWwgZ3JhbnVsYXJpdHkuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoUGl4ZWxhdGlvblBhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuXG4gICAgLyoqXHJcbiAgICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5tYXRlcmlhbC5zZXRSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJncmFudWxhcml0eVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubWF0ZXJpYWwuZ3JhbnVsYXJpdHk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQSBoaWdoZXIgdmFsdWUgeWllbGRzIGNvYXJzZXIgdmlzdWFscy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAzMDtcbiAgICAgIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSk7XG5cbiAgICAgIGlmICh2YWx1ZSAlIDIgPiAwKSB7XG4gICAgICAgIHZhbHVlICs9IDE7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubWF0ZXJpYWwuZ3JhbnVsYXJpdHkgPSB2YWx1ZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhQaXhlbGF0aW9uUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBQaXhlbGF0aW9uUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBBbiBhZHZhbmNlZCBEZXB0aCBvZiBGaWVsZCAoRG9GKSBwYXNzLlxyXG4gKlxyXG4gKiBZaWVsZHMgbW9yZSByZWFsaXN0aWMgcmVzdWx0cyBidXQgaXMgYWxzbyBtb3JlIGRlbWFuZGluZy5cclxuICpcclxuICogVGhpcyBwYXNzIHJlcXVpcmVzIGEge0BsaW5rIEVmZmVjdENvbXBvc2VyI2RlcHRoVGV4dHVyZX0uXHJcbiAqL1xuXG52YXIgUmVhbGlzdGljQm9rZWhQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGJva2VoIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBjYW1lcmEgLSBUaGUgbWFpbiBjYW1lcmEuIFVzZWQgdG8gb2J0YWluIHRoZSBmb2NhbCBsZW5ndGggYW5kIHRoZSBuZWFyIGFuZCBmYXIgcGxhbmUgc2V0dGluZ3MuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgcGFyYW1ldGVycy4gU2VlIHtAbGluayBSZWFsaXN0aWNCb2tlaE1hdGVyaWFsfSBmb3IgZGV0YWlscy5cclxuICAgKi9cbiAgZnVuY3Rpb24gUmVhbGlzdGljQm9rZWhQYXNzKGNhbWVyYSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFJlYWxpc3RpY0Jva2VoUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihSZWFsaXN0aWNCb2tlaFBhc3MpLmNhbGwodGhpcywgXCJSZWFsaXN0aWNCb2tlaFBhc3NcIikpO1xuICAgIF90aGlzLm1hdGVyaWFsID0gbmV3IFJlYWxpc3RpY0Jva2VoTWF0ZXJpYWwoY2FtZXJhLCBvcHRpb25zKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFJlYWxpc3RpY0Jva2VoUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERlcHRoLnZhbHVlID0gaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLm1hdGVyaWFsLnNldFRleGVsU2l6ZSgxLjAgLyB3aWR0aCwgMS4wIC8gaGVpZ2h0KTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhSZWFsaXN0aWNCb2tlaFBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gUmVhbGlzdGljQm9rZWhQYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIEEgcGFzcyB0aGF0IHJlbmRlcnMgdGhlIHJlc3VsdCBmcm9tIGEgcHJldmlvdXMgcGFzcyB0byBhbm90aGVyIHJlbmRlciB0YXJnZXQuXHJcbiAqL1xuXG52YXIgU2F2ZVBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgc2F2ZSBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gW3JlbmRlclRhcmdldF0gLSBUaGUgcmVuZGVyIHRhcmdldCB0byB1c2UgZm9yIHNhdmluZyB0aGUgaW5wdXQgYnVmZmVyLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3Jlc2l6ZT10cnVlXSAtIFdoZXRoZXIgdGhlIHJlbmRlciB0YXJnZXQgc2hvdWxkIGFkanVzdCB0byB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgYnVmZmVyLlxyXG4gICAqL1xuICBmdW5jdGlvbiBTYXZlUGFzcyhyZW5kZXJUYXJnZXQpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcmVzaXplID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU2F2ZVBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoU2F2ZVBhc3MpLmNhbGwodGhpcywgXCJTYXZlUGFzc1wiKSk7XG4gICAgX3RoaXMubWF0ZXJpYWwgPSBuZXcgQ29weU1hdGVyaWFsKCk7XG4gICAgX3RoaXMubmVlZHNTd2FwID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmVuZGVyIHRhcmdldC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldCAhPT0gdW5kZWZpbmVkID8gcmVuZGVyVGFyZ2V0IDogbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcbiAgICAgIG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICBzdGVuY2lsQnVmZmVyOiBmYWxzZSxcbiAgICAgIGRlcHRoQnVmZmVyOiBmYWxzZVxuICAgIH0pO1xuICAgIF90aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSBcIlNhdmUuVGFyZ2V0XCI7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVuZGVyIHRhcmdldCBzaG91bGQgYmUgcmVzaXplZCB3aGVuIHRoZSBzaXplIG9mXHJcbiAgICAgKiB0aGUgY29tcG9zZXIncyBmcmFtZSBidWZmZXIgY2hhbmdlcy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVzaXplID0gcmVzaXplO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoU2F2ZVBhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVGFyZ2V0KTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoaXMgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIGlmICh0aGlzLnJlc2l6ZSkge1xuICAgICAgICB3aWR0aCA9IE1hdGgubWF4KDEsIHdpZHRoKTtcbiAgICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5yZW5kZXJUYXJnZXQuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiB0YXNrcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhbHBoYSAtIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwgb3Igbm90LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbml0aWFsaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7XG4gICAgICBpZiAoIWFscGhhKSB7XG4gICAgICAgIHRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0O1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFNhdmVQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIFNhdmVQYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIEhhbGYgUEkuXHJcbiAqXHJcbiAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgSEFMRl9QSSA9IE1hdGguUEkgKiAwLjU7XG4vKipcclxuICogQSB2ZWN0b3IuXHJcbiAqXHJcbiAqIEB0eXBlIHtWZWN0b3IzfVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxudmFyIHYgPSBuZXcgVmVjdG9yMygpO1xuLyoqXHJcbiAqIEEgdmVjdG9yLlxyXG4gKlxyXG4gKiBAdHlwZSB7VmVjdG9yM31cclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBhYiA9IG5ldyBWZWN0b3IzKCk7XG4vKipcclxuICogQSBzaG9jayB3YXZlIHBhc3MuXHJcbiAqL1xuXG52YXIgU2hvY2tXYXZlUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBzaG9jayB3YXZlIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIG1haW4gY2FtZXJhLlxyXG4gICAqIEBwYXJhbSB7VmVjdG9yM30gW2VwaWNlbnRlcl0gLSBUaGUgd29ybGQgcG9zaXRpb24gb2YgdGhlIHNob2NrIHdhdmUgZXBpY2VudGVyLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc3BlZWQ9MS4wXSAtIFRoZSBhbmltYXRpb24gc3BlZWQuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1heFJhZGl1cz0xLjBdIC0gVGhlIGV4dGVudCBvZiB0aGUgc2hvY2sgd2F2ZS5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMud2F2ZVNpemU9MC4yXSAtIFRoZSB3YXZlIHNpemUuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmFtcGxpdHVkZT0wLjA1XSAtIFRoZSBkaXN0b3J0aW9uIGFtcGxpdHVkZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gU2hvY2tXYXZlUGFzcyhjYW1lcmEpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgZXBpY2VudGVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBuZXcgVmVjdG9yMygpO1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFNob2NrV2F2ZVBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoU2hvY2tXYXZlUGFzcykuY2FsbCh0aGlzLCBcIlNob2NrV2F2ZVBhc3NcIikpO1xuICAgIC8qKlxyXG4gICAgICogVGhlIG1haW4gY2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtPYmplY3QzRH1cclxuICAgICAqL1xuXG4gICAgX3RoaXMubWFpbkNhbWVyYSA9IGNhbWVyYTtcbiAgICAvKipcclxuICAgICAqIFRoZSBlcGljZW50ZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1ZlY3RvcjN9XHJcbiAgICAgKiBAZXhhbXBsZSBzaG9ja1dhdmVQYXNzLmVwaWNlbnRlciA9IG15TWVzaC5wb3NpdGlvbjtcclxuICAgICAqL1xuXG4gICAgX3RoaXMuZXBpY2VudGVyID0gZXBpY2VudGVyO1xuICAgIC8qKlxyXG4gICAgICogVGhlIG9iamVjdCBwb3NpdGlvbiBpbiBzY3JlZW4gc3BhY2UuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1ZlY3RvcjN9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5zY3JlZW5Qb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc3BlZWQgb2YgdGhlIHNob2NrIHdhdmUgYW5pbWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLnNwZWVkID0gb3B0aW9ucy5zcGVlZCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zcGVlZCA6IDIuMDtcbiAgICAvKipcclxuICAgICAqIEEgdGltZSBhY2N1bXVsYXRvci5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMudGltZSA9IDAuMDtcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzaG9jayB3YXZlIGFuaW1hdGlvbiBpcyBhY3RpdmUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEEgc2hvY2sgd2F2ZSBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1Nob2NrV2F2ZU1hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuc2hvY2tXYXZlTWF0ZXJpYWwgPSBuZXcgU2hvY2tXYXZlTWF0ZXJpYWwob3B0aW9ucyk7XG4gICAgX3RoaXMuc2hvY2tXYXZlTWF0ZXJpYWwudW5pZm9ybXMuY2VudGVyLnZhbHVlID0gX3RoaXMuc2NyZWVuUG9zaXRpb247XG4gICAgLyoqXHJcbiAgICAgKiBBIGNvcHkgc2hhZGVyIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtDb3B5TWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jb3B5TWF0ZXJpYWwgPSBuZXcgQ29weU1hdGVyaWFsKCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIEVtaXRzIHRoZSBzaG9jayB3YXZlLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoU2hvY2tXYXZlUGFzcywgW3tcbiAgICBrZXk6IFwiZXhwbG9kZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBleHBsb2RlKCkge1xuICAgICAgdGhpcy50aW1lID0gMC4wO1xuICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdmFyIGVwaWNlbnRlciA9IHRoaXMuZXBpY2VudGVyO1xuICAgICAgdmFyIG1haW5DYW1lcmEgPSB0aGlzLm1haW5DYW1lcmE7XG4gICAgICB2YXIgc2NyZWVuUG9zaXRpb24gPSB0aGlzLnNjcmVlblBvc2l0aW9uO1xuICAgICAgdmFyIHNob2NrV2F2ZU1hdGVyaWFsID0gdGhpcy5zaG9ja1dhdmVNYXRlcmlhbDtcbiAgICAgIHZhciB1bmlmb3JtcyA9IHNob2NrV2F2ZU1hdGVyaWFsLnVuaWZvcm1zO1xuICAgICAgdmFyIGNlbnRlciA9IHVuaWZvcm1zLmNlbnRlcjtcbiAgICAgIHZhciByYWRpdXMgPSB1bmlmb3Jtcy5yYWRpdXM7XG4gICAgICB2YXIgbWF4UmFkaXVzID0gdW5pZm9ybXMubWF4UmFkaXVzO1xuICAgICAgdmFyIHdhdmVTaXplID0gdW5pZm9ybXMud2F2ZVNpemU7XG4gICAgICB0aGlzLmNvcHlNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICB0aGlzLm1hdGVyaWFsID0gdGhpcy5jb3B5TWF0ZXJpYWw7XG5cbiAgICAgIGlmICh0aGlzLmFjdGl2ZSkge1xuICAgICAgICAvLyBDYWxjdWxhdGUgZGlyZWN0aW9uIHZlY3RvcnMuXG4gICAgICAgIG1haW5DYW1lcmEuZ2V0V29ybGREaXJlY3Rpb24odik7XG4gICAgICAgIGFiLmNvcHkobWFpbkNhbWVyYS5wb3NpdGlvbikuc3ViKGVwaWNlbnRlcik7IC8vIERvbid0IHJlbmRlciB0aGUgZWZmZWN0IGlmIHRoZSBvYmplY3QgaXMgYmVoaW5kIHRoZSBjYW1lcmEuXG5cbiAgICAgICAgaWYgKHYuYW5nbGVUbyhhYikgPiBIQUxGX1BJKSB7XG4gICAgICAgICAgLy8gU2NhbGUgdGhlIGVmZmVjdCBiYXNlZCBvbiBkaXN0YW5jZSB0byB0aGUgb2JqZWN0LlxuICAgICAgICAgIHVuaWZvcm1zLmNhbWVyYURpc3RhbmNlLnZhbHVlID0gbWFpbkNhbWVyYS5wb3NpdGlvbi5kaXN0YW5jZVRvKGVwaWNlbnRlcik7IC8vIENhbGN1bGF0ZSB0aGUgc2NyZWVuIHBvc2l0aW9uIG9mIHRoZSBlcGljZW50ZXIuXG5cbiAgICAgICAgICBzY3JlZW5Qb3NpdGlvbi5jb3B5KGVwaWNlbnRlcikucHJvamVjdChtYWluQ2FtZXJhKTtcbiAgICAgICAgICBjZW50ZXIudmFsdWUueCA9IChzY3JlZW5Qb3NpdGlvbi54ICsgMS4wKSAqIDAuNTtcbiAgICAgICAgICBjZW50ZXIudmFsdWUueSA9IChzY3JlZW5Qb3NpdGlvbi55ICsgMS4wKSAqIDAuNTtcbiAgICAgICAgICB1bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICAgICAgdGhpcy5tYXRlcmlhbCA9IHNob2NrV2F2ZU1hdGVyaWFsO1xuICAgICAgICB9IC8vIFVwZGF0ZSB0aGUgc2hvY2sgd2F2ZSByYWRpdXMgYmFzZWQgb24gdGltZS5cblxuXG4gICAgICAgIHRoaXMudGltZSArPSBkZWx0YSAqIHRoaXMuc3BlZWQ7XG4gICAgICAgIHJhZGl1cy52YWx1ZSA9IHRoaXMudGltZSAtIHdhdmVTaXplLnZhbHVlO1xuXG4gICAgICAgIGlmIChyYWRpdXMudmFsdWUgPj0gKG1heFJhZGl1cy52YWx1ZSArIHdhdmVTaXplLnZhbHVlKSAqIDIpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5zaG9ja1dhdmVNYXRlcmlhbC51bmlmb3Jtcy5hc3BlY3QudmFsdWUgPSB3aWR0aCAvIGhlaWdodDtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhTaG9ja1dhdmVQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIFNob2NrV2F2ZVBhc3M7XG59KFBhc3MpO1xuXG4vLyBHZW5lcmF0ZWQgd2l0aCBTTUFBU2VhcmNoSW1hZ2VEYXRhLmdlbmVyYXRlKCkudG9DYW52YXMoKS50b0RhdGFVUkwoKSwgbm90IGNyb3BwZWQsIGxvdyBkeW5hbWljIHJhbmdlLlxudmFyIHNlYXJjaEltYWdlRGF0YVVSTCA9IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFSUFBQUFoQ0FBQUFBQklYeUxBQUFBQU9FbEVRVlJJeDJOZ0dBV2pZQlNNZ2xFd0VJQ1JFWVJnRkJaQnFEQ1NMQTJNR1BVSVZRRVRFOWlOVUFxTFI1Z0llb1FLUmd3WGp3QUFHbjRBdGFGZVlMRUFBQUFBU1VWT1JLNUNZSUlcIjtcblxuLy8gR2VuZXJhdGVkIHdpdGggU01BQUFyZWFJbWFnZURhdGEuZ2VuZXJhdGUoKS50b0NhbnZhcygpLnRvRGF0YVVSTCgpLlxudmFyIGFyZWFJbWFnZURhdGFVUkwgPSBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBS0FBQUFJd0NBWUFBQUFCTm1CSEFBQWdBRWxFUVZSNFh1eTlDYmhsVjFrdE92YnBxMDlEa2lJa1VCSTZreEFTSUgwRGxBUWlJSzF3UmZTSlR4K2k0Slg3dktJaWdzOEhYcFh2cVZjdnJjQzlhZ1E3SURUU1NXZ3FDUVFsaURSQkpLa2toRFNrcVZQTnFWT25QKzhiLy9ySDNQK2VaKzE5OXRsem5WVGx2VnJmdDcrMVQ3T2F1ZVpZNDIvbTM3UUFMS05rMndIZzFwSVRsQjE3bUMrUHAxMVczWC9MSHlUMzJ2aGc0OC81U092K1Bud3BzSEE3MEpvR2x1ZUIxaUtBcGVxenZPem40NEdhdFRCNzZYemhkN3N1QlI3K1dXQURnREVBd3dDRy9MNTRiL3BvRExySHV2dm03MFoyQXZoc2MrUFZjeHNjQlU4RjhDOEFEZzUraXBJakQvUGxHd2ZnanU4QjkyNEU1c2VBUlVmTHNpTm1xUVcwSWpMOCs3TDJOWUQvN0NPQnpmY0NtK2FCOFNWZ2RBa1lJUkNYS3lEYXg0RWRBYW5MNVB1TlBsbE52WERsQUh3RmdQOEFjQzJBaFJJb0RYYnNZYjQ4ZGw1V2tWRlRFM0xHRGNDOW00Q1pDV0J1RkZnZUFaYUdBWUpRUUNScURIVCtNY0pyVmI4endBVFVYSDAyTUhZZk1IRUlHRnNBeGdqQXBRcUFDWVFPUmp0ZC9CN0F4dC96NzlzQzArY01QZ2pqbHdQd1Z3SGNBK0RmQUh6VHhjVmdXQnJvcU1OOCtjWUJlTTcxd0gwVHdLRXhZSFlVV0NJQUhZUkxUbGtDWWdjSUJjQWdVL24zcXk4R1J1NEhSZ25BT1dCa0VSaGRkUEFKaEdKREJ4a3Z3N2NxaW1yK3pGTS9aTG5aRjY0Y2dMOEJZRCtBV3dCOHgvZGxXdVdhZ0hpWUw5ODRBSi8wUldCeTFBRTRBaXp5TTF5eFlBY1RpZ1c1NXhNYkFreEVpd0Vka0ovWkNReFBBaU9IZ0JFQ2NLRUM0VEJaY0trU3YrbVRpZU5jTlBOQzI2bUxOc2o0NVFEOExRRFRBTzRHY0p0LzdpdzJiZm9HNFdHK3ZBR3dtOUV4aUVnNjl6cGcvd2d3UFFMTWpnQUx6bjRFNGFJem9KalE5ZzQwMjR1eWdraitweXVBb1gwVkFJZm5nT0g1TmdDSE1oQW04U3YyeTNYRFplQmhOSXA4T3pKRThPc0J6QUtZQkhBWGdEdDgvNE8rTVZUMGo0ZjU4bzBEOFB4cmdmM0R3TXdJTUVQUUVZUmtOd2Znc3V1RFpMc2tpcDBObzBnV01ELzlIR0RvQURBa0FDNEF3L3dzQWdaQWdzMlowQUJJMEdVNklWbUt2K2YyOEtEbkh4a0EvRzBBOHk2RzczTjlrT0NqWG5oL0ViYjZPdmd3WDc1eEFGNXdMVEExVklIUEFEZ01MRGo0eUlBNUFBbTZhQ1VudjRvejQ2ZWVEd3hOQVVNendKQXo0QkFCU05ERlR3U2ZnN0RES0hFMjNNRzVQcUlZOEExdS9kSU5zOWRCZHk4QWduR1BNMk5mVUJyc253N3o1UnNINElYWEFBY0p2aUZnbHVBYnlnQklOblNMV09Bakd4SjRwZ09LRFYwdi9PU0xLcDhpR1hCb3ZoTEJCT0NRTTJBQ29UT2huWXJBZEl0WWJDaWo1SkZ6UnlJQXFSY2NBbkRBUVVqZzZVTlE3aHNNWFAwY1JRQWV4c3MzRHNDTENFQ0NMd0NRek1jUHdVaTJNd0FTY0FLYmZuWS9ZUkxGUThESFgrSUFKQU1TZkRrQUYxM2tMdmxlSWpoalFRSHhVVlMzampnR3BLZWVOellWUUVqZ1VTOGsrUGdoT05kaEl3QVA0K1hYQllDSEtJSmJ3SnlEVGdhSUFkQ0JKeDNRMk04dFlBSFA5bTRkZi95bFFPc1EwSnF0UkxDeDMwSzF3dExCZ2dTY1FPZ3NLQkdjV0hBSmVPd1JDMEJTTTFtUUlLUmJoaCtCajk4SlFQNnQ0VTBBUEV5WFh4Y0FFbnhrUUFGd29WVXhJRDlrdlFnK2MxQzd2aWRSYklEa2MyNEIvL2hUUUd1bURjQ1dBNURnTXhBU2ROSUZCVUk1cENNTDh2OEFQSTV6ZkVReDRCdWRncWljenZpU25KaFF3Q1A0Qk1DR2wrd084K1U3QUppL1c0TzRZUzYrcG1LLzJjaUFEc0FPQmhUSUlpQUpuUEI3QXZOalArMEFuQU5hWWtBSFgySkJBYyt0WWFKWE9xQlp2MjRWYzM4NlhXNWR0a0hHVys0SEZBSm9ucE9lK1lZUVpBU2hnS2p2M1BOdlBRYXhWb0k4ekpkZkZ3QVNmUHpNVXdTM0t0MXYwVUZJbG9zNm9ERmRBR0ZjbGlNQVAvcnlBRUFHTndRUm5ET2dMYmRsSUV3cklzNkFaL1Fna01NSFFGNlpBS1FjSkFzU1lQd0llQUlrOXdKZ29QSzFnaTcrUHdGNEdDL2ZPQUF2SVFQU3MwVVJUUEJKL1BwM0dTRUdSSGZCQ0lRMHhvd0J0VWJjQWo3eXM1WDRKZnUxSElBR1FySWdRUlhFc0FGUUlPUkRGaGlEWS9yTUhtclU0UVVnUjA4QWtnVWpDQVc2Q0Q2Q2t3QnNBSVFDNEdHNmZQTUEzT1hpTnpDZzJJOWdOQ01rc21BQW9lbUR6b2ltRndMNDhNODVBS2tpdVFWTUFBcDhDWVJSREF0OEdRaUo2N042R0pPREFYQUhsc0dndXNjQTJBSmcxSVBHWW14T3BCeEZXa1JOOUxzQVRnSXdYbk5zL3YvNXovOVhDZjhCTzNZQXR4YmMvNDYvS0R0KzUrZWExWWt1MlZVeEh6L3owdjI0RndNR0sxZ1dzSzJPVVV4SEhkQ0JlUlVCNk94SEFCcjRaSUNJQmQwUVdTRitYUmRNVEFqZ0NkVHJHOWNCTndFNEY4Q3BEa0lDeVlMR3N1aEZ0NnpzK2dJU3dVZW44ekVBamdNdzRjZngySDZPLzkweUFGbzg0Q2JnNElEMy85VGZMVHQrNStlYm5SQUJrT0RqeDBTd1BpNWVjL0ZyWXBtcVNBeE04RG42MENzcUFGSTZHZmhxQU1pREUvZ29rbXZFcjBDNFBnRGtCUW00MHdFOHpNRkVVREtFVm94SU1MbC9LUzczbUU3SDlkK3ZjS0hRUWNqd1cwWXU5blA4bThzQW1PSUJ1V1k2d1AyLzRzMGV6ampnOFR1dmFSNkFCSjcwdnhVQXBHcm03RWJHRStpNDcyQkFCK1dIZnFIUy9lb0FhRXdZMkU5K3dMU1hUcWhJN0NYZ25CNkxDb09KNEJpU1QraFRuRzBIY0N3QWdsQ3gzQVJvWkVWRlhuQlBwL08vQS9oWEFDYzdDUHM5L2kxbEFPeUlCK1JEWCtQOS8rcGJRampqQU1mdi9QTDZBRkRzMXdGQWdzLzlmZ0tmZ2RFL1pFcHVpUWxid0FkZTZRQU1CZ2lSbXNTd0E5QlkwSmZqb3ZHUkRCTUg0VGxjWEdoY0JPYzZIa0YwZ2pQaFpnY2h4VExaTUFjaS8wNFcvQjZBYjN0MDlFUFhjUHlmbGdGd1JUd2dKMk1OOS84YmY1cUZNNjd4K0IvYVc0WFF6NDJGZUwwWXJSeWlrenRVRncwNzA0bWY5a1hneGhPQXFjM0FBc1B5Unh4UUNzL1BkWE9GWTBXMUtIeTNRSVVHdHgrNnZkbngxdnNCK2RzVG5jbTJBb2dnbEZnVkVBbFVXck9NQjJSeUVtTUNHUS9ZNy9IdktuczZ0ZkdBbkpRK3IvOWI3Nm9KWjF6RDhXZHlRallCaDhhQmhWRUhqRUxvdVE4dWtRN1ZSU0NKQUFMd2tyK3NBTGhuR3pERDNKQUpZSkhnOXVob2k0Yng4eXRrV1V0dkhULzcrWmM0ZHcxdVozNjEyZkgyZGtRZjd5eElFRW9ja3drSlFuNElRb3E4dW5oQWhtUFJLS0Z4MHV2NEs4dWVUczk0d0Q3dS8vVlg5Z2huN09QNGMrNEc3aDhIcHNlQitkRjJBS2xGTHd1QUlaOGpENk5Qck9oQWZmbWZBOS9aQnV6WkNreVJXU2VxQkNXeW9ZR1E1eVFyQnBEYnVtL01FMUhvUG8wWEVrU0QyemxmYm5hOHE2K0VVSmNUQ3hLRXRITDVFUWpQNkJFUHlJZ1lBWkJ2WXQzeEh5eDdPcXZHQTY1eS83Lzl3VlhDR1ZjNS9zbDdxeEQ2NmRFcWlZZ1J6QXFoTjFBNENCTkFBbER5QUZJK2laOS9OM0RMSnVDK2pjRFVCbUNXeVVuT3JtVFlDTUlPa05jbExnMEI4L1JzTkxnOStVdk5qbmQxQVBMbW1RcEZIeUVCUk91V0FDUVQ4bk4rSC9HQXZZNy9WTm5UNlNzZXNNZjEzL0NwYWhHblp6aGpqK1BQbXdYMk1ZZERJZlFleFd5QkF3RVVPUURyUkROLzk4cDNBN2R2QU82ZkFBNXNxSEpEQkVBeW9VVkdrd0VkNkhSMTJYVTRrd3pmbDZmQ1hUWnpqeTU3dnZuUjUxM1g3SGo3QXlEdmdnQVVpOUV5RmdpWnFOeFBRRjYzNDVuT1diRDFIUS9ZNWZwdnVMYS8yKzgyL3ZOSGdBUERGUURuaG9GNWoyQzJxQldDSThidzFlUnc1Q0w1bDk0TDNERU9USTREQjhZOU9XbXNFdS96QkozcmdzYXlicUJvYi83QTRDN2p0V2Nvb1JyY3pyK3UyZkgyRDBBT1FnQVVDeEtFUDdhR2dMeTY0K202S2RqV0ZBOVljLzAzL09zYTRnbHJqcitBdXBxSHoxc0VzMGN4RzBCQzlISWVQTG9pdDllTmtWZjlMK0R1VVdCeURKZ2FxNHliR1lMUEFXZ2lYbUxlZFVFN2R3QzdzYUw3Q3FmUEtYaTROWWRheWtDRDQxMGJBSGxERXNOaXdaOXdBUFlia0pjZno2VDJnbTNOOFlEWjlkL3dIeFVBKzczOWZQd1hQclNLWUdiK0J1UDNqQUZERWxGSDlISVd3YnpDSUdrQnIvb3I0SjRSWU84b01PVzZaVmNBdXZpMUNnb2hhMDRCQ3dUNWdmTUtIbTdOb1JkZTIreDQxdzVBM2hRWmtBRGs1K2NHaUFlTXgzKy83QUVORkE4WXJ2L0c3MWNBWEZNNFl6aitvdE9BYVFMUUEwZ1p4YUlJWnRNREZUaWdLSlY4SDlJcTZhWjU5WlhBdlNQQXZwRUtnQlR0Qk9EY1NDV0NaZVJZdHB6cm1MeWVHTkNBeUZsMXYrSGVpOHFlYjM3MFJkYzJPOTdCQU1pN0VnQi8yUUc0MW5oQUhVOUx1V0FiT0I3UXIvL0dQUlVBMTNyN0d2OUZad0lNb1ZjRXN3RXdmRG9pbUVQMHNoS0t0SXBoYVpRQVh2MStZTSt3QTNERWRjdlJLa0dKQURRUUVzUXVoaTFUanQ5NXZCc2g1bngySU81OVNzSERyVG1VT1N0TmpuZHdBQXFFcnkwSXlDTUlDa095aXVJQk53QnZQRlFRVDdnQnVQamM5b1JZQUlIeU9FTDR2SUZFWVZOYU9vdTV2Q0dFL3RWL0Ewd09WY25wekk0N05PcmkzUUZJQnBTZWFTRFVkWUxPU1d2WUltU0dnZnRwSkRhNE1XSmJBR3hpdkdVQTVNQU9jMEJlNmVWTGo3LzRNaytoekNPWVBZcFpEQmlOa0xoK0cvTTN5Rnl2L2x0Z0wzVzNZUWZnY0ZVaGdSWTJQd1krWjcvRWhBUjFTRnlYQ09iNTdyMjhRZlFCc0pRQk1uNUQ0eTBIWUxQamU5Q2Q3UklDMFBNM0VpTW9mRjRnVkNCcDFQODQwaXgvZ3l6NTZyK3ZBTWprOUdsMzc1aUI0K0N6dmV1WmRMa2tFUEo4WkVmWC82Ujczdk9qelQ1U2k5aHVjTHhIQVZnNFB3SmdSd2g5Q0tPWEs4WUE0WkVxS1pYU1FXaDVQKzVBZnRYZkEvdUdLdllqQ0tuNzJjY3RiRnJaTkVDa2E1TDVDUHdJUHRNSDNUVnoxN01MQjVnZExnQTJOZDZqQUN5Y0h3TFF4RkVVU1I1QVN2QVJEQjBoOUFRYjliWElnQ0drNmxVZkFQWVRnRVBBSVRLZ2cxQk9iazU4c3JUSmdHNThXTWtXTWFBYlFRVDFuYzhySEdBTkFKc2M3MUVBRnM0UEFhZ1Flc3RnQzFsc0JKNEJNQ1NPSzZkRFVjd3FxYUZpUXIvMFFlQUFBZGp5K2pCaVFRZWVNU0JaVDNuQ1BVRElhOXorL01JQjFnQ3d5ZkVlQldEaC9CQ0FlUVN6Z2tqRmZHTEJCRDVueFE0RHhOMHd2M2hWeFg1VEJHRHdMNW9ieHZWQTVZcVlMNUJlTUxkNjZZWXhKcFJCMGdLKzk2TENBZFlBc01ueEhnVmc0ZndJZ01yaFVQS1EyQytCejBQbUJUcUJNUWVoQWJEbElqajRGODBLSmd1U1ZaMEZ1WHBqb0NPZ1hhd0xqQUxoYlQ5ZU9NQXVBR3hxdkVjQldEZy9sMUlFMDVFZDB5Z1pueUhkejBWd0NxRVBJZk55eDBRUXZ2TERGUUNwKzhuZlprNXVuZDh0WHdJZ1djSFNOWDBOMkNKbW5BbDN2NlJ3Z05uaGwxN1Q3SGlQQXJCd2ZnaEFTN21WL2hleTJKUzlGdk0zQkxwVVVpMVl3RFJNWHZrUllKb0FsQWgybDBkY1owNHM2SlVURElqeUJjcmw0eURjL2RMQ0FkWUFzTW54SGdWZzRmeHdLVndKZ0dFSk5tV3R4cFFNcFg5b24yZVJoVkErTzU2QWpNZm5QK2UzWHZmM053RzR4SVBUbGVpWTU1YnBHaDZVYmFmTlUwbDB6MHArNUpoNUhxWUo2YjUxblA2WFA4Y3gxMlhOSFFWZ0lRQi9iRlBWZzJPQzdRK1dnVkZXbmcvRnZ0V0xJMDZ1V2g1b2d1S0VjWFZTLzlzRUFGLy9WR0Q3dDRFVERnSmJGNENOaThDR1pXQnMyZlBML0g2VndwMktFdFZrNGZKK3YvRUlZUE45d0thNXF1K0luY2ZQd1hIVlplL2FPTDNFYndTN3h2OEExclF2bk8wajhQQXJUZ1RHWjRCeEZ2OW1JeGhPQ0dzdiswT1BZRFJnaGNMZmtXa0V1cTArRzAweDRPdGZER3orZDJEYkhtRExqTDhzaThBWVAvN0NHSUFpRUVNVEc5MnpYcVNiSCtkOVIyYUEwWG52TytKanRoaUlyT1ZESEhQT2tCcnpVUUFXQVBzWnAzb1BEcGEvWGFnNkVWa0xCSys1ckFuSkMzL25Zay9BUEQ3MDRXaUVBVjhPVEh3WDJMUUgyRGdGYkpnRk5yQmhqZDhyNzlkZUdvRXdzbGxnTkJPenk4Q2Rqd2VHOXdCajA4QUlBY2kyRDZIYWZteUFrNC9aN1NKNzJoR1lSd0ZZQU1ETFR3T0dwNEZSRmdEM0hoenFSR1FpeWV1cnFPZEc2cjBSbThJRVpqelJsa2lxQ1dvRWdLOEF4bTRCSnU0SEpoeUFiRmhEeG1iREduWk80ajBTZ0xHRGtwaWJnRXE2NlRKdy8xbkEwRjVnZExwcSt6RHFGZmQ1TE1lV3F1NUhOU1QwdUpPSWxsZytxZ01XZ0krSFB2MHh3TEEzZ1dIcFcyc0M0NDFnQ0VDYm1LemlhR3JuVWRNTzRhSGVoNk14QVA0U01ISTdNTDRIR0Q4QWpIdkhKR05BZ3BEZ1kvY2szc3RpcFJlbXZWaGMrdUFTTVBVRVlHaC85ZElSZ0d4OFkrTU5iUi8wMHVWdEgwd0V4OTRqL3Ywb0F4YUE4RWQrR0JpZUFZWlpnNWtBREMwUVdHT0Z6R0psY0dQemwxQnhOTFhEOHNrNHhmdHdOQWJBL3d3TTN3R01VbXhPT1FCbkhYemV0SVl2aWJvbm1TaXVZVE5qcmlWZzdnbEFpd0JrMGZOWkg2K1BtWDlQNmtmTm1DWEdwZnRKN1RnS3dCSUFubG4xNEJBQVl4TVltNUM2UmpDeUNvT3lyMHFrRC9jK0hJMEI4RFhBOE4zQXlDUXdlc0QxVlFLSDdFY0FTbTFRK3k0Q2tOOXBVS2lWRjVuTHZ5K2ZCYlRVZDhRQmFIMUh2TkJST2ladmZzTm5yRjRrY3ZQd3Bkc0JMQmVVMThOZjdBQjIzRHA0ZWNIQzhvQmdVbEpKZWNMUys3K1dPcEUzZ2JFK0hLdyt5b2V2Q1lrTUdLcVBKcmRFS0FSdXRhRllSczFmaUVaMHdQOENETjhMRE84RlJxWXEzVzEwcGdLZ2ZZTGFZQ3pvb3RnQTZLWGFUQTkweTM3NFRLQjFzQm96eTc3eEhGWjUzNnV0UmdBbUVhdzZnNWtVU0Zad1NYbkEzMzBxc09sZmdITVBEbFplc0xBOElPam9MeXBQV0hqLzExRW5DaVZ3a3o3a0FFeHRzR3JhWVVXZFNEWDVUbXNhZ0w4S0RCR0E3QmQzMEpzVzBvV2l2bkVPUU5QN3lHVFNCUjEwMUFsWlNVdEd5ZmdaRGtDV1kxSG5KZGNCVmU2MzI1aFR2ZWxnMkNRalpORHlnRy8yQW4wajF3S25MNnk5dkdCaGVVQzhwclE4WWVIOVgzOU9WUVNjN01jNmZDYUt2QWVIZENJVmY0eU1ZQ3luVHBYK25iOTdOSm1sU1FiOHI4RFFIbTlZT0ZVWlRLT3pvWEdoczZBeEYwSElleGNMQnZXQnVpSE44czJuZTk4UjNxYzZMNFZ5YjJvQlZqZm05TUlGSGJqRENoNmtQT0JiUW9HK29XOENPNWJXVmw2d3NEd2dmcjIwUEdIaC9YLzFpYUVJdURjQ1RJVy8xUTRyRnY4T25ZaVczYytXMmlLd1VqS2J5alFOd0wxdXVSNnNBRWdEZ3ExYnJYT21WODFQeGhOQjZEVURCU1l6UUp3RnR6NjIzWGNrdFgxUTFWV0thVEYvelpoVmF6QlZZQTF0WDVNYXpzR3ZvYndlL2pRcjBOZTZCVGg1dWYveWdvWGxBZkc2MHZLRWhmZi9yU2UxaTREblRXRFVBQ1kxZ3VGVERxTFlkQ0J2ZjZESllTTVlBVEJmT3gxa0xmajF2MWF4SDEwblEzU2QwR1VrQm5UZnBlbXRCSmdzZUlLUUFITFFjVnhhMlRudU1XMEFxdWk1ZXM4eEJJZWdWZFZWRThWaHpIbkxoNjVXTUI5QW4rWDE4SzZhQW4ydE80RVRsNnZxYkt1VkZ5d3NEd2hldnFnOFllSDkzL1JrNzBKRTkwbm93eFpiSUpqdlMzV1lOU0dVd0dISlRwUHh3d2NiQnVCcmdSWUJlS0FDbjdWdHBkVXUvYzBOSnhPOUJJeGNLdTRUVE9EemJrb25QTG9hTDB2eVVRUmIyeThIc0wxY2tmV3pNZXVGaTQwUWV6cWkreWlQaHl0N0ZPanI2L2dDRndnUDdYYjV2c3NURnQ3L25RUmc2TUdSV21EUm9leVRscGd3NjhHUlR3Z1pnbzFnR21YQVg2LzhkdGF5bFNLWS9rb3lJRDlCaHpNTDNxMWdBb3MyQWNPclpZU29xL3BKcDFWdE9EUm05WjNMUy83V2pWa3ZYT3pFdE9wS3lHcmxBVCs0U29HK1ZZOHZCR0N2eS9kVm5yRHcvdmVlNjVOQkppQWpCSVZjQUpRak9tK0RrQ1pFZWlHQU13NnNBd0Rac0pyQWRoRk05clBHaGQ0OTA0Q281b1Z1Q1pQVjZrRDQwRWM2KzlXOGRCVEJzZmRjM25rcHZuQjgyZnAyUlBjczc5ZEhnYjUxTEE5b2ZzRFY2dnV0NS8zUG54Y0FtTFZCaURxZ2V2RGFKTGtZcnB1UXh6Y053TjhBV2dJZ1JiQjhsb0VCelhEd2w0Y0dpREdmdDU4U0NPV0dlZGdqdk9KK2JQdmdSa2l1QStaanpoblFRT2lGTlZibG9hN2wvZm9zMExkTzVRRU5nRVhsQ2ZzOFFiZjdIeU1BM1FWallpaFloTEVOZ2pYOXkvcXd4UW1SVS9hc2ZkMFpjTFUyQ0hWR3l1c0pRTEtmVmk5OENTMTJUNWY3aUVDa0hwc01rQWhDRjgrbnNoV0gySS9qWHNPWU8xNDRHVi85QXBBSXJTM3Z0NFlDZmV0UUh0QUEyRysvNFBXNC8yUFBiek1nbVVNaTJOb2VTQ1J4SXQyL0Z2dXhXVVJJV0NYZzM1N2dmVGpFRE5JSG5UUlhSQ3BINXVnS3dHbDNIcE1CWFFjMHY2V0xZVm0vNWxpbWowNHJHNzYySzJ1WVk5akJrcjkrckkwM05MNVpiY3pTL2RKK0xReW9nYTRvNzdmR0FuME5sd2RNQU95M3ZsL1Q5MzhLQWNqMTIxejhCbitZOWVXUUpSejhZNmtOYWdEaDJleTVFdnhqeFFEOFRXZEF1bmVDQ080QW4xdnc1dmR6UU1tZGt0d3E3cExaUVIrZE0zNCtadW1BeHZZMVkwNHVxT0FKNkZzRXh6ZXRvN3pmQUFYNkdpd1BhTFdSMWxyZnI4bjdmL1JsM1FHem1zaXMrL3VPNzFWOU9GZ1AyZ3BQaGdyN1RHUnFSVVQ2ZHl2cjRhSXMvcG0vMnpWVU5iQlN2Nkc4ZTVwRXYwQ3ZlYzdQbzcrYlR0amxCUmxrdkFNQmtEZVF5dnNOV0tDdm9mS0FDWUJycmUvWDFQMC9vV0VBbm5GRDFZZGpodFh4UjczbVgxMEZmQ0hIRTlwVldjR0FJL1MwZ0tzZkEyeSt0d3JGWnc2SHhmL0YwUGs4Umkva3BHU25NdUR4NVQwaUFDZ1FIaW9vME5kQWVjQlVIVzZRZHNWMi9jTDd2L0N5cXI1Z25jNDJDQ09jZlgxVklaL1Y4V2U5SURtVHpWWHdQREppWHVLWFB4dERCbWE4K2x6UDRXQWdLa1B4Q1VBUEU0djVHekV1TVgwUFlKUExoQjZGSnNjN01BTW1rVnhhWUMvSzlnRytGMSsrOEFRN0d3YmdrNzhJN0dGcFhnSXdGaVJYT3dhSlpQVWJpUjB5Q1VEUmsrY0hmK1lwd01qOUhnZkk4Q2xHUHl2c1NpSDBXU0tSdVlsaXRMYi96SE0vSk9TczVDL1lJQzljTVFEWnIvZHd4Z09XOWd0R1lVQmkwd0E4bDMwNHZEUXZBY2hpbEZicElCUWhaN0VqcTZaUTAvWWhpbDh5NGo4OUF4aWU5REFzRDZGWDlIT0szUXRST1RGa3ZpTjgza0c0ZmVsSVk4RENlTHJTZU1EU2ZzRW92QUVDVUZzVGpIRCt0Y0IrdGtGZ2NYS3ZCUmlyN3F0Rmw5b3dtTzRYeS8xRzNiQUZmUHJaSG9yRk5XQkZ3SGpRQUZjdElnaGoya0JhcncwNklmLytNTTlacVRONkRnc0RvakNlcmpRZXNMUmZNQXB2b0drQVdoOE9iL3RnQVBTS1dDcDhuZ05RdGFkam1UZGx0dk52bjNwZUZZaGdRUWdoK2lVbUVhVUFVb1hNMXlSTG1XdUZMYUU5WitYSUFXQmhQRjFwUEdCcHYyQVUza0RUQUx6d21xbzZxdFZoOWtKRXJBdWRBQmlhMzhUQzV3SmdTMnhJaEF3Qm4zeWhCeUw0RWh6WGZSWHhZc0RUSjRJdnJOTjJKRk14WmNCelZvNGNBQmJHMDVYR0E1YjJDMGJoRFRRTlFMWkJZSDFBVnNRU0FBVStpbUkxb2JIeWJsbmpHL2tKazNVOEJIejh4VlVRQWhuUUlsNUN5TmdLQUdwNUxLU1NDb0F5U2g1Smo3OXZUYWdjeFVhSUJlUk5lNzlnOWdxK0RYaWc0d0d6eStQT05mVDdSV0ZBNG5vQWtHWFpWQWhjQmNrSlFnTmdyTGlhTmIzcGFJRG8xdkhIWCtvQTlMUUJpNER4SmNPVVBKVW5UZ1UyTkpVeVJPczhpckdBUnhRQUMrUHBDdHNGZDQwSC9BRWYwZ01Ra0xnZUFDVDQxUGlHb0xPS3F5ckpxM0svWWE5bU55cjVGdXNOL3VQTFBJZURhOEJjK3czcnR5bDRWRkhhTVpjM2k5UldCTTlqanpnQUZzYlRGYllMUm1tL1lCVGVRTk1BdEQ0Y0JLRFhCVFFHZEFCMk1HQm84U0NMbUV1UzFBRlZBSjNBL05oUHQwUG9DY0E4YlNERzc2WEk3YXlTZzZKWXVHZkt3SkhGZ0gwRTVCM3VlTUNlL1k0TCt4VkhBT1orOUVIY0VnUWd3YmVpRVl4Nmp3VGR6NHFmdTdFaEVKcXhHcXJ1Zi9SbkhJQUVueGd3Qk0wYUM4YVVBWVdOQlJDbW9JbGw0SFRxTzEyMlFjWmJyZ01XeHRNVnRndnVPeDZ3YTcvandodG9Hb0RXaDRNQkoxNldONGxmcjhBcUkwVFZWMU8xZmE5QmJRem92a0F5NEVkK05nQ1FVU3haQ0ZXdkNPYU9GUkVYeVV3Wk9QSUEyR2RBM3VHT0I2d1BhT3orUVB2NVMrTUEzT1hpTjlhY2xnaFcrZDNJZ3VwQkYycFBxeGN4R2VuRFB4ZlNSaDJBU2lLS2lWUDJQYVpTY3ZBS29BMFZEYzZjT2xJQjJHZEEzdUdPQjF6Ujc3aXdYL0Y2QUZCOU9OU09RVzBmckE1MHNJTFZjY2tXSnlJRFNnd1BBVmNKZ0ZiWXVaM0ZKdkFsRUhiSjNJc2dKTEdlZGVCSUErQUFBWG1IT3g2d285OXhZYi9pOVFLZzJpQUlmREpFSkhxajRTRXhiRXR5MGdrZGhCLzZQOW9aYkJaSUdpS1lWYjlHS2FONTBsUkhCTE92aER4aC81RUt3RFVHNUIzdWVNQjJRR00vZ3JiNy82d0hBUE5HTUFZK0dTR1VqQzUyVlgyZjJDRDQrSE8wZ3FrWmZlZ1hLZ0JhSGtjV3RTMEFXaWk5eEcxSW1yTGxONVhSOEw4Zm1RRDA1QlZybUVFTm1wWVNQOVFYK0tIaXFqMi84MitIcXFEV3duYkJSZkdBVGR6QWVnR3dydTJEcFJxN016cTJmcEFmME5xMFJsMndCWHpnbFo0eVVBUEFtRFNWV0RCUEhRakxjZ1RxT1o2elV2ZEtIaDRydURDZXJveC9EbnU3WXF3WEFDMU5JL1FjRVF1SzZXSy9rZGdDVEdDMFBZQVAvS0lETUJnZ2xxK2hJa3JPZnNhQ3ZpTFNvZmNKZ0o1QWRNN2trU2FDai9IcVFLVklHdkQ0c3dGOGJjQmptempzYVEySDVELzZhY0JkOXdBTEI0REZXV0I1QVZoZXJNcDRHS0lZRU9wNysyNlVGMGFTZlQveFl1REc3d0RqcklwQUVSeXRYZjJ2YWpqN3VlcnlRWFNGbDEwSy9PTjNnSVdEd0NMdmpmR0I4WjU0TytFZTR2ZTY1MTN1QjJSMXl6c3FDK3R3YkM4SGNOVmhmQWVhQnVEUC9Udnd0UzNBL2VQQUlmWUZWbFBxMkhIVHV5dWxaQ1RsaGJqaEVURjV5eFRRR2dQR2hvSGhJV0M0VlNYR0QzbjB0TGtNSFhIeHUrWXlCK01sUHdEdVpzNUs2RmxzYkN6ZFZPOUR1S2ZrSE04QUVrUDdCOGZPa3dEY0QrQjducDQyK0prR092S2RBTDRFNEs4UDB6dlFkRVQwYjE0RDNEZ0IzRDBCN0I4SFprYTlXenJEODhONnNGbStZY1Vqcm43RTFaRHZNdEY5REJnZUFZYUhnU0dCMFBOSENENEJMd0xSc0J5QXlYL2lqMC9kRFV4dXFsSUc1aGl4N2VGaHZMY09WVUF0eVBTeWRBRm1PUU5lNkVZR1YvOVpFU2lLZ0lFZ3RiYUQvZ0hBTFFDNG92WTVyNUt3dGpPVS9YZlRBSHp6THVDbUllRHVNV0R2S0hCd3BNb04wV1F6TnRBYVlTczBLNFpsT1NBakdHOWtQakNCUndaMEFCS0VCSmV4WUFaRUFVM0E3T2kxQmVEeW00RURualExVHdDR1dNVzhNWGNLa3MwWU95Wk5sUU9RamNnWUlVSGxsRXpZUTBrdG0rcjZvejhHNEY0QVh3WHdSZDgva085QTB3Qjh5NjVLbVB4Z0dKZ2NxWUpUS1lwVHYyQ0N6eWRkUUpSRE9qS2l2bitEZWg4QkY4Qm53QnRhQ1VBK1lZRXlBVThoK2M2QXo5Z05ISFJtcmdPZ21EQTNqSFEraVd1cENlVUF2TlNyQTlITndxeCttdWs5bkpWTmcvQ1Rmcm1iQVB3YmdLOEQrUGNIa0lpYmpvYjVvMTNBM1h5cFdzQWtHMWNQQTlQREZRRFpNMWlkMGkxS3hzV2ZPcktuQUZYbGlmQ0ZGTU1SY0FTaWdPY3MyTUdBSWZFOWlXWHBsUzZPbjdVYm1QYVVVVFhRcmdzVk16Y1JqNUZvbGcyVjVheVVBNUJXWUt3T3hLVWFmbm9zV2pjSndrKzdXNUYyRUt2bEUzeGNYYU5ZZmlDWXNHa0Evc211cXVnNmhjbGVBbkFJbVBiTzZZd1JwTWdqQ0FWQW0veVFtS1R2NWhOc0FmL2k3U3lOQlNsMmE4UXYvNC9NMXlGK0JaU1lsTlFDbm5WcnBiQyttVG9BQUNBQVNVUkJWSmNhSTdzT1NFWTJOcGFEWExxcFIrdkUvT1Zrc0RnSW1nR2dnaEhvWUpiVFdjN29KdEZXYzY1L2NnMkFZdmgyQUxzQjNBemdWdjk1blMvZjRRZHNJa1Q5VDNjQnJHdElUV1pmQzVocXRRSEluc0VHUW4zVUREdkVERVkvSUNmN1N4TU9yQWc4VCtjMDBKR2t2SEdkMkRBQlVZWklBT056Q1VEcHBDRmhTdWtDQnNMUXJGdFplL0lpeFlRcFN5RW9Kb3FudVBXclZSQXViUWg4M0hObFpCMjN6N2oxeXdtajZDSUlxVVB4dzJYZXU5YngyangxMHd6NFo3c3FUWVphREQ4RUlEdW9FM2hNVkVwaFdnNjZKSXA5MGswc0J4QmN5K2lQSUlhVDFSdEVzSFMveUlBcXcrVlNOUFdRZmU1dGxWRWs4YXVYZ1ZhNUJVc0VKdVQ1dW9saUFiRTVBR290bUlBakNQblI5eERHM1RRZXJuWUFVdXBUZEJHRUZNZjgzT2tBcEhHK1hsdlRBUHdmdXlyZ1NaT2hhczN1NmN3VHNVQlZuMmdUd3lGTWk4d2pIWkFBMU05ZllHSERVTEpEMW04Q3BhOGZSeERhZCtsK1lrZi8zWE52ZDExVStxaUwzOVN4WGV2U3NzaGRERnZnYkkxTzJBd0F0UlpNWnpUQlJ1REZqeGUxWGc4UUVJQjh5eWo1eVlJVXhmUUlrZmtJUm5tSENNNzEySm9HNEZzZGdISHAzQUNvTUgyRzZqTTRsV3pvUWFyU3Z3UTZNU0IvdnBvclZhRmtoK21DTGxwVlI4WitkcURaTG9ET3BIU2lRZUFGRGtCalBybGdDSGdDVWFGaWZnNjdILzl1WWpuNEFpMXZwVEVSVEFBU0Jhb1FKQkFLZU5xSGxMNm13UERaWUFPUk9hZy9FWVJrUFgzNE13SEl2elc5clFjQStUTHBJMjJHN0VjUUtsSkdzWUlKaEM2Q2xVTWlYZkJUYkZVUUFlajZuUFMvT3VBbDlwT09xSWMyQkx6ZysrM1ZtV2dJRVV6ODJjUnVDQXRMSUhRUW0wZ081MnVPQWIyMnNDM0pFV2dSZlBwWmYyc1FCUUlnTHlkUEVJRkd3UEVqOE1sRjJiU2JzdWxnaExmdHFzQ1hxOUhHZ0h5c3puckdnaTVxelRVVEZIOEZMaEFVbjNoSUp3Q04wSExuY3czN3FhRjJ6b1l2dUtOaXZtUUl1VU5jN0d2V3Q2c0hOczI2dHdBNnZoeXE4TkVNQUhseW50RnJEQ2NRZWh5YVBUbCtGd0FiWERjbUFLTVJUaGFrRWs4UThrUGc4U1BMMHF6TEJsK0E5UUNnUjZ1WkdzM3ZmSHo4VHRCWnZrZ0dRckVQQlZBVWcyU2lqNTBRQU9qaVZLSTNzYUFESlJtN2RTTFlXZlNGRGtDZW0vZGhaZU15OXBQWTVRdlNEWVF5VUpvRElLOHFNZXpoM3dZNmZTTDQ5UGNHZ0NBQThwU2NKTElnQVVZUUVtejhSUEExN1N0dkdvQnYzOVcyNGVSRWlCb05RU2dXTkkxSEJrZGd4SlN3MUFJK2RGSWJnT1lta2ppbVExcjZYWEMzckFiQ0h5Y0FneXRvaGY4dnNCL3IyS1JhUnE3enBaK0QzN0hNWDBzM0REY0NVR0xZYXc1M01KNFlVT0R6dXNxbEdDUUFPUUNlanV4QThVVUxVa3hJd0FtTUFwOFdhM3FrTi9SOVcrc0J3T2hJRVBqazVTTHI4SGVLRmJUUWZiNzdjc1BJTUhHbC80TVBiUmVzbFBoTmU0K01pVHBpOUFGR1Y0bkk3TWZ2YWdOUUxoL3BmclluREFTOGFKUTQyQTJ3NGVtMmNBeVdRVXVKVlFUR1dMczF1TDdERzlKMVJqaEEranZZazR0M0tYZU1xaWpwenJ1ZDRBdDl6M1h0UDE2eUdmaktabUNHb29ZaDF0Wnp2djh4WFBGbDRQb0pZQzk3azlGbHdaV0QrQXppL2RlTVpXZVAxM2VRQ0dFeW9FUnVkQ2hJamJiM21KWXdIN1YwUUlLdUN3ai9nZk1qMGFzbjJJMEZYUlNIWGZML2lSa05nTHllVmo4Y2NNWS8vSjFmeXh6VEFYVDIreG9RVmlLWUQvMWhEcUx4UGlZeFRnU3ZRcnBocGhHOTd0ejRTbHFhZm5qN3VrMWtJUURacnZXVHc4QjNqd0VXK1JMeFBnU2lDRVJkUHdQUjcrd0NQZy9ndWxGZ2ZydURrT01Ra0ZjNXg4NGU3MDhKQU1tQ3VSTkJYaTRUSWc1Q0dSekdpQkdFL0Q0RS9DMnIydmNBWUpvaWZ5NjJpMGFKU01oQisySUhvTnd1MGZrY2pRODVwdTNhY2s1bklCUkVxbmVZRnlXTGtBWElKSEVTZTAwQ3l4NVF5ZUw2Ri90eUVjRGNyT1cybjdmWDhkZjBtTUUrL3ZRL1BRamhveTNnem8zQUlTWWY4ME1RYVF4MXBlSDl3Yjd2Mm1ydG1DQmtJTU1lanAzaklKRDFNc2F4YU1aOHY1Ti82N0lOQXNCM0JBWVU0Skw0RFNvMUoxNUFGUEFFd3VRSFpKemtLZlVBdE9ITEpTT1FSV25kQllRdkNRQTAxY2ZuTm9wZnNhQ0phRDJiYUJuNzlRalNUaU9FUDFFY2F3SXBrcTJrZWdCVE5nSFdFcE9LRjhVd3EyTlJGUE00QXFDZjQ2L3JBMlU5L3VWRHZ1ckIwMXp2QUpwaWl3T2wzZkVlY2lDR0YrSWoxMWYrUWtiU2ZNUGZJenF3NTdtRUZaOURsM1BzNUhYV0FZQnlISkFKS1Y3TitzMGNDUVFod1NsZm00bEdaMEtCOEMvckFCZ1pVUzZaSElUQlNFaENvd1VZQUFrc0Y3Y1N0V1JFeXhSd3R1UHBPbGd3KzVzOXNxNk9hSUpJSWxVZ0VoQTFlZG9UZ0h4YTlIVnc1amliWk5GK2ovOXlHUUEvN3BidWpaNGJ3djIrY1dCNnRGbzBOellua3hGQStjdkVBbzQzVkJvRW8yZSs0OEVNWEVPbUQ5RjZ4aENFOFJ3WkVKODBWYmxLdkRsbXp3aWNmcXk5My9vKzhLOFR3QjJqVlNnVzEzOEZySlFUWEJObG5KZ21yalp3YW5vdzlDQlAvckw5d0YwandBR1dEdEZ5b045UEh1dG5JSFQwNW1QWHo5M2RNR1FBUG5pSnNqaUJYaVRieERaRk1GOU5MVVBReEtSNXFlenoxWTYvWVpESDBENkdrZEFrWUpJdlJhbEFkSEFNbVBab1loYjZOaERXdkV5Zi9tYTczN0NYTjdSMVpDN2hVYlBnY0ZncXQvWlpqQURuTTF4cUVWaFlCcGI0Q1VrNVVzTDdqUXZqLy8vNWJ1RHJMZUNPRWVEK1lRY2hZd0c5VklmeWcxTmFac3pGaUNINkRrUkdMemU1L2RnazhJTVdjTUNqZENpQ3pSOG9kMUI4T1R3dkpNOEpFU2hGdXQxZnpNaGkrZVJKcjZMSTdoWVAyTS94Vkx3S05vWmpVVHdSTUFRUW1ZeWhXR1F4c1NBRE9mbFo0a3VrajdQaFo3NWJFVGpCcGtBR2FoTWtjckdnd2hzWGVDeUJIQmoxd21PQlF3dkF3cUt6b0ZlUlY4WmFlcmpLWUF1aXJtUFkvbzlYN3E1Q3lyN2ZBdllNQWZ0Q1BHQUVvWWxCaVZ0RndManRwMlU0aXJqN3lPQU5iaStjckh5cmZDYlRxdUpWNDRPMEYxRnJ3UUdJTVpGcWRRRHlQL2dHU1o4VEMwWlJSc09sVnp6Z2FzZC91K3pwTUJ5TGVoQWZDZ01RQ0R5R1pKSEZDQ2dMWjJmOG1nSTVxYXVFY1Z4OWU1dkFDVGdDVHdFTVdyNVRkSXBXS0piNU12cm5vb2NEc3d2QVBBRzRWTEdnNlVLZXFtaTRpdUR6NGVyMzBvWDBGUDd1NW1vTXZJZjdXOEIrandsVU5BekZubFpDSWh2R0ZSQ2VXenJnWFNTSUJyZVhURlpTZ1ZMSEFwNFVIT0Z1b2NpRUVzbjJQSndsL1hFazBkemZTb2plZXJGZzFJT281QktBdmVJQmV4MVA2N2xnVXpnV1FhSndMQUtSSDA0aTE0SXRnREtFdEdzUm5XeDQ5YjJWa2s5d1VlZlRHcktDRjdSMEp4Wk1xeE44Y21QQXhXY0FjeEdBQktFQUtQQTV1OWxFYUFiQ21LTUkrc0ROMVgzeitybzI0d0VaRmMwVkVFNjRBQmdUMTgwUEY5WmRCY0RiNkpwcWNQdFBrKzFBQ2JtS2pKbmxsd3l1SUx1bkVBV2paSGtCc3JzUlVuZkQwcUVpQzVJSmZ5aXNnTWh6V2hjUDJPMTRSbzRXYkFTZ0FNUUo0OFNKd2NobUJDREZhOHFweUJiU1A3T3ZVNFBRMHAyVzcrTFNuU0pVRk9ySTRWN3c1SW9CVFFRVGZKNm9UU1lrMm1RY3BHUnlIMnN5R2pJRjZFTTNWL2ZNKytDMUNmd1VFeGhDc216Q2FRVDQzbFpDM2UxaEJwRUhoMzZYRXFyQjdTY21xNWRWMFhaeG1WOFd1REZ6QUY5aXdob3c5c2VBR29CY0d0S2pxQWMrMWw5ckxiLzFpZ2VzTzU1eXNtQ3JDOGVpNkl4Uk1BS1RXTkJpNlh3OTh4TlRGVWkwakVjbXBZZ1JBUGhkZHBWaTlPSUVQUDVjWUQ0Q2NMa0Nvb0hQd2FXOWtWK2l3V3JRSFQ4dUExZmQzRjdERnZnVUhVUDJrOGpUaW9nQXFMb3hGcERnYk1qOWpYU3VON2k5ZExJZGF4ekJwNVhWQk1JTWdGRW5GQVBLVDlxUGQ2QTlCSUdJN01mUG1mNFUrNDBIekk4bldncTJQQnhMNEZFa2pLSml4R1JSRnlRUVB6emQxaUFVekNBUWFzMVlPbUFFb0Zqd2tlY0RDL1BBd2hLdzZDeElrQ1h3T2RWSkx4VG9iTWpCZHlJZ2Z2aW1Odk5KN0V2ZjRqV3RkblJZRDFZTkdWdUc5M1ZXdVdzNEpmK21sWkNDWnh3UC9jbko2bVhWS2syK3RLOGxRUVZIUlRHYzY0U0RBWkIzRXkzSmN4eUFDa1RvSng0d0hsK1l3cWxvR0RJQ21ZbVRGZ01RRkJFVDh5eVl6eUFHL0FmV1g4bUNHUWcwQlRSb0h3dDlLVmFQRS9IUTg5MEFJZmdXSytDUkFhTVJZblZkeEhiaGRZOFdzbHcxVjkzVURzbVBJajlHeGdpQWlvUlJNSUpOdm90aStTVy9Ja2QwZ3dBVTgrWHhKY2JHSVRKUER2STZYZENGUkVGU2tuVEI4M3hrYTQwSDFQR0Y5ZG55Y0N4Rnd5Z2tLMGJBU0pRU1ZBYkFZZUQ5OHhVQWU1VTNqS0l3Qm9zU2dOc3VBQllvZ2wzL0l3Z0ZQck9JZzFYYzRacnBBc1NydnJ1eWtsMnVjeWthcGtNTWg0Q0V4RDVEd0pmV0FZQXh3azRNS1BBSmdPSWpHU0VHd3VDYWtSaGVtdzZZdjBVVXdSZjdMMDBMOXBuc054NlF4NGZlWTRPOHBERWNpeE9qc29US0twTVlqU0ZZWWpPQzhFcTNXbm5yMFlZUyswVG1pMkh5c3JQR0xxd0FTTll6Qm5UMk16MlFEOTFsYXhMQjBnczEyR0FoODFjZi9vL09jSHlKK3FqMFMvenhuaFVaYlN5WVdhTDgrUnEyUzI5d293aVdrSlBhbjRNdmdyRERHQWxSZTdLSXl3RElnUjNtZUVEV2c5SGJKZ0FwTlRrWG84bzBpN29WZ3huRWdGcjhGN2pFZG5VNUd2cWZKUUtRS3lFT1Bsc05JUXZ5dnVwQUdIUy9Pa3Y0cXY5b2grUEh4TUxrOGdnQkNSeHZBbUVOK0FpRXp6MmlRZlFCZU5ta2g0SzUyaEpCS09hTmUvRlNMb2JMUlhDejQzclFudTJ5aTlvTVNNRHhzMmpvODMwM0VSejF3c0NHWkVDRjRrZDNEd0VZWXdKamhvTmxRcmdJamxZb2RiQlByd01BWmZFbXl6Y0l2MjdnczZYRHpDL0lSMURPZ0E5YTZEUno0d1pBc1orTFlYdlFZc0hvRDR6aU9Ga2xuYTZZRDMrbm5VNmRaN2JHREFjQlVJbUlBbUVVdy96YkoxaS9zY0dOREppTFhtbGUzUmhRK2wvYXE1N2dVUUNXend3QktQZUxzWi9MRnJHZy9TaFJYQWU2NEFqa3YzMGtBTEFqRjhSMTFEeTNLN0tSd0pjc1VUYXFXU2NBUm91M3cvSU5WbkNIK0EzNm44UnZNM25CNVhQNG9ENkRBVEJZd0diNWFqbE9MT2g2WDhKYUJLUkc3Nys3eWdHWXAxYm4rVjI1LzAxQXpCbndRMXlwYW5EN0tXZkExUURZQzN6SklqN0tnT1V6YzluRmJldFgvcitPNWJpd05oeVg1dVNFRHI1bzB4c0p3THA4L200QTdHYUpVdi9qMy81K0hRRllKM29GUFBraG8vaE5lcUJjTWtjQjJCQUE2WHJ4bU1Ca2ZGQWNpL20wSnB3elh3MFRYdlh0enJ6K1BLYy9NbC91Z3pNOU1EcUNBYnova2VWampHY1FBL1lMdmpvZ3VvMW1Sc2xSSTZSd2ZzaUE1bnFoTDVENm5zY0Y4Z2ZUZGZ4cFMrL2hMenZXZnpNUUNvQjFGcS84YjNWV2FQSURacXNSVjY0REFMc1pIVkhzMWdFdnNxRkFlQlNBcFFDOHBISzkwT3FsNFVFQXl2Q3dOZUdjQlhOTE9QTUxmdGdac0k3NW91VXI5b3VzcDJURXlJSi9zVTRBekMxZStXSUZzaHlBSFBaUkVWd0l0cnJEM3dHQWhpYlRZQmh4VnBlL3hlUHlyTkJ1V2FvTnAzRGdGd0M4MU8rUkFlcEsvYTVMZmU1MWp4cjdKd0E4M25QWFlncTFhc2wweVg1TjQ4K2Y0VkVHTEFUbEsxdkFvNVlCMWdCU1Jtc00rTkZFNTdsY2ZQRDVwUEZXQ0pJbXR5dkdnR2ZPQWFjQllPNTl6RmdsZ0hnUGVmWnNYVjYvZ1BYQlllQzBSVmd5Sk5PR1l1SmpQa2E5ZUhXZ2pMOWJXemhXazAvbi93UG4razhiZ0ZObWdZY3NWZmxabkJSbUlTaHRKTS9tN0pHaWJHQm9PSUllejl3S1BQNEFjTnB5bGZiTmxHZmRJKzlOakJqejhKVnpwcGNrWnVKK2RCdzRhUTQ0ZHJrNmoxTElZOUprUEQ3UDRzMmx3VkVHTEh3Sm5uY3NjTkloNE5oNVlNc1NzSG01bmRPdTFCR0ZUaEo4L0s2SnJadG9zbFNUMitYSEE2ZnRCMDVaQUU1Y3JnQXVwczVUZmFMNkVGK1V5SWlmM2dBY093dHNYZXA4MmVJWVk5SmtYcE1nTXAvQWVaUUJDMmI4T2R1Qll3OEMyK2FBTFF2QVJnSndHWmhZN3N3RXpiTmE4OElSdkFWTzFxa0Y5MUozNkROT0JFN2VEMnlmQjQ1ZnFwaExuZXZ6ZEdlQktCZkw4VVg1L0NaZ3l5eXdlUkhZc0Z3eFlIelJOSzZvZXRTQk1ETGpVUUFXVFBxUG5ncHNuUUsyemdLYkNNQWxZTU1TTUU0QUxyY25SNkpZUUl3c29VbmpwRFJzdE9MeTdjQkpCNENIVUd3dUF0dVcyblVEVkgxRUZVaHljU3dXakdENjRtWmcweHl3Y2FFQ29JMHo1UDNYNVA2bldsSGRnSGdVZ0FVQWZPWU9ZTXRCWU5Nc3NIRWUyTGdJVEJDQURrSXpTSlpYcENPbklnMjV1UHJoZ251cE8vVHlod0xISHdTT213VzJMVlNpazJwQ3JEc1Fza3pOSUJHSXBCZEdJK1ZmTmdNYjVvRU5DeFg0eVBSalBqNHhhSjArV0dlRUhSWEJEVXoyTXg0RmJEb0liSnlwQURpeFVBRnd6QUZJOEtVSkNoTVYyU1VhQUdjMWNFL3hGSmVmM0ZZUnRpNjRua3FXRHJxcUVoYnJzbTV6dlpDZFBDZDhuSHpKT0xadUFCUno5aFRIWndQTDdMbkxub05NSVkyVnlhS2NqdFpMSE9BYk5nTlBuZ0tlNEJhY2ZHRjFwbnlkRCtocGhRLzhYVjVVaUV1ZUxHbkROMXRXWGovMy80Y1R3QVV6d0dQY1JjRkppRHBQdDNGTG1mNXZqd0UySEFRMnpQckV6RHY3T1FnNU9TTStTY1lReTVYYm84NDY1dS9aZkxUSjdmS0hBZHVtS3hWaDh3S3dlYWxTRTZpbkVvU3kyTVdDZGJVSElnaHYzQXFNendIamk5VkxadUR6RDhjWHh4V1pzNWM3YXBtVzBmTUJuSUhLbjVYN2Q2STVucHZSejk0TzdMZ1h1R0lSZUpTYitYbDF0enFmbHlid1J3cWY5aTk3QlFSV29tV0pRN29aVkZ0Sm9xRFgvYi9vR09Ec3ZjQlRBVEI5Z3NmR3FtemRqdFZ6K0crUEF5YW1nWW1aQ29EakZFMmFuQ1ZnMUNlSndPTW5UUkIvRG1VSU5Wa2tnaWEzeTA4QnRrd0RXK1lxQUZKRk1EMVZBQXc2WEc2MVIzMU85L2ZkcmNEWVBERG1ZMHpqYzFVaml2QnVBTXgxUWRNQitXQVlYVThkaEVVMTZkT1NrcHBiY0hGU3JuZzhNSHduc0dNUGNONXlwVVJIcDJ4TUlhN3pEejJ6OEduL2tWZTBZb21PMHdFd0JZS3VqTDd2L3pIQTZDM0F4Zk9WaDU4ZzVBc1p4eDRmWk03c2YzaDZCY0R4V1dlR0JaK2NNRUZpd0dFSEhSbkR6dW43T05Icy9kamtSZ0J1bnFsMFZET1NISURVM2N4U0Q0YUVhamhGWFM0SDRTMWJnVkdOMFY4d2U3RTBGaDlqVkRHNk9icjFMSk1Sd24ra09DYVRFWVQwZHNmcVpIWGwvcDdQckxpOXdJWTdnTzBIMnlBZ0NBV0NXQ293S3JZRThuTUxuL2E3UFFuOVg3eklKUFBrQ2NLKzc1OHk3eDdndU5zQjZsOThnWmpMTFlldDNBeTVuMHN2NFIrZkNZeFBBMk1Pd0xFQVFMSURQeVA4dUJnMmNSWW16RndlQVlpbEtrbitPQzgvRmRoMENOaEVBNG5HQTQwa2Q2RkVTMTNXTE84djFxSEtBZmg5QitEb1lqVTJBay9qcy84TkFJd2c3T1ViN0xDQytXQWZCNENwQkpvSWlUUk5SbVMxbDEza3FXaDNBZHYyQThjZHFxcDFNQithSU9TeFd2NnBxNUQya2tJQXZ0OHJGN0JMSmtzTi9qTXFmYTd2KzcvQWs0QjNBNmNlcXBhc0tNcTVha0FtbExXWTM3dDhaVzk3UERCMnFBTGcyQnhnQUZ3QU5FR2NuSTVKY3JEWlJQbGthWEw0dTFLSlVBZkFqYlRRNTl4NmRTdmRMUFhBZ0dZc2haV1I2SklSYVhCL053Rkk4QzFXd0xNWHpNZVN3TGZjWHVLckEyRyt3ckxDRGNOL0lJZzRFUlJuMHF2eXlTQVFYNm1HMVh1QTRmdUFiVE9Wd2t0UlJyMk1MQ29ReXZFWi9VWS9Xd2pBajNqdEZKWmtVNzlnMWdoa2dFQmY5OCswVW1iLzNBMk0zbGtCbC9mT2NkTW9rMkVqa1p5djg3NzNMQWZnSERES2p3Tnd4RVV3OXlhaWxwd2R4QkFFWWhCYkF1R3pHM2FLa1FFSndBa0NrT0NqbGI3WTZTWXlmMlV3bEFTK3ZLWW5BWGpmTm1ERVg3REVmQTVDalVjc256dmJ1MW5EdFVNbUNEa1JaRUV5R2RsQWs2RzZsUVRTYTZtME1QNkh1WTczQXhOVGxjSkxaNldPSllDNS9DTnhMcEhNZ2RLSUtObDY5UXZ1Ni83NUFqSE9pVFU4N2dLT09WaUpiNzQ4QktDV3JuSy9tYVRBKzU4QWpNMEFvN1BBNkx4L3hCQXVwb1lEQzlva0JSQW1QZEJaNDdsTkEvRGh3TVJzeFg3bVBnbCtTcm1LNUVhUk5Sc2xYRlE5Q0tCOURrQURuNzljWnRrSEZreXNKMTAzZUJicWxoOTdEcG1UUVRZZ2s5Vk54dSt4WWJYS1UzbGhGb0pQT2dkRkdZK2xQa2dReG9ra2dGOVhnajRBdmZvRnM4NGVYNEtlOXg5ZklDK3RSZkR4dnZuaWlmMzU4c1NpcjJMQ2o1d05qQktBYzhDSWkyQXh4TEN6SUFHWTlMN0FoR0lLZ3BBVHc0bDh3VG9CMEpqUHJmVGtwK1NMUWJIck9xbTVqTnlhalM2VkNNSXBBcERBV3dRNExyR2dYcXpJZm5xNWN2MHZOMFpYSFRJbk1FNUdCTkxiMURHZE9ZUXNJN0FmR0tGamxncXZlOHdKd0c0VCtmdUZBRnl0WHpDTGIrVmdXbkgvZklHWWZjNDZIczdpSEM4WmtQY2RYeDRWZlZYSnc4K2NBNHdJZ002QUhTTEtXWkNURVNmTGZnN1dzSXlSRjNja2lSUStIQUNYa3dIcHR5UDRLSHJwSnZLVkduT2hSRjllQkY5d0UwbVVFb2d6MndDK1dHSS92VnhpUVFJeEFzOStybUhBNkUxWUZZQjhESndRTVpsME9yTForK2k3c2ZUOHpyb1lITFM5ZGY0UkFDV0t4U1p2TFh6Ry9mUUxacWsyZ3FuMi92VUNVUTlVWmFNOXdEYVBlU1ByQzRBNUMxS1YrTklUS3dDUy9TaUNSL2pSQkRsTG1QN25IeW5zeG5vMUlQd0pTeVJwYmlNQURYenVQRFlmWmZCVEVvQW1jdVZRZGlhVzB6d1h3UXNDWURZbU1hREExd0c4VEJTdmFvUjBHNzdFY0dTRVQ2aGpPdlZBcGZSUEFVTjB6anI0NUp6VmNTcWlUeEQrVmVHelhrdS80TnI3SndESk9reEZJd3Q2ajYrUnFVcmxrTzRiWHpwMWdDQUF2MDRBemdMRERzQmhLdWdMRlV2UVVoVHdDRUtibktDdzE0SHdKOWNEZ0dROVdlZ1JnREk4WEVjVkVEdkFsN2xWbGdsQWdpK0k0Q1IrWmYxbUxHZ01tREZoQkdGZkRDaWNSSkZFUnZpU0FCakxTN0ZDME1GS01VKzA3d09QRTBrR3Zhb1FnR3Z0Rjl6MS9pT0Rrd24zVldvRVh4cmVzNWliOXh4MXdadWZCQXdMZ0FRZXhiQUQwSmlRd0pPdUpCQTY4L0gzWmhrNiszQ2lmcXF3V05NS044d2pLZ2JrNmdXSmdDK0ZNYUJiNXZKVm1zVWJWMnZDcW8zY1JXWmNDSUFDb2F4NTMrdWxrcU5kN2lxT2NVMVdjQzljeEVtNWtRQlVkWitzVG5TTC9qRXRUV25naTIxamhKTkpCaXZaQnVrWHZPTCt5WUJrY09xeEtqSjRBR2d4ek1yQlZ3ZEFNbUhyWk9BWUYybDZ5L213VjZ4RDE3em1XbzZNYlJ5ZVd0T0h3eEo5MUlJaHI2cnFaUzcwRFBQTFhEVlVyZkJ3ekhLcjFFVXA2L2gwVC82TC9HY0Nxc2x0NElob1Rjd2RBcURTczdJNjBXUUg2UjMyOXBIdUZ5dVhESm1FanVPU2JkQit3U3Z1UDViR1VqbXNBNVhvVXZjdkJYS0tBUW5BcFVkWHdhaDBiOGpYUjJZekpUc0MwWkhCMzNGTCsyeWlYM2gvMVllRDFmRlpHVDgxZy9INnlxa1ZhOVlFcHFNaFRBRGxlOGVySEE2dDdNaDZqNFpCWGRCR2pGeU80Q1NJbTl3R0JpQnZncXh3SUFKUWxYSXlFSkx5SS9pMFNrQUcvRmJoYUVyNkJYZmN2KzVkTEtoQ2c0ejFDMUhFQko4K0JPRFFHWlhmay9xdUFaQzZrZXRBWkVRQ1RXQVU4UElKdDBmZ3dIelp2VldOYUtxaTdKTE9tdERXRnk0MmcxRnhIL1hmcUdrSUkwQythMHRuRGtmc0d4UWpuM1ZQc2s3dFhtdXkrWHAwSmh0b0pvc0FhRmNVQUpVWUtpWUp4Y3FIcUtBSDlyUGxHMmNNcm1DVWJNWDlndU1McEdUY0NNS0RsWkdoTUs4SVBuUEluMVg1UEEyQXdlZ3dFRVltREdCTWpPSTV3aEdRUDNOUEJUN1ZKbFJOYUt2RjR0MklXSGJERXJ0RGxTazFwNGxKNy96ZDI0NnRnbEdacnlJZnJGaFE3cFU4V0NBWDBaRU5HKzU3VTE0WjRZckNlTHJTeFhkZXY2VGZMd3JieFQ3em5NcmZLUVhmSExRQ255dm1SSXYwUTM0MzBlek1tTDk4UDM5M0czd3F6NmFtMU5ZenpvR24rc3ZxUm1UQVUyY2l0Y3RxQVgvMkVJOEY5QUNFbUxIWExaR29GeHRTbDJ4eUsyYkFZd3JqNlhyMTIrMW5vTC9qVVRDRDl2dkZybjZ1MHYxL252R2thb1ZCQVFpMGV1bW1NQXVYUUhNV0pBQTdnQ2l4RzhVMGdGZmNYZGxCS2s0WjZ6RUxnQUpmWkVLcnhwQzF4T0lsLytTazdqa2NkWWxTY285MHk5K2dLNnZKclJpQUREMHBpYWQ3UnVGbzN1ZE5DZ2Z0OTR2Q2RyR1huK3R1amdWM1FBY0hMY0Zucm9lbGl2SGtjaEVMOHVlMHVRNzRTM2V1YkFJVFMzSVFoS2tNUmpCTW9rZ1dHM0wvLzJ6M1ZTblA0VkRnUVd4VUVFVXhBWkZITDBlUjNIRGZtM0lSYkRIa0JmRjB6eTRFSUtOaFN2cjlnb0dFQmR2VHovTUlZUUxRZFZzVHdSVEZEajVqUW1kQXJSRFlKUU5EU3M5NjFSM3RQaHg1TlhvVmdveGxlSG5hcmpvaGdMZWMzRDJISTQ5MnlRTnZJd3ZxTzlmSm05ektHYkF3bnU2RmhhUDVwRnVNZy9iN3RUYnBCZHZUejY4Y3ovekk4YXpWajhpQUhUcWdtRkhYRFVCODlSMmR0YUM3dFVHdzRrRE9nRmIwUjJ3WVJER1o4ZzlPOGFVNFh3UE9jemhpd0dsTWpxcUxXaUZZR3U1NzB3QURGc2JUdmF4Zzhua293N0U4bk0vYXRmS3psbjYvMW1TNFlIdjZCUTQrWjBCYnFIY2QwTnd3WWJWRDMrMXlXaFhKeFBCcmJxOEFxRS9YQXBTcUF4aUJWMk1aLzU0RE1PWndLRTAwcm5EVVdjUjVLaVYvYnJqdFNBTUFMSXluKy9tQ3llZWhqSVlwNmZkcnZWRUx0aDhSQUNseUhYeG1oUGk2cjFtOEZNMHVjZ2s4K3k0UkhDMWtBSy81WGdXKzJoWllvZmFmV2NQcTFCNUFxRHFFWXNRM25lcFIyZ3FoVjJ5aW9sMUNPa0QwQythT2FvR3g0YUw3RFFDd01KN3VWd29tbjRmbTdWclgydS9YQWxFTHRoKzVzSFB0TitsL0FwNnNYMmRDc1ovcGhaa0lKZ3Y5bCsrMXdiY3ErMldGdjJOWElqTktBUHp1dzdNVUFWOERUdXluRklFc1F5ODNSZ1RBaGl2K05nQkFCYVFPR0UvM213V1RMd0FxSG5hUWZyOUdud1ViQVJnRE5CVWxrcHpRYm95WUN5WURZZElMZGYwbDROZHVXOWtHb2E0Z2VOZGF6TEVsS29BM1ByeDdEb2ZpRVR0QzZYdkU3aEdFekpscGNpczNRZ3JqNmQ1VU9Kb1lEY01nbHJYMit5ME5QdGw1VVpVamtmeC9IcWJlY29lME9aemRGMWdIUXJsbjlCaGVlNHMzZjNaeG00TXZBazlWU0ZkVUl3MGkrUTJQYUJ0SVNpQlNTRmdDWU1qTVcwME1QN3B3dnZMRG13RmdRVHpkSHhjT1NHdkJnL2I3WlJaQnlXWUFsT0VSbHVLTTNSYTlDS1djMHE3M2RUQmhNRlQ0WndJdzlsNUxycGVzK0hqZUJpR0NVT0tYZXVCdlBjS1RpRUlPUjBmK1JoREJNWWkwTGhlYTRHVGFhNU5iT1FBVkR6aGdQQjFMYTVSc3NWM3JJUDErN3l5NU9BQURvQWNoRUhCa0ZiS2ZHUnBpd2VBUHRNczVJRk5va3lPR2svN3JBWUM5T2hCRndOWFZZMWF0NXRmdENCSGFXVlMyQUpkRWNFaW5yRE5DK0x1bWl5YzFCOEFCNCttdUxBUkFYVERDV3ZyOTNsUjQvWjBYdDZPREZRa2o4V3R1bUV3SFRLRExRZWpBZk4zdWRzL2Rmam9RZGF0R0x4YjhqUUJBWXo2L2JveGlGZ0FWdWR6TkljMi9zM3hMazFzekFPUm9CNHluKzJEaGFBVEFHSkN0YnBrQ1lxOSt2NFYrYUJnQVE0aTY2WHRhQzg1WWtEb2cvemRadnpVZ2ZOMU43YTYzM1hxdjZmZTltc0RJSGZOYUI2QXkySlJFMUFIQUVESWZJNW56WkNMZU40TmJtOXlhQStDQThYU3N1bDZ5cVYwckoyV1FmcitzcGxDeUNZQlIvSEp5S1g0cGhzMFBLQlowbHFPWVRwdm5pQWlVQW1BZCtIS2pvMWN2RGpIZ3IrM3dQSlFzVkN5bVVaclBNdVJzUkJERzRBUUNzdW55SnRGR0h3QUFJQUJKUkVGVWNjMEJVSmx4UW9INjJxOFNUOGNnZ3BLTkFGUkd3Q0Q5Zmt1dmJ3QWt5R2dKRTNDK056MVAxcTkvVDNGMUVaQnh2Wmg1MHM2QUVZQzV5eVVIWHQ1L1E4ekk1L0tyQW1BSWtraXBreUdQWXdYejFhUlQ4djVaTzZqSnJSeUF2S092TlhsTGF6c1hzOWJvL3p0YzI5UG9oZ290cDVKNDlSY2ovcHpmSXdHUy8vM09NNENOZDFkcG50UXBGVW1qRUg0TFlJZ255bi9PTGpMOEZlREdod0piTmdGakk4RElFREE4QkF5MVBGSzdGU0tmNDNjTktydkh4KzhDL3ZteHdNZ21ZSGdFYUEzNUowU3RwdnZ6TC9uUDhSYkxBZmh5VDIwN1RDaGdEUml1L1pMOURzZldOQUJ2WXpiaENEQktvQkFrL3BFb2JHV1RxcDgxOWh6UTEvMGswUG9hTURFSmJKanhWWkZnRGFkMFNhVU81TGtzV1ZqK1hTY0RtdzVVRVVESjZVNGQwblZiQzkxUzNvdmZWSHA1YWw2NGNnQytrN21aQVA3NjhLQ0EwV0QzQS9pZUx6MDkwQ0RjZVZtbEF1aEJsakxncmZjQXc2UEF5REF3UEZ3QmtDQWJJdE00YS9GaU50RVJqQmw3Nlc5ZmZEMkFid0pEZHdGais2c3lJbVJYcmQ1WTJGaklZY256V1BMRXFuc2ZDMHpzcjZxQk1RbWZJRFIvcHlKNnhNaEt5TXJTRGlLRDJ4amE2VEFEVHQwL0FHQXMxS2NBVUNGck9MRjZ0YnRpUlZGYXZUL3d1TUNhN01mVlRsSDA5OFlCZUJjd05BSU1FWUFVbFM0dUJVTE9tSzNMQ253T1BBTmxFSU9Tb0Y5K0M0RHZWb1dYaHZkV1pWT1lxV2dpM3ZPWERVUWhnaWVCMEVFbFZpTVlKMDhIeHFlcW5HOEQ0SUlEa0F6bzUxREtRUUp2QktVbUtBQ3piTTQrNWhVaXZ3cmdpd0M0THp2am1nQ2g2bkJjZ2lNVGN2OUFibzBEOEU2ZzVlQ2pmcFVBNkF4b1FJemdpOEFMbVd3QzR6Ly9EeGNQUHdCYWs4RFFGREI4eUpQcFBaSGVHQ3lDMEtONURGQ0J5Zmg5LytPQXNla0tnRXpDVHdEMDQ3WDBTQ1BNMUlZUWpDdjJFL01Kb0dWd1VVUW9QYm9xME1kcWtXVm43UnRERE1haEI0ZytQNnFoWEZwalZ0a0R0UkdBMm5Lam9zN0l5T3lIRlViSXJYZTBGWHNUdXpJWWZOYjRPMk0zQVRHSVlRT21QbjZoRzZnaTNlVWtRUUFlQUlZT0FVT3pBTE1WaDJwQWxFU3FHRkJBWEFZT01RVmp4bGwwM2lPL3lZS1JBVDBGUVhrd1pranAxcHo1MUxPMlhBVDNLdEQzQUlBd2o0V2cwNWtmaXVVSFlsc1hBSkxWblAwSU5MTTBPWUZ4NzhBemNSeVNlVHN3MkFKdWVJK0RqMkZuZTRFV0t6NU1BME16RGtDQ2tBQnlVV3FzSnphckVhbnpqMnpYd2pFR0ZIdUdZK3BZc01vanpaTDFHOUVCZXhYb3UzMzlJUkJyQzNsSkdtTkR1U0hYK3c3V0M0Q202d1d4bThEbmdMVEltZ0M4cEJjR0J1VFhmLzFmWG55VHVnbkZ3eFRRT2dpMENFQ3lJRmxzdnZKZkVuaDBtaHNZSS9zNXV4RllpMXhab2Y3b09xU0Fhd3dZalJHQnpZR1hidFdYYUNJcmx2SFVhZ1g2U1AvcnVNVllDRWJFcUVDWEFNamZyZWUySGdBMEVTdXIxLzB2dG5Od0dTc0cwUnNaTUUyMC8rL1hXSDZNdWdrL3luZ1BBR3k1R0RZQUxqaUlISWdSVUlyc1pqTTdBeCtCU3gxUzRwZmZmUVZJZXA4ZEw3ZE1Ec1RHakpCK0N2UXhUSG1kdHJ3NGwwQ292RnJ1QzJOT2U5NzVlZ0RRc0NYUksvZUs2MzRKaEJLOTBxMkM3STFpK0d0MGp4RjQwazFjUEpBQjdVUDJtM01HSkFBRlFyR2VpOWlVVEg5eUJVRFRIZlUzQjUrQk9JS1E0M0JXdE50UGNXSU96RVpFOEZvSzlLMERDR054TGkzRnFhS0E5Z1RnZW9Gd1BRQW9JME91bFdUMTFvRXdpRno3Y3diRXJ6TnhXdEVZQkIrVlk3NlZoNERXckg4SU9vR1E3T2NnMUNxTVJMUGx0bXh2czEvU0hhUDRkY0FKZVBZeXlVQ1JJenJUQjh0RThGb0w5RFVNd2w2MWtRUTg3Um15MlBTMnJnQjBhMWNpMThSdWRFSkg1N09zWTAyeS8rODMvc1pkQktyNEZYUVRBcEJ2cHJHZ1FDZzlVRUFNK2g5RjZ1Z0pEa0MzZ0pQQkV2UkdyWW9ZQ0JYOUl4RWNTNUs0aTZjWkFISXc4b1hRNG1MQmIzNVlINWQ3T2VrYWR0VFYxVVpTamFFSVBING5RellOd2dqQUhOd0R1V0dZcFpjN2x6UGZYMWNRdXI1b0JvcmZ6RGYremkweVZUdVNrdXhCSTJRK1BoUURJVUVuTUxvMVRCQ1pMdWZHdy9peGJRYTBLQjhDVE9EalBvaGRZNzhJUW1mRGptVzdZby9kb0FYNkdxSWlBdERIYVlzd1NtZU11YlY4MWtwMTFMNmh5MlBkQWNnYmxmc2xPS0MxSWlLUm15UnhaZ1YvOCsrRFM4QkZyeFhpNUhkL1U2TWVTS2RxRXNFS2hwQlJzZ1JNYkF0dUc0S1UvKzlyeTVicnpQL2xQVk12MUVQT1FlZ2hhcnJWY2daVWhWSEZ4TlBjcDlWRnRsT1drTDQzN0MwV0FCV3lwRlJHc1Ywc2I1SG4yellCd3ZVR29LbDEwdjFrbkRnbzB5N1hBOFBmdjBVQUNuamFLMzNDbzlnSlFBT2U2NEZrTnZ0WkFIUWRqejl2Mk56MkdTYTNqWWVqMlczS0d1WjlpeEdkSVZTb0tUMTNCMnM1QUhrR2hlU1Q2cW4wZXJIdjVBSWdBQVUrTFZmdy93cTNDRUFWN2NsQktEREdaRzkvNW9WWHgvb3lZQVJjemNxSDVHeUg4ZUZwbFRhd0Z2QXRydFhMR3BOclFER2JlanVwQjNvbWxJSFFHYy9FcnpPY0dTUnM4enJoQWJidUwxVGNvL0pmYkxsTndIT21pMmtJY3Mzb3diZHdOcFl0eW5EUWhzRmNndnVHOS9ZYXBHRnZZWDIyelpjQVUwL0d3QTJMSi80QW1HRjltd0ViQnU5OFkzY01GK3VBR1FDajJIVnAzQmJQdW8zSWxxeEF5NXdIQXE0T2ZBUm1FQlhHZk5JQmEwQklzRzBlY3dDNjdtZXJIZ1JwWkx3b2NyV2FvdnVUeGV3L1YwdHhKUTJEV2VhZTNXQUdiZGhiMkRCNCt3Unc3dzVnOFFwdjg4bGl5R3RvV0h6TWk0QzlmQUVIYkJpOGt3VUt1MnhOQWRCeGFHQkxiSmRadXgxTHdBR0VDWUFFbTZ3eWZwZWxKckVnRm5SRHhFU3dneVV4SVVzVk13alZ5NUFZTzBiRzg5QXV1MS81QkYzOEtxakJIbFVBWVhzdGVOQ0d3VGVXTnV3dGs0Sk1rcmx6R05pekExaG02OWcxTml4K3pET0JXMGFCZVJaWkdxQmg4TTRlbWZXTkFERFQrenFNalF5RVNkUUZIZkRiWkVDQ0xSZ2RIZUNUZThDQmFLSlkxckRuQlJDSUF1R1c0VFlBWmVGRzhadU1rR2lRMUlFd0dDSnRIWkJteTFvYkJzdlZNbkREM2pJQWVydGkzTEVCT01qR2NPcGEzV2ZENGljOXQ2b3ZlRHRMZnc3UU1Iam5INndQQXliVzZ5YUc0KzhENEhJUWZ2dERJVnRMZWpwQkZzVnZVSTdOSUJIdzNEVWpSekwzckRWdHNZUE9rQVNjdVgzY29ORHluVDJWWUpDa24rUGpxdlVEOGhWYlM4TmdqcGhHeGNBTmU4c0FHTm9WWS84MjRCQ0J0SWFHeFJlOHBMS1pkcE1rVHZYaUoydG9HSHpTTkhEUFNjQXlxM2VyNHFQeUdhTmM3SkNSWFdMVDJUandHbUNPZVFhc2hxNitxU3BabXA4dm9qUXBoZUY1OG5jZFpWakxualdQSHI0VldLVEt4ckhHVXFxOTdxWHUzanAwd1B5K2VFQy9EWU5ac1pBTzZJRWI5cFk5bE5DdUdQY05WODMwWm1rTTlkbXcrT0tmYmRjWHZKTVBkWTBOZzAvN0duRFhLY0RNY2NCUzdNd2RLejhLQ0FLUUlnWTBNV0dDdHI0VE9IQWFzTXdPa1RxZjZ1bnl1THlrZmQyNTRua2I3cXN3L2lWZzdqaGdtU1gzMVZwZDl5UkhlTHgrelJoakVHUmJCNndEWVQ4TmR5bXl1YnpEekNDR2ZwTUpXZlNSWWZyOUhQL2FNZ0JtN1lveE5RSE1iUUhtK0lENmFGaDh5UzkzdEF2R1FiN2RhMmdZZlBvWGdidFBBcWFQQSthM0FFdWJnR1UxUk02QjA2MGZna1JvQ3pqK1RjRCswNENGRTRCbGRaZFJjNC9ZeGx4Z2pKTWV3U2l3TjF6V2ZzT25nZGxqcTNFbVkwOHZtNWkvN2o1eUlNcXB2dXBLeUdvTmc5bG5nWW9zbDl3WS8wZFpkck16WWw4TmU4c0FXTk91Mk1BM3p3L0YyQ29OaXk5OVhidmZ0cmNMcml6NlBoc0duM1U5Y005eE1PRE9iUVlXQ01BTndQSjQ5VWxpdVc2U2FxcUJuL2dHWVA4cHdQeUp3Tkl4d0RLNzZhaERlTjZ1WFlDdVl5QUJrRXphNExicFk1V0VXZFNMeGpGMjYvZFFCMFNKNnI0QnlBTjZOUXhta1djcXJuUTAweDFERURKRmpSOENjTldHdldWUHA2WmRNUTZPVk9DYjN3QXNjUEo2TkN5KzdQZXJrUDVRM3RCWTFQclQ5dEV3K0p3YmdQdTJBbE5iZ1ZrQ2NDT3d0QUZZY2dBdWl3V2xNL1hxRGpNRWJQOXQ0TUIyWU81NFlKRk1vLzVnSEljQUxWMVRSWjE3RlhPaFB0dmd0dmtxZjlINGt2SERseUtLNGw2Vnp2VlNCRjIydXdqT2I3cGJ3K0NmY3dCU2t5ZUZFSEFVeC95dzlKVHlFYm8yN0MxN09sM2FGV051QWxnSW45UXhPMnRZZk5sYks2TXZheGVNUllxdXZMOXJUY1BnSjMwVHVIOExjSEF6TU91Z1gzUUFMbzIxV1hCWkxFSHdSRjFPZ0hTMmVPZ2JnSVBIQTdQSEFlek51N1FGV0ZaN0puWEo1cm5xeEhFdWx2bHp3eVZOTjMrd2VybjVZb3ZsN1NYTEd3dm40cmlMV080ZmdNUkpYY1BkLytwbU95bUVMRWhSekJ4SkFvOWdWTDRrd1ZuYnNMY2NnSEVwV2kzZXBvY0NBTWVCUlU1ZVRjUGl5LzZxdGwwd3B2aEErMmdZZk83TndPUW00T0JHWUdhRHMrNUV4WURHZ3FQK2NjQWtJTmFWcEI4R1R2NGQ0T0J4d053MllHRnJ4WUNtVjBZeExOWWhlQ1hhdTdFaFYzZ2EzTGI4ZzQrUjQ1dW9HTEFEZ0hXcWhzQlhBOEsxQVpBRHlSdnV2dGtCU0FyaCtpOURzUWhDT3RmMFVVZ1cvN2FpWVcvWjArblJyaGl6b3hYd0ZoeUFpNXk0ckdIeFU2NnFBRmhUM3JEU0lWZHBHSHplbmNEZWpjREJEY0RzQkRCUDF1WDFDTUpSd0ZpUUlCenhpZUwzS0lZMVlXNU1QT3hOd0xSYjhnczBhZ2hBc3MxR1oxTytTRkhzZFJQdDBpL1BMSHUrK2RGYi94NG1YZmhjYld4aGZDdFlNRnIvdVd2S3hmRGFBY2c3aXBQQ3ZGT1ZwdW8zSHJDallXL1pBK3JScnRpNlRTNk1WUStMNE5QSDJueDY5OEduWEYwQnNLYThJYWI0ZEZacEdIeitKTEJ2QXBpZXFBQTRKOENQT1F1T0JCQU9WMENVWWJJc2tSa0FlY3J2QWROYlhjL2FEQ3hTcHlUNENFSXlUZ1JnbmVpTElwM25QNmZzK2E0QTROOEI4LzQ4Q1VDK1pHSkEyOWZwdUxteEpXKzVoNWtORmcyamlXSFNpMHIwVXY0cENvWnN4dzhEVWZuaGQ0VmswWEdkR3ZhV1BhQlYyaFZqZGpnQTBCbHBrUS9LOWJtbi9IT1ZxdENsdktFQnFsZkQ0QXRtZ1AzakRzQnhCNkRBN3RkYmN2WXpKdlFKa2lpMm40Tk9lTXBiZ0prdGJZUEdBQ2lGM3dGb0V4MVpNTmUvNGpuUExYdStLd0Q0dC81U08vaU1CY1h1ZXNIeWx5QUNNQlBEZ3pHZzdvcE04bUVISUdkd3JmR0ExckMzN0FIMTBhNjRZcjRBUHZ2T1Nkd0VQT1ZiS3h1K0sycGRLUlRtZEkzZHFrUFBWZ2JTVEJHQVk4QXNBVGpXbmlCZHgwUXhKeWxPRkNjcjZIQml3MVAvQ0RnVTNFZ0VJTVc1Mk04WWtMb2xRUmRkSU4xQXlLV2lCcmV0ZjlNSlFONkhzYUNQeGU0cnZnRGRIT2NPeERJQWNtREZEWHZMbms0ZjdZcXQ2M2dFSUIvWW9qKzRwOXhhQWJCSGVVUE04cUYyYVJoODRRUXdOUVljR2dkbXg0QzUwV3FDRm5nTnNnU3ZRK0R4dTRNdWlhd2h3SUFYVmsxTytlL0E3Q1pnVGhZMWRjbm8xbkhMMm9ESXlaVUxwQnNBRlRCWjlwalQwUVFnbjJWNnVmUmljUzhRUmdiczVaWXBFc0VORGVqQmZwb0xyd0FPamdJelpNQlJaMEFIb1VDK1NPQTU2eEp3TmxFeVRGdzVGeEJQZVd2bHpwbmJBTkNkUTFlU0dUUnliTXV5ZGdNZ2dWQnNLbXRZb0M2TXQ4em5aeHNaTUx6QXhvQU92c2greWREcXRYeDRGSURsOEwvb21RN0EwUXFBODJTL0VSZFRJMjJtTmZhVHVCSUl4UjRCaEtlK3k2MXB1blFDK015dEkvWnovYzlFdXZ5QmVldExBZkdaNVdPTVo5ajIvZ3FBQkIxZk1Mc0hBVkJxaGZUY3lINWQ5TUJ5RWR6cytCNTBaN3ZvR1pYK056TlNzZDhjd1VjRzVBU1JLWWJkSFJOWXdoaERJSFJnR21PMGdGUCtISmgxNWpPWGpueUtibFZUNUNiZm9xK3lKT3N6RjhQOCtWbk5QbElDa01BemRzL1lMeGxZem5ySndJcE82ZWdUUE1xQTVaTkRBQjZpQ0NZQXlZQmNCcVRSUTBlNDYzMFN4WnlRSlFJdk1KOG1TZUxyWWUrcC9HekdmblRwRUlCeTZVUy9vdXQrSzF3ZyticnM4OHJIbURPZ0FWQ01uckVmeHhNdGUxTXQ2ajd1OXp6S2dJWHpjekVCT0pJQjBCbkNKb3FnSWZERWhNNThTV3pKRVBHSmU5aGZWSDQydW4vTWZ4bDliZ1NpQnlTSUJXbkFKQkRHRURBQjhRV0ZBOHdPMy9hK3dINCtyZzRSTFBZTHVsOHRDSThDc0ptSk1RQU91d0ZDOXFNSTlnOVowQ3hoWno2NUswd2ZGQlBxdTdQRXlWZFdBT1RIVmxUY3B4aFhIWkx6MXcwWkE2RURMaGtDc2tSZjBzdzRkUllDMFBRL3ZWU1JBWVBvN1FDZGo3R3FWT1NNZUJTQXpVek14WmNETXdMZ2NLWC96YnY0NVNRbEhYRElnYWdKYytialpCcUFXaFVvSC9ZK0IyRDBKN3JGYTZMWURSbXpvbXNBYU9lS3F4RXZiV2FjSFFCMDhKa1JJdGVTWGlTQkxZSk9MQitYNHhyekF6WTd2Z2ZkMlM0UkFLa0REZ1B6TkVBSXhNQVNTV0YzOFdzZ2t1WEx5WFRSU1JDZS9EZHVTWk1CTXdlNk9iVGQ4SkJqMjRBb3QwN3VET2JQUDlYc0l6VUdGUHM1K0pKL002b1Q0YnV4SHY5WDdCZVk4S2dPV0RnL1o1OEdUQzlYcTVGeFRYT3c5YzNDbTZrNWZQY2pnYkhiZ0FsdlZHMnRIMVQzT2F2b3E2QmxuaVorMTJuNXUvMnNEYk92YXNxb0ZnOHgyTG5iY2QxR2RoU0FoWE4rN3FNckFDNHNBOHNPUko2eUh3RDI4eitGdDRmZHY4VXlxVURyRG1DRUJjcFozOWtMUzZhcTlsNEQyckxiL0tZc0ZUUFdkZmJ2aDg2dlF1MnMxSy9LK3pJalRzWElWUTlhNTlFZ3M0WTZzWmZJQS9FY1NwL2pFWHY4QldjQWh4YUErU1ZnU1FBa0dBTUlDY3dWbE5MbHFUYzlHYnYvSEFBN01yTDQrZjFWbFh3clVxN1N2Q295R2NycldwR2h1dXIyZk5HWXdNOFlUNjdoVDNzMUxhWnZxbjVNTE0wYnptSE1tSUZTZ2RGTmovbUlCY3Q2M05oRlp3RXpEc0JGZ3BEUGVhbk5nQVRmQ3RHc1g5VElLd05yZzl0dVZraGxuZzdUSS9ZQXJYMVZrWEtyRWUxbDJTeW5OMVJDc0ZKc3FuUXYzVUlNeGh3SVJqVTVBR045UVV0ZVZ6M0JVQXZhaHVOZ2pDM0h4TEFORDduQnAvY2dPTlhGNXdDejh4VURHZ0NqS1BidmV2bHpjS1VISDJhZzZjbll6ZXBZQkI5WmkyRnhESmRqb1hKdjFXREZpTEo2TUtxS1pVem9RRlRmajJIbXdUS2NUcFZXdmN4SEttNmtLZ29PUkFFdlZjbFBENk5kekxYcE1UOElZTlBjTFY3eUpHQjJBVmhZckFDNFNOQTVBeEtNOXJ5RFBFNWZzNmVlVktXR1oyTTNTM01RZkV5SlVLVjhMMVpwSlhwVko5cExpbG1sQXhXa1ZKSEt3SWhqakQ5VHRWWFZtMUhkT3kvcEppYU1GUldNK2JvMHJXbDR5TTFON29QaFRKZWNDOHdSZ0F0dEJqUVdkQkJHRVN3Z1NpVjBQYjlEUmd1MFRZMTlOK00xbVJLaDhuaXFGeDNyUkRzTHFqZ2w5eWFHWFQ4MHZjTDF3bkUyNTJQQVpDekFIUUNvaXFvVzN5WVdGSXQ2NjRmVXBLYVJFcjFOUGFrSDZYa3VPUStZRHd5NEZNU3dnVThHU1JTejBVSngzVngvNXZGTmJycy9FaUxSWSt2NEFDSVR3dzZpSkVvZFFLd0JJeUJSdjl2d2hLelVXNno2NlRVR0V3aERTM2V6cXVzQXlOeG5Kbjh4YTFLUlBTRnRzOVlmRkIvUURaY0FtNzhDbkRCVDVVOHJDcWpmYzN5aDhHbi9oR2QvTXNLZjErUXpZSjQ4OTFKeWUxM2l5MWNBRTljREorNkZwWXJFa2lkeEROM090WFIrRndCR01lem9NbXhKTE91bUF1RDRKNHJ4SnJmZEgvWENvTEdGVktpVWJ3K0xBUFFxV1dhTU1McmQ2LytKeWNTSW04NXc5bE9wdDFqMU13QXdGVGlxQVdFVXhlWUg1RU5uL2pJblVWSGVNWFEvZi9qUmVQdkNhNERoVHdMSGZCYzRmckdxcWFOSnpMUHc2aVp4VitIVHBsRkd2WnJYWlQ0NU4zOStIVzNUdWpsWnY4RDZmcDhIUnE4RHRzOVhJT1I1WXRha2dCZ2RycnJ0NVFzcThTc2QwQmhRNEhNd21WaXRBV0hBWS9MYkxEUU5RRGFUVko4UTZXNHFWQjUxT09xRFpEUFZCM1RMT0JlcFc1am1xYUxiZWMzakdnQkdNU3h2dmVtRFlrUTlHb0tGMVNoVUNTS0NxQmVRcnZtZlZaUEMxa2VCalhjQ213OTExdFRKOHE1WGdPTGFRZ0EreC9PZFdBMkVHWjk4Z2JqbGVUSGRRSFFOKzJpd2xzM25LMy9aaGozVmVRaG92WXpkeG1BclN3UWdEUkEzUWlTQ0pVclRuamZsNEtvelJDU0NDZVltdDkwRW9KSmJWQ2svMStGaUN3Rlp4TGs0ZFJmTEZpYTZ4OExiWWtEOXY5Y1h0TEc2K080QVlRUmZyZ1B5Z1ZJY3F5aFRYY1dGT0pIOGZoM3J6N0VLd25VQXJxOG1jR3dLMk1DQzFpN1dZN1plbmg1NmZlSFQvakUzeWxpRTRUWm5jZDYzNmdQRkNLV2F2R2hjUngySitjdnM5TWxTdzBUeTNjQ20rYzduMEcwTUV4ZFc0Qk1JYlRYRTlVQ3ludnlDQ1grT3ZtNGdiQnlBL3hpc1ZnSlBwWHJ6TGo0RW9SSmpKSVpyV0hBclM5aXBySytLY2VmZ2l5QjBYVktHak9tQ21XOXhoUlZNVVN5UkZuTmVGR0VkSTJxKy9IRlhjbGtwOVdzQWJnVEc5d0dqMDhDSTY0V3hSay9PVERjVUF2QkhYU0xReGNWQ0RNUVNXYnp2KzFlN1dWYnorazV3MnRKdHNiY0NZVjZXSlk3aG1Bc0RBN3IxU3ozT2dPZ29NK0tUT0piY2pTSTV5R0lhTkUxdXV3bEFBVS9NRit0RjUvMHNJZ2hWTGRWZE0yUzBiU3pIeDJNaStGVHhYZjhYOTI1TkM0QnljSzhRd2ZtZ1ZYMUxsY0ZpeWtFTWNMMkJuZEpKN2FRZmlqS2Z4TEdEd0FoQnlNN2FDNVU0cXdQek53dWZObk51T0g0VlphQ1BsUG8yQWFocUZxb1BWRmMxNGdhMm0rV0VFTDBjQXo5a2RQck9tTXU4cjFvL3JUc1h6N2Y5b3N3RnMrak82TEFxa3ZDM0dnZzVGZzZtd1cwM0NVSTZYMTJoOGx5ZmN6M1FIcXIzRElsNjREYnFhUUtjOW1JODdRWEFDRDZ2cEpxWTBFVnh6MkNFeUNJNWVNU0dYMmU3VnRJNUo0eVRSeVpoc2NydnQxblF1aXZPQWFOTGxZRVN3Y3lTZ2lWYnIzN0JmZDAvdTMxeUVnZzJGVmFpUENlVk9ndXFBZkdvdjBpUjBSOUpBQkowYm53azluTXh3K2ZPaDU1RWJnUmh6b3pyQlVBMXBvbE45Q0x3b2s1SEVFVVFCakZNUUI3RCtqNjU2UFcrSXJKOE8vYkJDbzRzR0ZkR2VqcWl5WUN4M21LZTkvSnRUaUJ2bUk1T0ZpVGlzZzlMdEpGRjdnWkdEclViSEtzNzkraHl1NWhTYVV2aDFmb0ZyM3IvNnZaSkNpWGdDRHdWVkZKN01WbVJMc3JHbHR1RkNjNjh5RmRBQ01EQWZsd1I0UU0zSFBvS2dJRXh0NGd6NDJTdWFRYjhoQk9FMm9abWx1K0tGbEtSM1FTc3NNSnhEUFdiYmpwZkxvSnJ4RzhDWVQ4TUtHWlNWVEN4WUZUSWI4NG5rQ3hDSVBMRGlieTMwZ1hGZ2hhRjRjMlJlUjQ2NlV1MmZ2b0ZyM3IvZktBRUZ4dnBxTWNkOXlvbklya3VLNUxMVjdNVkNNKy91REpDeUlDMko4YTB6MWl3cXlFU2dNbDE1U2EzM1FLZ210UEVCbnAxMW13dVhnTzcwVWQ0REhXemZnRFlDM3pCRU9rN0hsQTZYS3lIUXpiOEhnR29DU1FMcXN4b3JJeTFCeGllN1d4MHJGYWYrd3I5WHYzMkMrNTYvN0hiSjVWSHRSWVQrR0pyc2VoSGN5YTU3UHlLQVFrNit2QmtCWlBwalBFRXhsd1U1OWF3ZzNDMjRXNktCc0M2dHFIUitNaWR5VkczaTNyZEFuQXNIMlQwOTNYVCt6THIxOTdNVEE4MGgzU2ZzWlAyVXFwQ3JQUTQ2b0YzMTdWcnBlaUtYVEo5TWhNTGtnR2RDYWNLRy9tdXBWOXcxL3Zud3lHZ0NEQ0tXekplM2xxc3l6TFdaV2U2L2tjL29LemdLSDRqQzdvb2xoZEM0aml1ek0wV1BvK2NQUTJBc1gxb2JGQ1RPNUp6bjU2NlB3YlJlaXduZlRXakk0S3ZEb2gxanVoK2FUK1dLU1lEM2k4QXFsMnJKaytWc1ZRbHk1a2tkZHYyRnZIVDYxaWNxTzdGcjcxL0lrTE5YT2kwRlFqVjAwNDZvQnk2d1o5MjJROTVJQ3FERWFMNFhXdzNDT2NmOU13NzNERkI5QXFFNndaQUFTOFh1ekdRSURLZitvVmtxeHQwMHR0QWMrWVQwUEo5cVJGU0I4eG95ZTVYdTFaVmVDU2dDTGJZTFZOc3dvbmNIeG9lTHdDekJHakJOa2kvNEJYM3o5bFhnVUN5SUlHbWhvdmE4M2NSZ081VGU5eUxnUDNNZm1zQlM4eHM4L1U2N2VQUU9xeTl1bUJVcnVEY2hxbzhzSFNkM1BNZlQ1aWZvK2FjazhlRkhJNlFFY25UNUd2ZE9uVmRYb2YrcHRKK0JWUFdjZWlhUkhBOFVzL25rQUNvOG16cWxxbVdyYkZEcHBUNUE1VUlabTdDUEEyVmdtM1Fmc0VkOTA5a0tJcUIxcUpBS0NCRzhac3RaejN4SE9BQWl3bXBESWRuZzFtYVpRQWtaenNIWjUzN1lmUXJ3Tnl4b1ErSGFrcm5TMGgxbVVBMUM5NlRkSlRtT1J5aEMzb2VxZHdST2krR0Roa0ZJNmJZTnJjTkRFRGVBa1h3UWl6UFJwbW5JczNPZHFaUFNhUkZVY2JjaEhsZ2llNmFncTJrWDdEZC8rZDhsVUpWWHVVems4RVJtUysydmZkNHV2TjJWT1Y1clN3YjB5M0poZ0loOXdKZU4zWU1RQ0lnUjc4UStuREVWWUJZWlVyVXBiWEZuTTdDT1NkZjdONElQdnREblQyQlkvaDhDaGgxME1YUWVZR1MrN0dHamFRaUFCcHVOSUZpRUNuemRXSk1JVUhjYXpMcHRDN1lpdnNGOC83RmdMRk1xcGlRTDVUdU5iS2ZBL0RDNDZycXFBYkF3SUtXSyt0aW1SVUJFaU5Hc09Rc3lRbStHcGpkNG4wNDZoYlQ4NEtQdVlqT21ISHlwOTJnY2dEUzJPb0l1VkllaC94eVVrYVZ3eUVXZExyZXdIRTN1QlVEY0tJd25xNDBIcERYTCtuM0N6YmFLZGd1ZWw1Vm5GSmwyYXdhZ2hMUUJUenRlWjBjakxxMkEybjBNNkVQaDJwQzU3V2c0MXBvTHpac0FaTnNvMEh3NmVWUi9KOGJGOVlqV0dtVkNwR0t3UUxCUkNjcmJpU3hOTGdWQXhDRjhYU2w4WURISEZQVzd4ZUZCUnd2L3JHcU9LVUJrT0R6cWdkV1BZQU01M3ZUQVNNUXU0Qng5Sis2OU9ISUYrTjcxRjFPMWdVQitBc0JmRnFLQys0V2k0QldYK0NZZ09UQVUzNndkTVZOVktrYTNNb0JXQmhQeHlpdWtvM3hrU1g5ZnZHTWtxc0RsenpIQzFONlNRNERvSU5PZTdLZWxXV1RoZXppT2JlS0NkQVJBcEQxQWRWblJIMDQ4Z0tVQW1BRVlpNk9oNERKVjRWb0dEV3FqcTRYTGJPNW8xakJvaW1FUGhQSm13dTlGdm5UTGdkZ1lUd2Qyd3lYYk15UktlbjNpMmVYWEIyNDVGbFZZVXBWeFVwR2lMdG1HQmxyVEVoVlV3VjhkRWtWS0FxM01ISjF1elJiUngrT09nRFdGWDZNc1hKVS8zNmxKb0VvQTJBS3Z3OCt1d1RFRElCYlN0ZE9zOGRkRHNEQ2VEb203WmRzekJJczZmY0w5cm9yMkM3NVVTOUl4SkpzRXNIZEdGQmlsNHlZdVV3a25vZkpnRjRYY0VVZmpyeitYN2ZLbzRFSkovL1BrTU9STzZGclZqUU1lTDVrSmhaTU1Yekx3TlpDdDFuekRGZ1lUOGNRd3BMdDRoRE9OMGkvWDd5czVPckFKVmUwUy9JU2dGWTdqOVp2blE3STMrbHlxcFlhTDk4Q1dwL04rbkRrWmRoaTZiVzhBbjFrUDNmUlRMS1ZXbHdGNlJaQ0gyTDR6RERSMGsxSXFlVE5iMk9RU1lOYk9RTVd4dE14ZXF0a1k2SStueTlWRXo2YnRmYjd4YytYWEIyNDlBb1h2ODUrdElCVmdKSjZuNGxmNm9WK21mamRESk5NSDB3QVZGWDkwR01rMWY1VHhsUzNGZ2doOTJEeU4wSU9SeTU2NjVLSWZDa3RzbCtLM1ZzR3RwVk9XT01pdURDZXJsU25qUTJyQituM0MrcElCZHVsejh3cW9uck5QTEtnd0thQzVCM3M1M3FoWFZxNm9ETmc2c09ocXZxaEVyM1YyVk5MQmptblNTTmRyT0xKMXprQXU2VlBSakZjRno0ZlhESjhpNDVoRzk0R3QzSUdqT0ZZQThUVGxRWi9xR0gxb1AxKzhadGxUMU1BdEhLOG1RZzI1ek9aVVNDTElsaVdjYnc4d2ZXNUxuMDRzc3FuSFgwNGV1aUNrNi8zZGU2Nk1QcHVBUVZaQUVGa3cyTUtGdzZhMXdFTDQrbFNCdm1BT01oRDh2a09rRlg3N2ZlTE53MTRZVC9zc21jNEE2b09kSEJFa3dYbGdqSDJrNE5hbDZ3QjRmSXVYOUx6WmpBbW9yTmVITW81VGMwT2V3SHdEVFVoOUhYeGZHSnNZa0FiQUFBZ0FFbEVRVlMvdXZDcG9BY2V3NnpCQnJkeUJsUXd3b0R4ZExaV1hMREZrSHlGOHhHRS9mYjd4UjhYWEJ5QUFWQzFvQjE4SFFZSVQrOHVHZlA3NVNDVXMxbzY0aGU4djRqNmNJUStJcWtQaHhyQkNIamRqQkg2QWJsUWtBZVkxb25kdWtTaUVMbXNVUHBqYnlwN1h1dkRnQVh4ZE5aVnZXQ0xJZm1LZzZCYmhyanVwOTh2M2xWd2NRTHc4Z3FBNXY5ekM5akVydXRsdGc4Z014RFdXTUJhTVZrbUFOV0Z5RVY2UjB1SDJJMUl6Vzd5cGJrUU9UUDVmMmNoOUtzRmt3cDBrUWxEQU9teHpIcHNjR3VHQVF2aTZWRDRSZ21BZy9iN3haVmxUNU1BVE5Yd3FRYzZLR3dmMlUydUdWMnV6ZzNENHVhN2ZEblB3WmNLZ0lkcTlHYUlCUFpiMFlkRDdoZ3lJRldNWGlIMGVRNXZYUzVIY01rYysrOWx6MnQ5R0xBZ25zN0t4eFpzQ2tnZHROOHZXRCt2WURNQVVwY2phN2xPUjllTFZjSVA0dGN1b2IvM0FPSENkVzAyVlRYNjJBcEI0TXYxdjI0Z25QeTlIaUgwM2ZKMzY2S1lIWVRIc2dCQmcxczVBeGJHMCtITFphT3A2NWkrbG42L1lNNUV3ZFlCd0dqMWNtVWtFNys4VEhMTmRBSGh3clVPWHRjck8vcHdoRjRjY3Qyb042OEJNRENmbXNKTS9uNlBFUG9ZUHA4Ykgza0NrYnRqamkydEpKQTk2MllBV0JCUFowV0JDcmJZc0ZvT2Y5cERBaUVOazE3OWZrdXZmOW5UWGV3S2NCU2pzbjdsZG9uV2JnUXB4KzI2b3RhTEl3QWxmaTJRUVNKWTNZank1aTlkbXNGTS9vRURNTS9aN1VmMFJpWVVBN0orVG9OYk9RQzNlMFdCQm05cUxhZDZISUNHMVpLMVhCNVBveG51T09JY3hTWGUvT2Y4eEhWL1ArRnB3TjQ3Z0tVcFlIbXVTdmUwcEtaZ0NLU3E1d3FuaVdFMVdaei94b3VCbTc0S1RNd0JJMTdsVkJYd3RXU3MrOC92TDQ1RmYzdmhwY0FudndvczhkNDhEWlgzTTJoeDlYSUFudTBJSU8wY2h1MzVBT2dMTDB5dUcvak9td2JnMDI4Ry9tTnoxWVdkRVRibTRJNUJyRmxvditFdEQyd0lvN2wrQXRnOEQyeFk3aXczVjVkaUVxTzU0bW5qNlhkTUFZY1UrNmdvbjdBM05TTzJxRmpseVpZRGtBWDZ1RDVJYW00NFlhVWZWTkROeGFKY0xJUFhjR0dwZmk2UG5aZFZEMXdQc3BRQlgvd2w0T2FOd042SnFnK3h3cnhzbGNWRnVZSmJsZWhrY1lZWkdQUzNMMjBCeHVlQmNTOG53ZzVINWtaa3g2VFFTYlhGWmNDUUthZHg1Q3o1bVB1ckFGeHJSYWExN3BBUjJQRkMrRWxTSEtRLzBRalFjZ0N5R3lNOXYzU25zREJSSmdMNm1zV0NmNklmV2VVSmFjOFVGbHBZODUwMERjQ2Z2Z2I0M2hpd1p3eVlWaGQyRC9WU3JLR0FtSURuQmtpYWZFY045Y3BySGdLTXpnTmpTMVY3clJqUmxjZXlycWlmNktBa01nWElNKzZ0QW5EbCt6U0wzNk85K1U4cDlqR0hRbzI4NS8yWEEvQW5YZU5uS0FvckRYSC9BSUx3YlN2TEV6NlFsMitjQWYvM1hjQ2R3OERrS0hCd3BPcEZiRTJ3YWR6SWR5aDNqak5RaXJZV0V3WXErL3pKd01oOHBmK3hLTlN3TTZEWk1tek5SUmJNMksrMklpNlRsRnJBV2ZkNVYzaS9GN0lnVDJMQkY1TGJJZGtxeExQV3Z0emxBR1EzUnBVM1k3QWlpeE14TE9VQjJ0N3BLUThNMHFDVG5wOEhrb2pKZ05xYU1FSmVzUXY0QVIzSXc4REI0UXFBcys2U1dSaXFnSmdZMEhWREFkQkE0QmE0eE43bmRsU0ZBQWpBWVg0SVBPNWRCRE1BZFMyaStKeDdYVGYxZUVkVERmZ0FRblIzNHAvd1FrUm1qTkFvQnlEVC91Z0ZwaFhBbWpBRW44cWFQUUFnWkNzMGxTY2tDTm1WaWdFYkZNc1BCQkUzRGNCWDdnTHVhd0g3aG9BRDdFTThETXc0OEFoQVRyanRRd2lYb3FrVEV3V2Q3TE9uZVhOQ2J6NlRpcS9USW5iMk04WnpJRnJUUWJHaXk5Mm9HejdwWGwvN2p2ZEFKbmIyNDcwSWJCM1Q3N1NhaStoeUFQNXZvVHFXNnNLd0ZBYy9UQWRjNSszZHZjc1RydlBWWVNLNFNRYjh4VjMrNklhQXFTSGcwRkRWaDNpT0lGVElGeHRpdDlvckw1Wi9MRDFRNHMrQjhPbkhWdVh3aGhkZDVEb0xHc2dDQ0owNHE2NlgvSnUvdlNhZUF4RFB2YmR0bWR0S0RWOTBnVkVQSWwveHlTa3ZpT2htQUVqcmx6U2t3ajQwU2xRWllaMzlJKzhKQk14OG1acnloT3NLd3FZQitLcGRWU0RGdmhZd1BWUjlCRDd1eVg0U3dSUzU5bk5JK2JSY2svRHpKMDV2MTJNMG5ZOGZBazhpV0w1QkI1cUFTUEdSQ2k4RVZqenYzbXFwa0M5QUNycndoS3VrQjY3R2hwcVJSb3dRTXFDaVliajhvT29IZVVXcGRZSUJBVWo4YzhXanJqeWhOSUoxdW56akRQanFYZFVqSkFBUDhUTUV6TFlxOXVPSElDUUFMZS9Fd1dlK1FnZGRBcUN6ekQ4K3ZnSWdnMHFwKzVuWWphRHpDZ2ptbkNZb25lMGtscVA0SlNndnZLKzZMb0ZQb0ZNbGtQR2grMHJQV3RhNFJIVE5KSlF6NE04RUFHb05UUFZVOG9wUzY0Q0M5em9BV1RGQ2hjcTdsQ2RjaDZzM0w0Si8yUUZJRUJLQTFQOW1ISUJtaFBoM0FpMzU0UnlBQW1Xc1IvUFJzNnZPUjhaOEZNUFM5N3l4dElsWWdWQi9JN2pDMHJJS1NmTFhGMUVFQitCRkZqUTNqQ0xBNDlPV3NSVFRFUHp2elFFd3J5N1ZyWjVLd3pBUUFQc3NUOWp3MWRjSGdDck9SUUNTL2JnbisxSHNDWVFTdmVhSGt6dkd2MXNjZ1UvNlI1NVkxWUl4aHZPbTFFWmVrUVdsOHdWRHhKZ3djODhRaUpjNkFLWC9tZUhEYXdYOXoxNk0vRW03Yk84UTA4R0JQL2pFa0FFVmpNQm9BRldYVWpSQTNLdE53T0JYVzNFa0FaaHJBTGt0cEM2bEt0VFY0T1U3UkhCKzNrSFdndi96cm5ZWmwya0NrRjR1RjhNR1FHYytNcUVZVUNBMG4xdGt3eGJ3NFNjSEFIcjcxUTdXNCsrYzhjendjQkFtSFZCL2M3QmNlazliM0Z1d2JkRC9rakdXZ3pKalEzdGhHbVZBM2poZk95VStSeEI2RmFtT0ZwOE5yaHNUZ0x5OENwem01UWxWcHRBVSs2Q2lOZ1hDYUlRMEJjRFlWOGIwUDRwaTMwdmZJeEQ1K3c3MkM5YWxpZWdXOE1IenFybWgvbWV1RmhZaTBwS2JzNkQ5ZnNoL24xWEZNcllNYlBnVUJ5Q1p6NkordUVrbkRBOUFvcm5XRlJiMDFXWkVzQUNvSGhPcXlDN3dkZXRUMFFBSzJLcU9iNU1DVXZQeWhMRTBvUXh6cWFZTlhMNXhCdnlWWGUxMnZCeUxBRGpYQXZneEJ2U1BHRkdNSWpDbUpiRVc4SGZudHh0UW14VDBjbXhwOVVQQWRLQVoxdXBBNkVCN3FnRG82b0NVeFhSdFBWU3BBd0pwblVodXhBcVdDQ1lLMU1CRXhabGpZNVM4U1lyK3B4QUZBdUJheWhORzI2anc4dXNDUUxYMFNBQWt3d2NBRW5neVFpemFYb3ppSWxpK09lNy85a0p2TmsxTG1CTWU5RUNPM1hSQjdhUGVGMEVZSE5WUGRUOGdqMDE2WUJjV3RCZkJWWUp1ejdtRjdWZ0dZL3BPOGY1V2RRMS83VTY3bklLTlM3ajB3SWJEUEZac3lOSEhZN29kL3hkbEVIajhDY0MzVGdDV0hnR0FQU3hpU2R0NDMxMnUvOFNQQWw4L0RsaDRwRGVaVzJQRDRKMWM5K3V5RGFJRGtnRUpRS25UZkcvTjhuVUFtdTVIVW5NVzVBUmJQZkV1SUh5L0FDalJLN0ZMNXBPUjRSYXhnVEhvZktsOHIvUzFaV0JuQUdES2VmYm4zQUZJUFJQWEI3c0ZpVlFpbUtWZ0dkbDVvb053TFExLzFVK0RRR1NYUTlyNUV2eTFxOXJaYlAxbEdRRFpzUHB6SThBUEhnWGdvZDdxVXgxMVl0QmJGekMrL0MrQkw3U0FXd2hnZG9Ma09OU0xxeTVvTG9nWWZ0M1pJMUY3RUFDK3Boc0FuZWtva2hQNEhJem1sL1B2dGhRV21QQjlMSjdqeGtjU3IxNGpXajQvMHdGbGdKRDVlb0R3NmZlNER6QVlQSG9rV2hISlozVEZTa240aDdZT1NPQndFdGlNVHYxYVkwdWt0RllUbUkyLzQzRU1RbUN1QUptVUUwZ21WRDhFRmRQcGRueGhWaHF6RHI4RjROTXRZTTlKZmc5OEVWVGVOdTlRMk9GWkJYN3ZyOXZ0Z20vbGNlemN6WjYxWk5OOERDdmlsWUNkUFhxTkRRcEFsZkdUS20wTTZBQTBQVEF5b01TeDY0Y1JmUFFIWHNuaU9USStmRVdERkdwK1FiOUJleVNSQlYya3BsMFF4eEdBbEhEbWtJNTZYNnorRVA3VURZU2RSZ2gvSW91d0laMzZsSGFiQkUwR0owcjEwUmdiL3hBL3R0L2ovNmFNQWYrN1I0Q3h6dUJYV1JHVUx3QmZJclk2VU5mcHZMYWU3bjBJK0xPL3Jlb0xNcWlWTWJXMzhvVWhrTmtRSXpaTzd0SXdlR2VQY21XbEFGVGpBWUhQVkd3WHhXb0xZYmxFRGtMdVRUOE1EUGhYTEo0akFMcGFKQitnZ1U2eGZnSmtuVDdJS1hJUVhoNFkwRlpDb2crd3hpVVR3U2tYVWJTTVYxckIvQTMxT1hXdUZwUFVkYS9tUkhLaTFlNlUraEE3WnE3bCtBK1VBZkR0SGcvTHJwdGtRcFo3MjdjUldPTDk1NDJQYTNyT3Z1T3FhZ1VsdGd0bUpNMDhqNC9QSUxiSURLejZ3NVBBSHNicmFUbk1HZFpXSXdJenhJZmVLMHJuNTc4SjNMQVZ1SDhDT0RSYWhWL0ZGUS8xSXVtSXZYUDFRdWROZnlOVDhvVnFjSHZpUGNCZDQ4QTBnMlJEdW9EcUhkYjJTYWxaQWRHOWRuZkRrQUUwZ1huSDVpaldDRGJLQ3E1L01SaVYwUUQ4SGdIUTYzakcwaGRzTEd4QTN4OUJ3MUFzbGk3aE8zQndBcGduZy9HanZxMDFJSHJYSjdxM0N6N0UrK1l6aUYycnMxWkxaKzhIOWpKc1NvRUNXWGo2aWdtUjg3YUxnZmJHcTRHdmJnTHUyZ2pzSHdkbUNFSVBTSTFoK1NrQ1JqcGZVQzNpTldjcG9ScmNucllidUdzVU9NQm83UUJDeFNURy9pZ3hWY0JJVkdQV00xaDFKWVFQbnlLTkV4R1pNRElKOWI2NmVFQkd4UERZMVk1bnYrR0NqZkdBeEQrRERwaWF3cGhBQldaUGp3TnpOTEFFSUg0WENIME03LzVjOTNiQmZJOFlrMmNnVkFkdmRUMTBpZkRrQldDL3I5bEdINTFOaElzbnNXSE9mUG1FVUtUOTRXZUFHOGVBTzhhQWZXUEF3VkVISVNOUWxLUVVnbEpqSkV4cUMrSDZOcTkza09wVWc5c3pid0x1SGE2NlF6RldrYUZpZVh4aTZoZ1ZIT01DWUdSdUorNVY0allKSURLSTlLbHNBdkZEcThRRHJuYjhOV1ZQaDlFd2RGa1E3OVRsU01Jc04wTWk1czlNb09Hbm80VTZmM1lBdmVmTDdZN3J2ZG9GTHhPQU5TQThmN3hTZ1dtZDBrQ1FibVo2bVRMRW5KMFVxV0xoVWt4bHJCbjZuM3dXdUdrWXVHdWtDc3VmR3EyaW9qblJGcGFmc1U3TUR4RXJKdVpoWUNzSm9zSHRXVGNCZTFvZXEraHhpZ0pnWEJyTW1UQlBuSktMcnIrVkVENTRpYkhZdlpvczhzTytETmNySHJEWDhZVlZ5Z2xBS3VkMEx0TWpGUHROTXo2UUxEWTdWb21MSmQ2NzFBRUg0WHUrM2c3bldxMjhJU3ZYNTgvaGd1T0JnOHZ0RlF2Vi9oRXp4ZnFPZXZ1VGZwanJpOHZBV3o4TDNOWUNmakJjNlpZSG1CY2l0bkZkMDZweHliOFc0Z1BsZ29uQnFmZlR0ZFRnOXB5YnFpVk5Cc3N5VXNkVUQ3ZUdPOWFtbmYzc1h0eFFpcGw3V2cvc0Q0QThBd0hJeVpNWWt5NTBUcC94Z04yT0w4eTA1MXF3MmhYendSQ0VkVDJubWNrMVJ4SEcrdzVqZU85TkZRQnBSNmxkTUlNWGxGV2dWbmRxRjJkVkZzSnp1T2dSd01FbEI2RGNJNnJ6bmVtRDBSbmJ3UWlTUlMzZzdaK3RWSWw3UEM5a2FoaVlabTZJaXp1TGlnbGlUL1ZvVW9nK3A4UDlsM3dKN3FHRWFuQjc3azNWY3pyb1VUb1dMQ3NBQnVkNHlwYUxDVW94ZjlpLzl3OUFEaUlDVUxyUVJXdUlCNnc3bnVacndhWndMQkd3Q2xTcVN5ejNBaEhiYVJHRUZHT21DNDRENzJVVmdqVzJDMlo0bElGNEFyam9kT0RRY3FVR3FBeGZjcEc0bUpWdVZxY0w1dGJzMnovdmVWMHRZSy9uaFRBcWVzWU5IZE81UENKWm9zK1d1enhISklWaXVYRnlKeHVwTkxnOTc2WksybGl6VUtvZGlsR1VnenlHaG9rRjh5dzVNZitxUmtqZGpmdUR0d2trbTdEVGtOYUJhUTJveDFxM2VNRDgrQjZPM0g2ZW04S3gxQ2N4OXB0V2w5aVlJVUFBV3JJM0kzbkhnUGRPdHNPNWVPdXhYWEJkajBWMXZPTC9zbzNDeGVmNjB0bFNwWXd2ZUtmMHBBdTZvaGZkSjhrNENVcWd2cjVqVjZWR1RCS0FMZUNBaCtWYlpMVG5oNWd1NkQ0NEE2SDhjVmxrTks5NU8xV2tCcmZuMzFSNUhTeStKQ3dQcGxBeFJlZ0UvMlQrQWxvR25jTm1iUXlvZ1VReC9Ld0I0Z0hqOFlXTlR3UkFPVzBGSUlJbmRvcU5rVEF4ei9iZDA5WERHTEJkTU02L3BMS2k1d2hBWDYwZ0NLMnVqeHpFQXFHTDJwUTFKaXM1QUpFQUZIdlR1allBS2pSZitTRXVnbTFkMkNPUUxVL0RBd1E0NGNhRXc4QXRaelNJUGdBdnVLa2RyV01NNk03eENNQm9pQm40WXBDRTJOQ2Z4V0FBNU1FdXd2Q0NFSUN3bG5oQUhWK1lPUmZEc1dKR2dQcE1Ld2cxYjlRcEZuekhiRDJCSzJKR3VsOXM4S2tZVzE3dkxBTFFSVENCcHpYWnBTNGd0Q1hYTUFrZHV1QXk4RTdQaWpQV3ByWEo1Q1IzOHlndzFmSkRvaGgyQmxSQWdxMk9lTjd1VFdjMUQwQUZOdG1MNTRFU0JzQ2FKY0xrRGFqeGo1WlhSaUNJR0Ewd2FEd2dqeThzazUrSFkrWDlwcFViSlNDcDZUbkZDTVh3bnkxV0FGUThyVUFjMndVclJMNm1YVEFlZlduRmZuejNGcGJhZ1FLTEFxQXpvWmpBS2trcFhrTk81R0NFdk9NTEZYT25uQzR4SUtPam5RR05kV1NNK0dxSFFHZDdKU3N4VWYrSnpRTHdoVGRWNGplMW5RdnIxTWtQR3RsZjl5UDJEeStnQXFaNnJReXRmdmRIU0R4Z0x3QkY4QW1BWWpIV2x1RURpS0dNaXFPVnZ0ZWpYVEJPdVJTWUp3REpBQVJnWkFHV0w5TmsrSU0zU3pnVHlkRTRlZWMxblpIYnREYU5BZjFEcGQvU014MkVORDZrRDBvWHRGaEJYbWNZK09ZNkFGQ2huS256bDdOZmRNUjNxQ0FhZTJCK1ZWTVlYQVN2RHMzL1gvekhKWmNCODR2dWlxQUJFbzBRUG5obndxUUx5UlVSbVpCUHl0bndIZGUwTTF2TjJsUjZwaWNvS1VMYXhIRElFZEhrVzJpV2c0LzdiNXpiN0RTUUFWZDAvZ3JpVjJKWW9qZnB3UkdFWXNHQnJPQm14L09nUDVzQUtBTmtjYkZ6TldUUm5YL0dTR0ltTVlIL0xZbGsrZ0d2ZFQrYlcrU1dIK0lnMUdxTDVRZVR0UjJFWWo1TFZIZmp3L1pEd0w4eUo2VEI3VVUzVlZvVGpUWXhZREsrSXZ2N2R6TkFaSXhwWlNpVThqaktnSVdUY3lrWmtCYXdEQkJuUWRNcjVRZVRLSTVpV0NCMDlBbUViNyt1Y25PUS9hVFBXbjZ3dXp5UzR1K1IwT2I2Q1VHcUpwSURBOTdBZHFJTmJnUmdCSjY5Q0c0SnA2cS9ja2pYcUIvUktsYTRXcGtPMk9EZ0hveW5pZ0EwSmlMd2FOaUV0OTVZUUtKNEZSQys3YnJLelJIOWpaYk42aUpZdVNIbTlJNWlPQU9oSE5KZlpraCtneHNCS1BiTHUzK0pnYVdEZG9qaE1PNWtrRFdTbE5UZzRCNk1weUlBamYzSWdnSmdNRDRNQ0FSakZNVTlRQ2dBeWtoU0tuVUNZSEI5SkIwd3k1YVRSVXhtdXA0aCtRMXVBbURzK2hwWGdGTG5CNlVMT05PbjV4QUNOSnF4Z2hzYzNJUHhWQkdBaVFHOWFMZWlsV1VKVzFGdlZYRU4wVEtwMUM2QXQxOVRNU0NCcHoxZEh0VC9KSDdOOXlheHA2UWtGNzNLQnhZSXIxMG5BTXByb0I0NHFRR1RqNnNqVXJ0T0ZQdExlRlFITEVTOUFkREZycTFFNk0xM01heFZDVE5BWE5GVGhJeWxMY29yNDB6eHRnREFQS3VWd0RNck9LdytTQlRidFIyTU5EN3Nad0M3UXZtNHdxSGE0VC91SXJoYis3bjBFZ2JRZFRpam95ZythZ1dYVDhsbERzQUZXci9COHFQMUs3YlQwcHZ0VndIaFc2K3QyQy9tOHN2dlpsYXdpMkNLZTM3bmhGdGFwa0RuSUxScUJRQSt2MDRBak15bjc5RUlrWE8vRG56eUNCd1Z3ZVg0d3hzOUI0clJaZ3lQVkZxeWtnRGQrNUpTcEJVNXIwdkh5SHoranNjM3ViMEtBQnNaTUN5UWdlRXhLeUZQVkl6M2xtY002T2ZQQUdDQURZUEU2N0pmczZoN0cwbyt4dmk3b3lLNGNMWmZPZ3BzWHdDMkxxOU13dXVWRVJvbktuNG5TSnJjWG5RS2NNN2R3TU1YZ1ljc1Z4a1NlYkpnek9XUHFkQjFhZDJmM2dwc253SzJMWFdlUjltM2RhblVJVjFsQlNDUEFyQnd0cCs3RFRodUJ0aTZVRFdEbVdBL0R2WGs4TFJwdGZQdE5VbGloWVpUT1BDaTA0R0gzd0ZzbndHT1c2aUFzNW4zR2VKSitLTG9FKzlWRENsUThSNnZPUUhZZWdEWXd1WTNTNkgvaUo4amIxMWNrMHE5UWhvYzlRTVdnUEJaSndGYnBvRk44OERHUldCaXFRSWdXeUpZM2xQb3phR0oxS1RFUGgzNnpwVGtKcmNYUFJFNDRTN2crQ25nMkRsZ3l5S3dhY2xmRm9Jd3ZDd3g5Wm4zUTFEbUlQeC8yL3NTYU11dXNzenZqZlhxMVpSVUVsSmtLc0JFR1F5WWhKQ0JTa1VxQVcxdHNCZHB1eEVWYUJ6b3dYWnFlMWc5MEcyTG90alFkbU1qS3F0QnhRRVJkQVdVQWtVbFpOQkdrUVJOeUlBRU1Ba3hwRktwcWpmVUczdDkvL20vYy8rNzM3bmpQcTl1VmVxY3RlNjZiN2pubm4zMi9zNi8vLzN2Ly8rK1R6MGRtRDBLekM0RE02dkFGcGQvMEwzR2g2eVREZ252THdLekFXREdpSC9UaGNDMk9XRHJFckIxcFJnUWlzSVFoQWErQUVEK0hFRVk2dU5MeXJSblpMU2w2dFNicmdMT2VCUTQ0eWl3OHppd2ZhVjRVR2JkZWdtQTVRTVRMRmxxc2ZuN1hlY0RXK2VBbWVQQWx0WGlYbmt1WlNCa1JjbTRVR1h0VTJ1bzN4c0FaZ3o2eTU0SnpNd0RXemtnQk9BcU1NVkJDU0FVT2JoOFF1Ti9DaVRnY1dBdXlXaEwxYW12dkJiWStWZ3hiVzQ3N3BhYTdnSUJxQ25VcmJVQmlRdWhBS0RVb3QxM0liQmxEdGl5QkV5dnRPNVZEeHZ2VmZ4Vy9Ka1dORnJDZUs4TkFHc1k3QnN2S1FDNGhRQ2tKTmFLeTJMUklzZzZTSjNJUVNlMW9uS0tDMkNzT1lNZU4rMER0ajBPYkRzR2JGc0VabVdwNVM3NGcySXIydUEyMkJTY0FKR0ErZEpGd1BROE1MMEVUQVVBa2dEVFBxOXpkSy8rc01XcFBGMTlOeFl3QTRnM1B0c0h4QUU0U1FDNkZkU2dtR1dSUklKTFpKbGw4RUdLakhpWDFqd2FOMTBIekQ0QmJEMEd6QzRXcnNLTVcycE5vYlpvQ3U2Q0xDRGZDVHF6Z2c2c3Ird0ZwaGFBS1FmZ1pIS3ZwUlNZZzdITjVYQ0wyQWJBWndQclpHYWo2aXBwWGhnbjBrcW1VMXdveG5IZWRnNUFBVHVXSGlnMkZFMXVWUndveG9YK1djYmc4OVMzQXFDS1BPTmNDaThvUHRWUCs5KytHM2orb1NLMnhSQkZERWxVeGJUUyszbnZjNEZwRHNqeGxsWFFvSmc4RmdkQ1FvR0pKVFRpY0xjUTZ2UEw2d2JnOWNETTRjSnYyN29BekZBNWt5OS9VT1N2bWc4b1A4Nm4wZElDQm4yNUp3akFSV0RTQVVnQkhONnZmZGJ2MTBBYkFSaDhYOTF2RE0yc3MrTnZBRUNLUFZMQ3NIb3lVZ1JxcmxiblJ3QjkzM09CYys0RFhySUMwSUVtaUxuRTc1ZGk4SHN5QWNqeldVVkdVaTZ1SUNNcFZ3d0pWTVhkZU9rM1hBeGMrSG5nK3ZWMmVzQVl3K3NXb1AzMXIzZUxjTHdRQmVRVXJFSGg0Sm8yaDR2RG1KUHVBeU1MR0FlRW43dXFiZ0IrSTdEbFNXQkdDd2UzMUdiOWFMMjBrR0RiL0VHUnhZNldUejhmMnd0TThsNHBnTDFTZ004ZXNIQ3ZzdXlsTUU0bm45Y2ZRTHRsZGc2VFowa1VLb3JBZmlqMjN2QVBDbXFwM2ZjQ2w2MFhGSU5pZDFQbFpyZjQxL2RuQXBCNndTUWp1dFVmSURKUjhDR0lRT3dXRUg3RHl3cEtyV2M4Q0Z6cVJMSGtWWXJCMmpTMkZRSDV2a3VCeWNYQ0FsSVVVQUFrQ00yaVJCQTYrQVJDZTdEalltUWR1TFlUbGVpUS9YVFRTNERwSSs2bkxoWlcybnpWQ0VCYU1MZCtzb0lHcWpEMWFtcGR1Z2lZV0NwZUJLQTliQkpDOUFjdEFrOExFUzI2U3FzZnRJbkxaNDRkUWlmNElnZGh5bTVXTHJQRHl1WUgvN0hUQ053RG5Qa284TFhyQmNjalFhaW9lNkJpS2FkMytRWS9NR1RINnJTM09CdkNuUUR1QUl5cWhpRGtROVJYKzI5eUUzb244SXdqeFFQSTh6a1RpQXBHVTNvVmtELzRmR0RpZUF1QWRNdzVNRlFqRWdnMURZc1VrdSthM3VJMFRHQmZWN1BvdHdId2FPRW1iSEVBVHZ1REl1dG5pNlVBUW9GUklGUlloZmUvZGhFdzd0YmU5T2YwU2kxZzhIa3J3UmNldkRhanowN2dJSjduMDVyWXlXSXBiNHlhLzd2djhQUmRGcGovTFhEbWtRTEFuQTRqQ0NPbFRCUk4vckZNQUpLZ2trVkhwR1VqeVNTQlNGZWc3L2F6cWs4RWdiU0VxOFVEUkFDTEtEWFN5YVE3QnIvL0RjQTRMU0N0d25LaFRFa1FjbUFJUWh0TStVYWFqbDB1UzlOYXRJVFhXenB6ZmNkTkI0RHBZKzZuQmdEYUN0YW5ZTE42ZkNqNHUxYXkwUUlxdE1ML0VZQzYxd1NBOXRBSmVQNmVXc0FvRHlzRnBnMWVCMEhJUVJDSUlrVmVDcVFmLzA1UDNXQ0IrVVBBK0NQQXp2bUNhRldES0V1WWNsMXlNTitZMmRja3FHVGVIUEV2dldEU05oT0FmYmVmWDBBNnJTOENVdzhYOTA2NmJGSWZkcU1ISklEKytESmdMQUNRdW15YzNneUFFWVJSS0ZDTEQxZXU1T0RMRjZRdlhlZHgwdzNBMUJ3d3hkQUpMVFhqZDhzZVFuR3JaOWJQRnhMeUE3V0lLT042M3RZdENRQk4vc3Y5UVBtNkJrTHAwdmw5dC9tNmlldFI2ZmJ5QkE0Z25YdE9Sd1JScE5uVHRQcFc2Z1dMSDgzbEtxY09GVEVuRGlLdG9Id3k4Uk5GaHJlZnllenRibnJCZmJXZmd0dHNQK2tJeU8zMkVMRDFjSEh2SW5ybHZXczZUc25CN3FBVWxnL3N1RnRBV2tFNTV6WVEwUXBxY0FMb05DWFRFdDdBM0tvYUR3R1FmcW9BT0VVQmE3ZlViS2N0bHR3Q2FqVmJ4dlNpeXZvYXNNMEJhQkt3d2RLYjlmTjdOZmNxQldHaVNXeWtXWEVSMHVtZWFjVUVvblFnQ0tSZklnREZqeWE1eXE4V2ZzZnM4ZFlnaXVNeGdwQWcvdm5NenU2bUYwejZaajVBUGR2UFFlYzBURW9zbnZRb3NHT2hhTHVJWXZud0VZU2l0aEU1MkYxWEZBQTBwNXlpZ0Q0b3RDcXlnRktucEhVcExZUDBPY0tVUll2Nk1qNE1OUjQzM1FoTTBnTDZRb25nYXdPZys2cmw5Q3N3S29Ta0VJeFB5VHN1QVBpZ0NZQm1BWFZmWWNWZituMFNSWXc2ZFAxWXdOZ0hzZ1NhamlKUDQyOVJycFdPTTZjeERpSkI2TklOTTR3N0xiVUdNUVV3Qi9NOW1aM2RTeStZVkcwRW9CaURCU1Q1ZGRaK1BrQ3NBaUlsUVpEYTNMVmF0SjBXWEcyUGJMOThBQis0b21CM29QL0hnVFVobUdnQmZScVdmMlRUclVTakV4RFNQL3FXelFEZ2ZBRkFXeXpSOHJrRnREQUtYNzVqbzZuVWd1WnhaOE5CeUhidnZxQlEzNlQxc3djc0JhQkFHR1JnNDBJcitydDlXVURoUTVaQVU3RXMyZTlMTHpnbHFIUnhOa2JldVcrb1FSUmxzNWphTWpuSzBhOWVjTmYyUjRMQXdPODI5a1FCM0xUdEVZUVBVd3pRQVdnVzBBR284QVFIMGxqcC9WMTdwbTBLUmNFaWZHdU5Pbm9jTzFyQUNRYktQWGhzOFR0TndWcjV1aCtuNlpmM3dEZ3UyOWcyRmRNdE9jOEI2UGRwRmowOFpGcnBsdytaQTVGVHZBUVEwL0JUMzZGUERrUnFCVDlKYWc3eFlsUUl0WTBmODhqNzhzWnpDY0tQWmxyQVFmU0NLOXV2QjRoNTc3U0NvdFVpRUo4b3BxOElRRmwvUFVCUEVvQkx4YlJFNjJMU3FHNGRGQjhyNWJIY090aU9RU3FUNVQ3Ukt6WURnSngrQlVDQ1R4WlFDd2hhUWM5b0tjRW5FQktrbmo1RnNKMUxBUG85eG9XV1BXRHkrNklJb3FiZWFPMFZBK3pIQjB6eElRREtrbjFHZ3RYaVJ4TUlBeDBWbjBEYitsa3VGakxSQ3Q1V0V3RDcxUXZ1Mkg1T2Zla0Q1RmFjaVFheS9HSWJGZ0JYcml3QXlHbUpBRFIxY2szRHdURTNUUTRCMExldHpCSkVyVFlBcjJCQlNJM0hUUzh0TEtCWlBvL2ZXUURacDE5N1ozc2NqR2I1QkRwL0wzK25qTXdlQjZCODNHajl3ajNhdE9zUFdpbjlXZ1hDRmxWTy8zY3RmNGlEOFhrQmtINVVTbEFabE5QWkFRcUFScjV2eHUxeWptSDBnaXZiWDBVUUtJNjNvMFd1bi94SHVSOEU0Vm5QSzVKUUxkNFZOdHRUQnZLMnVvaUtPVWYvZitHandNTkJoME5NVjZKMGMwTnBjUnY3bXJZdjNraDgvdUh4WXArYlZwd0xwM1I3c3RzMll6b3VTcTNLR2ErcTcreDdDbzRuYXpBZXJSS3NWbFYxUWl0RjU5ZHl5RlphWVkwSE11OW1XTDNndHZaWE1ieW1CSUZNWjFvdjJoMEIrTFRMaXN4Z1crRXE1dVU5MmlaNzJ1ZDl2dlIrNEpGcDROamtSaDJPTmkwT0IxL1VCQ2t2RVlSaGZ1TnM0T21oaGlQS25GUWx4NmFBak1uU1hKVUFBQ0FBU1VSQlZQam16MXc0MW5ud080Y0NJQnZCd1pnVEFPVUhScTNneURFeEQ0elJHVllFbnBtNUxxbVFjME01ZXNGdDdhY0ZsMFNsSGlCeHVUa1l4eGRhaWhVQzRRVlhGdTVGQ1VENVF0Smw4NXNqR0EwemlReHFldS9mZW0raHcwRjJmTExRR3hGbFlNUnZvN3YxV21JVnRwdDFERmtYdk9SN0x3SjJIU2t5b1ptRXlwb1ZWZThwN2I2cUVNbmlkR0cvVmwvTDJhUE9Jd3VBMXBBSVFFM0RBbUZhNGo5ZjdDUGFGcENIS3VqcjV4elplc0dkSHFBcUt6NVgrRkxSQWw1OGxlK2p1aStrVEJBTE1jZ1o3M0NEQmtwTjIvNytiZmNXT2h3VXlDRUFqUVRjQVZoS2Rqa1BjMlJhamV3S3l1L24xLy9xSmNBMnVoQk1SR1hRT2NuOVU2SklPalhIUXFTWU9zVm9RcDFITmdBdno4eW55ODBINVBWejlINlJxVmQ4NDlXdFhRL3pBME93MmF5R0xKNDc0TDBHNzl2dmJ1bHdrSmk4QkdDZzRTMDFTS3FvZm9OdlNJQys1emtoRlV1cFY4clVUcEpOMDZLcGFCa0ZRbTVNMUhsa0EzQXlNNS91OVpsMzh6cms2ZjBpVTYvNGhtc2NnSzVJU1V0Q1Rvd3lEcWI3VXh3c3FGSlczZm8vdmJ1SUJKRVoxWVJneUh3UUtOaTBLRWwxT0tUQ1pKZHh0UERuLy92OG9vYURhVmdxRnlpVEQySUtmY2paUzRGbys3ZytIWE9Qdjg0akc0REl6S2ZMelFmOEtWZkkvRk5LclE2aDk0dGZ6K3ZPQTljR0FBYnJweWxZMlNEbFZUVHQrdUNuVjMvVjNhN0RRUUF5c0pBd29iWkpnVVhpNzhRYXloZDgxMldlaU9BWnpFeVVpQWtITWV1NUJGNUZ3WlFBV0xQd2tua0xReTlDclBNeTgrbElIWkZ6dk4zVCtZYlYrOFg3YzY0T0hIaXg3NFY2ekl4QitSSjB3UStVVTk5MnRZb0Z5M2ZjWGNURHhRa29Qc0NVaEZJY3pLVkNlZ1NnNUI4QS9QSUxOOVp3eEJTeHRpS2lVQU9pN0pXMGRMVHVzdEY4QUdibTAvMW8zdmpqblNHZGorbFlsR3dkUk84WE4rYzF3QUJJb0hrNms2MXl1U0NKSVRxM2pEWTlWeDBCcUsrK3V3QWZYNkprSS9oTUUwU0MxRUdndWlRK2lzcWNRUkxyRjYvMGpPMncrNkZNblpoeVpZc1ExVzUwcU9IZ1BYMU5YbmR0T0RzZmdNd0h6TWluKzArWk4wUzlZT2xsTXpXZkx3S1FTUzM5NlAzaVkza05PTERQTTF5MDY1SDRnT1czcDR1VERrQjh6V2RiN0ZnYmREaEVnSmtDVURSdm9nVG1kL3ZQdjNCVkFVQnV2eWxOekFBWWk0aGlzVlFuRUhvSXFXYmxyeHFtNE14OHVqZmxqVCtZanNXQllnSU9jMG9KUHNxMXNsQ3BINzFmS3liSk9Fb0F1dVZUUlNDbllsbVU2UC9aNGlTSkVjYkx2K1l1OS8xRUFoN0pLRVhES3hxNENoVWlLeW1SYndqZ0hkY1VXVEFSZ0xZWEhTcjJMT1UrQlY3TVZ3enh3T2ZrT1d5YllBR1pENWlSVDBlZGpweEQ2VmhjT1E2ajk0dFA1MXdkT0hCZE1lWGE5T3FXUmNtV1hBMVhMVUlVSDZ6eUN3bEFzM3orWUJrZnMxdStWSWVqSkVGM2NrcmpJOVQweS9hTUEyKy90Z0FnMDhWVVJLVDh2YktNVWdBTUlHenpBY09pNUhrbkhRQXo4K2wrTVcvODI5S3hodEg3dFR6K2pJTUFKUENZTVVMQVdkNmZ2aStFWTlvdW9aQk0vS3gvNExVQmdGTGdOQzVvMTZGckU4SkpWSmdraUZoYVFRQnYzK2RWYk1yV1ZzQzhVeEZSa2pqYVZzVzJEdFJkT0ovdkF5b2hWWUs3QStiVHZUZGo4SGxxVE1jYVJ1L1h4SGt6amdOa0lPV3VEcjhqbllZREtEdXRncFVocmEwdUFsQXlDQ1VBSzhCWGNqQlhnTENrL2gwRC9oY0J5RHhGQWRBem9GVXFVQllSSlRVY01XZFBQN09OTDZpNWJMUWVBTEpSUStiVC9XN0c0QXVBT1hxL2xzR2RjUmdBWStnbExrWWNsSlZUc2E2cHRDWDN1UWpBS0lOUXN0RnJBWktJd1d4UUloSUp1b3ZCL054K3IyTHpGQ3dsajhZMGV2bC9NWWswa2llVnRjdnJ3R1VuSFFDVmpqVmtQbDNtSXRRc0lQdUVseDlHNzlkT3pEZ01nR2tBV2xOeUJKbjh4S3ByQlJDK3pnRW80TFdSZ2NkVmNPQ2pqbE52bXg4NERyek5BYWhhRlpXTHlnS1d4VU5pYkloVGNQRDlCTUxMYTY1YnpyZUFNU0dWb1h2Si9DZ2gxV1VmTytYVFpTNUNEWURzOUdIMWZuT3JJRGNBa0FCVFREQ0NMWUswQ3dpLzU4NldjS0pVaUVwQzhDQ0JZRHNpaVNwbHFVSVVtT2pmK28ydElpS1ZVSmJnVTV1U1dsNERXd1g0K1BjWG5yUUFUQk5TKzh5bnkxeUVvcGRjYXkrOTMweTVZaGdBZys5bjJPb1VlSTVUZFFlciszMmZkaG1Hb09CWmFuQm8rZzF5RUtVNGRZZ0ZTdnFCLy92WkJJQnQ5UnNoa1RiVzhaWloyaFVndkRMM2lVM3V1eDRMU0JNMFpEN2RQUm5USDA4VkFJZlYrMlhBT3VjUUFNdVZjS2ZGU0QvK0lBQUJzRW9Hd1lBb0haSUtFRVl4UklId0xTOHBVdWhqRlZzNi9aWmhJVld5eFZLQkJJUlhuYlFBVEJOUys4eW5JNHRCemtFQUN2K2NobFVWSUtFLzVjUkdzV21sS2ZJenVkYzNBUExRU2xnM0UyT0N5VlJjMWtwVTNEZ0JtS29Rc1d0bEJjc3dqUHUrbmZUWXRCTCtHUWRnT2YxNkdDWlc2cFhsQkNxV1NncUp5cG9PQUZmWFhEaWZid0ZKTHZpNUhBamxuVXNpSWU2QWpPcDRpUU5RSFJsVDJQbGdKQ1ViYmMycyt2L2hGd0ZiL3E3Z202SGxZcEJibVRWMnNzY1F5eS9xRkJqMnYwL2NBZHovSEdEN05EQTFBVXlPT1UrMUN3V09ld05qS2o2L08wM0YxL1d1dWdXNC9YSmdmQm9ZbXdER2RIN0l4QjVrTFBJQitJOEFmTndaZ2dhNWNrMmZKYkVtOFY5ek5XUGZyYXNiZ011UEFjdXNlSjhFeHNiOUZkQmhBKzdnYVFOS0I2VGZjZ0NZdWcrWUpUK2c4OWFvQkRNbUlNU2NQMTJ1VEtqMTN1RHY4enNLaWcvdUoxdVFPc25vam0zcUI1UDVBQ1JCSDNPaFB1enpSTjlEVjg4SHFRTEVXUEpudlR5NW5tL3QvMXM0QmN1U3BSWnRHQXU0Zmkrd3RCVllFeWNjcll3bjZoRjgvRmtKcDliS3hBS1ZGc24vZDh1cmdiSFBBOU5QT0VPV2w0KzJjZm9GSGhmVnJKVFpQS0hTajVkYU90dXA2SnlDcFB4OHJIV1JWUTdXT2xyWUNNeDhBSEl6bHhrQUxQRDljMFZCK3gvQTNFLytFMmZVWUhYZEY3S1RHd2R2VGQwQUhQOXI0UGdXWUcwS1dCZGZzQmRzTVBmUHJLS3NvTDlYQVZMQXZPMmZGeWxDRTRjS2xpeXJEVlpOY0dTMUNxRVloV0ZpQVpWK1hudGFVUmRUTG1wQ0VicGNoVFlMcWk2TnJrTUN6THp0NVhjNEh3eUptbWtKK1o3M2pRT2g0TldlRFVaaUsxSzA4ZjBFWHQ3Q01IVmF3SWs3Z2FWcFlKVUE5TEkxQW84YnpLWDFjeXRvRnRGZnBkQ0lXejdyZ3pIZ3RoOHUwb1BHRHdFVGM4Q0VNeVNVekZhaWtndGxwVzFUYThKcU5iYTdsVmxqU1JnVytRNlpQLzU3V1F2ajZmeWRCalhmQWpLYmdFdk1Md1dDdmhOb2lwZ05wblFzaGxTNElHRld6SWs2eWxXd0F6OTNFVEx4R1dCNUNsaWRMQUJvSU9TN3BtR2ZHKzMzWUFHNW1ORDBHOEY0Njc4dmtpUEpjek5PQUM0VXlRbTJOOHc5NGtpckZsZklBbDdpNDAyZDZkYlBXV0F0cnNqT0ZpdUN2QUpaT1FFMHBIVEZzY2tIWURlQ3ZoTmdpcFFOeG9BejgvOElQcjVuYnZIMmpkKzZBVGhKQUU0QXF3VGRaS0VCTERvRGdVNCtZVmtQSElCb1B3YXJlT3QvQmtEZXhzTUZBRm5iek5KWW0wSURuVndidDR1eXVyMWt3TDdUcCtpWk0vMDhXVDlSYzdESFVtdVlUci94KzZvNG92dnU5ZmpCYmdSOUp5QStvbXd3eHZaSTVVTGc2Wlc3eTlGUGY5UU53S20vQ2dDY0tBQm92aDhCeVZ5L1VDdEpxMmYrWDF5WUpQR1UyN2xJWkxidUVXRHNXQkhlc1plRHo0aVVSTFVXYTFURTQ3THFLMTJmWm1kM09YaWRGY3RxbTkyS2F0VnMxakFFc052NnNkeW1hYTJnOCt4VUw0SStQbjJiZUNnYkxHV0hJL2g4RzNvVHI0NWlLODZQT2xiQlU5eUtJL0FjZkxSK291UXdIOUJmbW1iTGxUSGJvT25aL1Q5KzV2YWY4RlVhQVRoWHNGT1E0NW1VY2daQ1dUQXhlMFVRK3VyWU1PMS8zN0d0eFFtb0xDQnRSU3AzMExyRHAyU0ZkellNZ2svUitWTnd2d1I5bXdRRHNhc3BHU2ZKZ1lEWU5UYnA4cHNDUUZKeEVJQmtRakRyeHQ4ZFhDVUlZK0NPSDVNVkZQaThTT24ybi9RWUxaOUdwMGN4QU5JUDVJdkFrelZ6eGl2UnlkbktOekJhOGZkZE04NGI2QUZ5QXJpTUYycGFqazlrWUllb0NsWG1BM0FRZ3I1TlFFSE1CcU1WRk1OYUlPYXlOUkwvdmhsSDNSWndtaGJRUVVjQWFzclZWR3o0RXRqQ3UvM2RmYi9JRDNQYlQ3dUtBWi9NaGNJQzB2cVJUbzRXMElCSUVBbUV0RndDWXFqVzAzYmNtZHdCWWVvV2dldFViclI4c25ybG9pUjJkcnBBQ2YrckQ0RDlFdlRWaklKdTdIQlYrNzgxWDc1MkN6ajlsd1Vaa1RFZ2NQb05QcDVOdjRvQlJoQ0c2ZGQrMURrTXoxSkloUjFCQUhKN3p3cU8zZklSUk01dG1ESzVDb1FLc1NnT2VCWUJLRlpVTFRxY0I5cjZOaTVLWW1kM1dLRFVBMEJsaE5MTThFYlQxUUJYQlU3MmFJNVpqVWNWT3h6N1dMa1E4ZDM3dnNhcnQvdUE2UmNQc3hOU0F0QVhIRFlOQzFBRXBmOXMwMWtLd3VCd0dVN0hnVnQvMWp0RDFlNjBmZ1FpZ1NlL2o1YlFwK0tZcEdCK0g2MmpUN1A4L1p5cEJJQzhEaGN4OGVZOXdGMDE1YWJobW5vQXlKNVdTcktlTmdLTzlTSHhuVC9MU2FzSkJpbTVsUmpXQkVJVmVST0luS0wxcXVueWJSYXdMZ0FTZEV5NzRxamFOTnpKQ2dxRUVZekJHdkswMjk3bUFGU0hFSUI2ZWJLRGdjOEoxa3NtVjh0MjlmMWVuNkw1djZjeElLNWlLNlhuZS81akNUaUZjVHFWbi9yL3RXRFBXd1huRVBUVmdJS1VIVTdsakFTYXdLZWZJd0RwTWRSeFJCK3dGZ0QrUlJFREpBQnB3U3p6MmMwTGZ4Y3pWamtWS3dhWWd0QkJlenUzU3ZYMDhkMzlQNXVPM1FLYWhYTVFjaW91clpSQUdLWldhci9ZWjF4WFJQZTh3UXIyQVVLN1R2Yk9WVFpCWHg0TUJFQ1JuQ29uVUJTRkVYVDZtZi9USysvcW16QUYvMFVCT1BxQlpZRjUySHJURkN3MkxINUc4VUN6SkVrbzVuWnFtUm5QaC91Q1htcG5WcERUc0lQUHdLQXBPYVNBMlFMRExTSGY5N2lQeDB0cElTTGZ6N2JsNGlGZnNVc25qK0haV0VlT1lEQ0RuRG1DdlprRWdlZGNDanhHc2VJaEJZdDN2eDA0OUh3TUxSaDhnQTlnaDJNb0g5QUJxS0p6eGYwTWNPN1hsU0FVNEh6aFlZRnErNUQ3aHdCdS85OE9RTGxJQkNLblczOVNsWE5ZK25xZWlxMmRrUWcrZ25HUGI5L1pwVDBscTZNVjVEOTZnTEN3Z0RtQ3diZG5DdlptQ2dZL2R4eTQ3eHhnNVNXdVVqaWdZUEhGYndBK2Z5R3dmcjJyWHJNdlBCK3ZwM0wzR0hDZ2k5Sk9IUUNrUlZQcHBlVUJpZ1hMRnlteWVqWVRCNFlzZ2ZBMjBvZlJBbFlCMEZmQWx2UXFQMC9Uc1g1UExPQjVETnU0NzFjbUl3aUJhUnd3L0YwMUorbXoycHFDaHhVTVp2cEpsbUJ2M2lUb2NzVzRkemV3ZmhrR0ZpeCsyZmViWERBZUpPL1lFSUxCQjdwVTFnOExRRm85OFFBU1ZHWU5RNkRaZkVHM2ZuRXFyZ0xoYmYvSFYxNWFuYmtGTkN2b2hXU2w5WFBRMlhUTS8yczNJNER3UElad0JFRGZnaXRIMEVrNk42eCt1L2lEN1Q0Zy9ZZEJCWVBwV0hFYUhscXdOdytBUWE0WWo1NEpySk8rYVFEQjRwdCtvQ0F5WXZPUEVJUURDZ1lmZUYvOVUzQWJBTVg3SXRBbFZ0QXNwS1pkejVTT2x2QTJwc3R4akVTM3dKKzkyTmdBR0syZ3dpNzhRb1ZmRWhCZVFBQ3FOTlAxUmRvQTE4a0tkZ0RoeGtVSS96S0lZRENucXl6QjNqd0FKbkxGT0VJVzdRRUVpMS8xWTIxeXdWZ2xDQWNRREQ1L0VmajdNNENWclo1QUtsa2h4ZVFVYXhCSTRudkZ6eGY4SWZDVkM0SFY3Y0M2WkVYNW5lbjNWWDF2QUdMWnE4eXNydkhZK1FCd2JHZkkyRTZKcEx2ZFgra3N0aHBVdlFybVgvc1ZER1pWVUpaZ2IxN3ZKSExGZUdRY21DZFZiNStDeGQvNXhqWjZRenpNTE9RQkJJT2ZUVjJQczRIRkhRN0NMUVVRbVVyVjByZ0tKTXNDanN4R0FxVG4vaHp3MEVYQTR0bkF5ZzVnYlRZQm9yS2tVeUxua0I5WVZoVHh1K2tUMTNpY2N3dHdkQmV3UEF1cytiMmFyOXhKQWFmcWZnTVFPNGRoK0o5K0JIZTVncVpaWnpZb2sxSkpVY3BhUjZicDkzUCtXL042cDBLdUdJZW1nRVdLZ1BRaFdQeGRQN05CTGhpSEtZSFVwMkR3cFo4ckxPRDh0bUpRVnBsT0x4QXFtYlJLQzZFRFlDNy9DZUNSUGNDeDNjRFNyc0lTcnMwNENQbTlBclprNTVVdktBc3BZTHFQYVBkUjQvSDBnOERSSGNEeVZyL1g2VmFiTEhrMlBoanBQVlpZN2Q1eHdGNkN3Uzl5LzRMYmJWeVFzRUtJdWZHaUtlMHAySnZYT3gza2luRjBHamhPUVkrb05SdGxqamk5VFFQZi9mT1Y5SVpZNEdxNEQ4SGd5LzRXK09vMllHNWJVVXkwNHZVY0xDcVNKVlJXc3pKYk5neFNtTWF1K3EvQW8yY0JSODhFanRPcWJnTldXYVRrSUZ6M1lpV3JGNG5BanROMG5CWnJKblUrLzhQQTNDeHdmTVlCNkxVcmEzb2dsTDB0cHM2d2xWaGE1ckxpcWQ5QWREZkI0SmU2VTBzLzBCWFREWWg4MFNyMkZPek5BMkFYdVdJc3pBQkwxSmFLV3ExUitud0dlTTE3T3NvRlk1WFRWdy9CNEN2K0RqZzBDOHh2TFlxSkNFQ3pnc3htWmxxOVQ4ZTBYR1V5YVVpemF2UHR4b0ZyL3p2dzJCbkEwWjNBOGUyRlZWM3g2YzRzcXdPYmNrZXloaVhBb3dVU0FEaEQxWGhjZURNd3gzN2x2VTRYeFZOMm4zckpJb2N5Z2tyL1ZiczdmZStFZEJMY2ZhWFhRM0lQV0lycEJCNlhsbndwUjc2allHOWU3L1NRS3phcnhNN3FKRmo4bWc4VWFyTVY5SVo0Z3ZOREQ4SGdLeDhIRHM4QTh6TUZBRm5QWVFQRGwwQ28yZzRmcERaTHFLQ3hUMC83ZmhKNGZDZHdiRnZoUml3UmdKcnVDT3dVZ0NwZUN2VWpabUVGeGhmazlXOTY5a1cvQjh4dktRcW5WZ2crQjZDQjBNc0k3UDcwQUhnbWQybjFOUTBydjdGdkFMSWxWWUs3M01uUUNETFRoU0dab0RwdVA3dUNldVg1bjh6cm9CNXl4VGhHblEwQ2d5Qk14WTYzQXEvNWFCSEc2RUJ2aURsT0xWMEVnMSswQUJ5WkxnYmwrSFJ4blpYSm9xcXR0QTRPRG92bEpaVnVTalRRRnRxK053TlBiSE1BenJhbWRWcFZzNndFb1B0ZE5nMzd3SmZ2c1lpSlA5TkZxdkhZKzd2QXdqU3d4QWVOeFZPOFQ2YU5WUlJSbFQ2aEhySjBPdmF3MFdESkNLbmc3Zzg2QVB2TkI5d2cySnZYTzMzSUZXT0JnbjhFSWYyblJMRDR0YmUxK0FVN3lBV2JaZXNrR0h3VmRkMm1nQVVDY05LbkpnTFFyWi9WOS9Kbm41SlVZbW5BRTNoQ212Myt0OEFXUWZTenlQSy9QT09nSmdEZHNncUE1bmZKQXZMZExWK2J6MGtLNFJxUFozd1FXSnh5QVBxRFZoWlF5UXI3Z3lhWEk5YXhXQ0ZWQUdMdlJVaFY0NlBnTG5VV0JzMEhiQlBzemV1ZFB1V0tzVFJaQUpEVG84bDh1aS80Mmp1TDV2ZVFDN1pwc0VvdytPclpRbHFWVnVINEZMQThXVnlEQU9UQW1IVVFDQVdRa09sc1FBd0R0LzkvQUU4U2dQUXBOYTA3K0FoQUE2SExYYmI1WHI0SWFBTWZ2L2VHdlA1Tnp5WUE3VUdqQldUV2poNDB2OWZTeXNjSEx0YXhoSld4RlZzTk5BWEgxa2h3OTgzK0RZUG1BNWFDdlhrZE5JQmNjZW1mY2Vvb0FmaEFBY0ErNkEyeEx1QUd1Y3hyemdLT01leERmVjlPd2JTMkJCL0JFb3FMU3JCb1lHZ0ozRThxTGNJRXNQL25nQ1B1VXk3UzEzTDN3YjZQVTU2L20vWGo0UHMwVEtDWFFBNkFYdU5lWlkzSE16NVFBTkFlTkQxa3djS1hsajZ3T1pRK2I3UitQaTBQRDBEZUZBZms1OTBDS2c4cW5jZm9GeklSVldWcWZGZkJoZ24yNXZYT0FITEZXQ0RidlBzdEJzSlo0TFVQdCtqZGVzZ0ZnK3FWcHRXcTExYmcyZ3RnZnVMaVJBQWdRZWcrb0Vtc091anNYYjVTc0FvQ0lOLzN2eDA0T2xOTTZZdjB0ZHgxTUt2SzcvVEZqVm1lQ0Q0SFFRUWhmMTU5ZVY3L3BtYy9rd0NjS0FCb2VZdlIwb2VwdDdTRW9aUTBUcjFsUHVQUUZsQXRPMG55QWNXaHB6dy9GU2pGekdqTHgrUkd2eHpvU2VDMWh3c0E5a2x2YUZONUZBeSs5bUpnbmhhUTBxcWFnZ2xBRG80YzlBaENEcEpQbDVab21tUTg3MzhIY0d3NkFKQlcxVmVjWnYwY2VQd09ZMC93bDFsQUQvV1VDeDBtTWxETHI4YmptYitEd3AzeDRua0RZYkQwdGhJTzVhTnRmbURpL3hHRWVSYXd4aHM3VmIvcTJodUFCUUp3QWxoeXkyY0MweG9nZ2pBQVVDV1dBa2tzT2lJWTk3OFRtT09xZXFxd3FBeDNXR2hISzA2bjdURHdPY0FWL2lpcFBBS2p3Z3JabTJvOG5rVUEwZ0ttQUhUcnArbzlNVHJFWXZxNDRvOXBaSU90Z211OG1hZkNWNzJZQUtUL1J3QXk1T1BPdVZsQUFrOU91bGU2eFFSVFdVS2xXdGtVL0l2QUhBSHRpNW9Jd0RLODQxWlBGdENtZHIwVThQYUM5aFZ1bHRkNENJQzhQMlp0dC9tNS9xQzExVEpYbEpER0dwZkdBbVlPRGdGb0N4QUNrTHB1V2gzS0NncUU4Z05WWks0S3R4Z2pKQUIvMlgxS3JhbzFyZk43Q1daZjNMU0JUNHVBRUl5V0JWcGlwTDdHZ3dBMEFXMjVHYkdFTkJUUngzcm0xTTJ3MzltbXJGVndqVGQxS24rVkFaQUxFRTVMdElEeU1XVUJ2YkxOTEdIZ2Q1SC9WMDdCRHA3cjN1VStKYWRnbjNwdHhla0E1TUJyaTAvV3A0d3pCakRiQ25rTVdNcVZwRThHSndMUXF2ZmMwcHFia1ZqNWFOazdnYkN4Z0pubzMwY0FqbnRvd3RYTmFaMXN1dlNLTmhzWVRjVkttdzlGNXhHRSs5NGRmRW9QK0pZaEQvOE9DOGVJUFVzVUhva1ZWS0I3OFhzemJ6QUY0UHZkLy9QQ0tWR0lwT0FyNzhtbjREWk9tOFlDMWpjbyt3NkVGVEREUEpxZUNFQlpCYTVHZmZWYmhtUThEdFpXNVRZT3ZQaFhpcDBHVHV1MjJsVE1MU3crYUFWbDlRaEVXanVySS9hUWlMSmtUTUxzWDlSM3IveW1aNzNmcDErMzdPVTlodW5YU2tkbDdUM1FyaEtDdGxDTTU5azJpNUNNTVNJQUdkcXhFSXdybXB0elRzQ0V1dDV5aWxLb0pMQWN4Q3EzZmU4dExDREJGd08rdEtqeXV4U0NNZFlFWG9lRHJIY0h2dTB0VHdMem13SEE0Ti9HaDZ6TkNxcWVPU3hDMmxiOHRRU2lNd2J1cVhJcUFjakZoMkpqQktHSnlTaFFHNnlnVmJmSmVnVUxXQlljTVIzcnZiNm9DUmFRd0ZQZ2wxTTVyUjcvSnRCWk9JWld4LzArczRRZVk1ei8xL1gydEZuQXhQcEZFTGFWa2RMTjhNV0dWcjRwQ0JzZk1ITjhibVRLZkNqWjBOY3A0NTYveDU4ekx6Znc2UWYzQUJkOHBVZ0VZbXFrNWJHeWVrMDZJUWwxYmtYU2NubE4vdThMMjRHZHgxcVZxOTFLUXZycGd3YUFBdzlwK3duWFB3MVlqeVdNR3REbzJBU09GR01VN1NJRVV6ZFlEMzR2TVBtWHdMYkhnZGtGWUF0bEdpaW02RHB4SnR2cTlMdGxWci9hV0tFQjhwVVhBT09QQUZQendCVFo5cjA0dmRROVRzNHBBWjNjZCt5SHhnZk1BT0grdmNBNjkvOVV4aWptei9BZXJZcGRhcjFsTlNNWXpWK3ZXWS8zNEk4RFk1OEdwaDhCcG84QTA0dkFGRUZJa25JSG9oR1ZSNjJRaEZSU1lqUUU2cUZyaTJ6M2lhUEFoSE5ObHhLd0FySTBRMUlBeHdmUmVhY2JDNWdCUHA2Ni81SUNnTEtDdHFuc3JLS2xyRlpVRlBLT3I3b3NNVHRkc3h6cVFSWjkzUTFNUEFSTVBsbG9oVXhScWtFSzZnU2hPUDBTK2RZMmhsUnY5OXkrb3ZSaTdJaVRuVHZMcW1nNnhEUFlwcUFVZ1Jnc29SN014Z0ptZ0hEL2M0RTFGWHU3RlJSYnZFZ2Q3ZXZYV2xiUHBwOUVnVWppSnB3ZTZ6d09NbHZwQVdDTVZ1c0pZUElZTU9sU0RaUnBvR2lOeEt6YmRJUWxYT05NV0piR3R3NHN2ZGd6M0VsNDduelRSdlBycktwdEFKVDZacnpmaW50dkFKZ3g0dnN2ZFF2SVhLNVZZRjNzVVp4bUpVdmdBMUZPdndGOHNwS3lCdE0xeTZFZXBJNExxVk1lZGJFYVRwMEVJS2RQS2g1RnFZWXFTeGdvMmpnRnIxM2o2WFhIbk9pU1pPZUJWU3Z5QzhxQzJyMDVGVnZWdzljQU1BT0ExNzhBV1BNcDJMSmFhZWtpQ1BYRXh3SHc2NjBuMW9CL25pR1FhendPa2tTZXBiSi83MkkxeDRDSitjSjZsWUkxcmljY3JWaWNVdVZTbUlXODJwa3duSEhWT0tiRnNPb3pRR2tGa3dld25CRVMzN0FCWU1hQVgzOVpBVUNDYjgybklsbys0MHAyZ05udnNvS3VueEgxeEd3QS9MT3pkUU9RSlBJdUh6VjJHQmc3Q293N0FJMGwzM1hmak9zdjZvVm9kZXM2SVNiQnNBWk1YK2tKeFU1NktZN3BrbUZWaE9jaXV2VHpTdDA1djArcnl1VC85Z0RyWk5lNHdQTXNJN1ZKUDNHY1A3Z1VPT2R2Z0wxclJZSjBaSTVJVjNoVjQvd3JHWVBQVTMvQWlSaFl1c3kySzdtVTk5OVArejkwT2JEN0x1QlpLMFhka2VxOU5TWDIrbzRITHdmV2xvcEZDQzBmZ2NpQk10QUZDOENHcllYVm9Wam5VMkc3clRYcnpoNGtmUnpMWTFreUd3Qm9laUdjUGlYYjVlQXpkWFduYXpQQ1NTY2I0ajN4Zm1hdjhDeDJwNTBsQU1XMFZYSU5pdENvZ2wycjlIMmRjY3RXd1F4UXNuNlpUQmJNTnRjZ2RLSWJpWmo1MVZjQmszOENYUHhvUWNmQ1VnOHBqY1lnWlNjdy9tb21BQ25YeXI0bGVCaHM1UWFCVEhwZjdYOGRNUFlKWU84WGdBdjllOFFKbEFaWnE4RDR4U3VBTllLUEpRbjBBUjJBSEt5MU1BQ0tlOW5mRkk2SUVxZHVFV29ISUo5d2xzVktMZWtvTUNhOUVBZWdTVFlRZU00VFhjbzJTRU1rQUhFYkJab2o0YmJZdGR5Q1ZyRnFHWGdUU3hnWFlUWmVITGk5QU1qRVFSQ1ZVWFAvbjRLVWFhVDh2VlRpK1J0ZzdHUEF1WWNBV2xNQ2dVVmtRZkoyUTEyeUJ2UFhNd0hJbWhEV3dmODFpbXNUaUxTRXZIWmtyK2pZL3A5Q1FSRDRwOERPQnd0ZUl0YWkwNXFuMzFGRmRmTGxGeFlXZ0NEVUlrUmtqL1R4YkNFaS84OWpmUFozWDJWcVlTSlFibVVOUVkzSFFUN2hidjJzTG9lclZ3S1FITkVFb0NzbThSNE1oUFJqWFVHelZFSUtJb1k3eWFFWXVZNGRnR2I1UlhydW9TZ3RTQ0xMYXJrSUNROWY2UU55a0dqRmRqc0lCYUk0a0dsdDhXK1JnNWcwSEo4cUFwNDduaWhBekZwdVd0UElNQlpKbEFTSUx2UjZmUTBEQ1ZiSkNrSk9KQ3FuazRwR3BiOTl0WjhNb3B5aUtEWDdXV0Rpd1lLWGlFUU9laENyZ0toK2VKUStFUUhvMUxieS96Umx5ZjhUSWJmOVhTNWZ0SWI4STkyWXVnSDRheTJwTHVzb3JsN2RBb29uV3RNd1FTVGRPRnVRU0xUR0h5SUM4a3hTSVF1QTRod1UyV1VBb080L2dyQmNEYnNmV0VsU3pnK0pDb1lEb0VHTTFpeFNrSHpnRi93Rzd5OHNJYTNKN0pQQUdXdUZKU1FJYVUwMWlKSFVpWVA0ZTMzQnJQT0htRy9KTWFPZlRaVllSaHdHYXY4N3ZXS1BKOS9yU0g0SU9HTzVzSVRxZy9nZ3hYczRUT2FCQUVDYmVvT3NnZmwrRHJRU2hGcWNFSWh5eXQwTWJNdXNFa3g3NmlBWlhLTThCdlhpWkFHbEYrS2FJYmFhZFlwZW00YURncEpaUXo2WUpBQlY1VmNIQUpaMHY0RnhYNktHNVVwWXMwS25xamhSdWFnRVZnUGdsWUFsOWNpSGY4bWRVckpoMFF4OXZrREJ6Qnl3ZmJrWVFJR3dhaEEva2dsQVRzSHNEektBMEJBVGlQeVo0TkVEd0llb2EvdUZZS0tYTDJmMjRuUW9JZ2Q5UjN5UUNNVEZxd0lBZmRCV0k3K3lCNVpMRUNZTEVUZDg1WUpsKzJZQVVOb3NMSWVsL3hZbHU0SnNsNmJoTmhENml0NFdKQ3ZBMlpjNEd4bzczUmNnSmVPcUZtR1I2cmNDaExZQUN5R29qbUVZZGo1OUtuWit0SVFSaEg5SXZXQTJoaVJFakRlUkk5Q2x5N2ZNRjNFdFdSRmF3aFFJZjVJSndFNTZ3ZFRJWWR0N3RwOXlzMUs4Sm5vSnZvZDlXbjY4MlBOa1A0aFV5MW5kV2dzdEF0QkRNTFlONS82UEFjNURHTm9GNFNyWmZOKzQrSWhUOGpxd2cyQ3A4VGhJSjV2ZlNXQlhBVkNyV045U014REsrc2thT3Zob0FjOG1lNjU0cG1VQjNmMHd5dCtFOEZ5UkFHbVBsT0VvaVNEMnFndm1BS29PbTUyZkF1aVRESFN5SVJ4eCtsSTBReHhBRHViZkY1dmZmTW1TYWpyV2xQN25tWjNkU3krNHIvWnpBVUVIblE4UjcwSHNYbEsrUGdKc1c2OEc0WFlHWmowRVkyRVlBVENBVDZ0QWhtRTBEWGNDNGZhYXBjd01nQUlmTGIwa3V6VDlRbXc1dXdBQUlBQkpSRUZVU2krRWZlQUxrU3JwQm92YnJRRG5rbTh3QW84L0UzaStDQ3NaOThOQ3BBcDhjVWVrWnlCYXZJNEVUL1RuYUFrL1JRQ3lBWHk2dU5TUEEwaSt3TWVCNmVQQTVIRmdacTJ3cE5HSzNGVURBSG12M2ZTQ2U3YWZYOENCNFVORUVPb2xWaS8zb2Jhc3ROd0o5Y081Qk9CS0VRTXNBY2lmSFd6UkFpZ1dXQWxDbjVLMmJRWUFPZTFLTWpUSVIya1JVaEtWUzdJckxpYTB2KzN4d0hNWk1DYllOUDBLZkc3OXpBcUs1RHhPdnlFdVd1NlZENUtTSHkyWUFFUUFmcGFSZGw1VWt1VWN0SXBCbkNJSWw0cHNEMDNGdElJUDFBREFsQnVKTTQ3RXFxVVgzTFg5a1NCUWN1dXlmdEs3OHhVa0h5UStSTHFIWjNGdjFLY2dMajVrQVExczBRbzZJQTFuSGhOTFF6QThaeHZCWHVOeDhEY1M1VVlwTm5vWXhzQ25VSXF2Wm8wRjN3UFRNYTdIdjUzSE9KVmJTL2wrNWJ1bVg3ZCs1V0xFNDRoeElSSkIyTk1DcWo5aXh3dUU5MHN2V0NhSUE2YkFwOTU5RUtlV0NoQXlBMFBUT1YydW5HTVF2ZUNPN2JmcUhiY1M0ckpSN0V3cW53NUFXaEx1SW1nMnVGUUFYQVZzOFJHbW50VzQrZzJoQjNQNzlML0VKOXpHdnFyeE9QaWJpVmloQU9ncldRT2YvRUJmQmNzUE5CQnFXOUh2Nnp6R3FGem1vWHozQjlBZVBnWGlxNmJnaXY0WU9COVFIUzhBZnBrQUZNTWpyV0FjUUEwaU85WEppUXlBbm9zMnZWN0VTSE9PUWZXQ083WmY3RjQwbVpGUVNjUktBWUJhU1U2dkFWY1RnTjd4WEhpVUZwRFRNSzJkRmg1NjkxMkJUaURjdnBrQVRJWHpDTDRnM1dYVFo0anBHZmpvRi9vaWhMK2Z4KzB5V1VBQkx3SXd0WUtLSWFiZ0N6SFF2aTJnZ0JLbjBNY0VRRGFLVDVjR2tJT282U3V5WXpFZmpRQjBFTTVuWmdBUG94ZThvZjNzZ1NxQ1FNM2prZEZMdnBSdlIxMys3VVZSdWhVRlNhdk5PNm90d3A4OFpaMyt0NE02SEx0Y2g2T1Q5QUcvcTljbXRmLy9nVjFKRFljblEyelk2L1lha2ZTclUrUGcxTTQ1TnFQdDNJRXRvTTdXRkhva3lyV0trb29nbENNV0xZamlVWE10SzNnOFV6ZDFXTDNnRGUzdlJSQ29VRVlDd0d0WUZ4eHFnQTJFL2pJMjBGNWhobVFvZDk4QkhObmx4T1RpZzFhR2lEYW5PMjF5VjREeWdXdUI4WWVCNmZuQzlXRXRpS1ZWS2VFMFpHaVhXY3plSm9XTUlpZzVhOVY1REExQU5vS0RlRHlsWjlOU1h4eUFzaUthd3JRcW1DdjJIVmY1ZThhUm94ZmMxbjd4cytraEl0QVV2b2p2eVdyeXhWY1dKWmtzVlN5Wm9RUkEzZGNBb0h6YXg0R2oyd3R1NkZWS003Z01ndGkwMmpiVjQ3Nm9VSkpzMWovQWJBMW1RM1BtOGVUUnNvWkR0Uit4WktDaUVLbU1YVEllWEhQR2RoWUFyWDhGd0c0REdNRW5BSElLNHl2VDU4bldDMmI3M2NleGFaZ1dXYUVLZ1UxZ2pOYlBQN1B2T1lHc1VTQmt2M2hCdG1SV056eGpUazlSV2t0dnhwNlBPajB2QVJqWTlzV2tGZWw4Uld4ZWdqSUY0Ump3QU9uWldNUEJUR2pxdkhtc3p4Sk9CVUQzeHl6bkwyYnFST3ZvUDNOM3E4NGpHNEM3TS9QcGN2TUJlZjBjdlY5azZoWHYrMllubzVRZkdBclJiYUNDMG1XdjJZdEYzZWNlck5EaGtOWklJc1hRUnY1ZGxUdEdBREpTejJnRUUxRUpRTS8vMDI2SGRJRVpMQzhCNkEwdGswZzFKYThEdXpKZHBoUzgyUUJFWmo1ZGJqN2d4Wk41ZXIvSVpJKzY3cHNjZ0U3UWFET1VNeUMwV2I4K2dYanVSNEY1SjZZc2FYbkZoQm9BR0VWdlVoYjYwaklTZ0NRbm9oL09MQmd2SXJMOHY3RGRGa0VZTTVkdE5nOTd0dno1ekpxemRmSUJtSmxQbDVzUCtESlA1eHRXN3hmZm56ZWg3SCtaKzMrUnBreVdUMVl4dVVSSllWdHg2VDBmQ1RvY291UVY4NVZrSFJJR2VnRXVFdi9ZS3BrQS9KY2VWbUw4a3Y2dDUvOXB1NjJ0ZmlQV2NGUVZFYTBEWjlXY0xKRVB3TXg4dXZmbmpUOUlnWnlqOTR0L2xkZUEvUzl0TWFHYTlTTmRtc0l4YnZWc2NWSjFHU2NvTXQ0VVB3aEFzbU1aMGFYelFCc3ZkR1JCalF6MEZVcEVKUkFKUU9xNEtBbkJkeitzZmlQSjNiT1luOGZzeWt5VldNZmlOM0JPemNrUytRRE16S2U3T1cvODhhcVF6c2ZFNWtIMWZ2R2plUTB3QURvZG1WR3dPZWlNc1VxSHJHT25TNFVGeTlQL3dBRW9qa0VuSStJcU9JSlFOTGdwQ1hoY21MQXREL0Qra2dRRTIzNUw5M3RqK1lCcWdUWDlCaUNlVy9OZWRUNEFtUStZa1UvM3NienhCeW1RdVpobThnMVQrUWJWK3dXRmRqS08vVGUybUVGTmxDYjZnUEY3MDhWSjFUWEhnS2Q5MUduWnBEZmkxay9nTTJ2cVUzRFVuQ3VCbU5RZTNQOXZ3NnBlMjI5S092QjBLMWsrWlMrcm5yZk0yQWxBM0pNWnRhaC9FWktaVDNkcnh1RHoxTy95eEF3dTlKZ0p4cjNsUWZSKzhhYThCdXkvd2RXUVpBVmwrWnpDckczcTljL1lya21IeTNJUllyeUFBcUFrRUJJbG9wSnhOTlViRVIrZkEvSCsvK0FBZFA5UG1TOWRhemljSnlibTdtbEI4blIyZEkxSHZnVmtPbFpHUHQybk0yOUdDYW1jR1pqQXdsUSt2dnJWKzhYL3pHc0FBVWlMVlBwL3dkK3phVE1GV3crL2tBQTBHUVFucEN3NW1Ec0FNSXJjUkI1bUMvK01BZmZUd2dmd0tZMktmbUNaNlpJa1VTaHJ4WHhCWDR5WWFWOEh6bWNuMTNqVUE4Q01mRHFXWWVRY1NraFZPbDhVNnV4SDd4ZWtyc2c0OWg4b2lDRU5nQzVUVUc1dkt4eFQ4ZjJhUnRPdGNBS1Exczhzb1B1T1ZVSXdwY2hObEVFSU95TlNJcnJ2djNod25ja1dJWlBac25iY0R5elRwdmczbFU4bXBaUXFvenlmSzc0YWozd0FLaDFMZ3JzRDV0TXhpei9ua0dEMXNIcS9ZTkZPeGtFQWN1VzdvcW1YbGlzdVFPVDdWVjJqd2kva1RnajFSa29aaEJqZThaODNTQ0FFRUpaVzBDM2dmZjh0QURDdDRWQVNhV0lCSzBISTlxOEJGNXlVQU16SXA4dE54NUpnOWJCNnYvamREUFNSbnMwQldJWmVVaXRJbzlJaEhtaFhUdnpDUFFkZGNjblo3NlUxVi9JdkM0U0JDRnlnMjZERk5nN2MrK01oaGI2cWlDaWtUN1dWVW1yNmxZbjJuUkt5cmRaNTFHTUJsWkljMDdHVUJkTWpueTZYQ2lVbXBBNmo5NHZNWmJnQk1GbzU1MnB1MjdQWEFxWFR5QVVRY2l0T1FqQW05eFgwTjlwSXdJUG1TQ21INVF1UHFFUjBMNGtEWWdwOXpPVUw2Zll4a2JaY0ZjZXlBcmVBRjNHbFYrTlJEd0F6OHVrc25UM2ppSUxWU21wV05saE16ZStrOTR2TVpmZ0dBUEplSERqcENyZ00wMVRkcnk5T3p2bVlBekFxTFZXSXdFU2h3emJSd3dTRW4rTXFQNmJRSzV0WmxXeWhqQ0NDc0MxOVh2N2dPbkJSYmdwN2N1LzVBT3lWanFWTW1BNzVkSlo5bkhGMHlvaFdObGhNeEtuUyswWG1NdHdBbUZxNGltbllickVxTkpQYys5a2ZkNjJSS2gwT244cVY5aFhaOWFza0VQZ0FmSTU2emlvY1VnVmJ6R1QyOGxFdFJNb0t0ZzdsQkh0em5mWk5BK0NRK1hRV004azR1Z2xXSy9OTFlLelMrOFU5R1JlWEQwZy9UeXZoNE5lMTdZYjRaYnI2ZzZ5Ny9hTldjb1BwaktSVHNKSWFnczVJSndrRUF2NmVuMDVTNkdVQmZSV3NVRXhaeVZaVlFDUXdyZ043V2ZkZDQxR1BCY3pJcDhPRGVYZlRTYkJhNllZeGxZOC9wM3EvdWRjM0MralRidHZxdDJvYWRuQjJtNG9OZ01uMFcwcCtoWVdIV2J3Zzl5VS8wS2I5RUl5KzV5MmhpQ2l0NFVnS3lUZUFrTjhWYWxrNExlL2xkbE9OUno0QVdXQlJNNmZkSVBmSHN0dy9HK1NFNXJNblZRL2tBNUFrTEhTMGFrN1Y3cmVYZmhnQUNhQnFEdEQzZS9ubWM1azlrQS9BODBKUmVxK1UzOHpHVnAzT2JKby9CdkFPRDNkdHdpV2FyOXpFSHNnSElHbEZ1YnFTeDcrSmphMzZhbkxMY0R2dmd3QStORHBEZklMditxbHp1WHdBWHVTanJrS2VtbE8yZTNVMXVXVVluTDhkd0IvNWUyYXBjYTlMTnYrdnNRZnlBVWhlWDRWZ3VCK216SXNhRzludHF4aEY0WGJlM1FEK243L3VITEFXOXdRMXRibE1SUS9VQTBDYUhDN3BsWEVoK3E0VDBPV2NmaGxlWVRTSEJLMEVIL21pK2ZjUnVLUW40STZmV3Blb0I0QWV2Q3ozSE9PbTl5YjNGNW1CbFpCTmNsWUNqMWFSZnlmcmJnUENUUjZBeksrdkQ0Q3lnbFg3anBtTjdIWTY2ZDFFMGN0ZElyRUVFNHdFSU1sYW0rUGs3WUY2QU1qN0V3QVZiVTgydlRlckN3aEFYb3BKTjl6VkkrQVlyT2VVTExaZ0VyWTJ4OG5aQS9rQUpHV3IwbmFVV2RGcHkyY1Qrb0NXanBkakxGeEU1VXpZSUJCcEVVWDVuTG5sdkFrdGI3NlNQVkFmQU9VSHBpQU1tOTZic1Z0Q0FNYUtBTElDTXl4RHE2Y1hmeWNBK2IvbU9MbDZvRjRBaXFCUklFekJwNy9YMkFmMCtmaTFYSWlvTUlsQUkrQUlQSUdQbWVST1dWM2oxWnV2eXUyQitnSG9GZlppRFMybEMwTGlZNTJXVUFEa1FvVFRNSDFCRlNZUmRIb1JmS1N1NXY5cXJpek1IWVBUK3Z4NkFSaFN1RGNBenptRG81WkdIVDFQQUtZTXdReE1FMmppU28vZ0V3QnJycSt1NDFaT3krK29ENEJhQ2NzWFRQaVNJM2V5OHM0S0dvRzhRd0NNRk0rMGdnUWhMUjBCRjE5U1h1RC9heWFrejd1UjAvVHNNY3hnM1NqZnFXTkEwaHNyZ2Evb2phcS84V1BjQytZSWs0S2U0Q01TdUIyWFZodDFPajh6SWZYbFU4QnRVOERobVlSWFdkZnJkRjFmZ3IzK1M4QXQ0OENEMDREVmpYUVNETzcwUFRVbmFKNXVPQ3dzSUlGSFNTRnkxcEtQV0NEc1p4Q3B3OFVWZ0tTUHhMWE05MzdPenh4QWxqemNQQWJjc3dVNFFoNFYzVU44bUtvZUttL2J1NzhJZktKUWE4VkQ0OEN5bEhRaUwzTzMvcWc1UmYzMEJLQUNNdEpYalhLUWNmQlNLOERmcWMzS1ZDd3VOMlZGR1JubS95S1p0cTRSZTVpZnlRUWdNMkErQmVCM0dIYVpCbzVNQUl1ZTBsN0t0M2NDNHhodys1ZUw3VHVDa0prMWpCdHllcmJVZllHNUV4alovcHFyeEU1ZkFPck9xNVNtb3dWSXJScDFJeVQyUjYrZmcwYmdWWUc0Q3N5WmUyVXNhaU9HS1hyNFNmcDlrOEN4Q1lBRlNLeXZYZVkxbzFCeFF1eDkxeU10ZnNIUHV0Z25ueVV1VXZoYzBac2dVWGliK25Wa3E2K1pLYUFCSUhzZ1ZabnV3RDlzVm82NnJyUjRJbWRoTEdTUTh6UEwvSmdCUXhlVTFvdVdrTzlQVGdEemJnbVh4cnpNa2F0bDNrZWl2Zkc1eDRyNElSY3o1QmZrTzV2RVowa2dwSWZCWjh5S2psTDE3c3l5MHRNTmNPbjlkbDRGeTZkTEZhYmoxTXB2b3c5SWZ5K0k0TmxvOVh0K1pxVTlWZEpwcVpoNFFERHl4VXlZT1lKd0hEZytEaGdJL1dVVlpsN2FTRXQ5MytHTzlJYTJpdVpLT2ZBN2xocDlKcHZBVnk2MXcybU93TzVobUNnTUhDMUg5TzI0Z3U2VUQ5alArWm1idExSYVNzZWk5U0w0WERQYkFFaC9rR1EvcFNVY2MwbGJBcEZXYjY3bFFVaHBWbkxCc29LcXFaY2xGTW1VdHJ4UGN3eGwzWDd2T0NBdFlMU0NjdWdGUW1xaGRzc0g3SFUrUnpuamlPbFlYQTh3cWtPZmtJdFRBb20rb0t5Z2NhNEVTOGpZK04zejdmU0c0aGZVdHAzaWhVSHJ1VlNzRnkxaVJ2TlArMU43QTVCZEpBQ21WcEFnWlBoR095Q2lnRWpsUEx1ZG43a3ZGdE94dUI0ZzZPakQ4VVdMUmtDWkZSd3JMQ0VYSlFRaHAySyszN2xRZUJDUlgxQTdLUFF0bzFwckZFbVNZbjJtQjlFQXNPK2tZZms4S1FoWkY4eWpWejVncC9NenR5T1VqaVc5YkNVaEVCaEtSQ0NnU2lzNDV1US9QaFgveGZGV01nT25XdTJneEIwVEYvbzBrRVova0NETTFUcyszUkhZbndWVUw2WGhERnJBc3dmSUI2dzZQMU1yVHVsWTBzdW0xVklDZ2xLd0NFQUNxdlFGQ1VLM2dIY3NGUUNNL0lMYXlxUDFrOUpzaFZxcm5jTWFsT1lZdmdjR0F5Q3ZJd3VvZDhZQkpRbVpwbUdKZXlSd2tHdzRuOGpKT0pRTnczaWRMRmhNUk5CMFNnQVNUSnlLb3kvNGllWENlRmZKQlVlVjJTb0FjbEZ5UjBiYm0xT0hUVWlOMC9EVEF3RDd6UWVNNTJkcWo4VnNHRWtWRTJqS2V0RzdBRWhRMGZySkF2NlJDMHRyQzFza2wrSVdsTmluR0xiU2FaZzdNYzB4ZkE4TWJnRjFMUVYxejA4QTJHOCtvTTdQVkY5TXMyR1VFMGdReXArTHd1MnlhZ0xnUjlaYVlwa1N5cFE2YTZRMkRDcXpwa3ZpZXRYSUZkb1pmdWllR21jT0QwRGVQMEhFYkJoTndZUG1BL0w4ekpRc0FUQUtuZ3VFcVMrWFRxa0U0WWZXV3dDVUZaVGtzWUFZd1pmSUJlTjlUdzBjak93dThnRElacXNvU1N2aEVlUURpaUdZRm95V2lTRFJ5cFdnaTY5VVA1c2M1ZkljcXVTQ05lWHFlMlg5WkFIZk03S2hlMnBjT0IrQVQ0MSthTzVpUkQzUUFIQkVIZDljdHVpQkJvQU5Fa2JhQXcwQVI5cjl6Y1ViQURZWUdHa1BOQUFjYWZjM0YyOEEyR0JncEQzUUFIQ2szZDljdkFGZ2c0R1I5a0FEd0pGMmYzUHhCb0FOQmtiYUF3MEFSOXI5emNVYkFEWVlHR2tQTkFBY2FmYzNGMjhBMkdCZ3BEM1FBSENrM2Q5Y2ZPeHFZSjJhdTlSZFB0ZHAva2hvRU9sZ2xEWVQzOVYxUHpRRlhMc01YQWxndDlQQ3hKS1BidWZ5ZjgvS0hJUGZCUEFaQUJmNzlYYzVYUTBaUTFRNzM2ME5ieG9IcmxzRHZzNVpSc2dvMHVuZTA2Ynk2WDFtWnZ0UDk5UE5BcDRGNExzQlhBNWdqdzhFR1RlcWFHRjRRaHpRRjgwQ1g3Y0F2R0lkZURZQWZoZFoyc1RLVWNWcnBFN25kMzFONWdqOGUyZElvMm9zazdOWnBNZEswWjE5dHYrYko0RjlLOEQxQUNqOHlmTlNpa0hlZys1Wjk2OW01N1kvOC9aUCtkUExLWmhQL3JjQStBWUFGN2cxb1JVaEVNVXpGTXQ2ZVNKZlg3OGIyRGtQZk0waThHSUFYK3VXbEFNcHByZVVVRXJuOHAyZ3pUbCsyZmxnL3NEYlRrdklPaWsrQ1AyMC8vbXp3QVh6d0RjQ3VOVFBKZUZYcEVwTTZRRWpJSG0velRGOEQ3VDVnQVRZTlFDZTY5YUFsb1JUR3VsZkJFU0JTWU55eFI1Zy9CaHc3aEt3WndsNHZrOUxuTTVKbXNCelV5REdBWDNCOEcyM016L2c5QnVVYS8wSWl1dGZNa2o3endLbW5nQXVYU3ZPcFV2QVdZQnRGNEJUbnNwSWovTzh6UGFmN3FkdldJVHc2ZVpBMEpMUUVoS0VHZ3haaFVqL2R6M056U0t3YlI0NGV4bll2VktjeSttTTVLbTBKaHhJblV0ckdrbXpDUGljZzNXNUxNR2tRaVpaVG05eFM5WjMrNG0ybzhDNWM0WDE1cFRLVzJMYitmQ3g3V0x0all4enFpcWwyOUljdy9kQTVTcVlmNlJUVGlsZytsWUNJWG1JQ0tRNElLOXd4ZlNKWThBWks4Q3VGV0RuYW5FdWE5WlRBTXNhQ29nM0R0OTJPL012blJHQnRHd2txS1JtTUVrcUNhYSsyayswTFFEVGg0clA4OFVIajc0a0YxV2FBVG85UUhRN21tUDRIdWdZaHRFS2o0UEI2WlErRlMwaFFhaHBsZFB5YTFrWFRPcU5ZOERzY2dHK0hhdkF0dFVDdkJ4SW5pdHJrZ0w0bGNPMzNjN3NwQmRNM2tBdVNucTJueDlnUWZBaDRKeVZ3dnJ4d2VsMnozcDRhTWx6SDZETTJ6L2xUKzhhQitRL09UNEVFcWNrV1FTQmtHRDZFUUtRbkRDTHdCU25ZZ2NmMzJmWGlvR1VGYXdDNGVzeXU3Q1hYbkRQOXRPQ3N5RDRLTEIxcm1ndlg3emZidTJXRy9KdG1lMC8zVS92S3hCTkFNb2kwS2Nqa0FUQ04zSE9FcjNVQWpEcndPUDcxclhpeFlFa2VLTUZsU1g4b2N3UjZLVVhUSjdBYU5FMnRGOFdmQTRZZTdLdzFtd3ZYL3labitlS252Y3JmekM2SUsvT2JQL3BmbnBmQUdRbnlTb0lTQnFVWHlBQVNTMUFLMEpmYWdXWWNSRE9yQUY2NlR4WlFVN2pCT0ViTTBlZ0g3MWdjZ1hTRlpBVjU0TlF0ajlZY05JcGJPTkN5aDhZZ2k4Q1Zvc3BBcER1QjYzZzkyVzIvM1Evdlc4QXNxTTRnTElLQkJJSDhiY0p3TUNOTVg2OEJUcUJiOHM2c0dXdHNJQTZqd0RrNjYyWkk5Q3ZYakE1QTZOVmEydC9JQWljbkMvYUdWKzhUNzRJUVBtL0FtR3VCYys4L1ZQKzlJRUF5THNsQUtNVi9MZ0F5SVVJbmZuandQUXFNT09nSS9Ec3RRNU1yN1VBcU1GOFYyWVhEcW9YWE5sK0VRUTZOOXYyOWFLZGVzVXBXSlpiQVB5UG1lMC8zVThmR0lEc3NEaWQvcFVBU0N2Q2FYZ0ptRmd1QUVmZ0VYVDI3Z0RrdXdhVWcvbmJtU013akY3d2h2YkxoU0RMNVR3d3ZkUnFvOW9xSHpBQ2tDQjhVMmI3VC9mVGh3SWdPMDFUMUlNQ29BWnhHUmhiS29BWFFVY1FUamtJK2E0QjVlNUZ6akdzWHZDRzlnZHFyTEdGWXJwVkcvVXVIekJPdzIvTGFYeHpiaDQzREtlb0p3bEFIcUxuZFNzNHVkb0NvSUJIUUU0NUVQazNEdWl0bVlPUW94ZGN0cDgrckZ3SVdzR0ZZaUZGb0xHTmNoY0VRQzZlK09KQzVKMlo3VC9kVHgvYUFwWWRKMzdBeUpLL0RJd3ZGeFl2V3IwSXdFbi9IMU9wY281c3ZlRFVoU0FBRjRISnBRSmtXaXhwNmsybjRJWWZNR2YwYW1ESGV2Mkk4K2w0L1Vidk53OEVvenc3MndKZVBPSjh1bmQ3RWtLajl6dEtHQTEvN1d3QVRvNDRuNDVwV0kzZTcvQUFHUFdaMlFCa1lIQ1UrWFRNZkdHUW1ZSXhqZDd2cU9FMCtQWHpBVGppZkRyS3RUWjZ2NE1QL01seVJqNEFSNXhQRitWYXFaTEpGMVV6S2RQVjZQMmVMRERyM0k1OEFJNDRuMDdaTUFSYm8vZDc4Z011YldFK0FFZWNUOGU5WU9uMlVoZXUwZnM5dFVDWUQ4QVI1OU1wRzZiUit6MjFnS2ZXMWdOQXo0Z2VSVDVkVEVabzlINVBQUkRtQXpCbVJNOEJKenFmTGlZalNLS3IwZnM5ZFlCWUR3QkhtRTlYdFJmTXNJejA0YVFaMStqOW5weWdyQStBa3FzOHdmbDBCQ0NUV1JxOTM1TVRZTDFhVlE4QW8xemxBbkFpOCtrRVFHWlROWHEvdlliNzVQdC9mUUFjVVQ1ZEJHQ2o5M3Z5QWF4WGkrb0RvRkx5VDNBKzNSY2F2ZDllWTN4Uy96OGZnQ1FYL0xQUjNTT3prb241NWpnMWV5QWZnRDhNNE5jQVBENmFEbUJ0QjFlNE5NRE5jZXIxUUQ0QWJ3Ynd4d0RlNFV2UkU5d0haRzFnTlNYRExsd0xOY2VwMVFQNUFQeHp6d2o5SUlBUG5YaFQ1T1JjNUVZQ0E5SE5jV3IxUUQ0QW1SSDZGUUJNVFNaWkg5OFptRDVCaDVnMUZvcGlObnMxeDZuVEEva0F2QWZBRXdEdWRuSStFdlF4UGZrRXpZZmFDWFJTQmx1UU1CN1lIS2RHRCtRRHNCTkJILzkrQWtBb2JxVEFER0s3SW53MXg4bmZBL2tBN0VYUXQ4a2dyR0FHTWZCeFo1Q3Y1amk1ZXlBZmdMMEkrcjY4dVIwUW1VRm9CUVU4dmZOdnpYSHk5a0E5QU9Sb013N0NkR1FDam9VWkR3TDRrdi8rOE9aMWdKaEJJakdEZ01oM3ZUYXZCYzAzNS9SQVBnRDdKZWdqT0RmaGlNd2dvcWVKd05QUFRhQjZFenEvaHErc0I0QWNYZVhFUCtaaEdWbzl2UmltSVFENXY1b1BBWkN1cGdESTl3ZzgvcXovMVh6NTV1c3lleUFmZ01NUTlHVTJPcDRlQWNocE9JSlFRRXovVnVQbG02L0s3SUg2QU1qZ0d6ZGw2UXR5WDVqV2pwUUZldkYzbHEzeGY2eWhyT2xJQVVnUUNvalI4Z21FK2w5TmwyKytKck1INmdFZ1I1VUE1S1lzYytBWm1DYlFDRGkrSXZnRVFNb2IxWEJFQUhJYWpnQk1MViswa0Nkd3M2YUd1M3pxZmtWOUFHVHdqZnRnM0pSVlZSQXRIUUVYWC93YkFjb1hQNWQ1Q0lEOEdvSkt2cURBbG9LT29Jei95N3g4YzNwbUQ0emhhcXdqUnpDWXlRZzVncjJaZ3NGVEx3ZVdyOFhRZ3NYamJ3TFdybk50TWxLZ05vTEJtWkFhN1BUQ0F1WUlCbE12bFdRc3d3cjJVbFV3NDVqZERTeDhIYkQrQ3RkK0hWQ3dlUEtiZ0pWOWFBU0RNOFlnNTlUV0ZEeXNZUEJ0bVlLOTFJYk5PSGFQQS9NN2dVWEtYQTRoV0R6NzljQTgrVzBhd2VDTVVSaisxSFlmY0JqQllPNTRNTVkzdEdEdjhJM25tV1NIT3pZT0xKMExMUEdYQVFXTHozb0I4TVFVc0VhMTZrWXdPRzh3aGpoNzR5SmtVTUZnYnNObENmWU8wZXB3aXNzVlkzNGJzSHcyc0VJUmtBRUVpL2RjVTBTUDVxaEYxZ2dHNXczR0VHZFhyNEw1MTM0Rmc0a0FqdURRZ3IxRHREcWNVbVpFVHdBclp3QXJ1NEJWcXN2MEtWaDgvbzNGNHYwUVhaQkdNRGh2TUlZNHUzTVlodjk1WmgrQ3UxeEJjeHVPVS9IZmVESXE1Y3Y3RnV3ZG90WGhsQ0JYak9YWkFueXJPNEJWNmluMElWaDh3U3RMdVdDc1VBeXZFUXpPRzVBQnorNGVCK1IvZXdudS9rT1AvM0cvbDRrSlRFUmxsalF0SW90MmU1My9Jd08yT1BsNEZMdGNuQ3FBcDljYWhUNTZDQlpmK0xwU0xoaHoxTjVxQklQekJtVEFzL3NMUkhjVERLYmlOSGRCR0d5bU9DLzNoZ2xFdmdqQW5vSzlBN1k0K1hnaVY0elZXWURBcy9ldHhhdWJZUEZGUDFRa0x0Q0lQOG5lYUFTRDh3Wmt3TFA3QXlDL3RKTmc4TC94TE5CdStZQmRCWHNIYkhFRkFJTmNNVmFtZ2RXWkFvUnJmUGRYbThLaXRMZG1nWXZlV0FxKzJ5N2lNcWZ1UmpBNGIxQUdPTHQvQVBKTHF3U0QzK3k1VDF5STBBb1NiQXhNTXpHVjFvOC9NeTJybzJEdkFLMnQrR2dpVjR6ajQrM0FJd0RYdHdCclZKZXVFQ3plKzlhVzREdXQ0UHhrSWhZc2RldEdNRGh2b0RxY1BSZ0ErU1dwNE80dmVRNVV2L21BR3dSNzgrNnJRcTRZcTlQQU9pMmZBNC92QmtLdWRLVlU3Vlp3Nzd1S3ZXRnVaYnRjTU5iNXYwWXdPRzlnK2p4N2NBRHlpNlBnN2djY2dJeGxjQTVUS2hhRDAxeVlLQm1WRnBCWk1meC9tMkJ2bnkzdDhMR3FvcVRsaVpiVkkrZ01nSHduTUFuQ0lGaTg5N2NMQUFaNlF5ekZ6elNDd1hrRDFPUHM0UURJTDVYZ0xtazVKSGsvU0Q1Z0tkaWJkMzhWY3NWWUdtdUJUYUF6RUhMSGd5Q2Nhb2tCNy8xSWtVRVQ1SUt4d0Y1cEJJUHpCcWJQczRjSElDL0FhZXF2UEw5cG1IeEFFK3p0czZWZExDRC9sY2dWWTNVeVdEMEJqMVp3cWdDZ2dYQTdzUGZXQW9BSnZhRXRaQnJCNEx5eDZlZnNQQUR5Q3RtQ3ZmMDBzL05uT3NnVlkzbThCVFJaUFp1R0JVQUNkQXJZKzVsV0RxR21ZYklyTEhFeDBnZ0c1dzFPSDJmbkE3Q1BpelFmYVhxZ1V3ODBBR3l3TWRJZWFBQTQwdTV2THQ0QXNNSEFTSHVnQWVCSXU3KzVlQVBBQmdNajdZRUdnQ1B0L3ViaURRQWJESXkwQnhvQWpyVDdtNHMzQUd3d01OSWVhQUE0MHU1dkx0NEFzTUhBU0h1Z0FlQkl1Nys1ZUFQQUJnTWo3WUVHZ0NQdC91YmlEUUFiREl5MEI4WllOTWJrWCtaZWtwdUlpT1FyUGFyK3hzODg5SEpnNmpaZzVqQXd2Vlo4QitsbDlQbE81L0ZjL28rRUNqbkhmaTh6WWZrdk01dWxtcDRxSlhWcXg1ZGVENHpmQWt3L0NHeGRBWmdvSGZ1aDEzMVFrYUk1aHU4QnM0RHM4QjBBV0xuSVJHQ0JzRmZuODdKZmZETXdkak93NVI1ZzhnaXdaYTM0am5RUVV3RG85OXdCZko0VE03Q09pTmRsYWoyckEvamVWL3ZmRGVBVEFQNFVHSDhJMkxyYzZnYytTSHFZNG9NWjc0VlNLTTB4ZkErVVV6Qi9vQlVVQ0tNbDZ6U1EvUHNYcVpENUtRQy9BMHcvREV3Y0FjWVhnWW5Wd3Bwd0FEdUJrZWZuQ2ltOTBGbUJXWHduSzg3VWVuNTNCSThzYnV3cWF6OXA1VWduUWhCUytaTjF6RThBazB1dHZpQ3dxOERJOC9ueDVoaStCemI0Z0p6S1pFMVNFRlpaZ1M5LzJwV1IvZ1RBSjRISlE4REVNV0I4QVJoZkJzYVdDd0RxdXdRS3Z2TmdIWHZPY1lWYlBGSlBrdytkRHhDL1cxWTR0V0Rwdy9SbGdvNGxvMVQ0L0t4VGloRE5wSndqMy9VaU1MWGVtcHJqZmZDN2VXcHpETjhEbFlzUURpS3RWeHpFcW9Ia3lYOUhSaXpXK25JZ2FRbnZBaWFlQkNibUMwczR0Z1NNdTJyTWVQQVI5WDI1MmpYa2xhVEZVMTA4SzBNSGF2L252SjZaeFZWazlPSTdHUjJJWm9HUU5jL0hnYkhnSXdxSUxJVnVqdUY3b09NcVdGYXdDb1J4a2ZFSUI1Q1dna1JFQkNOZjl3TVRjOEE0UWNpQld5b0d6MTZyd05nYU1MNWVXS3BjdFlaTDNOK1RXTFgwZ3Z0dVAwSEhrMm4xNkpEeXhYbVZoZlUwcXl3YkpicjVHU3VYS3hBL3NWNVk5VVlXZG5qd3lTM3FLS2dhcldBNjlXZzZmalFPSUswSGFkbklqUFZGQitBaU1FNEF1aVVrQ0ZuRVN5Q1NrbUF1VTdDam0xNXdYKzJYMmlmQlJuOUE4bUtjVzJVRmpVTFZRY2dWRGw4MHU0MFNZaDc2M0ZmdnF1aExDeGl0b0JZVXNvSmZqWEt0dEJ5TXE5Q0tjSG40c1B1Q2JnWE5Kd3lXa0VDY3o1UTM3NlVYM0xObmNaeVFBQUFERWtsRVFWVDlmRmdJSnM2bEJCd3RuM1R0NkZwSXo0UldudVF4UGgyWElHem00Q3dROWhXSUZnQlRLMGdRSGlJQUpkZEtxMEVMUWgrS0wxcVVSNE12U0Vzb0VOSUtyZ0FMSE5pTW94Kzk0Szd0bDlxbm5NaW84TVNmNlNOd0dwWVZqQ0RrL0p1N2lzcTQ5NmZDcVgwQmtEZXFsV3dLd2ljMWdBUVNwekdSRW5GZ1JFejAxZUFMTHZ2cTJLZmk0NW02Y2YzcUJYZHNmeFJiSk1obzhkaW1xT2hFSzhjWFFScjlRVnB2UG9ETk1YUVA5QTNBQ0VMRnhQaCtqQUNrUDBmTElLRkNDUlJxS3VQVWRxamxDOW8wN0pad0tWTkhlQkM5NERRY1pPMFhBQWttZ290QWs5UVlyUjlmL0J2QnlZZk1TQVREVk16d1RYTU0zUU1EQVZBZ1ZIQ1o3L01hUUs0UVpVSGlOQ2JCUWxxVXc3NFlDYjdnY21Za2VsQzlZRmx3dlZ2N1JSQW9yVHVCa0VDVTlhc0NJRDkveDlCOTM1ell6eUtrcXBmaU5IeGNBMGdMUWd2QkFhUFZrQ3FtM2gyQXRDNW0vUnlFcXp3LzR4aEdMM2hEKytNbXNsZ3FDYmdVZkxLQWNScm1UbEJ6RE4wREExdEFYVWxXY0RtMUlPSUlKQWpsVC9GZDA1bGJGUUZ3amR0Z0djZXdlc0Z0N1JjL0d4OGlXalVDakdDVDFZdldUMU13Z1VxcmYzTkc0NXRUYmN1MGF4aW1XeDl4RU5jRVFIR2JjWUFFd3RTWFNxWTBnbkNkZ2V1TUkwY3Z1R3gvRlVHZ0Zod0VZclI4MFFja1dOK1gwZmptMUR3QVd2OFJnSkZpbEpaQnpuejBwUWcrQVpBQWxWV2gxR3ZHa2EwWHpCMGNDUWkzMGFTR1ZhOUFGNjJmTE9CN01ocmZuSm9Qd1BFUjU5UHgrbzNlNzZtTDVLd3AyRzU3eFBsMGt4YzNlcituTHZ5S3RMbWhmVUM3OFJIbjA4MU9ObnEvcHpjQVI1eFBSOW1SUnUvMzFJVmd2Z1VjY1Q0ZE5hb2J2ZC9UR1lBanpxZWp1bXFqOTNzNkEzREUrWFJVZzJWU0NqZGFHcjNmVXcrSStWUHdpUFBwcUpqTzhKMU53NDNlN3ltSHdIb0FLTUZkN1FFckFlRUU1Tk5KTWIzUit6M2xzR2NOemdmZ2lQUHBvbUo2by9kNzZvR3dQZ0NPS0o4dUtxWTNlcituS3dCSG1FK25vcVJHNy9mVUExOTlVL0FJOCtrRXdFYnY5M1FIb0VoWlRuQStuWXFTR3IzZkJvQXRhaXFCVUltZG01aFBKd0EyZXIrbkt3QkhuRStYMWdVelNiblIrejExd1BqL0FlQ3BQREQzdDdydkFBQUFBRWxGVGtTdVFtQ0NcIjtcblxuLyoqXHJcbiAqIFN1YnBpeGVsIE1vcnBob2xvZ2ljYWwgQW50aWFsaWFzaW5nIChTTUFBKSB2Mi44LlxyXG4gKlxyXG4gKiBQcmVzZXQ6IFNNQUEgMXggTWVkaXVtICh3aXRoIGNvbG9yIGVkZ2UgZGV0ZWN0aW9uKS5cclxuICogIGh0dHBzOi8vZ2l0aHViLmNvbS9pcnlva3Uvc21hYS9yZWxlYXNlcy90YWcvdjIuOFxyXG4gKi9cblxudmFyIFNNQUFQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFNNQUEgcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7SW1hZ2V9IHNlYXJjaEltYWdlIC0gVGhlIFNNQUEgc2VhcmNoIGltYWdlLiBQcmVsb2FkIHRoaXMgaW1hZ2UgdXNpbmcgdGhlIHtAbGluayBzZWFyY2hJbWFnZURhdGFVUkx9LlxyXG4gICAqIEBwYXJhbSB7SW1hZ2V9IGFyZWFJbWFnZSAtIFRoZSBTTUFBIGFyZWEgaW1hZ2UuIFByZWxvYWQgdGhpcyBpbWFnZSB1c2luZyB0aGUge0BsaW5rIGFyZWFJbWFnZURhdGFVUkx9LlxyXG4gICAqL1xuICBmdW5jdGlvbiBTTUFBUGFzcyhzZWFyY2hJbWFnZSwgYXJlYUltYWdlKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU01BQVBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoU01BQVBhc3MpLmNhbGwodGhpcywgXCJTTUFBUGFzc1wiKSk7XG4gICAgLyoqXHJcbiAgICAgKiBBIGNsZWFyIHBhc3MgZm9yIHRoZSBjb2xvciBlZGdlcyBidWZmZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0NsZWFyUGFzc31cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmNsZWFyUGFzcyA9IG5ldyBDbGVhclBhc3Moe1xuICAgICAgY2xlYXJDb2xvcjogbmV3IENvbG9yKDB4MDAwMDAwKSxcbiAgICAgIGNsZWFyQWxwaGE6IDEuMFxuICAgIH0pO1xuICAgIC8qKlxyXG4gICAgICogQSByZW5kZXIgdGFyZ2V0IGZvciB0aGUgY29sb3IgZWRnZSBkZXRlY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcyA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XG4gICAgICBtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgIGZvcm1hdDogUkdCRm9ybWF0LFxuICAgICAgc3RlbmNpbEJ1ZmZlcjogZmFsc2UsXG4gICAgICBkZXB0aEJ1ZmZlcjogZmFsc2VcbiAgICB9KTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRDb2xvckVkZ2VzLnRleHR1cmUubmFtZSA9IFwiU01BQS5Db2xvckVkZ2VzXCI7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogQSByZW5kZXIgdGFyZ2V0IGZvciB0aGUgU01BQSB3ZWlnaHRzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldFdlaWdodHMgPSBfdGhpcy5yZW5kZXJUYXJnZXRDb2xvckVkZ2VzLmNsb25lKCk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cy50ZXh0dXJlLm5hbWUgPSBcIlNNQUEuV2VpZ2h0c1wiO1xuICAgIF90aGlzLnJlbmRlclRhcmdldFdlaWdodHMudGV4dHVyZS5mb3JtYXQgPSBSR0JBRm9ybWF0O1xuICAgIC8qKlxyXG4gICAgICogQ29sb3IgZWRnZSBkZXRlY3Rpb24gc2hhZGVyIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtDb2xvckVkZ2VzTWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jb2xvckVkZ2VzTWF0ZXJpYWwgPSBuZXcgQ29sb3JFZGdlc01hdGVyaWFsKCk7XG4gICAgLyoqXHJcbiAgICAgKiBTTUFBIHdlaWdodHMgc2hhZGVyIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtTTUFBV2VpZ2h0c01hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMud2VpZ2h0c01hdGVyaWFsID0gbmV3IFNNQUFXZWlnaHRzTWF0ZXJpYWwoKTtcbiAgICBfdGhpcy53ZWlnaHRzTWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBfdGhpcy5yZW5kZXJUYXJnZXRDb2xvckVkZ2VzLnRleHR1cmU7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU01BQSBzZWFyY2ggdGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7VGV4dHVyZX1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnNlYXJjaFRleHR1cmUgPSBuZXcgVGV4dHVyZShzZWFyY2hJbWFnZSk7XG4gICAgX3RoaXMuc2VhcmNoVGV4dHVyZS5uYW1lID0gXCJTTUFBLlNlYXJjaFwiO1xuICAgIF90aGlzLnNlYXJjaFRleHR1cmUubWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcbiAgICBfdGhpcy5zZWFyY2hUZXh0dXJlLm1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XG4gICAgX3RoaXMuc2VhcmNoVGV4dHVyZS5mb3JtYXQgPSBSR0JBRm9ybWF0O1xuICAgIF90aGlzLnNlYXJjaFRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG4gICAgX3RoaXMuc2VhcmNoVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgX3RoaXMuc2VhcmNoVGV4dHVyZS5mbGlwWSA9IGZhbHNlO1xuICAgIF90aGlzLndlaWdodHNNYXRlcmlhbC51bmlmb3Jtcy50U2VhcmNoLnZhbHVlID0gX3RoaXMuc2VhcmNoVGV4dHVyZTtcbiAgICAvKipcclxuICAgICAqIFRoZSBTTUFBIGFyZWEgdGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7VGV4dHVyZX1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmFyZWFUZXh0dXJlID0gbmV3IFRleHR1cmUoYXJlYUltYWdlKTtcbiAgICBfdGhpcy5hcmVhVGV4dHVyZS5uYW1lID0gXCJTTUFBLkFyZWFcIjtcbiAgICBfdGhpcy5hcmVhVGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XG4gICAgX3RoaXMuYXJlYVRleHR1cmUuZm9ybWF0ID0gUkdCQUZvcm1hdDtcbiAgICBfdGhpcy5hcmVhVGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICBfdGhpcy5hcmVhVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgX3RoaXMuYXJlYVRleHR1cmUuZmxpcFkgPSBmYWxzZTtcbiAgICBfdGhpcy53ZWlnaHRzTWF0ZXJpYWwudW5pZm9ybXMudEFyZWEudmFsdWUgPSBfdGhpcy5hcmVhVGV4dHVyZTtcbiAgICAvKipcclxuICAgICAqIFNNQUEgYmxlbmQgc2hhZGVyIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtTTUFBQmxlbmRNYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmJsZW5kTWF0ZXJpYWwgPSBuZXcgU01BQUJsZW5kTWF0ZXJpYWwoKTtcbiAgICBfdGhpcy5ibGVuZE1hdGVyaWFsLnVuaWZvcm1zLnRXZWlnaHRzLnZhbHVlID0gX3RoaXMucmVuZGVyVGFyZ2V0V2VpZ2h0cy50ZXh0dXJlO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoU01BQVBhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgLy8gRGV0ZWN0IGNvbG9yIGVkZ2VzLlxuICAgICAgdGhpcy5tYXRlcmlhbCA9IHRoaXMuY29sb3JFZGdlc01hdGVyaWFsO1xuICAgICAgdGhpcy5jb2xvckVkZ2VzTWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgdGhpcy5jbGVhclBhc3MucmVuZGVyKHJlbmRlcmVyLCB0aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMpO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMpOyAvLyBDb21wdXRlIGVkZ2Ugd2VpZ2h0cy5cblxuICAgICAgdGhpcy5tYXRlcmlhbCA9IHRoaXMud2VpZ2h0c01hdGVyaWFsO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRhcmdldFdlaWdodHMpOyAvLyBBcHBseSB0aGUgYW50aWFsaWFzaW5nIGZpbHRlciB0byB0aGUgY29sb3JzLlxuXG4gICAgICB0aGlzLm1hdGVyaWFsID0gdGhpcy5ibGVuZE1hdGVyaWFsO1xuICAgICAgdGhpcy5ibGVuZE1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXRDb2xvckVkZ2VzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLnJlbmRlclRhcmdldFdlaWdodHMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMuY29sb3JFZGdlc01hdGVyaWFsLnVuaWZvcm1zLnRleGVsU2l6ZS52YWx1ZS5jb3B5KHRoaXMud2VpZ2h0c01hdGVyaWFsLnVuaWZvcm1zLnRleGVsU2l6ZS52YWx1ZS5jb3B5KHRoaXMuYmxlbmRNYXRlcmlhbC51bmlmb3Jtcy50ZXhlbFNpemUudmFsdWUuc2V0KDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpKSk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIFNNQUEgc2VhcmNoIGltYWdlLCBlbmNvZGVkIGFzIGEgYmFzZTY0IGRhdGEgVVJMLlxyXG4gICAgICpcclxuICAgICAqIFVzZSB0aGlzIGltYWdlIGRhdGEgdG8gY3JlYXRlIGFuIEltYWdlIGluc3RhbmNlIGFuZCB1c2UgaXQgdG9nZXRoZXIgd2l0aFxyXG4gICAgICogdGhlIGFyZWEgaW1hZ2UgdG8gY3JlYXRlIGFuIFNNQUFQYXNzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtTdHJpbmd9XHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogY29uc3Qgc2VhcmNoSW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAqIHNlYXJjaEltYWdlLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIHByb2dyZXNzKTtcclxuICAgICAqIHNlYXJjaEltYWdlLnNyYyA9IFNNQUFQYXNzLnNlYXJjaEltYWdlRGF0YVVSTDtcclxuICAgICAqL1xuXG4gIH1dLCBbe1xuICAgIGtleTogXCJzZWFyY2hJbWFnZURhdGFVUkxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBzZWFyY2hJbWFnZURhdGFVUkw7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIFNNQUEgYXJlYSBpbWFnZSwgZW5jb2RlZCBhcyBhIGJhc2U2NCBkYXRhIFVSTC5cclxuICAgICAqXHJcbiAgICAgKiBVc2UgdGhpcyBpbWFnZSBkYXRhIHRvIGNyZWF0ZSBhbiBJbWFnZSBpbnN0YW5jZSBhbmQgdXNlIGl0IHRvZ2V0aGVyIHdpdGhcclxuICAgICAqIHRoZSBzZWFyY2ggaW1hZ2UgdG8gY3JlYXRlIGFuIFNNQUFQYXNzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtTdHJpbmd9XHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogY29uc3QgYXJlYUltYWdlID0gbmV3IEltYWdlKCk7XHJcbiAgICAgKiBhcmVhSW1hZ2UuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgcHJvZ3Jlc3MpO1xyXG4gICAgICogYXJlYUltYWdlLnNyYyA9IFNNQUFQYXNzLmFyZWFJbWFnZURhdGFVUkw7XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFyZWFJbWFnZURhdGFVUkxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiBhcmVhSW1hZ2VEYXRhVVJMO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFNNQUFQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIFNNQUFQYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIEEgcGFzcyB0aGF0IHJlbmRlcnMgYSBnaXZlbiB0ZXh0dXJlLlxyXG4gKi9cblxudmFyIFRleHR1cmVQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHRleHR1cmUgcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7VGV4dHVyZX0gdGV4dHVyZSAtIFRoZSB0ZXh0dXJlLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3BhY2l0eT0xLjBdIC0gVGhlIHRleHR1cmUgb3BhY2l0eS5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzY3JlZW5Nb2RlPXRydWVdIC0gV2hldGhlciB0aGUgc2NyZWVuIGJsZW5kIG1vZGUgc2hvdWxkIGJlIHVzZWQgZm9yIGNvbWJpbmluZyB0aGUgdGV4dHVyZSB3aXRoIHRoZSBzY2VuZSBjb2xvcnMuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFRleHR1cmVQYXNzKHRleHR1cmUpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3BhY2l0eSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMS4wO1xuICAgIHZhciBzY3JlZW5Nb2RlID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dHVyZVBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoVGV4dHVyZVBhc3MpLmNhbGwodGhpcywgXCJUZXh0dXJlUGFzc1wiKSk7XG4gICAgX3RoaXMubWF0ZXJpYWwgPSBuZXcgQ29tYmluZU1hdGVyaWFsKHNjcmVlbk1vZGUpO1xuICAgIF90aGlzLnRleHR1cmUgPSB0ZXh0dXJlO1xuICAgIF90aGlzLm9wYWNpdHlTb3VyY2UgPSBvcGFjaXR5O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBUaGUgdGV4dHVyZS5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtUZXh0dXJlfVxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoVGV4dHVyZVBhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuXG4gICAgLyoqXHJcbiAgICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnRleHR1cmUxLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJ0ZXh0dXJlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMi52YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7VGV4dHVyZX1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMi52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBvcGFjaXR5IG9mIHRoZSBpbnB1dCBidWZmZXIuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGRlc3RpbmF0aW9uIGNvbG9yIGlzIHRoZSBjb2xvciBmcm9tIHRoZSBpbWFnZSBpbiB0aGUgaW5wdXQgYnVmZmVyLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9wYWNpdHlEZXN0aW5hdGlvblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMub3BhY2l0eTEudmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMS4wO1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5vcGFjaXR5MS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBvcGFjaXR5IG9mIHRoZSB0ZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBzb3VyY2UgY29sb3IgaXMgdGhlIGNvbG9yIGZyb20gdGhlIHRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib3BhY2l0eVNvdXJjZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMub3BhY2l0eTIudmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMS4wO1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5vcGFjaXR5Mi52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFRleHR1cmVQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIFRleHR1cmVQYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIEEgdG9uZSBtYXBwaW5nIHBhc3MgdGhhdCBzdXBwb3J0cyBhZGFwdGl2ZSBsdW1pbm9zaXR5LlxyXG4gKlxyXG4gKiBJZiBhZGFwdGl2aXR5IGlzIGVuYWJsZWQsIHRoaXMgcGFzcyBnZW5lcmF0ZXMgYSB0ZXh0dXJlIHRoYXQgcmVwcmVzZW50cyB0aGVcclxuICogbHVtaW5vc2l0eSBvZiB0aGUgY3VycmVudCBzY2VuZSBhbmQgYWRqdXN0cyBpdCBvdmVyIHRpbWUgdG8gc2ltdWxhdGUgdGhlXHJcbiAqIG9wdGljIG5lcnZlIHJlc3BvbmRpbmcgdG8gdGhlIGFtb3VudCBvZiBsaWdodCBpdCBpcyByZWNlaXZpbmcuXHJcbiAqXHJcbiAqIFJlZmVyZW5jZTpcclxuICogIEdEQzIwMDcgLSBXb2xmZ2FuZyBFbmdlbCwgUG9zdC1Qcm9jZXNzaW5nIFBpcGVsaW5lXHJcbiAqICBodHRwOi8vcGVyc28udW5pdi1seW9uMS5mci9qZWFuLWNsYXVkZS5pZWhsL1B1YmxpYy9lZHVjL0dBTUEvMjAwNy9nZGMwNy9Qb3N0LVByb2Nlc3NpbmdfUGlwZWxpbmUucGRmXHJcbiAqL1xuXG52YXIgVG9uZU1hcHBpbmdQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHRvbmUgbWFwcGluZyBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYWRhcHRpdmU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSB0b25lIG1hcHBpbmcgc2hvdWxkIHVzZSBhbiBhZGFwdGl2ZSBsdW1pbmFuY2UgbWFwLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5yZXNvbHV0aW9uPTI1Nl0gLSBUaGUgcmVuZGVyIHRleHR1cmUgcmVzb2x1dGlvbi5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGlzdGluY3Rpb249MS4wXSAtIEEgbHVtaW5hbmNlIGRpc3RpbmN0aW9uIGZhY3Rvci5cclxuICAgKi9cbiAgZnVuY3Rpb24gVG9uZU1hcHBpbmdQYXNzKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRvbmVNYXBwaW5nUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihUb25lTWFwcGluZ1Bhc3MpLmNhbGwodGhpcywgXCJUb25lTWFwcGluZ1Bhc3NcIikpO1xuICAgIC8qKlxyXG4gICAgICogVGhlIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IGx1bWlub3NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqIEB0b2RvIFVzZSBSRUQgZm9ybWF0IGluIFdlYkdMIDIuMC5cclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eSA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XG4gICAgICBtaW5GaWx0ZXI6IExpbmVhck1pcE1hcExpbmVhckZpbHRlcixcbiAgICAgIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgZm9ybWF0OiBSR0JGb3JtYXQsXG4gICAgICBzdGVuY2lsQnVmZmVyOiBmYWxzZSxcbiAgICAgIGRlcHRoQnVmZmVyOiBmYWxzZVxuICAgIH0pO1xuICAgIF90aGlzLnJlbmRlclRhcmdldEx1bWlub3NpdHkudGV4dHVyZS5uYW1lID0gXCJUb25lTWFwcGluZy5MdW1pbm9zaXR5XCI7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmVuZGVyIHRhcmdldCBmb3IgYWRhcHRlZCBsdW1pbm9zaXR5LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQgPSBfdGhpcy5yZW5kZXJUYXJnZXRMdW1pbm9zaXR5LmNsb25lKCk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZC50ZXh0dXJlLm5hbWUgPSBcIlRvbmVNYXBwaW5nLkFkYXB0ZWRMdW1pbm9zaXR5XCI7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuICAgIF90aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQudGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XG4gICAgLyoqXHJcbiAgICAgKiBBIHJlbmRlciB0YXJnZXQgdGhhdCBob2xkcyBhIGNvcHkgb2YgdGhlIGFkYXB0ZWQgbGltb25vc2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRQcmV2aW91cyA9IF90aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQuY2xvbmUoKTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRQcmV2aW91cy50ZXh0dXJlLm5hbWUgPSBcIlRvbmVNYXBwaW5nLlByZXZpb3VzTHVtaW5vc2l0eVwiO1xuICAgIC8qKlxyXG4gICAgICogQ29weSBzaGFkZXIgbWF0ZXJpYWwgdXNlZCBmb3Igc2F2aW5nIHRoZSBsdW1pbmFuY2UgbWFwLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtDb3B5TWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jb3B5TWF0ZXJpYWwgPSBuZXcgQ29weU1hdGVyaWFsKCk7XG4gICAgLyoqXHJcbiAgICAgKiBBIGx1bWlub3NpdHkgc2hhZGVyIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtMdW1pbm9zaXR5TWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwgPSBuZXcgTHVtaW5vc2l0eU1hdGVyaWFsKCk7XG4gICAgX3RoaXMubHVtaW5vc2l0eU1hdGVyaWFsLnVuaWZvcm1zLmRpc3RpbmN0aW9uLnZhbHVlID0gb3B0aW9ucy5kaXN0aW5jdGlvbiAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kaXN0aW5jdGlvbiA6IDEuMDtcbiAgICAvKipcclxuICAgICAqIEFuIGFkYXB0aXZlIGx1bWluYW5jZSBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0FkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwgPSBuZXcgQWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwoKTtcbiAgICBfdGhpcy5yZXNvbHV0aW9uID0gb3B0aW9ucy5yZXNvbHV0aW9uO1xuICAgIC8qKlxyXG4gICAgICogQSB0b25lIG1hcHBpbmcgc2hhZGVyIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtUb25lTWFwcGluZ01hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMudG9uZU1hcHBpbmdNYXRlcmlhbCA9IG5ldyBUb25lTWFwcGluZ01hdGVyaWFsKCk7XG4gICAgX3RoaXMuYWRhcHRpdmUgPSBvcHRpb25zLmFkYXB0aXZlO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgcmVuZGVyIHRhcmdldHMuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoVG9uZU1hcHBpbmdQYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcblxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdmFyIHNjZW5lID0gdGhpcy5zY2VuZTtcbiAgICAgIHZhciBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcbiAgICAgIHZhciBhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCA9IHRoaXMuYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWw7XG4gICAgICB2YXIgbHVtaW5vc2l0eU1hdGVyaWFsID0gdGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWw7XG4gICAgICB2YXIgdG9uZU1hcHBpbmdNYXRlcmlhbCA9IHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbDtcbiAgICAgIHZhciBjb3B5TWF0ZXJpYWwgPSB0aGlzLmNvcHlNYXRlcmlhbDtcbiAgICAgIHZhciByZW5kZXJUYXJnZXRQcmV2aW91cyA9IHRoaXMucmVuZGVyVGFyZ2V0UHJldmlvdXM7XG4gICAgICB2YXIgcmVuZGVyVGFyZ2V0THVtaW5vc2l0eSA9IHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eTtcbiAgICAgIHZhciByZW5kZXJUYXJnZXRBZGFwdGVkID0gdGhpcy5yZW5kZXJUYXJnZXRBZGFwdGVkO1xuXG4gICAgICBpZiAodGhpcy5hZGFwdGl2ZSkge1xuICAgICAgICAvLyBSZW5kZXIgdGhlIGx1bWluYW5jZSBvZiB0aGUgY3VycmVudCBzY2VuZSBpbnRvIGEgcmVuZGVyIHRhcmdldCB3aXRoIG1pcG1hcHBpbmcgZW5hYmxlZC5cbiAgICAgICAgdGhpcy5tYXRlcmlhbCA9IGx1bWlub3NpdHlNYXRlcmlhbDtcbiAgICAgICAgbHVtaW5vc2l0eU1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldEx1bWlub3NpdHkpOyAvLyBVc2UgdGhlIG5ldyBsdW1pbmFuY2UgdmFsdWVzLCB0aGUgcHJldmlvdXMgbHVtaW5hbmNlIGFuZCB0aGUgZnJhbWUgZGVsdGEgdG8gYWRhcHQgdGhlIGx1bWluYW5jZSBvdmVyIHRpbWUuXG5cbiAgICAgICAgdGhpcy5tYXRlcmlhbCA9IGFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsO1xuICAgICAgICBhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy5kZWx0YS52YWx1ZSA9IGRlbHRhO1xuICAgICAgICBhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy50UHJldmlvdXNMdW0udmFsdWUgPSByZW5kZXJUYXJnZXRQcmV2aW91cy50ZXh0dXJlO1xuICAgICAgICBhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy50Q3VycmVudEx1bS52YWx1ZSA9IHJlbmRlclRhcmdldEx1bWlub3NpdHkudGV4dHVyZTtcbiAgICAgICAgcmVuZGVyZXIucmVuZGVyKHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldEFkYXB0ZWQpOyAvLyBDb3B5IHRoZSBuZXcgYWRhcHRlZCBsdW1pbmFuY2UgdmFsdWUgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieSB0aGUgbmV4dCBmcmFtZS5cblxuICAgICAgICB0aGlzLm1hdGVyaWFsID0gY29weU1hdGVyaWFsO1xuICAgICAgICBjb3B5TWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSByZW5kZXJUYXJnZXRBZGFwdGVkLnRleHR1cmU7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXRQcmV2aW91cyk7XG4gICAgICB9IC8vIEFwcGx5IHRoZSB0b25lIG1hcHBpbmcgdG8gdGhlIGNvbG91cnMuXG5cblxuICAgICAgdGhpcy5tYXRlcmlhbCA9IHRvbmVNYXBwaW5nTWF0ZXJpYWw7XG4gICAgICB0b25lTWFwcGluZ01hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImluaXRpYWxpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpIHtcbiAgICAgIHRoaXMubWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICAgICAgICBjb2xvcjogMHg3ZmZmZmZcbiAgICAgIH0pO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRhcmdldFByZXZpb3VzKTtcbiAgICAgIHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNvbHV0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJUYXJnZXRMdW1pbm9zaXR5LndpZHRoO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSByZXNvbHV0aW9uIG9mIHRoZSByZW5kZXIgdGFyZ2V0cy4gTXVzdCBiZSBhIHBvd2VyIG9mIHR3byBmb3IgbWlwbWFwcy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAyNTY7XG4gICAgICAvLyBSb3VuZCB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIG5leHQgcG93ZXIgb2YgdHdvLlxuICAgICAgdmFyIGV4cG9uZW50ID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKE1hdGgubG9nMih2YWx1ZSkpKTtcbiAgICAgIHZhbHVlID0gTWF0aC5wb3coMiwgZXhwb25lbnQpO1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXRMdW1pbm9zaXR5LnNldFNpemUodmFsdWUsIHZhbHVlKTtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0UHJldmlvdXMuc2V0U2l6ZSh2YWx1ZSwgdmFsdWUpO1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXRBZGFwdGVkLnNldFNpemUodmFsdWUsIHZhbHVlKTtcbiAgICAgIHRoaXMuYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwuZGVmaW5lcy5NSVBfTEVWRUxfMVgxID0gZXhwb25lbnQudG9GaXhlZCgxKTtcbiAgICAgIHRoaXMuYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdGhpcyBwYXNzIHVzZXMgYWRhcHRpdmUgbHVtaW5vc2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqIEBkZWZhdWx0IHRydWVcclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRhcHRpdmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwuZGVmaW5lcy5BREFQVEVEX0xVTUlOQU5DRSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdGhpcyBwYXNzIHNob3VsZCB1c2UgYWRhcHRpdmUgbHVtaW5vc2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcblxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC5kZWZpbmVzLkFEQVBURURfTFVNSU5BTkNFID0gXCIxXCI7XG4gICAgICAgIHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC51bmlmb3Jtcy5sdW1pbmFuY2VNYXAudmFsdWUgPSB0aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQudGV4dHVyZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwuZGVmaW5lcy5BREFQVEVEX0xVTUlOQU5DRTtcbiAgICAgICAgdGhpcy50b25lTWFwcGluZ01hdGVyaWFsLnVuaWZvcm1zLmx1bWluYW5jZU1hcC52YWx1ZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgZGl0aGVyaW5nIGlzIGVuYWJsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRpdGhlcmluZ1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC5kaXRoZXJpbmc7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSWYgZW5hYmxlZCwgdGhlIHJlc3VsdCB3aWxsIGJlIGRpdGhlcmVkIHRvIHJlbW92ZSBiYW5kaW5nIGFydGlmYWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMuZGl0aGVyaW5nICE9PSB2YWx1ZSkge1xuICAgICAgICB0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwuZGl0aGVyaW5nID0gdmFsdWU7XG4gICAgICAgIHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoVG9uZU1hcHBpbmdQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIFRvbmVNYXBwaW5nUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBBIGNvbXBpbGF0aW9uIG9mIHRoZSBwb3N0IHByb2Nlc3NpbmcgcGFzc2VzLlxyXG4gKlxyXG4gKiBAbW9kdWxlIHBvc3Rwcm9jZXNzaW5nL3Bhc3Nlc1xyXG4gKi9cblxuLyoqXHJcbiAqIFRoZSBFZmZlY3RDb21wb3NlciBtYXkgYmUgdXNlZCBpbiBwbGFjZSBvZiBhIG5vcm1hbCBXZWJHTFJlbmRlcmVyLlxyXG4gKlxyXG4gKiBUaGUgYXV0byBjbGVhciBiZWhhdmlvdXIgb2YgdGhlIHByb3ZpZGVkIHJlbmRlcmVyIHdpbGwgYmUgZGlzYWJsZWQgdG8gcHJldmVudFxyXG4gKiB1bm5lY2Vzc2FyeSBjbGVhciBvcGVyYXRpb25zLlxyXG4gKlxyXG4gKiBJdCBpcyBjb21tb24gcHJhY3RpY2UgdG8gdXNlIGEge0BsaW5rIFJlbmRlclBhc3N9IGFzIHRoZSBmaXJzdCBwYXNzIHRvXHJcbiAqIGF1dG9tYXRpY2FsbHkgY2xlYXIgdGhlIHNjcmVlbiBhbmQgcmVuZGVyIHRoZSBzY2VuZSB0byBhIHRleHR1cmUgZm9yIGZ1cnRoZXJcclxuICogcHJvY2Vzc2luZy5cclxuICpcclxuICogQGltcGxlbWVudHMge1Jlc2l6YWJsZX1cclxuICogQGltcGxlbWVudHMge0Rpc3Bvc2FibGV9XHJcbiAqL1xuXG52YXIgRWZmZWN0Q29tcG9zZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGVmZmVjdCBjb21wb3Nlci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gW3JlbmRlcmVyXSAtIFRoZSByZW5kZXJlciB0aGF0IHNob3VsZCBiZSB1c2VkLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRlcHRoQnVmZmVyPXRydWVdIC0gV2hldGhlciB0aGUgbWFpbiByZW5kZXIgdGFyZ2V0cyBzaG91bGQgaGF2ZSBhIGRlcHRoIGJ1ZmZlci5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnN0ZW5jaWxCdWZmZXI9ZmFsc2VdIC0gV2hldGhlciB0aGUgbWFpbiByZW5kZXIgdGFyZ2V0cyBzaG91bGQgaGF2ZSBhIHN0ZW5jaWwgYnVmZmVyLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZGVwdGhUZXh0dXJlPWZhbHNlXSAtIFNldCB0byB0cnVlIGlmIG9uZSBvZiB5b3VyIHBhc3NlcyByZWxpZXMgb24gYSBkZXB0aCB0ZXh0dXJlLlxyXG4gICAqL1xuICBmdW5jdGlvbiBFZmZlY3RDb21wb3NlcigpIHtcbiAgICB2YXIgcmVuZGVyZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRWZmZWN0Q29tcG9zZXIpO1xuXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKlxyXG4gICAgICogWW91IG1heSByZXBsYWNlIHRoZSByZW5kZXJlciBhdCBhbnkgdGltZSBieSB1c2luZ1xyXG4gICAgICoge0BsaW5rIEVmZmVjdENvbXBvc2VyI3JlcGxhY2VSZW5kZXJlcn0uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyZXJ9XHJcbiAgICAgKi9cbiAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5wdXQgYnVmZmVyLlxyXG4gICAgICpcclxuICAgICAqIFJlYWRpbmcgZnJvbSBhbmQgd3JpdGluZyB0byB0aGUgc2FtZSByZW5kZXIgdGFyZ2V0IHNob3VsZCBiZSBhdm9pZGVkLlxyXG4gICAgICogVGhlcmVmb3JlLCB0d28gc2VwZXJhdGUgeWV0IGlkZW50aWNhbCBidWZmZXJzIGFyZSB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMuaW5wdXRCdWZmZXIgPSBudWxsO1xuICAgIC8qKlxyXG4gICAgICogVGhlIG91dHB1dCBidWZmZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5vdXRwdXRCdWZmZXIgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMucmVuZGVyZXIgIT09IG51bGwpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYXV0b0NsZWFyID0gZmFsc2U7XG4gICAgICB0aGlzLmlucHV0QnVmZmVyID0gdGhpcy5jcmVhdGVCdWZmZXIob3B0aW9ucy5kZXB0aEJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXB0aEJ1ZmZlciA6IHRydWUsIG9wdGlvbnMuc3RlbmNpbEJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zdGVuY2lsQnVmZmVyIDogZmFsc2UsIG9wdGlvbnMuZGVwdGhUZXh0dXJlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlcHRoVGV4dHVyZSA6IGZhbHNlKTtcbiAgICAgIHRoaXMub3V0cHV0QnVmZmVyID0gdGhpcy5pbnB1dEJ1ZmZlci5jbG9uZSgpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEEgY29weSBwYXNzIHVzZWQgZm9yIGNvcHlpbmcgbWFza2VkIHNjZW5lcy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7U2hhZGVyUGFzc31cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuXG4gICAgdGhpcy5jb3B5UGFzcyA9IG5ldyBTaGFkZXJQYXNzKG5ldyBDb3B5TWF0ZXJpYWwoKSk7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcGFzc2VzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtQYXNzW119XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLnBhc3NlcyA9IFtdO1xuICB9XG4gIC8qKlxyXG4gICAqIFRoZSBkZXB0aCB0ZXh0dXJlIG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7RGVwdGhUZXh0dXJlfVxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoRWZmZWN0Q29tcG9zZXIsIFt7XG4gICAga2V5OiBcInJlcGxhY2VSZW5kZXJlclwiLFxuXG4gICAgLyoqXHJcbiAgICAgKiBSZXBsYWNlcyB0aGUgY3VycmVudCByZW5kZXJlciB3aXRoIHRoZSBnaXZlbiBvbmUuIFRoZSBET00gZWxlbWVudCBvZiB0aGVcclxuICAgICAqIGN1cnJlbnQgcmVuZGVyZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50IG5vZGUgYW5kIHRoZVxyXG4gICAgICogRE9NIGVsZW1lbnQgb2YgdGhlIG5ldyByZW5kZXJlciB3aWxsIHRha2UgaXRzIHBsYWNlLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBhdXRvIGNsZWFyIG1lY2hhbmlzbSBvZiB0aGUgcHJvdmlkZWQgcmVuZGVyZXIgd2lsbCBiZSBkaXNhYmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBTd2l0Y2hpbmcgYmV0d2VlbiByZW5kZXJlcnMgYWxsb3dzIHlvdSB0byBkeW5hbWljYWxseSBlbmFibGUgb3IgZGlzYWJsZVxyXG4gICAgICogYW50aWFsaWFzaW5nLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgbmV3IHJlbmRlcmVyLlxyXG4gICAgICogQHJldHVybiB7V2ViR0xSZW5kZXJlcn0gVGhlIG9sZCByZW5kZXJlci5cclxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiByZXBsYWNlUmVuZGVyZXIocmVuZGVyZXIpIHtcbiAgICAgIHZhciBvbGRSZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XG4gICAgICB2YXIgcGFyZW50LCBvbGRTaXplLCBuZXdTaXplO1xuXG4gICAgICBpZiAob2xkUmVuZGVyZXIgIT09IG51bGwgJiYgb2xkUmVuZGVyZXIgIT09IHJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hdXRvQ2xlYXIgPSBmYWxzZTtcbiAgICAgICAgcGFyZW50ID0gb2xkUmVuZGVyZXIuZG9tRWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICBvbGRTaXplID0gb2xkUmVuZGVyZXIuZ2V0U2l6ZSgpO1xuICAgICAgICBuZXdTaXplID0gcmVuZGVyZXIuZ2V0U2l6ZSgpO1xuXG4gICAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQob2xkUmVuZGVyZXIuZG9tRWxlbWVudCk7XG4gICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKHJlbmRlcmVyLmRvbUVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9sZFNpemUud2lkdGggIT09IG5ld1NpemUud2lkdGggfHwgb2xkU2l6ZS5oZWlnaHQgIT09IG5ld1NpemUuaGVpZ2h0KSB7XG4gICAgICAgICAgdGhpcy5zZXRTaXplKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9sZFJlbmRlcmVyO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgcmVuZGVyIHRhcmdldCBieSByZXBsaWNhdGluZyB0aGUgcmVuZGVyZXIncyBjYW52YXMuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIGNyZWF0ZWQgcmVuZGVyIHRhcmdldCB1c2VzIGEgbGluZWFyIGZpbHRlciBmb3IgdGV4ZWwgbWluaWZpY2F0aW9uIGFuZFxyXG4gICAgICogbWFnbmlmaWNhdGlvbi4gSXRzIHJlbmRlciB0ZXh0dXJlIGZvcm1hdCBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIHJlbmRlcmVyXHJcbiAgICAgKiB1c2VzIHRoZSBhbHBoYSBjaGFubmVsLiBNaXBtYXBzIGFyZSBkaXNhYmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRlcHRoQnVmZmVyIC0gV2hldGhlciB0aGUgcmVuZGVyIHRhcmdldCBzaG91bGQgaGF2ZSBhIGRlcHRoIGJ1ZmZlci5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gc3RlbmNpbEJ1ZmZlciAtIFdoZXRoZXIgdGhlIHJlbmRlciB0YXJnZXQgc2hvdWxkIGhhdmUgYSBzdGVuY2lsIGJ1ZmZlci5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVwdGhUZXh0dXJlIC0gV2hldGhlciB0aGUgcmVuZGVyIHRhcmdldCBzaG91bGQgaGF2ZSBhIGRlcHRoIHRleHR1cmUuXHJcbiAgICAgKiBAcmV0dXJuIHtXZWJHTFJlbmRlclRhcmdldH0gQSBuZXcgcmVuZGVyIHRhcmdldCB0aGF0IGVxdWFscyB0aGUgcmVuZGVyZXIncyBjYW52YXMuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZUJ1ZmZlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVCdWZmZXIoZGVwdGhCdWZmZXIsIHN0ZW5jaWxCdWZmZXIsIGRlcHRoVGV4dHVyZSkge1xuICAgICAgdmFyIGRyYXdpbmdCdWZmZXJTaXplID0gdGhpcy5yZW5kZXJlci5nZXREcmF3aW5nQnVmZmVyU2l6ZSgpO1xuICAgICAgdmFyIGFscGhhID0gdGhpcy5yZW5kZXJlci5jb250ZXh0LmdldENvbnRleHRBdHRyaWJ1dGVzKCkuYWxwaGE7XG4gICAgICB2YXIgcmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KGRyYXdpbmdCdWZmZXJTaXplLndpZHRoLCBkcmF3aW5nQnVmZmVyU2l6ZS5oZWlnaHQsIHtcbiAgICAgICAgbWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICAgIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgICBmb3JtYXQ6IGFscGhhID8gUkdCQUZvcm1hdCA6IFJHQkZvcm1hdCxcbiAgICAgICAgZGVwdGhCdWZmZXI6IGRlcHRoQnVmZmVyLFxuICAgICAgICBzdGVuY2lsQnVmZmVyOiBzdGVuY2lsQnVmZmVyLFxuICAgICAgICBkZXB0aFRleHR1cmU6IGRlcHRoVGV4dHVyZSA/IG5ldyBEZXB0aFRleHR1cmUoKSA6IG51bGxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGVwdGhUZXh0dXJlICYmIHN0ZW5jaWxCdWZmZXIpIHtcbiAgICAgICAgcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5mb3JtYXQgPSBEZXB0aFN0ZW5jaWxGb3JtYXQ7XG4gICAgICAgIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUudHlwZSA9IFVuc2lnbmVkSW50MjQ4VHlwZTtcbiAgICAgIH1cblxuICAgICAgcmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9IFwiRWZmZWN0Q29tcG9zZXIuQnVmZmVyXCI7XG4gICAgICByZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICAgIHJldHVybiByZW5kZXJUYXJnZXQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIHBhc3MsIG9wdGlvbmFsbHkgYXQgYSBzcGVjaWZpYyBpbmRleC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1Bhc3N9IHBhc3MgLSBBIG5ldyBwYXNzLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtpbmRleF0gLSBBbiBpbmRleCBhdCB3aGljaCB0aGUgcGFzcyBzaG91bGQgYmUgaW5zZXJ0ZWQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFkZFBhc3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkUGFzcyhwYXNzLCBpbmRleCkge1xuICAgICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcbiAgICAgIHZhciBkcmF3aW5nQnVmZmVyU2l6ZSA9IHJlbmRlcmVyLmdldERyYXdpbmdCdWZmZXJTaXplKCk7XG4gICAgICBwYXNzLnNldFNpemUoZHJhd2luZ0J1ZmZlclNpemUud2lkdGgsIGRyYXdpbmdCdWZmZXJTaXplLmhlaWdodCk7XG4gICAgICBwYXNzLmluaXRpYWxpemUocmVuZGVyZXIsIHJlbmRlcmVyLmNvbnRleHQuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKS5hbHBoYSk7XG5cbiAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucGFzc2VzLnNwbGljZShpbmRleCwgMCwgcGFzcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBhc3Nlcy5wdXNoKHBhc3MpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgYSBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7UGFzc30gcGFzcyAtIFRoZSBwYXNzLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW1vdmVQYXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbW92ZVBhc3MocGFzcykge1xuICAgICAgdGhpcy5wYXNzZXMuc3BsaWNlKHRoaXMucGFzc2VzLmluZGV4T2YocGFzcyksIDEpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJlbmRlcnMgYWxsIGVuYWJsZWQgcGFzc2VzIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgYWRkZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoZGVsdGEpIHtcbiAgICAgIHZhciBwYXNzZXMgPSB0aGlzLnBhc3NlcztcbiAgICAgIHZhciBjb3B5UGFzcyA9IHRoaXMuY29weVBhc3M7XG4gICAgICB2YXIgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xuICAgICAgdmFyIGlucHV0QnVmZmVyID0gdGhpcy5pbnB1dEJ1ZmZlcjtcbiAgICAgIHZhciBvdXRwdXRCdWZmZXIgPSB0aGlzLm91dHB1dEJ1ZmZlcjtcbiAgICAgIHZhciBzdGVuY2lsVGVzdCA9IGZhbHNlO1xuICAgICAgdmFyIHBhc3MsIGNvbnRleHQsIHN0YXRlLCBidWZmZXI7XG4gICAgICB2YXIgaSwgbDtcblxuICAgICAgZm9yIChpID0gMCwgbCA9IHBhc3Nlcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgcGFzcyA9IHBhc3Nlc1tpXTtcblxuICAgICAgICBpZiAocGFzcy5lbmFibGVkKSB7XG4gICAgICAgICAgcGFzcy5yZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCk7XG5cbiAgICAgICAgICBpZiAocGFzcy5uZWVkc1N3YXApIHtcbiAgICAgICAgICAgIGlmIChzdGVuY2lsVGVzdCkge1xuICAgICAgICAgICAgICBjb3B5UGFzcy5yZW5kZXJUb1NjcmVlbiA9IHBhc3MucmVuZGVyVG9TY3JlZW47XG4gICAgICAgICAgICAgIGNvbnRleHQgPSByZW5kZXJlci5jb250ZXh0O1xuICAgICAgICAgICAgICBzdGF0ZSA9IHJlbmRlcmVyLnN0YXRlOyAvLyBQcmVzZXJ2ZSB0aGUgdW5hZmZlY3RlZCBwaXhlbHMuXG5cbiAgICAgICAgICAgICAgc3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldEZ1bmMoY29udGV4dC5OT1RFUVVBTCwgMSwgMHhmZmZmZmZmZik7XG4gICAgICAgICAgICAgIGNvcHlQYXNzLnJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KTtcbiAgICAgICAgICAgICAgc3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldEZ1bmMoY29udGV4dC5FUVVBTCwgMSwgMHhmZmZmZmZmZik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJ1ZmZlciA9IGlucHV0QnVmZmVyO1xuICAgICAgICAgICAgaW5wdXRCdWZmZXIgPSBvdXRwdXRCdWZmZXI7XG4gICAgICAgICAgICBvdXRwdXRCdWZmZXIgPSBidWZmZXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHBhc3MgaW5zdGFuY2VvZiBNYXNrUGFzcykge1xuICAgICAgICAgICAgc3RlbmNpbFRlc3QgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGFzcyBpbnN0YW5jZW9mIENsZWFyTWFza1Bhc3MpIHtcbiAgICAgICAgICAgIHN0ZW5jaWxUZXN0ID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVycyBhbmQgdGhlIHJlbmRlcmVyJ3Mgb3V0cHV0IGNhbnZhcy5cclxuICAgICAqXHJcbiAgICAgKiBFdmVyeSBwYXNzIHdpbGwgYmUgaW5mb3JtZWQgb2YgdGhlIG5ldyBzaXplLiBJdCdzIHVwIHRvIGVhY2ggcGFzcyBob3cgdGhhdFxyXG4gICAgICogaW5mb3JtYXRpb24gaXMgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyB3aWR0aCBvciBoZWlnaHQgaXMgc3BlY2lmaWVkLCB0aGUgcmVuZGVyIHRhcmdldHMgYW5kIHBhc3NlcyB3aWxsIGJlXHJcbiAgICAgKiB1cGRhdGVkIHdpdGggdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgcmVuZGVyZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFt3aWR0aF0gLSBUaGUgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2hlaWdodF0gLSBUaGUgaGVpZ2h0LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgICAgdmFyIHBhc3NlcyA9IHRoaXMucGFzc2VzO1xuICAgICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcbiAgICAgIHZhciBzaXplLCBkcmF3aW5nQnVmZmVyU2l6ZTtcbiAgICAgIHZhciBpLCBsO1xuXG4gICAgICBpZiAod2lkdGggPT09IHVuZGVmaW5lZCB8fCBoZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzaXplID0gcmVuZGVyZXIuZ2V0U2l6ZSgpO1xuICAgICAgICB3aWR0aCA9IHNpemUud2lkdGg7XG4gICAgICAgIGhlaWdodCA9IHNpemUuaGVpZ2h0O1xuICAgICAgfSAvLyBVcGRhdGUgdGhlIGxvZ2ljYWwgcmVuZGVyIHNpemUuXG5cblxuICAgICAgcmVuZGVyZXIuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsgLy8gVGhlIGRyYXdpbmcgYnVmZmVyIHNpemUgdGFrZXMgdGhlIGRldmljZSBwaXhlbCByYXRpbyBpbnRvIGFjY291bnQuXG5cbiAgICAgIGRyYXdpbmdCdWZmZXJTaXplID0gcmVuZGVyZXIuZ2V0RHJhd2luZ0J1ZmZlclNpemUoKTtcbiAgICAgIHRoaXMuaW5wdXRCdWZmZXIuc2V0U2l6ZShkcmF3aW5nQnVmZmVyU2l6ZS53aWR0aCwgZHJhd2luZ0J1ZmZlclNpemUuaGVpZ2h0KTtcbiAgICAgIHRoaXMub3V0cHV0QnVmZmVyLnNldFNpemUoZHJhd2luZ0J1ZmZlclNpemUud2lkdGgsIGRyYXdpbmdCdWZmZXJTaXplLmhlaWdodCk7XG5cbiAgICAgIGZvciAoaSA9IDAsIGwgPSBwYXNzZXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIHBhc3Nlc1tpXS5zZXRTaXplKGRyYXdpbmdCdWZmZXJTaXplLndpZHRoLCBkcmF3aW5nQnVmZmVyU2l6ZS5oZWlnaHQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIFJlc2V0cyB0aGlzIGNvbXBvc2VyIGJ5IGRlbGV0aW5nIGFsbCBwYXNzZXMgYW5kIGNyZWF0aW5nIG5ldyBidWZmZXJzLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZXNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgIHZhciByZW5kZXJUYXJnZXQgPSB0aGlzLmNyZWF0ZUJ1ZmZlcih0aGlzLmlucHV0QnVmZmVyLmRlcHRoQnVmZmVyLCB0aGlzLmlucHV0QnVmZmVyLnN0ZW5jaWxCdWZmZXIsIHRoaXMuaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlICE9PSBudWxsKTtcbiAgICAgIHRoaXMuZGlzcG9zZSgpOyAvLyBSZWFuaW1hdGUuXG5cbiAgICAgIHRoaXMuaW5wdXRCdWZmZXIgPSByZW5kZXJUYXJnZXQ7XG4gICAgICB0aGlzLm91dHB1dEJ1ZmZlciA9IHJlbmRlclRhcmdldC5jbG9uZSgpO1xuICAgICAgdGhpcy5jb3B5UGFzcyA9IG5ldyBTaGFkZXJQYXNzKG5ldyBDb3B5TWF0ZXJpYWwoKSk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhpcyBjb21wb3NlciBhbmQgYWxsIHBhc3Nlcy5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBkZWFsbG9jYXRlcyBhbGwgZGlzcG9zYWJsZSBvYmplY3RzIGNyZWF0ZWQgYnkgdGhlIHBhc3Nlcy4gSXRcclxuICAgICAqIGFsc28gZGVsZXRlcyB0aGUgbWFpbiBmcmFtZSBidWZmZXJzIG9mIHRoaXMgY29tcG9zZXIuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRpc3Bvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgIHZhciBwYXNzZXMgPSB0aGlzLnBhc3NlcztcbiAgICAgIHZhciBpLCBsO1xuXG4gICAgICBmb3IgKGkgPSAwLCBsID0gcGFzc2VzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICBwYXNzZXNbaV0uZGlzcG9zZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBhc3NlcyA9IFtdO1xuXG4gICAgICBpZiAodGhpcy5pbnB1dEJ1ZmZlciAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmlucHV0QnVmZmVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5pbnB1dEJ1ZmZlciA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm91dHB1dEJ1ZmZlciAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm91dHB1dEJ1ZmZlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMub3V0cHV0QnVmZmVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb3B5UGFzcy5kaXNwb3NlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImRlcHRoVGV4dHVyZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgc2hhcmUgYSBzaW5nbGUgZGVwdGggdGV4dHVyZS4gRGVwdGggd2lsbCBiZVxyXG4gICAgICogd3JpdHRlbiB0byB0aGlzIHRleHR1cmUgd2hlbiBzb21ldGhpbmcgaXMgcmVuZGVyZWQgaW50byBvbmUgb2YgdGhlIGJ1ZmZlcnNcclxuICAgICAqIGFuZCB0aGUgaW52b2x2ZWQgbWF0ZXJpYWxzIGhhdmUgZGVwdGggd3JpdGUgZW5hYmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgbWF5IGVuYWJsZSB0aGlzIG1lY2hhbmlzbSBkdXJpbmcgdGhlIGluc3RhbnRpYXRpb24gb2YgdGhlIGNvbXBvc2VyIG9yXHJcbiAgICAgKiBieSBhc3NpZ25pbmcgYSBEZXB0aFRleHR1cmUgaW5zdGFuY2UgbGF0ZXIgb24uIFlvdSBtYXkgYWxzbyBkaXNhYmxlIGl0IGJ5XHJcbiAgICAgKiBhc3NpZ25pbmcgbnVsbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7RGVwdGhUZXh0dXJlfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHgpIHtcbiAgICAgIHRoaXMuaW5wdXRCdWZmZXIuZGVwdGhUZXh0dXJlID0geDtcbiAgICAgIHRoaXMub3V0cHV0QnVmZmVyLmRlcHRoVGV4dHVyZSA9IHg7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEVmZmVjdENvbXBvc2VyO1xufSgpO1xuXG52YXIgcG9seWZpbGwgPSBmdW5jdGlvbiBwb2x5ZmlsbChvYmplY3QsIG1ldGhvZCkge1xuICB2YXIgc2hvd1dhcm4gPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHRydWU7XG4gIGlmIChvYmplY3RbbWV0aG9kXSkgcmV0dXJuO1xuICBpZiAoc2hvd1dhcm4pIGNvbnNvbGUud2FybihcIkBQb3N0UHJvY2Vzc29yTW9kdWxlOiBwYXNzLlwiLmNvbmNhdChtZXRob2QsIFwiKCkgd2FzIG5vdCBmb3VuZC5cIiksIG9iamVjdCk7XG5cbiAgb2JqZWN0W21ldGhvZF0gPSBmdW5jdGlvbiAoKSB7fTtcbn07XG4vKipcbiAqIEBjbGFzcyBQb3N0UHJvY2Vzc29yTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9hcHBcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXVxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICogQGV4YW1wbGUgPGNhcHRpb24+IENyZWF0aW5nIGEgcmVuZGVyaW5nIG1vZHVsZSBhbmQgcGFzc2luZyBpdCB0byBBcHAncyBtb2R1bGVzPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIG5ldyBFbGVtZW50TW9kdWxlKCksXG4gKiAgIG5ldyBTY2VuZU1vZHVsZSgpLFxuICogICBuZXcgRGVmaW5lTW9kdWxlKCdjYW1lcmEnLCBuZXcgV0hTLlBlcnNwZWN0aXZlQ2FtZXJhKHtcbiAqICAgICBwb3NpdGlvbjogbmV3IFRIUkVFLlZlY3RvcjMoMCwgNiwgMTgpLFxuICogICAgIGZhcjogMTAwMDBcbiAqICAgfSkpLFxuICogICBuZXcgUmVuZGVyaW5nTW9kdWxlKCksXG4gKiAgIG5ldyBQb3N0UHJvY2Vzc29yTW9kdWxlKClcbiAqIF0pO1xuICpcbiAqIGNvbnN0IHByb2Nlc3NvciA9IGFwcC51c2UoJ3Bvc3Rwcm9jZXNzb3InKTtcbiAqXG4gKiBwcm9jZXNzb3JcbiAqICAgLnJlbmRlcigpXG4gKiAgIC5wYXNzKG5ldyBHbGl0Y2hQYXNzKCkpXG4gKiAgIC5yZW5kZXJUb1NjcmVlbigpXG4gKi9cblxuXG52YXIgUG9zdFByb2Nlc3Nvck1vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBvc3RQcm9jZXNzb3JNb2R1bGUoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFBvc3RQcm9jZXNzb3JNb2R1bGUuZGVmYXVsdHM7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQb3N0UHJvY2Vzc29yTW9kdWxlKTtcblxuICAgIGRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyh0aGlzLCBcImN1cnJlbnRQYXNzXCIsIG51bGwpLCBcImRlZmVyXCIsIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICBfdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLmRlYnVnID0gcGFyYW1zLmRlYnVnO1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoUG9zdFByb2Nlc3Nvck1vZHVsZSwgW3tcbiAgICBrZXk6IFwibWFuYWdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYW5hZ2VyKF9tYW5hZ2VyKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgX21hbmFnZXIuZGVmaW5lKCdwb3N0cHJvY2Vzc29yJyk7XG5cbiAgICAgIHRoaXMuZWZmZWN0cyA9IF9tYW5hZ2VyLnVzZSgncmVuZGVyaW5nJykuZWZmZWN0cztcbiAgICAgIHRoaXMucmVuZGVyZXIgPSBfbWFuYWdlci5nZXQoJ3JlbmRlcmVyJyk7XG4gICAgICB0aGlzLnNjZW5lID0gX21hbmFnZXIuZ2V0KCdzY2VuZScpO1xuICAgICAgdGhpcy5jYW1lcmEgPSBfbWFuYWdlci5nZXQoJ2NhbWVyYScpO1xuICAgICAgdGhpcy5jb21wb3NlciA9IG5ldyBFZmZlY3RDb21wb3Nlcih0aGlzLnJlbmRlcmVyLCB0aGlzLnBhcmFtcyk7XG5cbiAgICAgIF9tYW5hZ2VyLnVzZSgncmVuZGVyaW5nJykuc3RvcCgpO1xuXG4gICAgICB2YXIgY29tcG9zZXIgPSB0aGlzLmNvbXBvc2VyO1xuICAgICAgdGhpcy5yZW5kZXJMb29wID0gbmV3IExvb3AoZnVuY3Rpb24gKGNsb2NrKSB7XG4gICAgICAgIHJldHVybiBjb21wb3Nlci5yZW5kZXIoY2xvY2suZ2V0RGVsdGEoKSk7XG4gICAgICB9KS5zdGFydChfbWFuYWdlci5oYW5kbGVyKTtcblxuICAgICAgX21hbmFnZXIudXBkYXRlKHtcbiAgICAgICAgcmVuZGVyZXI6IGZ1bmN0aW9uIHJlbmRlcmVyKF9yZW5kZXJlcikge1xuICAgICAgICAgIF90aGlzMi5jb21wb3Nlci5yZXBsYWNlUmVuZGVyZXIoX3JlbmRlcmVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2NlbmU6IGZ1bmN0aW9uIHNjZW5lKF9zY2VuZSkge1xuICAgICAgICAgIF90aGlzMi5zY2VuZSA9IF9zY2VuZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2FtZXJhOiBmdW5jdGlvbiBjYW1lcmEoX2NhbWVyYSkge1xuICAgICAgICAgIF90aGlzMi5jYW1lcmEgPSBfY2FtZXJhO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5yZXNvbHZlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgcmVuZGVyXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZHMgUmVuZGVyUGFzc1xuICAgICAqIEByZXR1cm4ge3RoaXN9XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5Qb3N0UHJvY2Vzc29yTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuZGVmZXIudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwYXNzID0gbmV3IFJlbmRlclBhc3MoX3RoaXMzLnNjZW5lLCBfdGhpczMuY2FtZXJhLm5hdGl2ZSk7IC8vIFRPRE86IFN1cHBvcnQgZm9yIGVmZmVjdHMuXG5cbiAgICAgICAgX3RoaXMzLmNvbXBvc2VyLmFkZFBhc3MocGFzcyk7XG5cbiAgICAgICAgX3RoaXMzLmN1cnJlbnRQYXNzID0gcGFzcztcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgcGFzc1xuICAgICAqIEBkZXNjcmlwdGlvbiBBZGRzIHlvdXIgY3VzdG9tIHBhc3NcbiAgICAgKiBAcGFyYW0ge1Bhc3N9IHBhc3MgQSBjdXN0b20gcGFzc1xuICAgICAqIEByZXR1cm4ge3RoaXN9XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5Qb3N0UHJvY2Vzc29yTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJwYXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHBhc3MoX3Bhc3MpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICB0aGlzLmRlZmVyLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICBwb2x5ZmlsbChfcGFzcywgJ3NldFNpemUnLCBfdGhpczQuZGVidWcpO1xuICAgICAgICBwb2x5ZmlsbChfcGFzcywgJ2luaXRpYWxpc2UnLCBfdGhpczQuZGVidWcpO1xuXG4gICAgICAgIF90aGlzNC5jb21wb3Nlci5hZGRQYXNzKF9wYXNzKTtcblxuICAgICAgICBfdGhpczQuY3VycmVudFBhc3MgPSBfcGFzcztcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgc2hhZGVyXG4gICAgICogQGRlc2NyaXB0aW9uIEFkZHMgYSBwYXNzIG1hZGUgZnJvbSBzaGFkZXIgbWF0ZXJpYWxcbiAgICAgKiBAcGFyYW0ge01hdGVyaWFsfSBtYXRlcmlhbCBBIFNoYWRlck1hdGVyaWFsXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHR1cmVJRCBOYW1lIG9mIHRoZSByZWFkQnVmZmVyIHVuaWZvcm1cbiAgICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUG9zdFByb2Nlc3Nvck1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2hhZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNoYWRlcihtYXRlcmlhbCkge1xuICAgICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICAgIHZhciB0ZXh0dXJlSUQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6ICdyZWFkQnVmZmVyJztcbiAgICAgIHRoaXMuZGVmZXIudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghbWF0ZXJpYWwudW5pZm9ybXNbdGV4dHVyZUlEXSkgbWF0ZXJpYWwudW5pZm9ybXNbdGV4dHVyZUlEXSA9IHtcbiAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICB9O1xuICAgICAgICB2YXIgcGFzcyA9IG5ldyBTaGFkZXJQYXNzKG1hdGVyaWFsLCB0ZXh0dXJlSUQpO1xuXG4gICAgICAgIF90aGlzNS5jb21wb3Nlci5hZGRQYXNzKHBhc3MpO1xuXG4gICAgICAgIF90aGlzNS5jdXJyZW50UGFzcyA9IHBhc3M7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGdldFxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgcGFzcyBieSB0aGUgZ2l2ZW4gbmFtZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwYXNzXG4gICAgICogQHJldHVybiB7dGhpc31cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlBvc3RQcm9jZXNzb3JNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQobmFtZSkge1xuICAgICAgcmV0dXJuIG5hbWUgPyB0aGlzLmNvbXBvc2VyLnBhc3Nlcy5maWx0ZXIoZnVuY3Rpb24gKHBhc3MpIHtcbiAgICAgICAgcmV0dXJuIHBhc3MubmFtZSA9PT0gbmFtZTtcbiAgICAgIH0pWzBdIDogdGhpcy5jdXJyZW50UGFzcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCByZW5kZXJUb1NjcmVlblxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSByZW5kZXJUb1NjcmVlbiBwcm9wZXJ0eSBvZiBjdXJyZW50UGFzc1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZT10cnVlXSBUaGUgbmFtZSBvZiB0aGUgcGFzc1xuICAgICAqIEByZXR1cm4ge3RoaXN9XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5Qb3N0UHJvY2Vzc29yTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJUb1NjcmVlblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXJUb1NjcmVlbigpIHtcbiAgICAgIHZhciBfdGhpczYgPSB0aGlzO1xuXG4gICAgICB2YXIgYm9vbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdHJ1ZTtcbiAgICAgIHRoaXMuZGVmZXIudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzNi5jdXJyZW50UGFzcy5yZW5kZXJUb1NjcmVlbiA9IGJvb2w7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQb3N0UHJvY2Vzc29yTW9kdWxlO1xufSgpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKFBvc3RQcm9jZXNzb3JNb2R1bGUsIFwiZGVmYXVsdHNcIiwge1xuICBkZWJ1ZzogdHJ1ZVxufSk7XG5cbi8qKlxuICogQGNsYXNzIEV2ZW50c1BhdGNoTW9kdWxlXG4gKiBAZGVzY3JpcHRpb24gVGhpcyBvbmUgaXMgdXNlZCBpbiB0aGUgY29yZSB0byBoYW5kbGUgZXZlbnRzIHVzZWQgYnkgbW9kdWxlcy4gSWYgeW91IHdhbnQgdG8gbWFrZSBjdXN0b20gZXZlbnRzIC0gcGxlYXNlIG1ha2UgYSBzaW1pbGFyIG9uZS5cbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICovXG52YXIgRXZlbnRzUGF0Y2hNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFdmVudHNQYXRjaE1vZHVsZSgpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBFdmVudHNQYXRjaE1vZHVsZSk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhFdmVudHNQYXRjaE1vZHVsZSwgW3tcbiAgICBrZXk6IFwibWFuYWdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYW5hZ2VyKF9tYW5hZ2VyKSB7XG4gICAgICBfbWFuYWdlci5kZWZpbmUoJ2V2ZW50cycpO1xuXG4gICAgICB0aGlzLmVsZW1lbnQgPSBfbWFuYWdlci5nZXQoJ3JlbmRlcmVyJykuZG9tRWxlbWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGZ1bmN0aW9uIHBhdGNoRXZlbnRzXG4gICAgICogQGRlc2NyaXB0aW9uIFRoaXMgbWV0aG9kcyBwYXRjaGVzIHRoZSBsaXN0IG9mIGV2ZW50cyBvbiBzcGVjaWZpYyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9yaWdpbk9iamVjdCAtIFRoZSBvYmplY3QgdGhhdCBnaXZlcyBldmVudHMuXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZXN0T2JqZWN0PXRoaXNdIC0gVGhlIG9iamVjdCB0aGF0IHRha2VzIGV2ZW50cy5cbiAgICAgKiBAcGFyYW0ge0FycmF5W1N0cmluZ3NdfSBbZXZlbnRzPVtdXSAtIFRoZSBsaXN0IG9mIGV2ZW50cyBieSBuYW1lcy5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLkV2ZW50c1BhdGNoTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJwYXRjaEV2ZW50c1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXRjaEV2ZW50cyhvcmlnaW5PYmplY3QpIHtcbiAgICAgIHZhciBkZXN0T2JqZWN0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0aGlzO1xuICAgICAgdmFyIGV2ZW50cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogW107XG4gICAgICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIG9yaWdpbk9iamVjdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBkZXN0T2JqZWN0LmVtaXQoZXZlbnQsIGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnRlZ3JhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZWdyYXRlKHNlbGYpIHtcbiAgICAgIHZhciBlbGVtZW50ID0gc2VsZi5lbGVtZW50LFxuICAgICAgICAgIHBhdGNoRXZlbnRzID0gc2VsZi5wYXRjaEV2ZW50cztcbiAgICAgIHBhdGNoRXZlbnRzKGVsZW1lbnQsIHRoaXMsIFsnbW91c2Vtb3ZlJywgJ21vdXNldXAnLCAnY29udGV4dG1lbnUnLCAnbW91c2Vkb3duJywgJ2NsaWNrJywgJ3doZWVsJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnLCAndG91Y2htb3ZlJywgJ2tleWRvd24nLCAna2V5dXAnLCAna2V5cHJlc3MnXSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEV2ZW50c1BhdGNoTW9kdWxlO1xufSgpO1xuXG4vKipcbiAqIEBjbGFzcyBWaXJ0dWFsTW91c2VNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtCb29sZWFufSBbZ2xvYmFsTW92ZW1lbnQ9ZmFsc2VdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXh0ZW5kcyBFdmVudHNcbiAqL1xuXG52YXIgVmlydHVhbE1vdXNlTW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfRXZlbnRzKSB7XG4gIGZ1bmN0aW9uIFZpcnR1YWxNb3VzZU1vZHVsZSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgZ2xvYmFsTW92ZW1lbnQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGZhbHNlO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVmlydHVhbE1vdXNlTW9kdWxlKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFZpcnR1YWxNb3VzZU1vZHVsZSkuY2FsbCh0aGlzKSk7XG5cbiAgICBkZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoYXNzZXJ0VGhpc0luaXRpYWxpemVkKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLCBcIm1vdXNlXCIsIG5ldyBWZWN0b3IyKCkpLCBcInJheWNhc3RlclwiLCBuZXcgUmF5Y2FzdGVyKCkpLCBcIndvcmxkXCIsIG51bGwpLCBcImNhbnZhc1wiLCBudWxsKSwgXCJwcm9qZWN0aW9uUGxhbmVcIiwgbmV3IFBsYW5lKG5ldyBWZWN0b3IzKDAsIDAsIDEpLCAwKSk7XG5cbiAgICBfdGhpcy5nbG9iYWxNb3ZlbWVudCA9IGdsb2JhbE1vdmVtZW50O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKFZpcnR1YWxNb3VzZU1vZHVsZSwgW3tcbiAgICBrZXk6IFwidXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZShlLCBjdXN0b21YLCBjdXN0b21ZKSB7XG4gICAgICB2YXIgcmVjdCA9IHRoaXMuY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdmFyIHggPSBjdXN0b21YIHx8IGUuY2xpZW50WDtcbiAgICAgIHZhciB5ID0gY3VzdG9tWSB8fCBlLmNsaWVudFk7XG4gICAgICB0aGlzLm1vdXNlLnggPSAoeCAtIHJlY3QubGVmdCkgLyAocmVjdC5yaWdodCAtIHJlY3QubGVmdCkgKiAyIC0gMTtcbiAgICAgIHRoaXMubW91c2UueSA9IC0oKHkgLSByZWN0LnRvcCkgLyAocmVjdC5ib3R0b20gLSByZWN0LnRvcCkpICogMiArIDE7XG4gICAgICB0aGlzLnByb2plY3Rpb25QbGFuZS5ub3JtYWwuY29weSh0aGlzLmNhbWVyYS5nZXRXb3JsZERpcmVjdGlvbigpKTtcbiAgICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5tb3VzZSwgdGhpcy5jYW1lcmEpO1xuICAgICAgdGhpcy5lbWl0KCdtb3ZlJyk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgX21hbmFnZXIuZGVmaW5lKCdtb3VzZScpO1xuXG4gICAgICBfbWFuYWdlci5yZXF1aXJlKCdldmVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXZlbnRzUGF0Y2hNb2R1bGUoKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmNhbnZhcyA9IF9tYW5hZ2VyLmdldCgncmVuZGVyZXInKS5kb21FbGVtZW50O1xuICAgICAgdGhpcy5jYW1lcmEgPSBfbWFuYWdlci5nZXQoJ2NhbWVyYScpLm5hdGl2ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZWdyYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVncmF0ZShzZWxmKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgWydjbGljaycsICdtb3VzZWRvd24nLCAnbW91c2V1cCcsICdtb3VzZW1vdmUnXS5mb3JFYWNoKGZ1bmN0aW9uIChldikge1xuICAgICAgICByZXR1cm4gX3RoaXMyLm9uKGV2LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHJldHVybiBzZWxmLmVtaXQoZXYsIGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgc2VsZi5nbG9iYWxYID0gMDtcbiAgICAgIHNlbGYuZ2xvYmFsWSA9IDA7XG4gICAgICB0aGlzLm9uKCdtb3VzZW1vdmUnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoZG9jdW1lbnQucG9pbnRlckxvY2tFbGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgc2VsZi5nbG9iYWxYICs9IGUubW92ZW1lbnRYO1xuICAgICAgICAgIHNlbGYuZ2xvYmFsWSArPSBlLm1vdmVtZW50WTtcbiAgICAgICAgICBzZWxmLnVwZGF0ZShlLCBzZWxmLmdsb2JhbFgsIHNlbGYuZ2xvYmFsWSk7XG4gICAgICAgIH0gZWxzZSBzZWxmLnVwZGF0ZShlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHRyYWNrXG4gICAgICogQGRlc2NyaXB0aW9uIFN0YXJ0cyB0cmFja2luZyBldmVudHMgb24gYSBjb21wb25lbnRcbiAgICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50IEEgY29tcG9uZW50LCB0aGF0IHNob3VsZCBiZSB0cmFja2VkIGJ5IHRoZSBtb3VzZVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbmVzdGVkIFdoZXRoZXIgY29tcG9uZW50J3MgY2hpbGRyZW4gc2hvdWxkIGJlIHRyYWNrZWQgb3Igbm90XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInRyYWNrXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRyYWNrKGNvbXBvbmVudCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciBuZXN0ZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gICAgICB2YXIgaXNIb3ZlcmVkID0gZmFsc2U7XG4gICAgICB0aGlzLm9uKCdtb3ZlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMzLmhvdmVycyhjb21wb25lbnQsIG5lc3RlZCkpIHtcbiAgICAgICAgICBpZiAoaXNIb3ZlcmVkKSBjb21wb25lbnQuZW1pdCgnbW91c2Vtb3ZlJyk7ZWxzZSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdCgnbW91c2VvdmVyJyk7XG4gICAgICAgICAgICBpc0hvdmVyZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc0hvdmVyZWQpIHtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdCgnbW91c2VvdXQnKTtcbiAgICAgICAgICBpc0hvdmVyZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlzSG92ZXJlZCkgY29tcG9uZW50LmVtaXQoJ2NsaWNrJyk7ZWxzZSBjb21wb25lbnQuZW1pdCgnb2ZmQ2xpY2snKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vbignbW91c2Vkb3duJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNIb3ZlcmVkKSBjb21wb25lbnQuZW1pdCgnbW91c2Vkb3duJyk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMub24oJ21vdXNldXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc0hvdmVyZWQpIGNvbXBvbmVudC5lbWl0KCdtb3VzZXVwJyk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBpbnRlcnNlY3Rpb25cbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhbiBpbnRlcnNlY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgQSBjb21wb25lbnQgdGhhdCBpbnRlcnNlY3RzIHdpdGggbW91c2UgcmF5IChvciBkb2Vzbid0KVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbmVzdGVkIFdoZXRoZXIgY29tcG9uZW50J3MgY2hpbGRyZW4gc2hvdWxkIGJlIHRyYWNrZWQgb3Igbm90XG4gICAgICogQHJldHVybiB7QXJyYXl9IGludGVyc2VjdGlvbiBkYXRhLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuVmlydHVhbE1vdXNlTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbnRlcnNlY3Rpb25cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZXJzZWN0aW9uKF9yZWYpIHtcbiAgICAgIHZhciBuYXRpdmUgPSBfcmVmLm5hdGl2ZTtcbiAgICAgIHZhciBuZXN0ZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG5cbiAgICAgIGlmIChuYXRpdmUuY2hpbGRyZW4ubGVuZ3RoID4gMCAmJiBuZXN0ZWQpIHtcbiAgICAgICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICAgICAgbmF0aXZlLnRyYXZlcnNlKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgIHJldHVybiBvYmplY3RzLnB1c2goY2hpbGQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHMob2JqZWN0cyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3QobmF0aXZlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBwcm9qZWN0XG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSB2ZWN0b3IgYmFzZWQgb24gbW91c2UgcmF5IGludGVyc2VjdGlvbiB3aXRoIHBsYW5lXG4gICAgICogQHBhcmFtIHtUSFJFRS5QbGFuZX0gW3BsYW5lPXRoaXMucHJvamVjdGlvblBsYW5lXSBNYXRoIHBsYW5lIHRoYXQgaXMgdXNlZFxuICAgICAqIEBwYXJhbSB7VmVjdG9yM30gW3RhcmdldF0gT3B0aW9uYWwgdGFyZ2V0XG4gICAgICogQHJldHVybiB7VmVjdG9yM30gQW4gaW50ZXJzZWN0aW9uIHBvaW50LlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuVmlydHVhbE1vdXNlTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJwcm9qZWN0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByb2plY3QoKSB7XG4gICAgICB2YXIgcGxhbmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucHJvamVjdGlvblBsYW5lO1xuICAgICAgdmFyIHRhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHRoaXMucmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RQbGFuZShwbGFuZSwgdGFyZ2V0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBob3ZlcnNcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIGJvb2xlYW4gYmFzZWQgb24gaW50ZXJzZWN0aW9uIGRhdGEgKFdoZXRoZXIgbW91c2UgaG92ZXJzIHRoZSBjb21wb25lbnQpXG4gICAgICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXBvbmVudCBBIGNvbXBvbmVudCB0aGF0IGludGVyc2VjdHMgd2l0aCBtb3VzZSByYXkgKG9yIGRvZXNuJ3QpXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBuZXN0ZWQgV2hldGhlciBjb21wb25lbnQncyBjaGlsZHJlbiBzaG91bGQgYmUgdHJhY2tlZCBvciBub3RcbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoZSBjb21wb25lbnQgaXMgaG92ZXJlZC5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaG92ZXJzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGhvdmVycyhjb21wb25lbnQpIHtcbiAgICAgIHZhciBuZXN0ZWQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHRydWU7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3Rpb24oY29tcG9uZW50LCBuZXN0ZWQpLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdXNlIHJheVxuICAgICAqIEBtZW1iZXIge1RIUkVFLlJheX0gbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZSNyYXlcbiAgICAgKiBAcHVibGljXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyYXlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJheWNhc3Rlci5yYXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdXNlIHggWy0xOyAxXVxuICAgICAqIEBtZW1iZXIge051bWJlcn0gbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZSN4XG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwieFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubW91c2UueDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTW91c2UgeSBbLTE7IDFdXG4gICAgICogQG1lbWJlciB7TnVtYmVyfSBtb2R1bGU6bW9kdWxlcy9hcHAuVmlydHVhbE1vdXNlTW9kdWxlI3lcbiAgICAgKiBAcHVibGljXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tb3VzZS55O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFZpcnR1YWxNb3VzZU1vZHVsZSwgX0V2ZW50cyk7XG5cbiAgcmV0dXJuIFZpcnR1YWxNb3VzZU1vZHVsZTtcbn0obWluaXZlbnRzX2NvbW1vbmpzKTtcblxuLyoqXG4gKiBAY2xhc3MgQ29udHJvbHNNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSByZW5kZXJpbmcgbW9kdWxlIGFuZCBwYXNzaW5nIGl0IHRvIEFwcCdzIG1vZHVsZXM8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgbmV3IEVsZW1lbnRNb2R1bGUoKSxcbiAqICAgbmV3IFNjZW5lTW9kdWxlKCksXG4gKiAgIG5ldyBEZWZpbmVNb2R1bGUoJ2NhbWVyYScsIG5ldyBXSFMuUGVyc3BlY3RpdmVDYW1lcmEoe1xuICogICAgIHBvc2l0aW9uOiBuZXcgVEhSRUUuVmVjdG9yMygwLCA2LCAxOCksXG4gKiAgICAgZmFyOiAxMDAwMFxuICogICB9KSksXG4gKiAgIG5ldyBSZW5kZXJpbmdNb2R1bGUoKSxcbiAqICAgbmV3IENvbnRyb2xzTW9kdWxlLmZyb20obmV3IFRIUkVFLlRyYWNrYmFsbENvbnRyb2xzKCkpXG4gKiBdKTtcbiAqL1xuXG52YXIgQ29udHJvbHNNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBjcmVhdGVDbGFzcyhDb250cm9sc01vZHVsZSwgbnVsbCwgW3tcbiAgICBrZXk6IFwiZnJvbVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tKGNvbnRyb2xzKSB7XG4gICAgICByZXR1cm4gbmV3IENvbnRyb2xzTW9kdWxlKHtcbiAgICAgICAgY29udHJvbHM6IGNvbnRyb2xzXG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICBmdW5jdGlvbiBDb250cm9sc01vZHVsZSgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENvbnRyb2xzTW9kdWxlKTtcblxuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBjb250cm9sczogZmFsc2UsXG4gICAgICBmaXg6IGZ1bmN0aW9uIGZpeChjb250cm9scykge1xuICAgICAgICByZXR1cm4gY29udHJvbHM7XG4gICAgICB9LFxuICAgICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUoYykge1xuICAgICAgICB0aGlzLmNvbnRyb2xzLnVwZGF0ZShjLmdldERlbHRhKCkpO1xuICAgICAgfVxuICAgIH0sIHBhcmFtcyk7XG4gICAgdGhpcy5jb250cm9scyA9IHRoaXMucGFyYW1zLmNvbnRyb2xzO1xuICAgIHRoaXMudXBkYXRlID0gdGhpcy5wYXJhbXMudXBkYXRlO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoQ29udHJvbHNNb2R1bGUsIFt7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgX21hbmFnZXIuZGVmaW5lKCdjb250cm9scycpO1xuXG4gICAgICBfbWFuYWdlci5yZXF1aXJlKCdldmVudHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRXZlbnRzUGF0Y2hNb2R1bGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHNldENvbnRyb2xzXG4gICAgICogQGRlc2NyaXB0aW9uIFNldCB3b3JraW5nIGNvbnRyb2xzXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRyb2xzIFdvcmtpbmcgdGhyZWUuanMgY29udHJvbHMgb2JqZWN0LlxuICAgICAqIEByZXR1cm4ge3RoaXN9XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5Db250cm9sc01vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0Q29udHJvbHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Q29udHJvbHMoY29udHJvbHMpIHtcbiAgICAgIHRoaXMuY29udHJvbHMgPSBjb250cm9scztcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHNldFVwZGF0ZVxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXQgY29udHJvbHMgdXBkYXRlIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlIFVwZGF0ZSBmdW5jdGlvblxuICAgICAqIEByZXR1cm4ge3RoaXN9XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5Db250cm9sc01vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0VXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFVwZGF0ZSh1cGRhdGUpIHtcbiAgICAgIHRoaXMudXBkYXRlID0gdXBkYXRlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVncmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlZ3JhdGUoc2VsZikge1xuICAgICAgc2VsZi51cGRhdGVMb29wID0gbmV3IExvb3Aoc2VsZi51cGRhdGUuYmluZChzZWxmKSk7XG4gICAgICBzZWxmLnVwZGF0ZUxvb3Auc3RhcnQodGhpcyk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIENvbnRyb2xzTW9kdWxlO1xufSgpO1xuXG4vKipcbiAqIEBjbGFzcyBGb2dNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2NvbG9yOiAweGVmZDFiNSwgZGVuc2l0eTogMC4wMjAsIG5lYXI6IDEwLCBmYXI6IDEwMDB9XSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZT1leHAyXSAtIFRoZSB0eXBlIG9mIGZvZyAtIGV4cDIgb3IgbGluZWFyXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5Ib3cgdG8gY3JlYXRlIGFuZCBhcHBseSBhIEZvZ01vZHVsZTwvY2FwdGlvbj5cbiAqIGNvbnN0IGZvZ01vZHVsZSA9IG5ldyBGb2dNb2R1bGUoe1xuICogICAgY29sb3I6IDB4ZmZmZmZmLFxuICogICAgZGVuc2l0eTogMC4wMyxcbiAqICAgIG5lYXI6IDIwLFxuICogICAgZmFyOiAyMDBcbiAqICB9LCAnZXhwMicpO1xuICpcbiAqIG5ldyBBcHAoW1xuICogIC4uLixcbiAqICBmb2dNb2R1bGVcbiAqIF0pO1xuICovXG5cbnZhciBGb2dNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGb2dNb2R1bGUoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgdmFyIHR5cGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEZvZ01vZHVsZSk7XG5cbiAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgY29sb3I6IDB4ZWZkMWI1LFxuICAgICAgZGVuc2l0eTogMC4wMjAsXG4gICAgICBuZWFyOiAxMCxcbiAgICAgIGZhcjogMTAwMFxuICAgIH0sIHBhcmFtcyk7XG4gICAgaWYgKCF0eXBlIHx8IHR5cGUgPT09ICdleHAyJykgdGhpcy5mb2cgPSBuZXcgRm9nRXhwMih0aGlzLnBhcmFtcy5jb2xvciwgdGhpcy5wYXJhbXMuZGVuc2l0eSk7ZWxzZSBpZiAodHlwZSA9PT0gJ2xpbmVhcicpIHRoaXMuZm9nID0gbmV3IEZvZyh0aGlzLnBhcmFtcy5jb2xvciwgdGhpcy5wYXJhbXMubmVhciwgdGhpcy5wYXJhbXMuZmFyKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKEZvZ01vZHVsZSwgW3tcbiAgICBrZXk6IFwibWFuYWdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYW5hZ2VyKF9tYW5hZ2VyKSB7XG4gICAgICBfbWFuYWdlci5zZXQoJ2ZvZycsIHRoaXMuZm9nKTtcblxuICAgICAgX21hbmFnZXIuZ2V0KCdzY2VuZScpLmZvZyA9IHRoaXMuZm9nO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBGb2dNb2R1bGU7XG59KCk7XG5cbnZhciBpc0VxdWFsRGVmYXVsdCA9IGZ1bmN0aW9uIGlzRXF1YWxEZWZhdWx0KGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO2Vsc2UgaWYgKGEgJiYgYS5lcXVhbHMgJiYgYS5lcXVhbHMoYikpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59O1xuLyoqXG4gKiBAY2xhc3MgU3RhdGVNb2R1bGVcbiAqIEBkZXNjcmlwdGlvbiBgU3RhdGVNb2R1bGVgIGlzIHVzZWZ1bCBmb3IgYXBwcywgd2hlcmUgeW91IG5lZWQgc3RhdGUgbWFuaXB1bGF0aW9uLlxuICogVGhpcyBjYW4gYmU6IF90cmFuc2l0aW9ucyBiZXR3ZWVuIHNjcmVlbnMsIGdhbWVzLCBkZXZlbG9wbWVudCBtb21lbnRzXy5cbiAqIFlvdSBjYW4gY2hlY2sgW2Jhc2ljL3N0YXRlXShodHRwczovL3docy1kZXYuc3VyZ2Uuc2gvZXhhbXBsZXMvP2Jhc2ljL3N0YXRlKSBleGFtcGxlLlxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc11cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqIEBleGFtcGxlIDxjYXB0aW9uPiBDcmVhdGluZyBhIHN0YXRlIG1vZHVsZTwvY2FwdGlvbj5cbiAqIG5ldyBBcHAoW1xuICogICAvLyAuLi5cbiAqICAgbmV3IFN0YXRlTW9kdWxlKCkuZGVmYXVsdCh7XG4gKiAgICAgc3BoZXJlQ29sb3I6IDB4ZmYwMDAwXG4gKiAgIH0pXG4gKiBdKTtcbiAqL1xuXG5cbnZhciBTdGF0ZU1vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGNyZWF0ZUNsYXNzKFN0YXRlTW9kdWxlLCBudWxsLCBbe1xuICAgIGtleTogXCJhY3Rpb25HZW5lcmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhY3Rpb25HZW5lcmF0ZShpc0VxdWFsKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc3RhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFt7fSwgJyddO1xuXG4gICAgICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBrZXkgPSBfcmVmLmtleSxcbiAgICAgICAgICAgIGRhdGEgPSBfcmVmLmRhdGE7XG5cbiAgICAgICAgaWYgKGlzRXF1YWwoc3RhdGVbMF1ba2V5XSwgZGF0YSkpIHJldHVybiBzdGF0ZTtcbiAgICAgICAgc3RhdGVbMF1ba2V5XSA9IGRhdGE7XG4gICAgICAgIHN0YXRlWzFdID0ga2V5O1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9O1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIFN0YXRlTW9kdWxlKCkge1xuICAgIHZhciBlcXVhbENoZWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBpc0VxdWFsRGVmYXVsdDtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFN0YXRlTW9kdWxlKTtcblxuICAgIHRoaXMuc3RvcmUgPSBjcmVhdGVTdG9yZShTdGF0ZU1vZHVsZS5hY3Rpb25HZW5lcmF0ZShlcXVhbENoZWNrKSk7XG4gICAgdGhpcy5jb25maWd1cmF0aW9uID0ge307XG4gICAgdGhpcy5jdXJyZW50Q29uZmlnID0gJ2RlZmF1bHQnO1xuICAgIHRoaXMucHJldkNvbmZpZyA9ICdkZWZhdWx0JztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBkZWZhdWx0XG4gICAqIEBkZXNjcmlwdGlvbiBBZGQgZGVmYXVsdCBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSBDb25maWd1cmF0aW9uIHNldHVwXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuU3RhdGVNb2R1bGVcbiAgICogQGV4YW1wbGVcbiAgICogbmV3IFdIUy5TdGF0ZU1vZHVsZSgpLmRlZmF1bHQoe1xuICAgKiAgIHNwaGVyZUNvbG9yOiBVVElMUy4kY29sb3JzLm1lc2gsXG4gICAqICAgcGxhbmVDb2xvcjogMHg0NDdGOEJcbiAgICogfSlcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhTdGF0ZU1vZHVsZSwgW3tcbiAgICBrZXk6IFwiZGVmYXVsdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZGVmYXVsdChkYXRhKSB7XG4gICAgICB0aGlzLmNvbmZpZyh7XG4gICAgICAgIGRlZmF1bHQ6IGRhdGFcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgc2V0RXF1YWxDaGVja1xuICAgICAqIEBkZXNjcmlwdGlvbiBTZXRzIGFuIGVxdWFsQ2hlY2sgZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGVxdWFsIGNoZWNrXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0RXF1YWxDaGVja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRFcXVhbENoZWNrKGZ1bmMpIHtcbiAgICAgIHRoaXMuc3RvcmUucmVwbGFjZVJlZHVjZXIoU3RhdGVNb2R1bGUuYWN0aW9uR2VuZXJhdGUoZnVuYykpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYW5hZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hbmFnZXIoX21hbmFnZXIpIHtcbiAgICAgIF9tYW5hZ2VyLmRlZmluZSgnc3RhdGUnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBjb25maWdcbiAgICAgKiBAZGVzY3JpcHRpb24gTG9hZCBjb25maWd1cmF0aW9ucyBmcm9tIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlncyBDb25maWd1cmF0aW9uIGRhdGFcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+IEFkZGluZyBgZ3JlZW5gIGNvbmZpZ3VyYXRpb248L2NhcHRpb24+XG4gICAgICogc3RhdGUuY29uZmlnKHtcbiAgICAgKiAgIGdyZWVuOiB7XG4gICAgICogICAgIHNwaGVyZUNvbG9yOiAweDAwZmYwMCxcbiAgICAgKiAgICAgcGxhbmVDb2xvcjogMHgwMGZmMDBcbiAgICAgKiAgIH1cbiAgICAgKiB9KTtcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNvbmZpZ1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb25maWcoY29uZmlncykge1xuICAgICAgZm9yICh2YXIga2V5IGluIGNvbmZpZ3MpIHtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbltrZXldID0ga2V5ID09PSAnZGVmYXVsdCcgPyBjb25maWdzW2tleV0gOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdCwgY29uZmlnc1trZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgICAqIEBkZXNjcmlwdGlvbiBMb2FkIHVwZGF0ZXMgZnJvbSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHVwZGF0ZXMgVXBkYXRlcyBkYXRhXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPiBVcGRhdGUgY2FsbGJhY2sgZm9yIGBzcGhlcmVDb2xvcmA8L2NhcHRpb24+XG4gICAgICogc3RhdGUudXBkYXRlKHtcbiAgICAgKiAgIHNwaGVyZUNvbG9yOiBjb2xvciA9PiBzcGhlcmUubWF0ZXJpYWwuY29sb3Iuc2V0SGV4KGNvbG9yKVxuICAgICAqIH0pO1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciB1cGRhdGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHRoaXMuc3RvcmUuc3Vic2NyaWJlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzJHN0b3JlJGdldFN0YXRlID0gX3RoaXMuc3RvcmUuZ2V0U3RhdGUoKSxcbiAgICAgICAgICAgIF90aGlzJHN0b3JlJGdldFN0YXRlMiA9IHNsaWNlZFRvQXJyYXkoX3RoaXMkc3RvcmUkZ2V0U3RhdGUsIDIpLFxuICAgICAgICAgICAgZGF0YSA9IF90aGlzJHN0b3JlJGdldFN0YXRlMlswXSxcbiAgICAgICAgICAgIGNoYW5nZWRLZXkgPSBfdGhpcyRzdG9yZSRnZXRTdGF0ZTJbMV07XG5cbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdXBkYXRlc1tjaGFuZ2VkS2V5XTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhkYXRhW2NoYW5nZWRLZXldKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHRvXG4gICAgICogQGRlc2NyaXB0aW9uIFN3aXRjaCB0byBjb25maWd1cmF0aW9uLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb25maWdOYW1lIENvbmZpZ3VyYXRpb24gbmFtZS5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+IENoYW5nZXMgY29uZmlndXJhdGlvbiB0byBgZ3JlZW5gPC9jYXB0aW9uPlxuICAgICAqIHN0YXRlLnRvKCdncmVlbicpO1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidG9cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdG8oY29uZmlnTmFtZSkge1xuICAgICAgdGhpcy5wcmV2Q29uZmlnID0gdGhpcy5jdXJyZW50Q29uZmlnO1xuICAgICAgdGhpcy5jdXJyZW50Q29uZmlnID0gY29uZmlnTmFtZTtcbiAgICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZ3VyYXRpb25bY29uZmlnTmFtZV0gPyB0aGlzLmNvbmZpZ3VyYXRpb25bY29uZmlnTmFtZV0gOiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdDtcbiAgICAgIHRoaXMuc2V0KGNvbmZpZyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgc2V0XG4gICAgICogQGRlc2NyaXB0aW9uIFNldCBjdXJyZW50IHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuU3RhdGVNb2R1bGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIHN0YXRlLnNldCh7XG4gICAgICogICBzcGhlcmVDb2xvcjogMHgwMGZmMDBcbiAgICAgKiB9KTtcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXQoZGF0YSkge1xuICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHtcbiAgICAgICAgaWYgKGtleSkgdGhpcy5zdG9yZS5kaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogJ0FERCcsXG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGdldFxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gZGF0YSBvZiBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGtleSBQYXJhbWV0ZXIgbmFtZS5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzdGF0ZS5nZXQoJ3NwaGVyZUNvbG9yJyk7IC8vIDB4MDBmZjAwXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0U3RhdGUoKVswXVtrZXldO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHByZXZcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJuIGB0cnVlVmFsYCBpZiBgY29uZmlnYCBtYXRjaCBwcmV2aW91cyBjb25maWd1cmF0aW9uLCBpbiBvdGhlciBjYXNlIC0gcmV0dXJuIGBmYWxzZVZhbGAuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGNvbmZpZyBDb25maWd1cmF0aW9uIG5hbWUuXG4gICAgICogQHBhcmFtIHtBbnl9IHRydWVWYWwgVmFsdWUgcmV0dXJuZWQgaWYgY29uZGl0aW9uIGlzIHRydXRoeS5cbiAgICAgKiBAcGFyYW0ge0FueX0gZmFsc2VWYWwgVmFsdWUgcmV0dXJuZWQgaWYgY29uZGl0aW9uIGlzIGZhbHN5LlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuU3RhdGVNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInByZXZcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcHJldihjb25maWcsIHRydWVWYWwsIGZhbHNlVmFsKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmV2Q29uZmlnID09PSBjb25maWcgPyB0cnVlVmFsIDogZmFsc2VWYWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgY3VycmVudFxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm4gYHRydWVWYWxgIGlmIGBjb25maWdgIG1hdGNoIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgaW4gb3RoZXIgY2FzZSAtIHJldHVybiBgZmFsc2VWYWxgLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb25maWcgQ29uZmlndXJhdGlvbiBuYW1lLlxuICAgICAqIEBwYXJhbSB7QW55fSB0cnVlVmFsIFZhbHVlIHJldHVybmVkIGlmIGNvbmRpdGlvbiBpcyB0cnV0aHkuXG4gICAgICogQHBhcmFtIHtBbnl9IGZhbHNlVmFsIFZhbHVlIHJldHVybmVkIGlmIGNvbmRpdGlvbiBpcyBmYWxzeS5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjdXJyZW50XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGN1cnJlbnQoY29uZmlnLCB0cnVlVmFsLCBmYWxzZVZhbCkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudENvbmZpZyA9PT0gY29uZmlnID8gdHJ1ZVZhbCA6IGZhbHNlVmFsO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTdGF0ZU1vZHVsZTtcbn0oKTtcblxuLy8gVW5saWtlIFRyYWNrYmFsbENvbnRyb2xzLCBpdCBtYWludGFpbnMgdGhlIFwidXBcIiBkaXJlY3Rpb24gb2JqZWN0LnVwICgrWSBieSBkZWZhdWx0KS5cbi8vXG4vLyAgICBPcmJpdCAtIGxlZnQgbW91c2UgLyB0b3VjaDogb25lIGZpbmdlciBtb3ZlXG4vLyAgICBab29tIC0gbWlkZGxlIG1vdXNlLCBvciBtb3VzZXdoZWVsIC8gdG91Y2g6IHR3byBmaW5nZXIgc3ByZWFkIG9yIHNxdWlzaFxuLy8gICAgUGFuIC0gcmlnaHQgbW91c2UsIG9yIGFycm93IGtleXMgLyB0b3VjaDogdGhyZWUgZmludGVyIHN3aXBlXG5cbnZhciBUaHJlZU9yYml0Q29udHJvbHMgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9FdmVudERpc3BhdGNoZXIpIHtcbiAgZnVuY3Rpb24gVGhyZWVPcmJpdENvbnRyb2xzKG9iamVjdCwgZG9tRWxlbWVudCwgZXZlbnRIYW5kbGVyKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVGhyZWVPcmJpdENvbnRyb2xzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFRocmVlT3JiaXRDb250cm9scykuY2FsbCh0aGlzKSk7XG4gICAgX3RoaXMub2JqZWN0ID0gb2JqZWN0O1xuICAgIF90aGlzLmRvbUVsZW1lbnQgPSBkb21FbGVtZW50ID09PSB1bmRlZmluZWQgPyBkb2N1bWVudCA6IGRvbUVsZW1lbnQ7XG4gICAgX3RoaXMuZXZlbnRIYW5kbGVyID0gZXZlbnRIYW5kbGVyOyAvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSB0aGlzIGNvbnRyb2xcblxuICAgIF90aGlzLmVuYWJsZWQgPSB0cnVlOyAvLyBcInRhcmdldFwiIHNldHMgdGhlIGxvY2F0aW9uIG9mIGZvY3VzLCB3aGVyZSB0aGUgb2JqZWN0IG9yYml0cyBhcm91bmRcblxuICAgIF90aGlzLnRhcmdldCA9IG5ldyBWZWN0b3IzKCk7IC8vIEhvdyBmYXIgeW91IGNhbiBkb2xseSBpbiBhbmQgb3V0ICggUGVyc3BlY3RpdmVDYW1lcmEgb25seSApXG5cbiAgICBfdGhpcy5taW5EaXN0YW5jZSA9IDA7XG4gICAgX3RoaXMubWF4RGlzdGFuY2UgPSBJbmZpbml0eTsgLy8gSG93IGZhciB5b3UgY2FuIHpvb20gaW4gYW5kIG91dCAoIE9ydGhvZ3JhcGhpY0NhbWVyYSBvbmx5IClcblxuICAgIF90aGlzLm1pblpvb20gPSAwO1xuICAgIF90aGlzLm1heFpvb20gPSBJbmZpbml0eTsgLy8gSG93IGZhciB5b3UgY2FuIG9yYml0IHZlcnRpY2FsbHksIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMuXG4gICAgLy8gUmFuZ2UgaXMgMCB0byBNYXRoLlBJIHJhZGlhbnMuXG5cbiAgICBfdGhpcy5taW5Qb2xhckFuZ2xlID0gMDsgLy8gcmFkaWFuc1xuXG4gICAgX3RoaXMubWF4UG9sYXJBbmdsZSA9IE1hdGguUEk7IC8vIHJhZGlhbnNcbiAgICAvLyBIb3cgZmFyIHlvdSBjYW4gb3JiaXQgaG9yaXpvbnRhbGx5LCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLlxuICAgIC8vIElmIHNldCwgbXVzdCBiZSBhIHN1Yi1pbnRlcnZhbCBvZiB0aGUgaW50ZXJ2YWwgWyAtIE1hdGguUEksIE1hdGguUEkgXS5cblxuICAgIF90aGlzLm1pbkF6aW11dGhBbmdsZSA9IC1JbmZpbml0eTsgLy8gcmFkaWFuc1xuXG4gICAgX3RoaXMubWF4QXppbXV0aEFuZ2xlID0gSW5maW5pdHk7IC8vIHJhZGlhbnNcbiAgICAvLyBTZXQgdG8gdHJ1ZSB0byBlbmFibGUgZGFtcGluZyAoaW5lcnRpYSlcbiAgICAvLyBJZiBkYW1waW5nIGlzIGVuYWJsZWQsIHlvdSBtdXN0IGNhbGwgY29udHJvbHMudXBkYXRlKCkgaW4geW91ciBhbmltYXRpb24gbG9vcFxuXG4gICAgX3RoaXMuZW5hYmxlRGFtcGluZyA9IGZhbHNlO1xuICAgIF90aGlzLmRhbXBpbmdGYWN0b3IgPSAwLjI1OyAvLyBUaGlzIG9wdGlvbiBhY3R1YWxseSBlbmFibGVzIGRvbGx5aW5nIGluIGFuZCBvdXQ7IGxlZnQgYXMgXCJ6b29tXCIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgIC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHpvb21pbmdcblxuICAgIF90aGlzLmVuYWJsZVpvb20gPSB0cnVlO1xuICAgIF90aGlzLnpvb21TcGVlZCA9IDEuMDsgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcm90YXRpbmdcblxuICAgIF90aGlzLmVuYWJsZVJvdGF0ZSA9IHRydWU7XG4gICAgX3RoaXMucm90YXRlU3BlZWQgPSAxLjA7IC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHBhbm5pbmdcblxuICAgIF90aGlzLmVuYWJsZVBhbiA9IHRydWU7XG4gICAgX3RoaXMua2V5UGFuU3BlZWQgPSA3LjA7IC8vIHBpeGVscyBtb3ZlZCBwZXIgYXJyb3cga2V5IHB1c2hcbiAgICAvLyBTZXQgdG8gdHJ1ZSB0byBhdXRvbWF0aWNhbGx5IHJvdGF0ZSBhcm91bmQgdGhlIHRhcmdldFxuICAgIC8vIElmIGF1dG8tcm90YXRlIGlzIGVuYWJsZWQsIHlvdSBtdXN0IGNhbGwgY29udHJvbHMudXBkYXRlKCkgaW4geW91ciBhbmltYXRpb24gbG9vcFxuXG4gICAgX3RoaXMuYXV0b1JvdGF0ZSA9IGZhbHNlO1xuICAgIF90aGlzLmF1dG9Sb3RhdGVTcGVlZCA9IDIuMDsgLy8gMzAgc2Vjb25kcyBwZXIgcm91bmQgd2hlbiBmcHMgaXMgNjBcbiAgICAvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSB1c2Ugb2YgdGhlIGtleXNcblxuICAgIF90aGlzLmVuYWJsZUtleXMgPSB0cnVlOyAvLyBUaGUgZm91ciBhcnJvdyBrZXlzXG5cbiAgICBfdGhpcy5rZXlzID0ge1xuICAgICAgTEVGVDogMzcsXG4gICAgICBVUDogMzgsXG4gICAgICBSSUdIVDogMzksXG4gICAgICBCT1RUT006IDQwXG4gICAgfTsgLy8gTW91c2UgYnV0dG9uc1xuXG4gICAgX3RoaXMubW91c2VCdXR0b25zID0ge1xuICAgICAgT1JCSVQ6IE1PVVNFLkxFRlQsXG4gICAgICBaT09NOiBNT1VTRS5NSURETEUsXG4gICAgICBQQU46IE1PVVNFLlJJR0hUXG4gICAgfTsgLy8gZm9yIHJlc2V0XG5cbiAgICBfdGhpcy50YXJnZXQwID0gX3RoaXMudGFyZ2V0LmNsb25lKCk7XG4gICAgX3RoaXMucG9zaXRpb24wID0gX3RoaXMub2JqZWN0LnBvc2l0aW9uLmNsb25lKCk7XG4gICAgX3RoaXMuem9vbTAgPSBfdGhpcy5vYmplY3Quem9vbTsgLy9cbiAgICAvLyBwdWJsaWMgbWV0aG9kc1xuICAgIC8vXG5cbiAgICBfdGhpcy5nZXRQb2xhckFuZ2xlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNwaGVyaWNhbC5waGk7XG4gICAgfTtcblxuICAgIF90aGlzLmdldEF6aW11dGhhbEFuZ2xlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHNwaGVyaWNhbC50aGV0YTtcbiAgICB9O1xuXG4gICAgX3RoaXMucmVzZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy50YXJnZXQuY29weShfdGhpcy50YXJnZXQwKTtcblxuICAgICAgX3RoaXMub2JqZWN0LnBvc2l0aW9uLmNvcHkoX3RoaXMucG9zaXRpb24wKTtcblxuICAgICAgX3RoaXMub2JqZWN0Lnpvb20gPSBfdGhpcy56b29tMDtcblxuICAgICAgX3RoaXMub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuICAgICAgX3RoaXMuZGlzcGF0Y2hFdmVudChjaGFuZ2VFdmVudCk7XG5cbiAgICAgIF90aGlzLnVwZGF0ZSgpO1xuXG4gICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XG4gICAgfTsgLy8gdGhpcyBtZXRob2QgaXMgZXhwb3NlZCwgYnV0IHBlcmhhcHMgaXQgd291bGQgYmUgYmV0dGVyIGlmIHdlIGNhbiBtYWtlIGl0IHByaXZhdGUuLi5cblxuXG4gICAgX3RoaXMudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9mZnNldCA9IG5ldyBWZWN0b3IzKCk7IC8vIHNvIGNhbWVyYS51cCBpcyB0aGUgb3JiaXQgYXhpc1xuXG4gICAgICB2YXIgcXVhdCA9IG5ldyBRdWF0ZXJuaW9uKCkuc2V0RnJvbVVuaXRWZWN0b3JzKG9iamVjdC51cCwgbmV3IFZlY3RvcjMoMCwgMSwgMCkpO1xuICAgICAgdmFyIHF1YXRJbnZlcnNlID0gcXVhdC5jbG9uZSgpLmludmVyc2UoKTtcbiAgICAgIHZhciBsYXN0UG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuICAgICAgdmFyIGxhc3RRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IF90aGlzLm9iamVjdC5wb3NpdGlvbjtcbiAgICAgICAgb2Zmc2V0LmNvcHkocG9zaXRpb24pLnN1YihfdGhpcy50YXJnZXQpOyAvLyByb3RhdGUgb2Zmc2V0IHRvIFwieS1heGlzLWlzLXVwXCIgc3BhY2VcblxuICAgICAgICBvZmZzZXQuYXBwbHlRdWF0ZXJuaW9uKHF1YXQpOyAvLyBhbmdsZSBmcm9tIHotYXhpcyBhcm91bmQgeS1heGlzXG5cbiAgICAgICAgc3BoZXJpY2FsLnNldEZyb21WZWN0b3IzKG9mZnNldCk7XG4gICAgICAgIGlmIChfdGhpcy5hdXRvUm90YXRlICYmIHN0YXRlID09PSBTVEFURS5OT05FKSByb3RhdGVMZWZ0KGdldEF1dG9Sb3RhdGlvbkFuZ2xlKCkpO1xuICAgICAgICBzcGhlcmljYWwudGhldGEgKz0gc3BoZXJpY2FsRGVsdGEudGhldGE7XG4gICAgICAgIHNwaGVyaWNhbC5waGkgKz0gc3BoZXJpY2FsRGVsdGEucGhpOyAvLyByZXN0cmljdCB0aGV0YSB0byBiZSBiZXR3ZWVuIGRlc2lyZWQgbGltaXRzXG5cbiAgICAgICAgc3BoZXJpY2FsLnRoZXRhID0gTWF0aC5tYXgoX3RoaXMubWluQXppbXV0aEFuZ2xlLCBNYXRoLm1pbihfdGhpcy5tYXhBemltdXRoQW5nbGUsIHNwaGVyaWNhbC50aGV0YSkpOyAvLyByZXN0cmljdCBwaGkgdG8gYmUgYmV0d2VlbiBkZXNpcmVkIGxpbWl0c1xuXG4gICAgICAgIHNwaGVyaWNhbC5waGkgPSBNYXRoLm1heChfdGhpcy5taW5Qb2xhckFuZ2xlLCBNYXRoLm1pbihfdGhpcy5tYXhQb2xhckFuZ2xlLCBzcGhlcmljYWwucGhpKSk7XG4gICAgICAgIHNwaGVyaWNhbC5tYWtlU2FmZSgpO1xuICAgICAgICBzcGhlcmljYWwucmFkaXVzICo9IHNjYWxlOyAvLyByZXN0cmljdCByYWRpdXMgdG8gYmUgYmV0d2VlbiBkZXNpcmVkIGxpbWl0c1xuXG4gICAgICAgIHNwaGVyaWNhbC5yYWRpdXMgPSBNYXRoLm1heChfdGhpcy5taW5EaXN0YW5jZSwgTWF0aC5taW4oX3RoaXMubWF4RGlzdGFuY2UsIHNwaGVyaWNhbC5yYWRpdXMpKTsgLy8gbW92ZSB0YXJnZXQgdG8gcGFubmVkIGxvY2F0aW9uXG5cbiAgICAgICAgX3RoaXMudGFyZ2V0LmFkZChwYW5PZmZzZXQpO1xuXG4gICAgICAgIG9mZnNldC5zZXRGcm9tU3BoZXJpY2FsKHNwaGVyaWNhbCk7IC8vIHJvdGF0ZSBvZmZzZXQgYmFjayB0byBcImNhbWVyYS11cC12ZWN0b3ItaXMtdXBcIiBzcGFjZVxuXG4gICAgICAgIG9mZnNldC5hcHBseVF1YXRlcm5pb24ocXVhdEludmVyc2UpO1xuICAgICAgICBwb3NpdGlvbi5jb3B5KF90aGlzLnRhcmdldCkuYWRkKG9mZnNldCk7XG5cbiAgICAgICAgX3RoaXMub2JqZWN0Lmxvb2tBdChfdGhpcy50YXJnZXQpO1xuXG4gICAgICAgIGlmIChfdGhpcy5lbmFibGVEYW1waW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgc3BoZXJpY2FsRGVsdGEudGhldGEgKj0gMSAtIF90aGlzLmRhbXBpbmdGYWN0b3I7XG4gICAgICAgICAgc3BoZXJpY2FsRGVsdGEucGhpICo9IDEgLSBfdGhpcy5kYW1waW5nRmFjdG9yO1xuICAgICAgICB9IGVsc2Ugc3BoZXJpY2FsRGVsdGEuc2V0KDAsIDAsIDApO1xuXG4gICAgICAgIHNjYWxlID0gMTtcbiAgICAgICAgcGFuT2Zmc2V0LnNldCgwLCAwLCAwKTsgLy8gdXBkYXRlIGNvbmRpdGlvbiBpczpcbiAgICAgICAgLy8gbWluKGNhbWVyYSBkaXNwbGFjZW1lbnQsIGNhbWVyYSByb3RhdGlvbiBpbiByYWRpYW5zKV4yID4gRVBTXG4gICAgICAgIC8vIHVzaW5nIHNtYWxsLWFuZ2xlIGFwcHJveGltYXRpb24gY29zKHgvMikgPSAxIC0geF4yIC8gOFxuXG4gICAgICAgIGlmICh6b29tQ2hhbmdlZCB8fCBsYXN0UG9zaXRpb24uZGlzdGFuY2VUb1NxdWFyZWQoX3RoaXMub2JqZWN0LnBvc2l0aW9uKSA+IEVQUyB8fCA4ICogKDEgLSBsYXN0UXVhdGVybmlvbi5kb3QoX3RoaXMub2JqZWN0LnF1YXRlcm5pb24pKSA+IEVQUykge1xuICAgICAgICAgIF90aGlzLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xuXG4gICAgICAgICAgbGFzdFBvc2l0aW9uLmNvcHkoX3RoaXMub2JqZWN0LnBvc2l0aW9uKTtcbiAgICAgICAgICBsYXN0UXVhdGVybmlvbi5jb3B5KF90aGlzLm9iamVjdC5xdWF0ZXJuaW9uKTtcbiAgICAgICAgICB6b29tQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSgpO1xuICAgIH07XG5cbiAgICBfdGhpcy5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIG9uQ29udGV4dE1lbnUsIGZhbHNlKTtcblxuICAgICAgX3RoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93biwgZmFsc2UpO1xuXG4gICAgICBfdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgb25Nb3VzZVdoZWVsLCBmYWxzZSk7XG5cbiAgICAgIF90aGlzLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCwgZmFsc2UpO1xuXG4gICAgICBfdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCwgZmFsc2UpO1xuXG4gICAgICBfdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlLCBmYWxzZSk7XG5cbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlLCBmYWxzZSk7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5RG93biwgZmFsc2UpOyAvLyB0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTsgLy8gc2hvdWxkIHRoaXMgYmUgYWRkZWQgaGVyZT9cbiAgICB9OyAvL1xuICAgIC8vIGludGVybmFsc1xuICAgIC8vXG5cblxuICAgIHZhciBjaGFuZ2VFdmVudCA9IHtcbiAgICAgIHR5cGU6ICdjaGFuZ2UnXG4gICAgfTtcbiAgICB2YXIgc3RhcnRFdmVudCA9IHtcbiAgICAgIHR5cGU6ICdzdGFydCdcbiAgICB9O1xuICAgIHZhciBlbmRFdmVudCA9IHtcbiAgICAgIHR5cGU6ICdlbmQnXG4gICAgfTtcbiAgICB2YXIgU1RBVEUgPSB7XG4gICAgICBOT05FOiAtMSxcbiAgICAgIFJPVEFURTogMCxcbiAgICAgIERPTExZOiAxLFxuICAgICAgUEFOOiAyLFxuICAgICAgVE9VQ0hfUk9UQVRFOiAzLFxuICAgICAgVE9VQ0hfRE9MTFk6IDQsXG4gICAgICBUT1VDSF9QQU46IDVcbiAgICB9O1xuICAgIHZhciBzdGF0ZSA9IFNUQVRFLk5PTkU7XG4gICAgdmFyIEVQUyA9IDAuMDAwMDAxOyAvLyBjdXJyZW50IHBvc2l0aW9uIGluIHNwaGVyaWNhbCBjb29yZGluYXRlc1xuXG4gICAgdmFyIHNwaGVyaWNhbCA9IG5ldyBTcGhlcmljYWwoKTtcbiAgICB2YXIgc3BoZXJpY2FsRGVsdGEgPSBuZXcgU3BoZXJpY2FsKCk7XG4gICAgdmFyIHNjYWxlID0gMTtcbiAgICB2YXIgcGFuT2Zmc2V0ID0gbmV3IFZlY3RvcjMoKTtcbiAgICB2YXIgem9vbUNoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgcm90YXRlU3RhcnQgPSBuZXcgVmVjdG9yMigpO1xuICAgIHZhciByb3RhdGVFbmQgPSBuZXcgVmVjdG9yMigpO1xuICAgIHZhciByb3RhdGVEZWx0YSA9IG5ldyBWZWN0b3IyKCk7XG4gICAgdmFyIHBhblN0YXJ0ID0gbmV3IFZlY3RvcjIoKTtcbiAgICB2YXIgcGFuRW5kID0gbmV3IFZlY3RvcjIoKTtcbiAgICB2YXIgcGFuRGVsdGEgPSBuZXcgVmVjdG9yMigpO1xuICAgIHZhciBkb2xseVN0YXJ0ID0gbmV3IFZlY3RvcjIoKTtcbiAgICB2YXIgZG9sbHlFbmQgPSBuZXcgVmVjdG9yMigpO1xuICAgIHZhciBkb2xseURlbHRhID0gbmV3IFZlY3RvcjIoKTtcblxuICAgIHZhciBnZXRBdXRvUm90YXRpb25BbmdsZSA9IGZ1bmN0aW9uIGdldEF1dG9Sb3RhdGlvbkFuZ2xlKCkge1xuICAgICAgcmV0dXJuIDIgKiBNYXRoLlBJIC8gNjAgLyA2MCAqIF90aGlzLmF1dG9Sb3RhdGVTcGVlZDtcbiAgICB9O1xuXG4gICAgdmFyIGdldFpvb21TY2FsZSA9IGZ1bmN0aW9uIGdldFpvb21TY2FsZSgpIHtcbiAgICAgIHJldHVybiBNYXRoLnBvdygwLjk1LCBfdGhpcy56b29tU3BlZWQpO1xuICAgIH07XG5cbiAgICB2YXIgcm90YXRlTGVmdCA9IGZ1bmN0aW9uIHJvdGF0ZUxlZnQoYW5nbGUpIHtcbiAgICAgIHNwaGVyaWNhbERlbHRhLnRoZXRhIC09IGFuZ2xlO1xuICAgIH07XG5cbiAgICB2YXIgcm90YXRlVXAgPSBmdW5jdGlvbiByb3RhdGVVcChhbmdsZSkge1xuICAgICAgc3BoZXJpY2FsRGVsdGEucGhpIC09IGFuZ2xlO1xuICAgIH07XG5cbiAgICB2YXIgcGFuTGVmdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB2ID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZGlzdGFuY2UsIG9iamVjdE1hdHJpeCkge1xuICAgICAgICB2LnNldEZyb21NYXRyaXhDb2x1bW4ob2JqZWN0TWF0cml4LCAwKTsgLy8gZ2V0IFggY29sdW1uIG9mIG9iamVjdE1hdHJpeFxuXG4gICAgICAgIHYubXVsdGlwbHlTY2FsYXIoLWRpc3RhbmNlKTtcbiAgICAgICAgcGFuT2Zmc2V0LmFkZCh2KTtcbiAgICAgIH07XG4gICAgfSgpO1xuXG4gICAgdmFyIHBhblVwID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHYgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkaXN0YW5jZSwgb2JqZWN0TWF0cml4KSB7XG4gICAgICAgIHYuc2V0RnJvbU1hdHJpeENvbHVtbihvYmplY3RNYXRyaXgsIDEpOyAvLyBnZXQgWSBjb2x1bW4gb2Ygb2JqZWN0TWF0cml4XG5cbiAgICAgICAgdi5tdWx0aXBseVNjYWxhcihkaXN0YW5jZSk7XG4gICAgICAgIHBhbk9mZnNldC5hZGQodik7XG4gICAgICB9O1xuICAgIH0oKTsgLy8gZGVsdGFYIGFuZCBkZWx0YVkgYXJlIGluIHBpeGVsczsgcmlnaHQgYW5kIGRvd24gYXJlIHBvc2l0aXZlXG5cblxuICAgIHZhciBwYW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgb2Zmc2V0ID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZGVsdGFYLCBkZWx0YVkpIHtcbiAgICAgICAgdmFyIGVsZW1lbnQgPSBfdGhpcy5kb21FbGVtZW50ID09PSBkb2N1bWVudCA/IF90aGlzLmRvbUVsZW1lbnQuYm9keSA6IF90aGlzLmRvbUVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKF90aGlzLm9iamVjdCBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlQ2FtZXJhKSB7XG4gICAgICAgICAgLy8gcGVyc3BlY3RpdmVcbiAgICAgICAgICB2YXIgcG9zaXRpb24gPSBfdGhpcy5vYmplY3QucG9zaXRpb247XG4gICAgICAgICAgb2Zmc2V0LmNvcHkocG9zaXRpb24pLnN1YihfdGhpcy50YXJnZXQpO1xuICAgICAgICAgIHZhciB0YXJnZXREaXN0YW5jZSA9IG9mZnNldC5sZW5ndGgoKTsgLy8gaGFsZiBvZiB0aGUgZm92IGlzIGNlbnRlciB0byB0b3Agb2Ygc2NyZWVuXG5cbiAgICAgICAgICB0YXJnZXREaXN0YW5jZSAqPSBNYXRoLnRhbihfdGhpcy5vYmplY3QuZm92IC8gMiAqIE1hdGguUEkgLyAxODAuMCk7IC8vIHdlIGFjdHVhbGx5IGRvbid0IHVzZSBzY3JlZW5XaWR0aCwgc2luY2UgcGVyc3BlY3RpdmUgY2FtZXJhIGlzIGZpeGVkIHRvIHNjcmVlbiBoZWlnaHRcblxuICAgICAgICAgIHBhbkxlZnQoMiAqIGRlbHRhWCAqIHRhcmdldERpc3RhbmNlIC8gZWxlbWVudC5jbGllbnRIZWlnaHQsIF90aGlzLm9iamVjdC5tYXRyaXgpO1xuICAgICAgICAgIHBhblVwKDIgKiBkZWx0YVkgKiB0YXJnZXREaXN0YW5jZSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0LCBfdGhpcy5vYmplY3QubWF0cml4KTtcbiAgICAgICAgfSBlbHNlIGlmIChfdGhpcy5vYmplY3QgaW5zdGFuY2VvZiBPcnRob2dyYXBoaWNDYW1lcmEpIHtcbiAgICAgICAgICAvLyBvcnRob2dyYXBoaWNcbiAgICAgICAgICBwYW5MZWZ0KGRlbHRhWCAqIChfdGhpcy5vYmplY3QucmlnaHQgLSBfdGhpcy5vYmplY3QubGVmdCkgLyBfdGhpcy5vYmplY3Quem9vbSAvIGVsZW1lbnQuY2xpZW50V2lkdGgsIF90aGlzLm9iamVjdC5tYXRyaXgpO1xuICAgICAgICAgIHBhblVwKGRlbHRhWSAqIChfdGhpcy5vYmplY3QudG9wIC0gX3RoaXMub2JqZWN0LmJvdHRvbSkgLyBfdGhpcy5vYmplY3Quem9vbSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0LCBfdGhpcy5vYmplY3QubWF0cml4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBjYW1lcmEgbmVpdGhlciBvcnRob2dyYXBoaWMgbm9yIHBlcnNwZWN0aXZlXG4gICAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBPcmJpdENvbnRyb2xzTW9kdWxlLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBwYW4gZGlzYWJsZWQuJyk7XG4gICAgICAgICAgX3RoaXMuZW5hYmxlUGFuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSgpO1xuXG4gICAgdmFyIGRvbGx5SW4gPSBmdW5jdGlvbiBkb2xseUluKGRvbGx5U2NhbGUpIHtcbiAgICAgIGlmIChfdGhpcy5vYmplY3QgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNhbWVyYSkgc2NhbGUgLz0gZG9sbHlTY2FsZTtlbHNlIGlmIChfdGhpcy5vYmplY3QgaW5zdGFuY2VvZiBPcnRob2dyYXBoaWNDYW1lcmEpIHtcbiAgICAgICAgX3RoaXMub2JqZWN0Lnpvb20gPSBNYXRoLm1heChfdGhpcy5taW5ab29tLCBNYXRoLm1pbihfdGhpcy5tYXhab29tLCBfdGhpcy5vYmplY3Quem9vbSAqIGRvbGx5U2NhbGUpKTtcblxuICAgICAgICBfdGhpcy5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG4gICAgICAgIHpvb21DaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogT3JiaXRDb250cm9sc01vZHVsZS5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gZG9sbHkvem9vbSBkaXNhYmxlZC4nKTtcbiAgICAgICAgX3RoaXMuZW5hYmxlWm9vbSA9IGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgZG9sbHlPdXQgPSBmdW5jdGlvbiBkb2xseU91dChkb2xseVNjYWxlKSB7XG4gICAgICBpZiAoX3RoaXMub2JqZWN0IGluc3RhbmNlb2YgUGVyc3BlY3RpdmVDYW1lcmEpIHNjYWxlICo9IGRvbGx5U2NhbGU7ZWxzZSBpZiAoX3RoaXMub2JqZWN0IGluc3RhbmNlb2YgT3J0aG9ncmFwaGljQ2FtZXJhKSB7XG4gICAgICAgIF90aGlzLm9iamVjdC56b29tID0gTWF0aC5tYXgoX3RoaXMubWluWm9vbSwgTWF0aC5taW4oX3RoaXMubWF4Wm9vbSwgX3RoaXMub2JqZWN0Lnpvb20gLyBkb2xseVNjYWxlKSk7XG5cbiAgICAgICAgX3RoaXMub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuICAgICAgICB6b29tQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IE9yYml0Q29udHJvbHNNb2R1bGUuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIGRvbGx5L3pvb20gZGlzYWJsZWQuJyk7XG4gICAgICAgIF90aGlzLmVuYWJsZVpvb20gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9OyAvL1xuICAgIC8vIGV2ZW50IGNhbGxiYWNrcyAtIHVwZGF0ZSB0aGUgb2JqZWN0IHN0YXRlXG4gICAgLy9cblxuXG4gICAgdmFyIGhhbmRsZU1vdXNlRG93blJvdGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93blJvdGF0ZShldmVudCkge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVNb3VzZURvd25Sb3RhdGUnICk7XG4gICAgICByb3RhdGVTdGFydC5zZXQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgfTtcblxuICAgIHZhciBoYW5kbGVNb3VzZURvd25Eb2xseSA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93bkRvbGx5KGV2ZW50KSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlRG93bkRvbGx5JyApO1xuICAgICAgZG9sbHlTdGFydC5zZXQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgfTtcblxuICAgIHZhciBoYW5kbGVNb3VzZURvd25QYW4gPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd25QYW4oZXZlbnQpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VEb3duUGFuJyApO1xuICAgICAgcGFuU3RhcnQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlTW91c2VNb3ZlUm90YXRlID0gZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlUm90YXRlKGV2ZW50KSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlTW92ZVJvdGF0ZScgKTtcbiAgICAgIHJvdGF0ZUVuZC5zZXQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICByb3RhdGVEZWx0YS5zdWJWZWN0b3JzKHJvdGF0ZUVuZCwgcm90YXRlU3RhcnQpO1xuICAgICAgdmFyIGVsZW1lbnQgPSBfdGhpcy5kb21FbGVtZW50ID09PSBkb2N1bWVudCA/IF90aGlzLmRvbUVsZW1lbnQuYm9keSA6IF90aGlzLmRvbUVsZW1lbnQ7IC8vIHJvdGF0aW5nIGFjcm9zcyB3aG9sZSBzY3JlZW4gZ29lcyAzNjAgZGVncmVlcyBhcm91bmRcblxuICAgICAgcm90YXRlTGVmdCgyICogTWF0aC5QSSAqIHJvdGF0ZURlbHRhLnggLyBlbGVtZW50LmNsaWVudFdpZHRoICogX3RoaXMucm90YXRlU3BlZWQpOyAvLyByb3RhdGluZyB1cCBhbmQgZG93biBhbG9uZyB3aG9sZSBzY3JlZW4gYXR0ZW1wdHMgdG8gZ28gMzYwLCBidXQgbGltaXRlZCB0byAxODBcblxuICAgICAgcm90YXRlVXAoMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS55IC8gZWxlbWVudC5jbGllbnRIZWlnaHQgKiBfdGhpcy5yb3RhdGVTcGVlZCk7XG4gICAgICByb3RhdGVTdGFydC5jb3B5KHJvdGF0ZUVuZCk7XG5cbiAgICAgIF90aGlzLnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlTW91c2VNb3ZlRG9sbHkgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmVEb2xseShldmVudCkge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVNb3VzZU1vdmVEb2xseScgKTtcbiAgICAgIGRvbGx5RW5kLnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICAgIGRvbGx5RGVsdGEuc3ViVmVjdG9ycyhkb2xseUVuZCwgZG9sbHlTdGFydCk7XG4gICAgICBpZiAoZG9sbHlEZWx0YS55ID4gMCkgZG9sbHlJbihnZXRab29tU2NhbGUoKSk7ZWxzZSBpZiAoZG9sbHlEZWx0YS55IDwgMCkgZG9sbHlPdXQoZ2V0Wm9vbVNjYWxlKCkpO1xuICAgICAgZG9sbHlTdGFydC5jb3B5KGRvbGx5RW5kKTtcblxuICAgICAgX3RoaXMudXBkYXRlKCk7XG4gICAgfTtcblxuICAgIHZhciBoYW5kbGVNb3VzZU1vdmVQYW4gPSBmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmVQYW4oZXZlbnQpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VNb3ZlUGFuJyApO1xuICAgICAgcGFuRW5kLnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICAgIHBhbkRlbHRhLnN1YlZlY3RvcnMocGFuRW5kLCBwYW5TdGFydCk7XG4gICAgICBwYW4ocGFuRGVsdGEueCwgcGFuRGVsdGEueSk7XG4gICAgICBwYW5TdGFydC5jb3B5KHBhbkVuZCk7XG5cbiAgICAgIF90aGlzLnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlTW91c2VXaGVlbCA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlV2hlZWwoZXZlbnQpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VXaGVlbCcgKTtcbiAgICAgIGlmIChldmVudC5kZWx0YVkgPCAwKSBkb2xseU91dChnZXRab29tU2NhbGUoKSk7ZWxzZSBpZiAoZXZlbnQuZGVsdGFZID4gMCkgZG9sbHlJbihnZXRab29tU2NhbGUoKSk7XG5cbiAgICAgIF90aGlzLnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZXZlbnQpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlS2V5RG93bicgKTtcbiAgICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgICBjYXNlIF90aGlzLmtleXMuVVA6XG4gICAgICAgICAgcGFuKDAsIF90aGlzLmtleVBhblNwZWVkKTtcblxuICAgICAgICAgIF90aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBfdGhpcy5rZXlzLkJPVFRPTTpcbiAgICAgICAgICBwYW4oMCwgLV90aGlzLmtleVBhblNwZWVkKTtcblxuICAgICAgICAgIF90aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBfdGhpcy5rZXlzLkxFRlQ6XG4gICAgICAgICAgcGFuKF90aGlzLmtleVBhblNwZWVkLCAwKTtcblxuICAgICAgICAgIF90aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBfdGhpcy5rZXlzLlJJR0hUOlxuICAgICAgICAgIHBhbigtX3RoaXMua2V5UGFuU3BlZWQsIDApO1xuXG4gICAgICAgICAgX3RoaXMudXBkYXRlKCk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGhhbmRsZVRvdWNoU3RhcnRSb3RhdGUgPSBmdW5jdGlvbiBoYW5kbGVUb3VjaFN0YXJ0Um90YXRlKGV2ZW50KSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoU3RhcnRSb3RhdGUnICk7XG4gICAgICByb3RhdGVTdGFydC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XG4gICAgfTtcblxuICAgIHZhciBoYW5kbGVUb3VjaFN0YXJ0RG9sbHkgPSBmdW5jdGlvbiBoYW5kbGVUb3VjaFN0YXJ0RG9sbHkoZXZlbnQpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlVG91Y2hTdGFydERvbGx5JyApO1xuICAgICAgdmFyIGR4ID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWCAtIGV2ZW50LnRvdWNoZXNbMV0ucGFnZVg7XG4gICAgICB2YXIgZHkgPSBldmVudC50b3VjaGVzWzBdLnBhZ2VZIC0gZXZlbnQudG91Y2hlc1sxXS5wYWdlWTtcbiAgICAgIHZhciBkaXN0YW5jZSA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgICBkb2xseVN0YXJ0LnNldCgwLCBkaXN0YW5jZSk7XG4gICAgfTtcblxuICAgIHZhciBoYW5kbGVUb3VjaFN0YXJ0UGFuID0gZnVuY3Rpb24gaGFuZGxlVG91Y2hTdGFydFBhbihldmVudCkge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVUb3VjaFN0YXJ0UGFuJyApO1xuICAgICAgcGFuU3RhcnQuc2V0KGV2ZW50LnRvdWNoZXNbMF0ucGFnZVgsIGV2ZW50LnRvdWNoZXNbMF0ucGFnZVkpO1xuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlVG91Y2hNb3ZlUm90YXRlID0gZnVuY3Rpb24gaGFuZGxlVG91Y2hNb3ZlUm90YXRlKGV2ZW50KSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoTW92ZVJvdGF0ZScgKTtcbiAgICAgIHJvdGF0ZUVuZC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XG4gICAgICByb3RhdGVEZWx0YS5zdWJWZWN0b3JzKHJvdGF0ZUVuZCwgcm90YXRlU3RhcnQpO1xuICAgICAgdmFyIGVsZW1lbnQgPSBfdGhpcy5kb21FbGVtZW50ID09PSBkb2N1bWVudCA/IF90aGlzLmRvbUVsZW1lbnQuYm9keSA6IF90aGlzLmRvbUVsZW1lbnQ7IC8vIHJvdGF0aW5nIGFjcm9zcyB3aG9sZSBzY3JlZW4gZ29lcyAzNjAgZGVncmVlcyBhcm91bmRcblxuICAgICAgcm90YXRlTGVmdCgyICogTWF0aC5QSSAqIHJvdGF0ZURlbHRhLnggLyBlbGVtZW50LmNsaWVudFdpZHRoICogX3RoaXMucm90YXRlU3BlZWQpOyAvLyByb3RhdGluZyB1cCBhbmQgZG93biBhbG9uZyB3aG9sZSBzY3JlZW4gYXR0ZW1wdHMgdG8gZ28gMzYwLCBidXQgbGltaXRlZCB0byAxODBcblxuICAgICAgcm90YXRlVXAoMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS55IC8gZWxlbWVudC5jbGllbnRIZWlnaHQgKiBfdGhpcy5yb3RhdGVTcGVlZCk7XG4gICAgICByb3RhdGVTdGFydC5jb3B5KHJvdGF0ZUVuZCk7XG5cbiAgICAgIF90aGlzLnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlVG91Y2hNb3ZlRG9sbHkgPSBmdW5jdGlvbiBoYW5kbGVUb3VjaE1vdmVEb2xseShldmVudCkge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVUb3VjaE1vdmVEb2xseScgKTtcbiAgICAgIHZhciBkeCA9IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVggLSBldmVudC50b3VjaGVzWzFdLnBhZ2VYO1xuICAgICAgdmFyIGR5ID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWSAtIGV2ZW50LnRvdWNoZXNbMV0ucGFnZVk7XG4gICAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgICAgZG9sbHlFbmQuc2V0KDAsIGRpc3RhbmNlKTtcbiAgICAgIGRvbGx5RGVsdGEuc3ViVmVjdG9ycyhkb2xseUVuZCwgZG9sbHlTdGFydCk7XG4gICAgICBpZiAoZG9sbHlEZWx0YS55ID4gMCkgZG9sbHlPdXQoZ2V0Wm9vbVNjYWxlKCkpO2Vsc2UgaWYgKGRvbGx5RGVsdGEueSA8IDApIGRvbGx5SW4oZ2V0Wm9vbVNjYWxlKCkpO1xuICAgICAgZG9sbHlTdGFydC5jb3B5KGRvbGx5RW5kKTtcblxuICAgICAgX3RoaXMudXBkYXRlKCk7XG4gICAgfTtcblxuICAgIHZhciBoYW5kbGVUb3VjaE1vdmVQYW4gPSBmdW5jdGlvbiBoYW5kbGVUb3VjaE1vdmVQYW4oZXZlbnQpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlVG91Y2hNb3ZlUGFuJyApO1xuICAgICAgcGFuRW5kLnNldChldmVudC50b3VjaGVzWzBdLnBhZ2VYLCBldmVudC50b3VjaGVzWzBdLnBhZ2VZKTtcbiAgICAgIHBhbkRlbHRhLnN1YlZlY3RvcnMocGFuRW5kLCBwYW5TdGFydCk7XG4gICAgICBwYW4ocGFuRGVsdGEueCwgcGFuRGVsdGEueSk7XG4gICAgICBwYW5TdGFydC5jb3B5KHBhbkVuZCk7XG5cbiAgICAgIF90aGlzLnVwZGF0ZSgpO1xuICAgIH07XG4gICAgLy8gZXZlbnQgaGFuZGxlcnMgLSBGU006IGxpc3RlbiBmb3IgZXZlbnRzIGFuZCByZXNldCBzdGF0ZVxuICAgIC8vXG5cblxuICAgIHZhciBvbk1vdXNlRG93biA9IGZ1bmN0aW9uIG9uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgICBpZiAoX3RoaXMuZW5hYmxlZCA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGlmIChldmVudC5idXR0b24gPT09IF90aGlzLm1vdXNlQnV0dG9ucy5PUkJJVCkge1xuICAgICAgICBpZiAoX3RoaXMuZW5hYmxlUm90YXRlID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICBoYW5kbGVNb3VzZURvd25Sb3RhdGUoZXZlbnQpO1xuICAgICAgICBzdGF0ZSA9IFNUQVRFLlJPVEFURTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuYnV0dG9uID09PSBfdGhpcy5tb3VzZUJ1dHRvbnMuWk9PTSkge1xuICAgICAgICBpZiAoX3RoaXMuZW5hYmxlWm9vbSA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgaGFuZGxlTW91c2VEb3duRG9sbHkoZXZlbnQpO1xuICAgICAgICBzdGF0ZSA9IFNUQVRFLkRPTExZO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5idXR0b24gPT09IF90aGlzLm1vdXNlQnV0dG9ucy5QQU4pIHtcbiAgICAgICAgaWYgKF90aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgaGFuZGxlTW91c2VEb3duUGFuKGV2ZW50KTtcbiAgICAgICAgc3RhdGUgPSBTVEFURS5QQU47XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSAhPT0gU1RBVEUuTk9ORSkge1xuICAgICAgICBfdGhpcy5ldmVudEhhbmRsZXIub24oJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlLCBmYWxzZSk7XG5cbiAgICAgICAgX3RoaXMuZXZlbnRIYW5kbGVyLm9uKCdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSk7XG5cbiAgICAgICAgX3RoaXMuZGlzcGF0Y2hFdmVudChzdGFydEV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIG9uTW91c2VNb3ZlID0gZnVuY3Rpb24gb25Nb3VzZU1vdmUoZXZlbnQpIHtcbiAgICAgIGlmIChfdGhpcy5lbmFibGVkID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKHN0YXRlID09PSBTVEFURS5ST1RBVEUpIHtcbiAgICAgICAgaWYgKF90aGlzLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgaGFuZGxlTW91c2VNb3ZlUm90YXRlKGV2ZW50KTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IFNUQVRFLkRPTExZKSB7XG4gICAgICAgIGlmIChfdGhpcy5lbmFibGVab29tID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICBoYW5kbGVNb3VzZU1vdmVEb2xseShldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBTVEFURS5QQU4pIHtcbiAgICAgICAgaWYgKF90aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgaGFuZGxlTW91c2VNb3ZlUGFuKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIG9uTW91c2VVcCA9IGZ1bmN0aW9uIG9uTW91c2VVcChldmVudCkge1xuICAgICAgaWYgKF90aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCwgZmFsc2UpO1xuXG4gICAgICBfdGhpcy5kaXNwYXRjaEV2ZW50KGVuZEV2ZW50KTtcblxuICAgICAgc3RhdGUgPSBTVEFURS5OT05FO1xuICAgIH07XG5cbiAgICB2YXIgb25Nb3VzZVdoZWVsID0gZnVuY3Rpb24gb25Nb3VzZVdoZWVsKGV2ZW50KSB7XG4gICAgICBpZiAoX3RoaXMuZW5hYmxlZCA9PT0gZmFsc2UgfHwgX3RoaXMuZW5hYmxlWm9vbSA9PT0gZmFsc2UgfHwgc3RhdGUgIT09IFNUQVRFLk5PTkUgJiYgc3RhdGUgIT09IFNUQVRFLlJPVEFURSkgcmV0dXJuO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaGFuZGxlTW91c2VXaGVlbChldmVudCk7XG5cbiAgICAgIF90aGlzLmRpc3BhdGNoRXZlbnQoc3RhcnRFdmVudCk7IC8vIG5vdCBzdXJlIHdoeSB0aGVzZSBhcmUgaGVyZS4uLlxuXG5cbiAgICAgIF90aGlzLmRpc3BhdGNoRXZlbnQoZW5kRXZlbnQpO1xuICAgIH07XG5cbiAgICB2YXIgb25LZXlEb3duID0gZnVuY3Rpb24gb25LZXlEb3duKGV2ZW50KSB7XG4gICAgICBpZiAoX3RoaXMuZW5hYmxlZCA9PT0gZmFsc2UgfHwgX3RoaXMuZW5hYmxlS2V5cyA9PT0gZmFsc2UgfHwgX3RoaXMuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgaGFuZGxlS2V5RG93bihldmVudCk7XG4gICAgfTtcblxuICAgIHZhciBvblRvdWNoU3RhcnQgPSBmdW5jdGlvbiBvblRvdWNoU3RhcnQoZXZlbnQpIHtcbiAgICAgIGlmIChfdGhpcy5lbmFibGVkID09PSBmYWxzZSkgcmV0dXJuO1xuXG4gICAgICBzd2l0Y2ggKGV2ZW50LnRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAvLyBvbmUtZmluZ2VyZWQgdG91Y2g6IHJvdGF0ZVxuICAgICAgICAgIGlmIChfdGhpcy5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgICAgaGFuZGxlVG91Y2hTdGFydFJvdGF0ZShldmVudCk7XG4gICAgICAgICAgc3RhdGUgPSBTVEFURS5UT1VDSF9ST1RBVEU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIC8vIHR3by1maW5nZXJlZCB0b3VjaDogZG9sbHlcbiAgICAgICAgICBpZiAoX3RoaXMuZW5hYmxlWm9vbSA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgICBoYW5kbGVUb3VjaFN0YXJ0RG9sbHkoZXZlbnQpO1xuICAgICAgICAgIHN0YXRlID0gU1RBVEUuVE9VQ0hfRE9MTFk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIC8vIHRocmVlLWZpbmdlcmVkIHRvdWNoOiBwYW5cbiAgICAgICAgICBpZiAoX3RoaXMuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICAgIGhhbmRsZVRvdWNoU3RhcnRQYW4oZXZlbnQpO1xuICAgICAgICAgIHN0YXRlID0gU1RBVEUuVE9VQ0hfUEFOO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgc3RhdGUgPSBTVEFURS5OT05FO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgIT09IFNUQVRFLk5PTkUpIF90aGlzLmRpc3BhdGNoRXZlbnQoc3RhcnRFdmVudCk7XG4gICAgfTtcblxuICAgIHZhciBvblRvdWNoTW92ZSA9IGZ1bmN0aW9uIG9uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgICBpZiAoX3RoaXMuZW5hYmxlZCA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgc3dpdGNoIChldmVudC50b3VjaGVzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgLy8gb25lLWZpbmdlcmVkIHRvdWNoOiByb3RhdGVcbiAgICAgICAgICBpZiAoX3RoaXMuZW5hYmxlUm90YXRlID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICAgIGlmIChzdGF0ZSAhPT0gU1RBVEUuVE9VQ0hfUk9UQVRFKSByZXR1cm47IC8vIGlzIHRoaXMgbmVlZGVkPy4uLlxuXG4gICAgICAgICAgaGFuZGxlVG91Y2hNb3ZlUm90YXRlKGV2ZW50KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgLy8gdHdvLWZpbmdlcmVkIHRvdWNoOiBkb2xseVxuICAgICAgICAgIGlmIChfdGhpcy5lbmFibGVab29tID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICAgIGlmIChzdGF0ZSAhPT0gU1RBVEUuVE9VQ0hfRE9MTFkpIHJldHVybjsgLy8gaXMgdGhpcyBuZWVkZWQ/Li4uXG5cbiAgICAgICAgICBoYW5kbGVUb3VjaE1vdmVEb2xseShldmVudCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIC8vIHRocmVlLWZpbmdlcmVkIHRvdWNoOiBwYW5cbiAgICAgICAgICBpZiAoX3RoaXMuZW5hYmxlUGFuID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICAgIGlmIChzdGF0ZSAhPT0gU1RBVEUuVE9VQ0hfUEFOKSByZXR1cm47IC8vIGlzIHRoaXMgbmVlZGVkPy4uLlxuXG4gICAgICAgICAgaGFuZGxlVG91Y2hNb3ZlUGFuKGV2ZW50KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHN0YXRlID0gU1RBVEUuTk9ORTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIG9uVG91Y2hFbmQgPSBmdW5jdGlvbiBvblRvdWNoRW5kKGV2ZW50KSB7XG4gICAgICBpZiAoX3RoaXMuZW5hYmxlZCA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgX3RoaXMuZGlzcGF0Y2hFdmVudChlbmRFdmVudCk7XG5cbiAgICAgIHN0YXRlID0gU1RBVEUuTk9ORTtcbiAgICB9O1xuXG4gICAgdmFyIG9uQ29udGV4dE1lbnUgPSBmdW5jdGlvbiBvbkNvbnRleHRNZW51KGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07IC8vXG5cblxuICAgIF90aGlzLmV2ZW50SGFuZGxlci5vbignY29udGV4dG1lbnUnLCBvbkNvbnRleHRNZW51LCBmYWxzZSk7XG5cbiAgICBfdGhpcy5ldmVudEhhbmRsZXIub24oJ21vdXNlZG93bicsIG9uTW91c2VEb3duLCBmYWxzZSk7XG5cbiAgICBfdGhpcy5ldmVudEhhbmRsZXIub24oJ3doZWVsJywgb25Nb3VzZVdoZWVsLCBmYWxzZSk7XG5cbiAgICBfdGhpcy5ldmVudEhhbmRsZXIub24oJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQsIGZhbHNlKTtcblxuICAgIF90aGlzLmV2ZW50SGFuZGxlci5vbigndG91Y2hlbmQnLCBvblRvdWNoRW5kLCBmYWxzZSk7XG5cbiAgICBfdGhpcy5ldmVudEhhbmRsZXIub24oJ3RvdWNobW92ZScsIG9uVG91Y2hNb3ZlLCBmYWxzZSk7XG5cbiAgICBfdGhpcy5ldmVudEhhbmRsZXIub24oJ2tleWRvd24nLCBvbktleURvd24sIGZhbHNlKTsgLy8gZm9yY2UgYW4gdXBkYXRlIGF0IHN0YXJ0XG5cblxuICAgIF90aGlzLnVwZGF0ZSgpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoVGhyZWVPcmJpdENvbnRyb2xzLCBbe1xuICAgIGtleTogXCJjZW50ZXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLmNlbnRlciBoYXMgYmVlbiByZW5hbWVkIHRvIC50YXJnZXQnKTtcbiAgICAgIHJldHVybiB0aGlzLnRhcmdldDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibm9ab29tXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub1pvb20gaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVab29tIGluc3RlYWQuJyk7XG4gICAgICByZXR1cm4gIXRoaXMuZW5hYmxlWm9vbTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub1pvb20gaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVab29tIGluc3RlYWQuJyk7XG4gICAgICB0aGlzLmVuYWJsZVpvb20gPSAhdmFsdWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5vUm90YXRlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub1JvdGF0ZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVJvdGF0ZSBpbnN0ZWFkLicpO1xuICAgICAgcmV0dXJuICF0aGlzLmVuYWJsZVJvdGF0ZTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub1JvdGF0ZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVJvdGF0ZSBpbnN0ZWFkLicpO1xuICAgICAgdGhpcy5lbmFibGVSb3RhdGUgPSAhdmFsdWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5vUGFuXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub1BhbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVBhbiBpbnN0ZWFkLicpO1xuICAgICAgcmV0dXJuICF0aGlzLmVuYWJsZVBhbjtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5ub1BhbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZVBhbiBpbnN0ZWFkLicpO1xuICAgICAgdGhpcy5lbmFibGVQYW4gPSAhdmFsdWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5vS2V5c1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9LZXlzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlS2V5cyBpbnN0ZWFkLicpO1xuICAgICAgcmV0dXJuICF0aGlzLmVuYWJsZUtleXM7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9LZXlzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlS2V5cyBpbnN0ZWFkLicpO1xuICAgICAgdGhpcy5lbmFibGVLZXlzID0gIXZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJzdGF0aWNNb3ZpbmdcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLnN0YXRpY01vdmluZyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZURhbXBpbmcgaW5zdGVhZC4nKTtcbiAgICAgIHJldHVybiAhdGhpcy5lbmFibGVEYW1waW5nO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLnN0YXRpY01vdmluZyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZURhbXBpbmcgaW5zdGVhZC4nKTtcbiAgICAgIHRoaXMuZW5hYmxlRGFtcGluZyA9ICF2YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZHluYW1pY0RhbXBpbmdGYWN0b3JcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLmR5bmFtaWNEYW1waW5nRmFjdG9yIGhhcyBiZWVuIHJlbmFtZWQuIFVzZSAuZGFtcGluZ0ZhY3RvciBpbnN0ZWFkLicpO1xuICAgICAgcmV0dXJuIHRoaXMuZGFtcGluZ0ZhY3RvcjtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5keW5hbWljRGFtcGluZ0ZhY3RvciBoYXMgYmVlbiByZW5hbWVkLiBVc2UgLmRhbXBpbmdGYWN0b3IgaW5zdGVhZC4nKTtcbiAgICAgIHRoaXMuZGFtcGluZ0ZhY3RvciA9IHZhbHVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFRocmVlT3JiaXRDb250cm9scywgX0V2ZW50RGlzcGF0Y2hlcik7XG5cbiAgcmV0dXJuIFRocmVlT3JiaXRDb250cm9scztcbn0oRXZlbnREaXNwYXRjaGVyKTtcblxuLyoqXG4gKiBAY2xhc3MgT3JiaXRDb250cm9sc01vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc11cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zLm9iamVjdD1jYW1lcmFdIE9iamVjdCB0byB3aGljaCBjb250cm9scyBhcmUgYXBwbGllZC5cbiAqIEBwYXJhbSB7VEhSRUUuVmVjdG9yM30gW3BhcmFtcy50YXJnZXQ9bmV3IFZlY3RvcjMoKV0gQ29udHJvbHMgY2VudGVyIHZlY3Rvci5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW3BhcmFtcy5mb2xsb3c9ZmFsc2VdIEZvbGxvdyB0aGUgdGFyZ2V0XG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSByZW5kZXJpbmcgbW9kdWxlIGFuZCBwYXNzaW5nIGl0IHRvIEFwcCdzIG1vZHVsZXM8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgbmV3IEVsZW1lbnRNb2R1bGUoKSxcbiAqICAgbmV3IFNjZW5lTW9kdWxlKCksXG4gKiAgIG5ldyBEZWZpbmVNb2R1bGUoJ2NhbWVyYScsIG5ldyBXSFMuUGVyc3BlY3RpdmVDYW1lcmEoe1xuICogICAgIHBvc2l0aW9uOiBuZXcgVEhSRUUuVmVjdG9yMygwLCA2LCAxOCksXG4gKiAgICAgZmFyOiAxMDAwMFxuICogICB9KSksXG4gKiAgIG5ldyBSZW5kZXJpbmdNb2R1bGUoKSxcbiAqICAgbmV3IE9yYml0Q29udHJvbHNNb2R1bGUoKVxuICogXSk7XG4gKi9cblxudmFyIE9yYml0Q29udHJvbHNNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9Db250cm9sc01vZHVsZSkge1xuICBmdW5jdGlvbiBPcmJpdENvbnRyb2xzTW9kdWxlKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgT3JiaXRDb250cm9sc01vZHVsZSk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihPcmJpdENvbnRyb2xzTW9kdWxlKS5jYWxsKHRoaXMsIHBhcmFtcykpO1xuICAgIF90aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgZm9sbG93OiBmYWxzZSxcbiAgICAgIG9iamVjdDogbnVsbCxcbiAgICAgIHRhcmdldDogbmV3IFZlY3RvcjMoKVxuICAgIH0sIHBhcmFtcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoT3JiaXRDb250cm9sc01vZHVsZSwgW3tcbiAgICBrZXk6IFwibWFuYWdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYW5hZ2VyKF9tYW5hZ2VyKSB7XG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKE9yYml0Q29udHJvbHNNb2R1bGUucHJvdG90eXBlKSwgXCJtYW5hZ2VyXCIsIHRoaXMpLmNhbGwodGhpcywgX21hbmFnZXIpO1xuXG4gICAgICB2YXIgX3RoaXMkcGFyYW1zID0gdGhpcy5wYXJhbXMsXG4gICAgICAgICAgb2JqID0gX3RoaXMkcGFyYW1zLm9iamVjdCxcbiAgICAgICAgICBmb2xsb3cgPSBfdGhpcyRwYXJhbXMuZm9sbG93LFxuICAgICAgICAgIHRhcmdldCA9IF90aGlzJHBhcmFtcy50YXJnZXQ7XG4gICAgICB2YXIgb2JqZWN0ID0gb2JqID8gb2JqLm5hdGl2ZSA6IF9tYW5hZ2VyLmdldCgnY2FtZXJhJykubmF0aXZlO1xuICAgICAgdmFyIGNvbnRyb2xzID0gbmV3IFRocmVlT3JiaXRDb250cm9scyhvYmplY3QsIF9tYW5hZ2VyLmdldCgnZWxlbWVudCcpLCBfbWFuYWdlci5oYW5kbGVyKTtcbiAgICAgIHZhciB1cGRhdGVQcm9jZXNzb3IgPSBmb2xsb3cgPyBmdW5jdGlvbiAoYykge1xuICAgICAgICBjb250cm9scy51cGRhdGUoYy5nZXREZWx0YSgpKTtcbiAgICAgICAgY29udHJvbHMudGFyZ2V0LmNvcHkodGFyZ2V0KTtcbiAgICAgIH0gOiBmdW5jdGlvbiAoYykge1xuICAgICAgICBjb250cm9scy51cGRhdGUoYy5nZXREZWx0YSgpKTtcbiAgICAgIH07XG4gICAgICB0aGlzLnNldENvbnRyb2xzKGNvbnRyb2xzKTtcbiAgICAgIHRoaXMuc2V0VXBkYXRlKHVwZGF0ZVByb2Nlc3Nvcik7XG5cbiAgICAgIF9tYW5hZ2VyLnVwZGF0ZSh7XG4gICAgICAgIGNhbWVyYTogZnVuY3Rpb24gY2FtZXJhKF9jYW1lcmEpIHtcbiAgICAgICAgICBpZiAob2JqKSByZXR1cm47XG4gICAgICAgICAgY29udHJvbHMub2JqZWN0ID0gX2NhbWVyYS5uYXRpdmU7XG4gICAgICAgIH0sXG4gICAgICAgIGVsZW1lbnQ6IGZ1bmN0aW9uIGVsZW1lbnQoX2VsZW1lbnQpIHtcbiAgICAgICAgICBjb250cm9scy5kb21FbGVtZW50ID0gX2VsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb250cm9scy50YXJnZXQuY29weSh0YXJnZXQpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKE9yYml0Q29udHJvbHNNb2R1bGUsIF9Db250cm9sc01vZHVsZSk7XG5cbiAgcmV0dXJuIE9yYml0Q29udHJvbHNNb2R1bGU7XG59KENvbnRyb2xzTW9kdWxlKTtcblxuLyoqIEBtb2R1bGUgbW9kdWxlcy9hcHAvY29udHJvbHMgKi9cblxuLyoqIEBtb2R1bGUgbW9kdWxlcy9hcHAgKi9cblxuLyoqXG4gKiBAY2xhc3MgRHluYW1pY0dlb21ldHJ5TW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9tZXNoXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcz17YXR0cmlidXRlczogZmFsc2V9XSAtIHBhcmFtc1xuICogQHBhcmFtIHtCb29sZWFufSBbcGF0Y2hFdmVudHM9dHJ1ZV1cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9tZXNoXG4gKi9cbnZhciBEeW5hbWljR2VvbWV0cnlNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBEeW5hbWljR2VvbWV0cnlNb2R1bGUoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBEeW5hbWljR2VvbWV0cnlNb2R1bGUpO1xuXG4gICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGF0dHJpYnV0ZXM6IGZhbHNlXG4gICAgfSwgcGFyYW1zKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKER5bmFtaWNHZW9tZXRyeU1vZHVsZSwgW3tcbiAgICBrZXk6IFwiaW50ZWdyYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVncmF0ZShzZWxmKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgcGFyYW1zID0gc2VsZi5wYXJhbXM7XG5cbiAgICAgIHRoaXMuZ18gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgICAgIGlmICh0aGlzLmJ1aWxkR2VvbWV0cnkpIHtcbiAgICAgICAgICB0aGlzLm5hdGl2ZS5nZW9tZXRyeSA9IHRoaXMuYnVpbGRHZW9tZXRyeSh0aGlzLnVwZGF0ZVBhcmFtcyh7XG4gICAgICAgICAgICBnZW9tZXRyeTogcGFyYW1zXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAocGFyYW1zLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgdmFyIF9sb29wID0gZnVuY3Rpb24gX2xvb3Aoa2V5KSB7XG4gICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF90aGlzLCBcImdfXCIuY29uY2F0KGtleSksIHtcbiAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlLmdlb21ldHJ5LnBhcmFtZXRlcnNba2V5XTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZS5nZW9tZXRyeSA9IHRoaXMuYnVpbGRHZW9tZXRyeSh0aGlzLnVwZGF0ZVBhcmFtcyh7XG4gICAgICAgICAgICAgICAgICBnZW9tZXRyeTogZGVmaW5lUHJvcGVydHkkMyh7fSwga2V5LCB2YWx1ZSlcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLnBhcmFtcy5nZW9tZXRyeSkge1xuICAgICAgICAgIF9sb29wKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRHluYW1pY0dlb21ldHJ5TW9kdWxlO1xufSgpO1xuXG52YXIgbG9hZGVyID0gbmV3IFRleHR1cmVMb2FkZXIoKTtcbi8qKlxuICogQGNsYXNzIFRleHR1cmVNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL21lc2hcbiAqIEBkZXNjcmlwdGlvbiBBIFRleHR1cmVNb2R1bGUgY2FuIGJlIGFwcGxpZWQgdG8gYW55IE1lc2ggb3IgTW9kZWwuXG4gKiBAcGFyYW0ge0FycmF5fSBbdGV4dHVyZXNdIC0gYXJyYXkgb2YgdGV4dHVyZSBvYmplY3RzXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvbWVzaFxuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYW4gaW5zdGFuY2UuIHVybCB0YWtlcyBhIHBhdGgsIG9yIGEgZGF0YSBvYmplY3QuPC9jYXB0aW9uPlxuICogdmFyIHdvb2RUZXh0dXJlID0gbmV3IFRleHR1cmVNb2R1bGUoe1xuICogICB1cmw6IGAke3Byb2Nlc3MuYXNzZXRzUGF0aH0vdGV4dHVyZXMvd29vZC5qcGdgXG4gKiB9KTtcbiAqIEBleGFtcGxlIDxjYXB0aW9uPk1vcmUgY29tcHJlaGVuc2l2ZSBleGFtcGxlLCB3b29kIHRleHR1cmUgYXBwbGllZCB0byBhIEJveC48L2NhcHRpb24+XG4gKiBuZXcgQm94KHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICB3aWR0aDogMixcbiAqICAgICBoZWlnaHQ6IDIsXG4gKiAgICAgZGVwdGg6IDJcbiAqICAgfSxcbiAqICAgbW9kdWxlczogW1xuICogICAgIG5ldyBUZXh0dXJlTW9kdWxlKHtcbiAqICAgICAgIHVybDogYHBhdGgvdG8vdGV4dHVyZS5qcGdgLFxuICogICAgICAgcmVwZWF0OiBuZXcgVEhSRUUuVmVjdG9yMigxLCAxKSAvLyBvcHRpb25hbFxuICogICAgIH0pXG4gKiAgIF0sXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqICAgcG9zaXRpb246IFs1MCwgNjAsIDcwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgVGV4dHVyZU1vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGNyZWF0ZUNsYXNzKFRleHR1cmVNb2R1bGUsIG51bGwsIFt7XG4gICAga2V5OiBcImxvYWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbG9hZCh1cmwpIHtcbiAgICAgIHJldHVybiBuZXcgVGV4dHVyZU1vZHVsZSh7XG4gICAgICAgIHVybDogdXJsXG4gICAgICB9KS50ZXh0dXJlc1swXVsxXTtcbiAgICB9XG4gIH1dKTtcblxuICBmdW5jdGlvbiBUZXh0dXJlTW9kdWxlKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0dXJlTW9kdWxlKTtcblxuICAgIGRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyh0aGlzLCBcInRleHR1cmVzXCIsIFtdKSwgXCJicmlkZ2VcIiwge1xuICAgICAgbWF0ZXJpYWw6IGZ1bmN0aW9uIG1hdGVyaWFsKF9tYXRlcmlhbCwgc2VsZikge1xuICAgICAgICBzZWxmLnRleHR1cmVzLmZvckVhY2goZnVuY3Rpb24gKHRleHR1cmUpIHtcbiAgICAgICAgICBfbWF0ZXJpYWxbdGV4dHVyZVswXV0gPSB0ZXh0dXJlWzFdO1xuICAgICAgICB9KTtcbiAgICAgICAgX21hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIF9tYXRlcmlhbDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCB0ZXh0dXJlcyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIHRleHR1cmVzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHRleHR1cmVzLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciB1cmwgPSBfcmVmLnVybCxcbiAgICAgICAgICBfcmVmJHR5cGUgPSBfcmVmLnR5cGUsXG4gICAgICAgICAgdHlwZSA9IF9yZWYkdHlwZSA9PT0gdm9pZCAwID8gJ21hcCcgOiBfcmVmJHR5cGUsXG4gICAgICAgICAgX3JlZiRvZmZzZXQgPSBfcmVmLm9mZnNldCxcbiAgICAgICAgICBvZmZzZXQgPSBfcmVmJG9mZnNldCA9PT0gdm9pZCAwID8gbmV3IFZlY3RvcjIoMCwgMCkgOiBfcmVmJG9mZnNldCxcbiAgICAgICAgICBfcmVmJHJlcGVhdCA9IF9yZWYucmVwZWF0LFxuICAgICAgICAgIHJlcGVhdCA9IF9yZWYkcmVwZWF0ID09PSB2b2lkIDAgPyBuZXcgVmVjdG9yMigxLCAxKSA6IF9yZWYkcmVwZWF0LFxuICAgICAgICAgIF9yZWYkd3JhcCA9IF9yZWYud3JhcCxcbiAgICAgICAgICB3cmFwID0gX3JlZiR3cmFwID09PSB2b2lkIDAgPyBSZXBlYXRXcmFwcGluZyA6IF9yZWYkd3JhcCxcbiAgICAgICAgICBfcmVmJG1hcHBpbmcgPSBfcmVmLm1hcHBpbmcsXG4gICAgICAgICAgbWFwcGluZyA9IF9yZWYkbWFwcGluZyA9PT0gdm9pZCAwID8gVVZNYXBwaW5nIDogX3JlZiRtYXBwaW5nLFxuICAgICAgICAgIF9yZWYkZml4ID0gX3JlZi5maXgsXG4gICAgICAgICAgZml4ID0gX3JlZiRmaXggPT09IHZvaWQgMCA/IGZ1bmN0aW9uICh0ZXgpIHtcbiAgICAgICAgcmV0dXJuIHRleDtcbiAgICAgIH0gOiBfcmVmJGZpeDtcbiAgICAgIHZhciB0ZXh0dXJlID0gbG9hZGVyLmxvYWQodXJsKTtcblxuICAgICAgaWYgKHdyYXAubGVuZ3RoID4gMCkge1xuICAgICAgICB0ZXh0dXJlLndyYXBTID0gd3JhcFswXTtcbiAgICAgICAgdGV4dHVyZS53cmFwVCA9IHdyYXBbMV07XG4gICAgICB9IGVsc2UgdGV4dHVyZS53cmFwUyA9IHRleHR1cmUud3JhcFQgPSB3cmFwO1xuXG4gICAgICB0ZXh0dXJlLm1hcHBpbmcgPSBtYXBwaW5nO1xuICAgICAgdGV4dHVyZS5vZmZzZXQuY29weShvZmZzZXQpO1xuICAgICAgdGV4dHVyZS5yZXBlYXQuY29weShyZXBlYXQpO1xuICAgICAgdGV4dHVyZS5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xuICAgICAgdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI7XG5cbiAgICAgIF90aGlzLnRleHR1cmVzLnB1c2goW3R5cGUsIGZpeCh0ZXh0dXJlKV0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIFRleHR1cmVNb2R1bGU7XG59KCk7XG5cbi8qKlxuICogQGNsYXNzIEFuaW1hdGlvbk1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvbWVzaFxuICogQGRlc2NyaXB0aW9uIENvbnZlbmllbmNlIG1vZHVsZSB0aGF0IHdyYXBzIHRoZSA8YSBocmVmPSdodHRwczovL3RocmVlanMub3JnL2RvY3MvI21hbnVhbC9pbnRyb2R1Y3Rpb24vQW5pbWF0aW9uLXN5c3RlbSc+dGhyZWUuanMgYW5pbWF0aW9uIHN5c3RlbTwvYT5cbiAqIEBwYXJhbSB7QXBwfSBhcHAgLSB0aGUgYXBwXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtpc0RlZmVycmVkPWZhbHNlXSAtIHNldCB0byB0cnVlIGlmIGFuaW1hdGlvbiBzaG91bGQgbm90IHN0YXJ0IGF1dG9tYXRpY2FsbHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtzcGVlZDogMX1dIC0gdGhlIHBhcmFtc1xuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL21lc2hcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0ZSBhbmltYXRpb24gbW9kdWxlIGFuZCBwbGF5IGEgZ2l2ZW4gY2xpcCBvZiBhbiBpbXBvcnRlZCBtb2RlbDwvY2FwdGlvbj5cbiAqIGNvbnN0IGFuaW1hdGlvbk1vZHVsZSA9IG5ldyBBbmltYXRpb25Nb2R1bGUoYXBwLCBmYWxzZSwge1xuICogICBzcGVlZDogMS4yIC8vIHNwZWVkIHVwIGFuaW1hdGlvbiBieSAyMCVcbiAqIH0pO1xuICpcbiAqIG5ldyBJbXBvcnRlcih7XG4gKiAgIHBhcnNlcihnZW9tZXRyeSwgbWF0ZXJpYWxzKSB7XG4gKiAgICAgLy8gT3ZlcnJpZGUgcGFyc2UgdG8gZ2VuZXJhdGUgYSBza2lubmVkTWVzaCwgbmVlZGVkIGZvciBza2lubmVkIG1vZGVsc1xuICogICAgIHJldHVybiBuZXcgVEhSRUUuU2tpbm5lZE1lc2goZ2VvbWV0cnksIG1hdGVyaWFscyk7XG4gKiAgIH0sXG4gKlxuICogICB1cmw6IGBwYXRoL3RvL21vZGVsLmpzb25gLFxuICogICB1c2VDdXN0b21NYXRlcmlhbDogdHJ1ZSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe1xuICogICAgIHNraW5uaW5nOiB0cnVlXG4gKiAgIH0pLFxuICpcbiAqICAgbW9kdWxlczogW2FuaW1hdGlvbk1vZHVsZV1cbiAqIH0pLmFkZFRvKGFwcCkudGhlbigoKSA9PiB7XG4gKiAgIC8vIGFkZGluZyBtb2RlbCB0byBhcHAgcmV0dXJucyBhIHByb21pc2UsIHNvIHBpcGUgdGhlIGZ1bmN0aW9uIHRvIGtpY2sgb2ZmIHRoZSBhbmltYXRpb24gY2xpcFxuICogICBhbmltYXRpb25Nb2R1bGUucGxheSgnY2xpcE5hbWUnKTtcbiAqIH0pO1xuICovXG5cbnZhciBBbmltYXRpb25Nb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBbmltYXRpb25Nb2R1bGUoYXBwLCBpc0RlZmVycmVkKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBBbmltYXRpb25Nb2R1bGUpO1xuXG4gICAgZGVmaW5lUHJvcGVydHkkMyh0aGlzLCBcImJyaWRnZVwiLCB7XG4gICAgICBtZXNoOiBmdW5jdGlvbiBtZXNoKF9tZXNoLCBzZWxmKSB7XG4gICAgICAgIF9tZXNoLmdlb21ldHJ5LnNrZWxldG9uID0gX21lc2guc2tlbGV0b247XG4gICAgICAgIHNlbGYubWl4ZXIgPSBuZXcgQW5pbWF0aW9uTWl4ZXIoX21lc2guZ2VvbWV0cnkpO1xuICAgICAgICBzZWxmLmNsaXBzID0gX21lc2guZ2VvbWV0cnkuYW5pbWF0aW9ucztcbiAgICAgICAgcmV0dXJuIF9tZXNoO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIHNwZWVkOiAxXG4gICAgfSwgcGFyYW1zKTtcbiAgICB0aGlzLmNsb2NrID0gbmV3IENsb2NrKCk7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgdGhpcy5pc0RlZmVycmVkID0gaXNEZWZlcnJlZDtcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBwbGF5XG4gICAqIEBpbnN0YW5jZVxuICAgKiBAZGVzY3JpcHRpb24gUGxheXMgdGhlIGdpdmVuIGNsaXAgbmFtZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2xpcE5hbWUgLSB0aGUgY2xpcCB0byBwbGF5XG4gICAqIEByZXR1cm4ge1RIUkVFLkFuaW1hdGlvbkFjdGlvbn0gUGxheWluZyBhY3Rpb24gXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9tZXNoLkFuaW1hdGlvbk1vZHVsZVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEFuaW1hdGlvbk1vZHVsZSwgW3tcbiAgICBrZXk6IFwicGxheVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwbGF5KGNsaXBOYW1lKSB7XG4gICAgICB2YXIgY2xpcCA9IEFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSh0aGlzLmNsaXBzLCBjbGlwTmFtZSk7XG4gICAgICByZXR1cm4gdGhpcy5taXhlci5jbGlwQWN0aW9uKGNsaXApLnBsYXkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlIHRoZSBtaXhlciAoYmVpbmcgY2FsbGVkIG9uIGZyYW1lIGFuaW1hdGlvbiBsb29wKVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9tZXNoLkFuaW1hdGlvbk1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLm1peGVyKSB0aGlzLm1peGVyLnVwZGF0ZSh0aGlzLmNsb2NrLmdldERlbHRhKCkgKiB0aGlzLnBhcmFtcy5zcGVlZCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVncmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlZ3JhdGUoc2VsZikge1xuICAgICAgc2VsZi5sb29wID0gbmV3IExvb3AoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLnVwZGF0ZSgpO1xuICAgICAgfSk7XG4gICAgICBpZiAoIXNlbGYuaXNEZWZlcnJlZCkgc2VsZi5sb29wLnN0YXJ0KHNlbGYuYXBwKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFuYWdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYW5hZ2VyKF9tYW5hZ2VyKSB7XG4gICAgICBfbWFuYWdlci5kZWZpbmUoJ2FuaW1hdGlvbicpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBBbmltYXRpb25Nb2R1bGU7XG59KCk7XG5cbi8qKiBAbW9kdWxlIG1vZHVsZXMvbWVzaCAqL1xuXG4vKipcbiAqIEBjbGFzcyBEZWZpbmVNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+IENyZWF0aW5nIGEgRGVmaW5lTW9kdWxlIHdpdGggUGVyc3BlY3RpdmVDYW1lcmEgYXMgY2FtZXJhIG1vZHVsZSBhbmQgcGFzc2luZyBpdCB0byBBcHAncyBtb2R1bGVzPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIC8vIC4uLlxuICogICBuZXcgRGVmaW5lTW9kdWxlKCdjYW1lcmEnLCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKSlcbiAqIF0pO1xuICovXG52YXIgRGVmaW5lTW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRGVmaW5lTW9kdWxlKG5hbWUsIGRhdGEpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBEZWZpbmVNb2R1bGUpO1xuXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoRGVmaW5lTW9kdWxlLCBbe1xuICAgIGtleTogXCJtYW5hZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hbmFnZXIoX21hbmFnZXIpIHtcbiAgICAgIF9tYW5hZ2VyLnNldCh0aGlzLm5hbWUsIHRoaXMuZGF0YSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIERlZmluZU1vZHVsZTtcbn0oKTtcblxuLyoqIEBtb2R1bGUgbW9kdWxlcyAqL1xuXG52YXIgTW9kZWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9JbXBvcnRlcikge1xuICBmdW5jdGlvbiBNb2RlbChwYXJhbXMpIHtcbiAgICB2YXIgX2dldFByb3RvdHlwZU9mMjtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1vZGVsKTtcblxuICAgIGNvbnNvbGUud2FybignTW9kZWwgaXMgZGVwcmVjYXRlZC4gVXNlIEltcG9ydGVyIGluc3RlYWQuJyk7XG5cbiAgICBpZiAocGFyYW1zLmdlb21ldHJ5KSB7XG4gICAgICBwYXJhbXMudXJsID0gcGFyYW1zLmdlb21ldHJ5LnBhdGg7XG4gICAgICBwYXJhbXMubG9hZGVyID0gcGFyYW1zLmdlb21ldHJ5LmxvYWRlcjtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYWRkaXRpb25hbCA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhZGRpdGlvbmFsW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoX2dldFByb3RvdHlwZU9mMiA9IGdldFByb3RvdHlwZU9mJDIoTW9kZWwpKS5jYWxsLmFwcGx5KF9nZXRQcm90b3R5cGVPZjIsIFt0aGlzLCBwYXJhbXNdLmNvbmNhdChhZGRpdGlvbmFsKSkpO1xuICB9XG5cbiAgaW5oZXJpdHMoTW9kZWwsIF9JbXBvcnRlcik7XG5cbiAgcmV0dXJuIE1vZGVsO1xufShJbXBvcnRlcik7XG52YXIgQ2FtZXJhTW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ2FtZXJhTW9kdWxlKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FtZXJhTW9kdWxlKTtcblxuICAgIGNvbnNvbGUud2FybignQ2FtZXJhTW9kdWxlIGlzIGRlcHJlY2F0ZWQuIFVzZSBEZWZpbmVNb2R1bGUgaW5zdGVhZC4nKTtcbiAgICB0aGlzLmNhbWVyYSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSQxKHBhcmFtcyk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhDYW1lcmFNb2R1bGUsIFt7XG4gICAga2V5OiBcImludGVncmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlZ3JhdGUoc2VsZikge1xuICAgICAgdGhpcy5hZGQoc2VsZi5jYW1lcmEpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYW5hZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hbmFnZXIoX21hbmFnZXIpIHtcbiAgICAgIF9tYW5hZ2VyLnNldCgnY2FtZXJhJywgdGhpcy5jYW1lcmEpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDYW1lcmFNb2R1bGU7XG59KCk7XG5cbi8qKlxuICogTmFtZXNwYWNlIGNvbnRhaW5pbmcgYWxsIGNsYXNzZXMgZnJvbSBhbGwgbW9kdWxlcy4gVXNlZCBhcyBnbG9iYWwgaW4gVU1EIHBhdHRlcm4uXG4gKiBAbmFtZXNwYWNlIFdIU1xuICogQGV4YW1wbGUgPGNhcHRpb24+VGhlIHVzZSBvZiBXSFMgbmFtZXNwYWNlLjwvY2FwdGlvbj5cbiAqIG5ldyBXSFMuQXBwKCkgLy8gY29yZVxuICogbmV3IFdIUy5QZXJzcGVjdGl2ZUNhbWVyYSgpIC8vIGNvbXBvbmVudHNcbiAqIG5ldyBXSFMuUmVzaXplTW9kdWxlKCkgLy8gbW9kdWxlc1xuICogV0hTLmV4dGVuZCgpIC8vIHV0aWxzXG4gKi9cblxuZXhwb3J0IHsgQ29tcG9uZW50LCBNZXNoQ29tcG9uZW50LCBMaWdodENvbXBvbmVudCwgQ2FtZXJhQ29tcG9uZW50LCBBcHAsIExvb3AsIE1vZHVsZU1hbmFnZXIsIEFtYmllbnRMaWdodCQxIGFzIEFtYmllbnRMaWdodCwgRGlyZWN0aW9uYWxMaWdodCQxIGFzIERpcmVjdGlvbmFsTGlnaHQsIEhlbWlzcGhlcmVMaWdodCQxIGFzIEhlbWlzcGhlcmVMaWdodCwgUG9pbnRMaWdodCQxIGFzIFBvaW50TGlnaHQsIFNwb3RMaWdodCQxIGFzIFNwb3RMaWdodCwgQXJlYUxpZ2h0LCBDdWJlQ2FtZXJhJDEgYXMgQ3ViZUNhbWVyYSwgT3J0aG9ncmFwaGljQ2FtZXJhJDEgYXMgT3J0aG9ncmFwaGljQ2FtZXJhLCBQZXJzcGVjdGl2ZUNhbWVyYSQxIGFzIFBlcnNwZWN0aXZlQ2FtZXJhLCBCb3gsIENpcmNsZSwgQ29uZSwgQ3lsaW5kZXIsIERvZGVjYWhlZHJvbiwgRXh0cnVkZSwgSWNvc2FoZWRyb24sIExhdGhlLCBMaW5lJDEgYXMgTGluZSwgSW1wb3J0ZXIsIE9jdGFoZWRyb24sIFBhcmFtZXRyaWMsIFBsYW5lJDEgYXMgUGxhbmUsIFBvbHloZWRyb24sIFJpbmcsIFNoYXBlJDEgYXMgU2hhcGUsIFNwaGVyZSQxIGFzIFNwaGVyZSwgVGV0cmFoZWRyb24sIFRleHQsIFRvcnVzLCBUb3J1c2tub3QsIFR1YmUsIEdyb3VwJDEgYXMgR3JvdXAsIGV4dGVuZCwgaW5zdHJ1Y3QsIHRyYW5zZm9ybURhdGEsIHRvQXJyYXksIEVsZW1lbnRNb2R1bGUsIFJlbmRlcmluZ01vZHVsZSwgU2NlbmVNb2R1bGUsIFJlc2l6ZU1vZHVsZSwgUG9zdFByb2Nlc3Nvck1vZHVsZSwgVmlydHVhbE1vdXNlTW9kdWxlLCBFdmVudHNQYXRjaE1vZHVsZSwgQ29udHJvbHNNb2R1bGUsIEZvZ01vZHVsZSwgU3RhdGVNb2R1bGUsIE9yYml0Q29udHJvbHNNb2R1bGUsIER5bmFtaWNHZW9tZXRyeU1vZHVsZSwgVGV4dHVyZU1vZHVsZSwgQW5pbWF0aW9uTW9kdWxlLCBEZWZpbmVNb2R1bGUsIE1vZGVsLCBDYW1lcmFNb2R1bGUgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdocy5tb2R1bGUuanMubWFwXG4iLCIvLyBzdGF0cy5qcyAtIGh0dHA6Ly9naXRodWIuY29tL21yZG9vYi9zdGF0cy5qc1xuKGZ1bmN0aW9uKGYsZSl7XCJvYmplY3RcIj09PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6XCJmdW5jdGlvblwiPT09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoZSk6Zi5TdGF0cz1lKCl9KSh0aGlzLGZ1bmN0aW9uKCl7dmFyIGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGEpe2MuYXBwZW5kQ2hpbGQoYS5kb20pO3JldHVybiBhfWZ1bmN0aW9uIHUoYSl7Zm9yKHZhciBkPTA7ZDxjLmNoaWxkcmVuLmxlbmd0aDtkKyspYy5jaGlsZHJlbltkXS5zdHlsZS5kaXNwbGF5PWQ9PT1hP1wiYmxvY2tcIjpcIm5vbmVcIjtsPWF9dmFyIGw9MCxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Yy5zdHlsZS5jc3NUZXh0PVwicG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO2N1cnNvcjpwb2ludGVyO29wYWNpdHk6MC45O3otaW5kZXg6MTAwMDBcIjtjLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKTtcbnUoKytsJWMuY2hpbGRyZW4ubGVuZ3RoKX0sITEpO3ZhciBrPShwZXJmb3JtYW5jZXx8RGF0ZSkubm93KCksZz1rLGE9MCxyPWUobmV3IGYuUGFuZWwoXCJGUFNcIixcIiMwZmZcIixcIiMwMDJcIikpLGg9ZShuZXcgZi5QYW5lbChcIk1TXCIsXCIjMGYwXCIsXCIjMDIwXCIpKTtpZihzZWxmLnBlcmZvcm1hbmNlJiZzZWxmLnBlcmZvcm1hbmNlLm1lbW9yeSl2YXIgdD1lKG5ldyBmLlBhbmVsKFwiTUJcIixcIiNmMDhcIixcIiMyMDFcIikpO3UoMCk7cmV0dXJue1JFVklTSU9OOjE2LGRvbTpjLGFkZFBhbmVsOmUsc2hvd1BhbmVsOnUsYmVnaW46ZnVuY3Rpb24oKXtrPShwZXJmb3JtYW5jZXx8RGF0ZSkubm93KCl9LGVuZDpmdW5jdGlvbigpe2ErKzt2YXIgYz0ocGVyZm9ybWFuY2V8fERhdGUpLm5vdygpO2gudXBkYXRlKGMtaywyMDApO2lmKGM+ZysxRTMmJihyLnVwZGF0ZSgxRTMqYS8oYy1nKSwxMDApLGc9YyxhPTAsdCkpe3ZhciBkPXBlcmZvcm1hbmNlLm1lbW9yeTt0LnVwZGF0ZShkLnVzZWRKU0hlYXBTaXplL1xuMTA0ODU3NixkLmpzSGVhcFNpemVMaW1pdC8xMDQ4NTc2KX1yZXR1cm4gY30sdXBkYXRlOmZ1bmN0aW9uKCl7az10aGlzLmVuZCgpfSxkb21FbGVtZW50OmMsc2V0TW9kZTp1fX07Zi5QYW5lbD1mdW5jdGlvbihlLGYsbCl7dmFyIGM9SW5maW5pdHksaz0wLGc9TWF0aC5yb3VuZCxhPWcod2luZG93LmRldmljZVBpeGVsUmF0aW98fDEpLHI9ODAqYSxoPTQ4KmEsdD0zKmEsdj0yKmEsZD0zKmEsbT0xNSphLG49NzQqYSxwPTMwKmEscT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO3Eud2lkdGg9cjtxLmhlaWdodD1oO3Euc3R5bGUuY3NzVGV4dD1cIndpZHRoOjgwcHg7aGVpZ2h0OjQ4cHhcIjt2YXIgYj1xLmdldENvbnRleHQoXCIyZFwiKTtiLmZvbnQ9XCJib2xkIFwiKzkqYStcInB4IEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmXCI7Yi50ZXh0QmFzZWxpbmU9XCJ0b3BcIjtiLmZpbGxTdHlsZT1sO2IuZmlsbFJlY3QoMCwwLHIsaCk7Yi5maWxsU3R5bGU9ZjtiLmZpbGxUZXh0KGUsdCx2KTtcbmIuZmlsbFJlY3QoZCxtLG4scCk7Yi5maWxsU3R5bGU9bDtiLmdsb2JhbEFscGhhPS45O2IuZmlsbFJlY3QoZCxtLG4scCk7cmV0dXJue2RvbTpxLHVwZGF0ZTpmdW5jdGlvbihoLHcpe2M9TWF0aC5taW4oYyxoKTtrPU1hdGgubWF4KGssaCk7Yi5maWxsU3R5bGU9bDtiLmdsb2JhbEFscGhhPTE7Yi5maWxsUmVjdCgwLDAscixtKTtiLmZpbGxTdHlsZT1mO2IuZmlsbFRleHQoZyhoKStcIiBcIitlK1wiIChcIitnKGMpK1wiLVwiK2coaykrXCIpXCIsdCx2KTtiLmRyYXdJbWFnZShxLGQrYSxtLG4tYSxwLGQsbSxuLWEscCk7Yi5maWxsUmVjdChkK24tYSxtLGEscCk7Yi5maWxsU3R5bGU9bDtiLmdsb2JhbEFscGhhPS45O2IuZmlsbFJlY3QoZCtuLWEsbSxhLGcoKDEtaC93KSpwKSl9fX07cmV0dXJuIGZ9KTtcbiIsImltcG9ydCB7TG9vcH0gZnJvbSAnd2hzJztcbmltcG9ydCBTdGF0cyBmcm9tICdzdGF0cy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRzTW9kdWxlIHtcbiAgc3RhdGljIGNvZGVzID0ge1xuICAgIGZwczogMCxcbiAgICBtczogMSxcbiAgICBtYjogMixcbiAgICBjdXN0b206IDNcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGNvZGUgPSAwKSB7XG4gICAgdGhpcy5zdGF0cyA9IG5ldyBTdGF0cygpO1xuICAgIHRoaXMuc3RhdHMuc2hvd1BhbmVsKGNvZGUpO1xuICB9XG5cbiAgbWFuYWdlcihtYW5hZ2VyKSB7XG4gICAgbWFuYWdlci5nZXQoJ2NvbnRhaW5lcicpLmFwcGVuZENoaWxkKHRoaXMuc3RhdHMuZG9tKTtcbiAgICBtYW5hZ2VyLmFkZCgnc3RhdHMnLCB0aGlzLnN0YXRzLCB7YWxpYXM6ICckc3RhdHMnfSk7XG4gIH1cblxuICBpbnRlZ3JhdGUoc2VsZikge1xuICAgIGNvbnN0IHN0YXRzID0gc2VsZi5zdGF0cztcblxuICAgIGNvbnN0IHByZVByb2Nlc3MgPSBuZXcgTG9vcCgoKSA9PiBzdGF0cy5iZWdpbigpKTtcbiAgICBjb25zdCBwb3N0UHJvY2VzcyA9IG5ldyBMb29wKCgpID0+IHN0YXRzLmVuZCgpKTtcblxuICAgIHRoaXMubG9vcHMudW5zaGlmdChwcmVQcm9jZXNzKTtcbiAgICB0aGlzLmxvb3BzLnB1c2gocG9zdFByb2Nlc3MpO1xuXG4gICAgLy8gUGF0Y2ggbWV0aG9kXG4gICAgc2VsZi5hZGRMb29wID0gZnVuY3Rpb24gKGxvb3ApIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgaWYgKHRoaXMubG9vcHNbdGhpcy5sb29wcy5sZW5ndGggLSAxXSA9PT0gcG9zdFByb2Nlc3MpIHRoaXMubG9vcHMucG9wKCk7XG4gICAgICAgIHRoaXMubG9vcHMucHVzaChsb29wKTtcbiAgICAgICAgdGhpcy5sb29wcy5wdXNoKHBvc3RQcm9jZXNzKTtcbiAgICAgICAgcmVzb2x2ZShsb29wKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcmVQcm9jZXNzLnN0YXJ0KCk7XG4gICAgcG9zdFByb2Nlc3Muc3RhcnQoKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbImZuIiwibW9kdWxlIiwiZXhwb3J0cyIsImNyZWF0ZUNvbW1vbmpzTW9kdWxlIiwiZ2xvYmFsIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiT3AiLCJoYXNPd25Qcm9wZXJ0eSIsIlN5bWJvbCIsIiRTeW1ib2wiLCJpdGVyYXRvciIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZ1RhZyIsInJlZ2VuZXJhdG9yUnVudGltZSIsInJ1bnRpbWUiLCJpbk1vZHVsZSIsImlubmVyRm4iLCJvdXRlckZuIiwic2VsZiIsInRyeUxvY3NMaXN0IiwiR2VuZXJhdG9yIiwiY3JlYXRlIiwicHJvdG9HZW5lcmF0b3IiLCJnZW5lcmF0b3IiLCJfaW52b2tlIiwibWFrZUludm9rZU1ldGhvZCIsImNvbnRleHQiLCJ3cmFwIiwib2JqIiwiYXJnIiwidHlwZSIsImNhbGwiLCJlcnIiLCJJdGVyYXRvclByb3RvdHlwZSIsIml0ZXJhdG9yU3ltYm9sIiwiZ2V0UHJvdG90eXBlT2YiLCJnZXRQcm90byIsInZhbHVlcyIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwiaGFzT3duIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdwIiwiY29uc3RydWN0b3IiLCJ0b1N0cmluZ1RhZ1N5bWJvbCIsImRpc3BsYXlOYW1lIiwiZm9yRWFjaCIsIm1ldGhvZCIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJnZW5GdW4iLCJjdG9yIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiX19hd2FpdCIsInJlc29sdmUiLCJyZWplY3QiLCJ0cnlDYXRjaCIsInJlY29yZCIsInJlc3VsdCIsInZhbHVlIiwidGhlbiIsImludm9rZSIsInVud3JhcHBlZCIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiZW5xdWV1ZSIsImRlZmluZUl0ZXJhdG9yTWV0aG9kcyIsIkFzeW5jSXRlcmF0b3IiLCJhc3luY0l0ZXJhdG9yU3ltYm9sIiwiYXN5bmMiLCJpdGVyIiwibmV4dCIsImRvbmUiLCJHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0Iiwic3RhdGUiLCJHZW5TdGF0ZUV4ZWN1dGluZyIsIkdlblN0YXRlQ29tcGxldGVkIiwiZGVsZWdhdGUiLCJtYXliZUludm9rZURlbGVnYXRlIiwiZGVsZWdhdGVSZXN1bHQiLCJDb250aW51ZVNlbnRpbmVsIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkIiwidW5kZWZpbmVkIiwicmV0dXJuIiwiaW5mbyIsInJlc3VsdE5hbWUiLCJuZXh0TG9jIiwidG9TdHJpbmciLCJsb2NzIiwidHJ5TG9jIiwiZW50cnkiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwiY29tcGxldGlvbiIsInB1c2hUcnlFbnRyeSIsInJlc2V0Iiwia2V5cyIsIm9iamVjdCIsImtleSIsInJldmVyc2UiLCJsZW5ndGgiLCJwb3AiLCJpdGVyYWJsZSIsIml0ZXJhdG9yTWV0aG9kIiwiaXNOYU4iLCJpIiwiZG9uZVJlc3VsdCIsIkNvbnRleHQiLCJza2lwVGVtcFJlc2V0IiwicHJldiIsInJlc2V0VHJ5RW50cnkiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJyb290RW50cnkiLCJyb290UmVjb3JkIiwicnZhbCIsImV4Y2VwdGlvbiIsImxvYyIsImNhdWdodCIsImhhc0NhdGNoIiwiaGFzRmluYWxseSIsImZpbmFsbHlFbnRyeSIsImNvbXBsZXRlIiwiZmluaXNoIiwiZGVsZWdhdGVZaWVsZCIsIkZ1bmN0aW9uIiwiZyIsImdldE93blByb3BlcnR5TmFtZXMiLCJpbmRleE9mIiwiaGFkUnVudGltZSIsIm9sZFJ1bnRpbWUiLCJlIiwicnVudGltZU1vZHVsZSIsIk1hdGgiLCJjZWlsIiwiZmxvb3IiLCJpdCIsIlRPX1NUUklORyIsInRoYXQiLCJwb3MiLCJTdHJpbmciLCJfZGVmaW5lZCIsIl90b0ludGVnZXIiLCJzIiwiYiIsImwiLCJhIiwiY2hhckNvZGVBdCIsIndpbmRvdyIsIl9fZyIsInZlcnNpb24iLCJfX2UiLCJjb3JlIiwiX2NvcmUiLCJfYUZ1bmN0aW9uIiwiYyIsImFwcGx5IiwiYXJndW1lbnRzIiwiX2lzT2JqZWN0IiwiZXhlYyIsIl9mYWlscyIsImRlZmluZVByb3BlcnR5IiwiZ2V0IiwiX2dsb2JhbCIsImRvY3VtZW50IiwiZG9jdW1lbnQkMSIsImNyZWF0ZUVsZW1lbnQiLCJfZGVzY3JpcHRvcnMiLCJfZG9tQ3JlYXRlIiwiUyIsInZhbCIsInZhbHVlT2YiLCJPIiwiUCIsIkF0dHJpYnV0ZXMiLCJfYW5PYmplY3QiLCJfdG9QcmltaXRpdmUiLCJfaWU4RG9tRGVmaW5lIiwiZiIsImJpdG1hcCIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIl9wcm9wZXJ0eURlc2MiLCJzb3VyY2UiLCIkZXhwb3J0IiwiRiIsIkciLCJCIiwiVyIsIklTX0dMT0JBTCIsIlBST1RPVFlQRSIsIklTX1NUQVRJQyIsIm93biIsIm91dCIsIklTX0ZPUkNFRCIsInRhcmdldCIsIl9oYXMiLCJJU19CSU5EIiwiX2N0eCIsIklTX1dSQVAiLCJDIiwiSVNfUFJPVE8iLCJ2aXJ0dWFsIiwiUiIsImV4cFByb3RvIiwiX2hpZGUiLCJVIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJzcGxpdCIsIm1pbiIsIm1heCIsImluZGV4IiwibWluJDEiLCJJU19JTkNMVURFUyIsIiR0aGlzIiwiZWwiLCJmcm9tSW5kZXgiLCJfdG9Jb2JqZWN0IiwiX3RvTGVuZ3RoIiwiX3RvQWJzb2x1dGVJbmRleCIsIlNIQVJFRCIsInN0b3JlIiwibW9kZSIsIl9saWJyYXJ5IiwiY29weXJpZ2h0IiwicmFuZG9tIiwiY29uY2F0IiwiaWQiLCJweCIsIl9zaGFyZWQiLCJzaGFyZWQiLCJfdWlkIiwiX2FycmF5SW5jbHVkZXMiLCJfc2hhcmVkS2V5IiwibmFtZXMiLCJJRV9QUk9UTyIsImFycmF5SW5kZXhPZiIsIl9lbnVtQnVnS2V5cyIsImRlZmluZVByb3BlcnRpZXMiLCJQcm9wZXJ0aWVzIiwiX29iamVjdEtleXMiLCJfb2JqZWN0RHAiLCJkb2N1bWVudCQyIiwiZG9jdW1lbnRFbGVtZW50IiwiaWZyYW1lIiwic3R5bGUiLCJkaXNwbGF5IiwiX2h0bWwiLCJhcHBlbmRDaGlsZCIsInNyYyIsImlmcmFtZURvY3VtZW50IiwiY29udGVudFdpbmRvdyIsIm9wZW4iLCJ3cml0ZSIsImx0IiwiZ3QiLCJjbG9zZSIsImNyZWF0ZURpY3QiLCJQUk9UT1RZUEUkMSIsIkVtcHR5IiwiSUVfUFJPVE8kMSIsIl9vYmplY3REcHMiLCJVU0VfU1lNQk9MIiwiJGV4cG9ydHMiLCJfd2tzIiwidGFnIiwic3RhdCIsIlRBRyIsImRlZiIsIkNvbnN0cnVjdG9yIiwiTkFNRSIsIl9vYmplY3RDcmVhdGUiLCJfc2V0VG9TdHJpbmdUYWciLCJfdG9PYmplY3QiLCJJRV9QUk9UTyQyIiwiT2JqZWN0UHJvdG8iLCJCYXNlIiwiREVGQVVMVCIsIklTX1NFVCIsIkZPUkNFRCIsIl9pdGVyQ3JlYXRlIiwia2luZCIsIkJVR0dZIiwiVkFMVUVTIiwicHJvdG8iLCJJVEVSQVRPUiIsIkZGX0lURVJBVE9SIiwiJG5hdGl2ZSIsImdldE1ldGhvZCIsIkRFRl9WQUxVRVMiLCIkZGVmYXVsdCIsImVudHJpZXMiLCIkYW55TmF0aXZlIiwiX29iamVjdEdwbyIsIlZBTFVFU19CVUciLCJfaXRlcmF0b3JzIiwicmV0dXJuVGhpcyIsIm1ldGhvZHMiLCJLRVlTIiwiJGVudHJpZXMiLCJfcmVkZWZpbmUiLCJfZXhwb3J0IiwiX3N0cmluZ0F0IiwiX2l0ZXJEZWZpbmUiLCJpdGVyYXRlZCIsIl90IiwiX2kiLCJwb2ludCIsIiRhdCIsIkFycmF5IiwiX2siLCJBcmd1bWVudHMiLCJET01JdGVyYWJsZXMiLCJDb2xsZWN0aW9uIiwiVE9fU1RSSU5HX1RBRyIsIl9jb2YiLCJUIiwidHJ5R2V0IiwiVEFHJDEiLCJBUkciLCJjYWxsZWUiLCJmb3JiaWRkZW5GaWVsZCIsInJldCIsIkFycmF5UHJvdG8iLCJJVEVSQVRPUiQxIiwiZ2V0SXRlcmF0b3JNZXRob2QiLCJJVEVSQVRPUiQyIiwiX2NsYXNzb2YiLCJjb3JlX2dldEl0ZXJhdG9yTWV0aG9kIiwic3RlcCIsIl9pc0FycmF5SXRlciIsIml0ZXJGbiIsIkJSRUFLIiwiUkVUVVJOIiwiX2l0ZXJDYWxsIiwiRCIsIlNQRUNJRVMiLCJhcmdzIiwicHJvY2VzcyIsInNldEltbWVkaWF0ZSIsImNsZWFySW1tZWRpYXRlIiwiTWVzc2FnZUNoYW5uZWwiLCJEaXNwYXRjaCIsImNoYW5uZWwiLCJwb3J0IiwicXVldWUiLCJldmVudCIsInJ1biIsImRhdGEiLCJzZXRUYXNrIiwiY2xlYXJUYXNrIiwiY291bnRlciIsImRlZmVyIiwibmV4dFRpY2siLCJub3ciLCJwb3J0MiIsInBvcnQxIiwib25tZXNzYWdlIiwibGlzdGVuZXIiLCJwb3N0TWVzc2FnZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJpbXBvcnRTY3JpcHRzIiwiT05SRUFEWVNUQVRFQ0hBTkdFIiwicmVtb3ZlQ2hpbGQiLCJzZXRUaW1lb3V0Iiwic2V0IiwiY2xlYXIiLCJfdGFzayIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJXZWJLaXRNdXRhdGlvbk9ic2VydmVyIiwiUHJvbWlzZSIsInByb2Nlc3MkMSIsImxhc3QiLCJub3RpZnkiLCJpc05vZGUiLCJwYXJlbnQiLCJkb21haW4iLCJleGl0IiwiaGVhZCIsImVudGVyIiwiZmx1c2giLCJPYnNlcnZlciIsIm5hdmlnYXRvciIsInN0YW5kYWxvbmUiLCJjcmVhdGVUZXh0Tm9kZSIsIm9ic2VydmUiLCJub2RlIiwiY2hhcmFjdGVyRGF0YSIsInRvZ2dsZSIsIlByb21pc2UkMSIsInByb21pc2UiLCJtYWNyb3Rhc2siLCJ0YXNrIiwiJCRyZXNvbHZlIiwiJCRyZWplY3QiLCJmJDEiLCJ2IiwidXNlckFnZW50IiwieCIsIl9uZXdQcm9taXNlQ2FwYWJpbGl0eSIsInByb21pc2VDYXBhYmlsaXR5Iiwic2FmZSIsIktFWSIsIlNQRUNJRVMkMSIsIklURVJBVE9SJDMiLCJyaXRlciIsIlNBRkVfQ0xPU0lORyIsInNraXBDbG9zaW5nIiwiYXJyIiwiX21pY3JvdGFzayIsIlR5cGVFcnJvciIsInByb2Nlc3MkMiIsInZlcnNpb25zIiwidjgiLCJQUk9NSVNFIiwibmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5IiwiT3duUHJvbWlzZUNhcGFiaWxpdHkiLCJXcmFwcGVyIiwiJFByb21pc2UiLCJlbXB0eSIsImlzTm9kZSQxIiwiX3VzZXJBZ2VudCIsImlzUmVqZWN0IiwiX24iLCJfYyIsIm1pY3JvdGFzayIsIl92IiwiX3MiLCJyZWFjdGlvbiIsIm9rIiwiZmFpbCIsImV4aXRlZCIsImhhbmRsZXIiLCJfaCIsIm9uSGFuZGxlVW5oYW5kbGVkIiwiVHlwZUVycm9yJDEiLCJpc1RoZW5hYmxlIiwiY2hhaW4iLCJvblVuaGFuZGxlZCIsImlzVW5oYW5kbGVkIiwiY29uc29sZSIsInVuaGFuZGxlZCIsIl9wZXJmb3JtIiwiZW1pdCIsIm9udW5oYW5kbGVkcmVqZWN0aW9uIiwicmVhc29uIiwiZXJyb3IiLCJfYSIsIm9ucmVqZWN0aW9uaGFuZGxlZCIsIl9kIiwiX3ciLCIkcmVzb2x2ZSIsIndyYXBwZXIiLCIkcmVqZWN0IiwiVVNFX05BVElWRSIsImV4ZWN1dG9yIiwiX2FuSW5zdGFuY2UiLCJJbnRlcm5hbCIsIl9yZWRlZmluZUFsbCIsIm9uRnVsZmlsbGVkIiwib25SZWplY3RlZCIsIm5ld1Byb21pc2VDYXBhYmlsaXR5IiwiX3NwZWNpZXNDb25zdHJ1Y3RvciIsIl9zZXRTcGVjaWVzIiwiciIsImNhcGFiaWxpdHkiLCJfaXRlckRldGVjdCIsImFsbCIsIl9mb3JPZiIsInJlbWFpbmluZyIsImFscmVhZHlDYWxsZWQiLCIkaW5kZXgiLCJyYWNlIiwib25GaW5hbGx5IiwiaXNGdW5jdGlvbiIsImNhbGxiYWNrZm4iLCJnZW4iLCJwcm9taXNlJDEiLCJfbmV4dCIsIl90aHJvdyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiZiQyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZ09QRCIsIl9vYmplY3RQaWUiLCJmJDMiLCJleHAiLCJfb2JqZWN0R29wZCIsIl9vYmplY3RTYXAiLCJpc0V4dGVuc2libGUiLCJwcmV2ZW50RXh0ZW5zaW9ucyIsInNldERlc2MiLCJNRVRBIiwidyIsInNldE1ldGEiLCJGUkVFWkUiLCJtZXRhIiwiTkVFRCIsImZhc3RLZXkiLCJnZXRXZWFrIiwib25GcmVlemUiLCJfbWV0YSIsImYkNCIsIl93a3NFeHQiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJmJDUiLCJfb2JqZWN0R29wcyIsImdldFN5bWJvbHMiLCJzeW1ib2xzIiwiaXNFbnVtIiwiaXNBcnJheSIsImhpZGRlbktleXMiLCJmJDYiLCJfb2JqZWN0R29wbiIsInRvU3RyaW5nJDEiLCJnZXRXaW5kb3dOYW1lcyIsImdPUE4iLCJmJDciLCJfb2JqZWN0R29wbkV4dCIsIkpTT04iLCIkSlNPTiIsInN0cmluZ2lmeSIsIlBST1RPVFlQRSQyIiwiUU9iamVjdCIsImZpbmRDaGlsZCIsImRQJDEiLCJnT1BEJDEiLCJPYmplY3RQcm90byQxIiwicHJvdG9EZXNjIiwiQWxsU3ltYm9scyIsInN5bSIsIlVTRV9OQVRJVkUkMSIsIiRkZWZpbmVQcm9wZXJ0eSIsIk9QU3ltYm9scyIsIkhJRERFTiIsIl9lbnVtS2V5cyIsIiRkZWZpbmVQcm9wZXJ0aWVzIiwiRSIsImdPUE4kMSIsIklTX09QIiwiJHNldCIsInNldFN5bWJvbERlc2MiLCJzZXR0ZXIiLCIkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDEiLCIkZ2V0T3duUHJvcGVydHlOYW1lcyIsIiRwcm9wZXJ0eUlzRW51bWVyYWJsZSIsIiRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJqIiwiZXM2U3ltYm9scyIsImsiLCJ3ZWxsS25vd25TeW1ib2xzIiwiX3drc0RlZmluZSIsIlN5bWJvbFJlZ2lzdHJ5Iiwia2V5Rm9yIiwiaXNTeW1ib2wiLCJ1c2VTZXR0ZXIiLCJ1c2VTaW1wbGUiLCIkY3JlYXRlIiwiX3N0cmluZ2lmeSIsIiRyZXBsYWNlciIsInJlcGxhY2VyIiwiX2lzQXJyYXkiLCJUT19QUklNSVRJVkUiLCJkZXNjIiwiZGVmaW5lUHJvcGVydHkkMSIsImRlZmluZVByb3BlcnR5JDIiLCJfZGVmaW5lUHJvcGVydHkiLCJrZXlzJDEiLCJvd25LZXlzIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzJDEiLCJmaWx0ZXIiLCJkZWZpbmVQcm9wZXJ0eSQzIiwiX29iamVjdFNwcmVhZCIsImluc3RhbmNlIiwiX2NsYXNzQ2FsbENoZWNrIiwidGVzdCIsImJ1Z2d5IiwiY2hlY2siLCJfc2V0UHJvdG8iLCJvIiwicCIsIl9zZXRQcm90b3R5cGVPZiIsInNldFByb3RvdHlwZU9mJDEiLCJzdWJDbGFzcyIsInN1cGVyQ2xhc3MiLCJzZXRQcm90b3R5cGVPZiQyIiwiX2luaGVyaXRzIiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiX2RlZmluZVByb3BlcnRpZXMiLCJfY3JlYXRlQ2xhc3MiLCJzeW1ib2wiLCJfdHlwZW9mMiIsInN5bWJvbCQxIiwiaXRlcmF0b3IkMSIsIl90eXBlb2YiLCJfYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwiX3R5cGVvZl8xIiwiX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJfZ2V0UHJvdG90eXBlT2YiLCJnZXRQcm90b3R5cGVPZiQxIiwiZXh0ZW5zaW9ucyIsIl9sZW4iLCJfa2V5IiwiZXh0ZW5zaW9uIiwiX3N0ZXAiLCJfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uIiwiX2l0ZXJhdG9yIiwicHJvcCIsImV4dGVuZCIsIl9kaWRJdGVyYXRvckVycm9yIiwiX2l0ZXJhdG9yRXJyb3IiLCJhcnJheSIsImluc3RBcnJheSIsInRlbXBPYmplY3QiLCJndWlkZSIsImluc3RydWN0aW9ucyIsImluc3RydWN0IiwidHJhbnNmb3JtRGF0YSIsIk51bWJlciIsIkVQU0lMT04iLCJwb3ciLCJpc0ludGVnZXIiLCJpc0Zpbml0ZSIsInNpZ24iLCJtYXRjaCIsImFzc2lnbiIsIm5leHRLZXkiLCJvdXRwdXQiLCJFdmVudERpc3BhdGNoZXIiLCJfbGlzdGVuZXJzIiwibGlzdGVuZXJzIiwiaGFzRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJsaXN0ZW5lckFycmF5Iiwic3BsaWNlIiwiZGlzcGF0Y2hFdmVudCIsIkxFRlQiLCJNSURETEUiLCJSSUdIVCIsIkRFRzJSQUQiLCJQSSIsIlJBRDJERUciLCJnZW5lcmF0ZVVVSUQiLCJsdXQiLCJkMCIsImQxIiwiZDIiLCJkMyIsInRvVXBwZXJDYXNlIiwiY2xhbXAiLCJldWNsaWRlYW5Nb2R1bG8iLCJuIiwibSIsIm1hcExpbmVhciIsImExIiwiYTIiLCJiMSIsImIyIiwibGVycCIsInkiLCJ0Iiwic21vb3Roc3RlcCIsInNtb290aGVyc3RlcCIsInJhbmRJbnQiLCJsb3ciLCJoaWdoIiwicmFuZEZsb2F0IiwicmFuZEZsb2F0U3ByZWFkIiwicmFuZ2UiLCJkZWdUb1JhZCIsImRlZ3JlZXMiLCJfTWF0aCIsInJhZFRvRGVnIiwicmFkaWFucyIsImlzUG93ZXJPZlR3byIsImNlaWxQb3dlck9mVHdvIiwibG9nIiwiTE4yIiwiZmxvb3JQb3dlck9mVHdvIiwiVmVjdG9yMiIsImlzVmVjdG9yMiIsInNldFNjYWxhciIsInNjYWxhciIsInNldFgiLCJzZXRZIiwic2V0Q29tcG9uZW50IiwiZ2V0Q29tcG9uZW50IiwiY2xvbmUiLCJjb3B5IiwiYWRkIiwid2FybiIsImFkZFZlY3RvcnMiLCJhZGRTY2FsYXIiLCJhZGRTY2FsZWRWZWN0b3IiLCJzdWIiLCJzdWJWZWN0b3JzIiwic3ViU2NhbGFyIiwibXVsdGlwbHkiLCJtdWx0aXBseVNjYWxhciIsImRpdmlkZSIsImRpdmlkZVNjYWxhciIsImFwcGx5TWF0cml4MyIsImVsZW1lbnRzIiwiY2xhbXBTY2FsYXIiLCJtaW5WYWwiLCJtYXhWYWwiLCJjbGFtcExlbmd0aCIsInJvdW5kIiwicm91bmRUb1plcm8iLCJuZWdhdGUiLCJkb3QiLCJsZW5ndGhTcSIsInNxcnQiLCJtYW5oYXR0YW5MZW5ndGgiLCJhYnMiLCJub3JtYWxpemUiLCJhbmdsZSIsImF0YW4yIiwiZGlzdGFuY2VUbyIsImRpc3RhbmNlVG9TcXVhcmVkIiwiZHkiLCJkeCIsIm1hbmhhdHRhbkRpc3RhbmNlVG8iLCJzZXRMZW5ndGgiLCJhbHBoYSIsImxlcnBWZWN0b3JzIiwidjEiLCJ2MiIsImVxdWFscyIsImZyb21BcnJheSIsIm9mZnNldCIsInRvQXJyYXkiLCJmcm9tQnVmZmVyQXR0cmlidXRlIiwiYXR0cmlidXRlIiwiZ2V0WCIsImdldFkiLCJyb3RhdGVBcm91bmQiLCJjZW50ZXIiLCJjb3MiLCJzaW4iLCJNYXRyaXg0IiwiaXNNYXRyaXg0IiwibjExIiwibjEyIiwibjEzIiwibjE0IiwibjIxIiwibjIyIiwibjIzIiwibjI0IiwibjMxIiwibjMyIiwibjMzIiwibjM0IiwibjQxIiwibjQyIiwibjQzIiwibjQ0IiwidGUiLCJpZGVudGl0eSIsIm1lIiwiY29weVBvc2l0aW9uIiwiZXh0cmFjdEJhc2lzIiwieEF4aXMiLCJ5QXhpcyIsInpBeGlzIiwic2V0RnJvbU1hdHJpeENvbHVtbiIsIm1ha2VCYXNpcyIsInoiLCJleHRyYWN0Um90YXRpb24iLCJzY2FsZVgiLCJzY2FsZVkiLCJzY2FsZVoiLCJtYWtlUm90YXRpb25Gcm9tRXVsZXIiLCJldWxlciIsImlzRXVsZXIiLCJkIiwib3JkZXIiLCJhZiIsImJlIiwiYmYiLCJhZSIsImNmIiwiZGUiLCJkZiIsImNlIiwiYWQiLCJiYyIsImJkIiwiYWMiLCJtYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiIsInEiLCJfeCIsIl95IiwiX3oiLCJ5MiIsInoyIiwieDIiLCJ4eSIsInh6IiwieXoiLCJ6eiIsInd5Iiwid3oiLCJ5eSIsInh4Iiwid3giLCJsb29rQXQiLCJleWUiLCJ1cCIsImNyb3NzVmVjdG9ycyIsIm11bHRpcGx5TWF0cmljZXMiLCJwcmVtdWx0aXBseSIsImExMiIsImExMyIsImExNCIsImEyMiIsImEyMyIsImEyNCIsImEzMiIsImEzMyIsImEzNCIsImE0MiIsImE0MyIsImE0NCIsImIxMiIsImIxMyIsImIxNCIsImIyMiIsImIyMyIsImIyNCIsImIzMiIsImIzMyIsImIzNCIsImI0MiIsImI0MyIsImI0NCIsImExMSIsImIxMSIsImIyMSIsImIzMSIsImI0MSIsImEyMSIsImEzMSIsImE0MSIsImFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUiLCJjb3VudCIsImdldFoiLCJhcHBseU1hdHJpeDQiLCJzZXRYWVoiLCJkZXRlcm1pbmFudCIsInRyYW5zcG9zZSIsInRtcCIsInNldFBvc2l0aW9uIiwiZ2V0SW52ZXJzZSIsInRocm93T25EZWdlbmVyYXRlIiwidDExIiwidDEyIiwidDEzIiwidDE0IiwiZGV0IiwibXNnIiwiZGV0SW52Iiwic2NhbGUiLCJnZXRNYXhTY2FsZU9uQXhpcyIsInNjYWxlWFNxIiwic2NhbGVZU3EiLCJzY2FsZVpTcSIsIm1ha2VUcmFuc2xhdGlvbiIsIm1ha2VSb3RhdGlvblgiLCJ0aGV0YSIsIm1ha2VSb3RhdGlvblkiLCJtYWtlUm90YXRpb25aIiwibWFrZVJvdGF0aW9uQXhpcyIsImF4aXMiLCJ0eSIsInR4IiwibWFrZVNjYWxlIiwibWFrZVNoZWFyIiwiY29tcG9zZSIsInBvc2l0aW9uIiwicXVhdGVybmlvbiIsImRlY29tcG9zZSIsInZlY3RvciIsInN4IiwibWF0cml4Iiwic3kiLCJzeiIsImludlNYIiwiaW52U1kiLCJpbnZTWiIsInNldEZyb21Sb3RhdGlvbk1hdHJpeCIsIm1ha2VQZXJzcGVjdGl2ZSIsImxlZnQiLCJyaWdodCIsInRvcCIsImJvdHRvbSIsIm5lYXIiLCJmYXIiLCJtYWtlT3J0aG9ncmFwaGljIiwiaCIsIlF1YXRlcm5pb24iLCJzbGVycCIsInFhIiwicWIiLCJxbSIsInNsZXJwRmxhdCIsImRzdCIsImRzdE9mZnNldCIsInNyYzAiLCJzcmNPZmZzZXQwIiwic3JjMSIsInNyY09mZnNldDEiLCJ5MCIsInowIiwidzAiLCJ4MSIsInkxIiwiejEiLCJ3MSIsIngwIiwiZGlyIiwic3FyU2luIiwibGVuIiwidERpciIsIm9uQ2hhbmdlQ2FsbGJhY2siLCJzZXRGcm9tRXVsZXIiLCJ1cGRhdGUiLCJzMSIsImMyIiwiYzMiLCJjMSIsInMyIiwiczMiLCJzZXRGcm9tQXhpc0FuZ2xlIiwiaGFsZkFuZ2xlIiwibTExIiwibTEyIiwibTEzIiwibTIxIiwibTIyIiwibTIzIiwibTMxIiwibTMyIiwibTMzIiwidHJhY2UiLCJzZXRGcm9tVW5pdFZlY3RvcnMiLCJ2RnJvbSIsInZUbyIsIkVQUyIsImludmVyc2UiLCJjb25qdWdhdGUiLCJtdWx0aXBseVF1YXRlcm5pb25zIiwicWF5IiwicWF6IiwicWF3IiwicWJ5IiwicWJ6IiwicWJ3IiwicWF4IiwicWJ4IiwiY29zSGFsZlRoZXRhIiwic2luSGFsZlRoZXRhIiwiaGFsZlRoZXRhIiwicmF0aW9CIiwicmF0aW9BIiwib25DaGFuZ2UiLCJjYWxsYmFjayIsIlZlY3RvcjMiLCJpc1ZlY3RvcjMiLCJzZXRaIiwibXVsdGlwbHlWZWN0b3JzIiwiYXBwbHlFdWxlciIsImFwcGx5UXVhdGVybmlvbiIsImFwcGx5QXhpc0FuZ2xlIiwicXkiLCJxeiIsInF3IiwicXgiLCJpeCIsIml3IiwiaXkiLCJpeiIsInByb2plY3QiLCJjYW1lcmEiLCJwcm9qZWN0aW9uTWF0cml4IiwibWF0cml4V29ybGQiLCJ1bnByb2plY3QiLCJ0cmFuc2Zvcm1EaXJlY3Rpb24iLCJjcm9zcyIsImF5IiwiYXoiLCJieSIsImJ6IiwiYngiLCJheCIsInByb2plY3RPblZlY3RvciIsInByb2plY3RPblBsYW5lIiwicGxhbmVOb3JtYWwiLCJyZWZsZWN0Iiwibm9ybWFsIiwiYW5nbGVUbyIsImFjb3MiLCJkeiIsInNldEZyb21TcGhlcmljYWwiLCJwaGkiLCJyYWRpdXMiLCJzaW5QaGlSYWRpdXMiLCJzZXRGcm9tQ3lsaW5kcmljYWwiLCJzZXRGcm9tTWF0cml4UG9zaXRpb24iLCJzZXRGcm9tTWF0cml4U2NhbGUiLCJNYXRyaXgzIiwiaXNNYXRyaXgzIiwic2V0RnJvbU1hdHJpeDQiLCJnZXROb3JtYWxNYXRyaXgiLCJtYXRyaXg0IiwidHJhbnNwb3NlSW50b0FycmF5Iiwic2V0VXZUcmFuc2Zvcm0iLCJyb3RhdGlvbiIsImN4IiwiY3kiLCJyb3RhdGUiLCJ0cmFuc2xhdGUiLCJpbWFnZSIsIm1hcHBpbmciLCJ3cmFwUyIsIndyYXBUIiwibWFnRmlsdGVyIiwibWluRmlsdGVyIiwiZm9ybWF0IiwiYW5pc290cm9weSIsImVuY29kaW5nIiwidGV4dHVyZUlkIiwidXVpZCIsIlRleHR1cmUiLCJERUZBVUxUX0lNQUdFIiwibWlwbWFwcyIsIkRFRkFVTFRfTUFQUElORyIsIkNsYW1wVG9FZGdlV3JhcHBpbmciLCJMaW5lYXJGaWx0ZXIiLCJMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIiLCJSR0JBRm9ybWF0IiwiVW5zaWduZWRCeXRlVHlwZSIsInJlcGVhdCIsIm1hdHJpeEF1dG9VcGRhdGUiLCJnZW5lcmF0ZU1pcG1hcHMiLCJwcmVtdWx0aXBseUFscGhhIiwiZmxpcFkiLCJ1bnBhY2tBbGlnbm1lbnQiLCJMaW5lYXJFbmNvZGluZyIsIm9uVXBkYXRlIiwiVVZNYXBwaW5nIiwiaXNUZXh0dXJlIiwidXBkYXRlTWF0cml4IiwidG9KU09OIiwiaXNSb290T2JqZWN0IiwidGV4dHVyZXMiLCJjYW52YXMiLCJjcmVhdGVFbGVtZW50TlMiLCJ3aWR0aCIsImhlaWdodCIsImdldENvbnRleHQiLCJwdXRJbWFnZURhdGEiLCJkcmF3SW1hZ2UiLCJ0b0RhdGFVUkwiLCJtZXRhZGF0YSIsImltYWdlcyIsInVybCIsImdldERhdGFVUkwiLCJkaXNwb3NlIiwidHJhbnNmb3JtVXYiLCJ1diIsIlZlY3RvcjQiLCJpc1ZlY3RvcjQiLCJzZXRXIiwic2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24iLCJzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXgiLCJlcHNpbG9uIiwiZXBzaWxvbjIiLCJnZXRXIiwib3B0aW9ucyIsInNjaXNzb3IiLCJzY2lzc29yVGVzdCIsInZpZXdwb3J0IiwidGV4dHVyZSIsImRlcHRoQnVmZmVyIiwic3RlbmNpbEJ1ZmZlciIsImRlcHRoVGV4dHVyZSIsIldlYkdMUmVuZGVyVGFyZ2V0IiwiaXNXZWJHTFJlbmRlclRhcmdldCIsInNldFNpemUiLCJhY3RpdmVDdWJlRmFjZSIsImFjdGl2ZU1pcE1hcExldmVsIiwiV2ViR0xSZW5kZXJUYXJnZXRDdWJlIiwiaXNXZWJHTFJlbmRlclRhcmdldEN1YmUiLCJOZWFyZXN0RmlsdGVyIiwiRGF0YVRleHR1cmUiLCJpc0RhdGFUZXh0dXJlIiwiSW5maW5pdHkiLCJCb3gzIiwiaXNCb3gzIiwic2V0RnJvbUFycmF5IiwibWluWCIsIm1pblkiLCJtaW5aIiwibWF4WCIsIm1heFkiLCJtYXhaIiwic2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSIsInNldEZyb21Qb2ludHMiLCJwb2ludHMiLCJtYWtlRW1wdHkiLCJpbCIsImV4cGFuZEJ5UG9pbnQiLCJzZXRGcm9tQ2VudGVyQW5kU2l6ZSIsInNpemUiLCJoYWxmU2l6ZSIsInNldEZyb21PYmplY3QiLCJleHBhbmRCeU9iamVjdCIsImJveCIsImlzRW1wdHkiLCJnZXRDZW50ZXIiLCJnZXRTaXplIiwiZXhwYW5kQnlWZWN0b3IiLCJleHBhbmRCeVNjYWxhciIsImdlb21ldHJ5IiwiaXNHZW9tZXRyeSIsInZlcnRpY2VzIiwic2NvcGUiLCJpc0J1ZmZlckdlb21ldHJ5IiwiYXR0cmlidXRlcyIsInVwZGF0ZU1hdHJpeFdvcmxkIiwidHJhdmVyc2UiLCJjb250YWluc1BvaW50IiwiY29udGFpbnNCb3giLCJnZXRQYXJhbWV0ZXIiLCJpbnRlcnNlY3RzQm94IiwiaW50ZXJzZWN0c1NwaGVyZSIsInNwaGVyZSIsImNsYW1wUG9pbnQiLCJjbG9zZXN0UG9pbnQiLCJpbnRlcnNlY3RzUGxhbmUiLCJwbGFuZSIsImNvbnN0YW50IiwiaW50ZXJzZWN0c1RyaWFuZ2xlIiwiYXhlcyIsInRlc3RBeGlzIiwiZXh0ZW50cyIsInYwIiwicDAiLCJwMSIsInAyIiwidHJpYW5nbGUiLCJmMCIsImYxIiwiZjIiLCJzYXRGb3JBeGVzIiwidHJpYW5nbGVOb3JtYWwiLCJkaXN0YW5jZVRvUG9pbnQiLCJnZXRCb3VuZGluZ1NwaGVyZSIsImludGVyc2VjdCIsInVuaW9uIiwiU3BoZXJlIiwib3B0aW9uYWxDZW50ZXIiLCJtYXhSYWRpdXNTcSIsInJhZGl1c1N1bSIsImRlbHRhTGVuZ3RoU3EiLCJnZXRCb3VuZGluZ0JveCIsIlBsYW5lIiwic2V0Q29tcG9uZW50cyIsInNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50Iiwic2V0RnJvbUNvcGxhbmFyUG9pbnRzIiwiaW52ZXJzZU5vcm1hbExlbmd0aCIsImRpc3RhbmNlVG9TcGhlcmUiLCJwcm9qZWN0UG9pbnQiLCJpbnRlcnNlY3RMaW5lIiwibGluZSIsImRlbHRhIiwiZGlyZWN0aW9uIiwiZGVub21pbmF0b3IiLCJzdGFydCIsImludGVyc2VjdHNMaW5lIiwiZW5kIiwiZW5kU2lnbiIsInN0YXJ0U2lnbiIsImNvcGxhbmFyUG9pbnQiLCJvcHRpb25hbE5vcm1hbE1hdHJpeCIsIm0xIiwibm9ybWFsTWF0cml4IiwicmVmZXJlbmNlUG9pbnQiLCJwMyIsInA0IiwicDUiLCJwbGFuZXMiLCJGcnVzdHVtIiwiZnJ1c3R1bSIsInNldEZyb21NYXRyaXgiLCJtZTEiLCJtZTIiLCJtZTMiLCJtZTUiLCJtZTYiLCJtZTciLCJtZTkiLCJtZTEwIiwibWUxMSIsIm1lMTMiLCJtZTE0IiwibWUxNSIsIm1lMCIsIm1lNCIsIm1lOCIsIm1lMTIiLCJpbnRlcnNlY3RzT2JqZWN0IiwiYm91bmRpbmdTcGhlcmUiLCJjb21wdXRlQm91bmRpbmdTcGhlcmUiLCJpbnRlcnNlY3RzU3ByaXRlIiwic3ByaXRlIiwiZGlzdGFuY2UiLCJuZWdSYWRpdXMiLCJhbHBoYW1hcF9mcmFnbWVudCIsImFscGhhbWFwX3BhcnNfZnJhZ21lbnQiLCJhbHBoYXRlc3RfZnJhZ21lbnQiLCJhb21hcF9mcmFnbWVudCIsImFvbWFwX3BhcnNfZnJhZ21lbnQiLCJiZWdpbl92ZXJ0ZXgiLCJiZWdpbm5vcm1hbF92ZXJ0ZXgiLCJic2RmcyIsImJ1bXBtYXBfcGFyc19mcmFnbWVudCIsImNsaXBwaW5nX3BsYW5lc19mcmFnbWVudCIsImNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50IiwiY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4IiwiY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCIsImNvbG9yX2ZyYWdtZW50IiwiY29sb3JfcGFyc19mcmFnbWVudCIsImNvbG9yX3BhcnNfdmVydGV4IiwiY29sb3JfdmVydGV4IiwiY29tbW9uIiwiY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50IiwiZGVmYXVsdG5vcm1hbF92ZXJ0ZXgiLCJkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXgiLCJkaXNwbGFjZW1lbnRtYXBfdmVydGV4IiwiZW1pc3NpdmVtYXBfZnJhZ21lbnQiLCJlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50IiwiZW5jb2RpbmdzX2ZyYWdtZW50IiwiZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQiLCJlbnZtYXBfZnJhZ21lbnQiLCJlbnZtYXBfcGFyc19mcmFnbWVudCIsImVudm1hcF9wYXJzX3ZlcnRleCIsImVudm1hcF92ZXJ0ZXgiLCJmb2dfdmVydGV4IiwiZm9nX3BhcnNfdmVydGV4IiwiZm9nX2ZyYWdtZW50IiwiZm9nX3BhcnNfZnJhZ21lbnQiLCJncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50IiwibGlnaHRtYXBfZnJhZ21lbnQiLCJsaWdodG1hcF9wYXJzX2ZyYWdtZW50IiwibGlnaHRzX2xhbWJlcnRfdmVydGV4IiwibGlnaHRzX3BhcnNfYmVnaW4iLCJsaWdodHNfcGFyc19tYXBzIiwibGlnaHRzX3Bob25nX2ZyYWdtZW50IiwibGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQiLCJsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQiLCJsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudCIsImxpZ2h0c19mcmFnbWVudF9iZWdpbiIsImxpZ2h0c19mcmFnbWVudF9tYXBzIiwibGlnaHRzX2ZyYWdtZW50X2VuZCIsImxvZ2RlcHRoYnVmX2ZyYWdtZW50IiwibG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCIsImxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4IiwibG9nZGVwdGhidWZfdmVydGV4IiwibWFwX2ZyYWdtZW50IiwibWFwX3BhcnNfZnJhZ21lbnQiLCJtYXBfcGFydGljbGVfZnJhZ21lbnQiLCJtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCIsIm1ldGFsbmVzc21hcF9mcmFnbWVudCIsIm1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50IiwibW9ycGhub3JtYWxfdmVydGV4IiwibW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXgiLCJtb3JwaHRhcmdldF92ZXJ0ZXgiLCJub3JtYWxfZnJhZ21lbnRfYmVnaW4iLCJub3JtYWxfZnJhZ21lbnRfbWFwcyIsIm5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50IiwicGFja2luZyIsInByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQiLCJwcm9qZWN0X3ZlcnRleCIsImRpdGhlcmluZ19mcmFnbWVudCIsImRpdGhlcmluZ19wYXJzX2ZyYWdtZW50Iiwicm91Z2huZXNzbWFwX2ZyYWdtZW50Iiwicm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQiLCJzaGFkb3dtYXBfcGFyc19mcmFnbWVudCIsInNoYWRvd21hcF9wYXJzX3ZlcnRleCIsInNoYWRvd21hcF92ZXJ0ZXgiLCJzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQiLCJza2luYmFzZV92ZXJ0ZXgiLCJza2lubmluZ19wYXJzX3ZlcnRleCIsInNraW5uaW5nX3ZlcnRleCIsInNraW5ub3JtYWxfdmVydGV4Iiwic3BlY3VsYXJtYXBfZnJhZ21lbnQiLCJzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50IiwidG9uZW1hcHBpbmdfZnJhZ21lbnQiLCJ0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50IiwidXZfcGFyc19mcmFnbWVudCIsInV2X3BhcnNfdmVydGV4IiwidXZfdmVydGV4IiwidXYyX3BhcnNfZnJhZ21lbnQiLCJ1djJfcGFyc192ZXJ0ZXgiLCJ1djJfdmVydGV4Iiwid29ybGRwb3NfdmVydGV4IiwiY3ViZV9mcmFnIiwiY3ViZV92ZXJ0IiwiZGVwdGhfZnJhZyIsImRlcHRoX3ZlcnQiLCJkaXN0YW5jZVJHQkFfZnJhZyIsImRpc3RhbmNlUkdCQV92ZXJ0IiwiZXF1aXJlY3RfZnJhZyIsImVxdWlyZWN0X3ZlcnQiLCJsaW5lZGFzaGVkX2ZyYWciLCJsaW5lZGFzaGVkX3ZlcnQiLCJtZXNoYmFzaWNfZnJhZyIsIm1lc2hiYXNpY192ZXJ0IiwibWVzaGxhbWJlcnRfZnJhZyIsIm1lc2hsYW1iZXJ0X3ZlcnQiLCJtZXNocGhvbmdfZnJhZyIsIm1lc2hwaG9uZ192ZXJ0IiwibWVzaHBoeXNpY2FsX2ZyYWciLCJtZXNocGh5c2ljYWxfdmVydCIsIm5vcm1hbF9mcmFnIiwibm9ybWFsX3ZlcnQiLCJwb2ludHNfZnJhZyIsInBvaW50c192ZXJ0Iiwic2hhZG93X2ZyYWciLCJzaGFkb3dfdmVydCIsIm1lcmdlIiwidW5pZm9ybXMiLCJ1IiwibWVyZ2VkIiwidW5pZm9ybXNfc3JjIiwidW5pZm9ybXNfZHN0IiwicGFyYW1ldGVyX3NyYyIsImlzQ29sb3IiLCJzZXRSR0IiLCJDb2xvciIsInNldEhleCIsInNldFN0eWxlIiwiaGV4Iiwic2V0SFNMIiwiaHVlMnJnYiIsInN0cmluZyIsInBhcnNlRmxvYXQiLCJjb2xvciIsImNvbXBvbmVudHMiLCJwYXJzZUludCIsImhhbmRsZUFscGhhIiwiQ29sb3JLZXl3b3JkcyIsImNvcHlHYW1tYVRvTGluZWFyIiwiZ2FtbWFGYWN0b3IiLCJjb3B5TGluZWFyVG9HYW1tYSIsInNhZmVJbnZlcnNlIiwiY29udmVydEdhbW1hVG9MaW5lYXIiLCJjb252ZXJ0TGluZWFyVG9HYW1tYSIsImdldEhleCIsImdldEhleFN0cmluZyIsImdldEhTTCIsInNhdHVyYXRpb24iLCJodWUiLCJsaWdodG5lc3MiLCJnZXRTdHlsZSIsIm9mZnNldEhTTCIsImhzbCIsImFkZENvbG9ycyIsImNvbG9yMSIsImNvbG9yMiIsImRpZmZ1c2UiLCJvcGFjaXR5IiwibWFwIiwidXZUcmFuc2Zvcm0iLCJhbHBoYU1hcCIsInNwZWN1bGFybWFwIiwic3BlY3VsYXJNYXAiLCJlbnZtYXAiLCJlbnZNYXAiLCJmbGlwRW52TWFwIiwicmVmbGVjdGl2aXR5IiwicmVmcmFjdGlvblJhdGlvIiwibWF4TWlwTGV2ZWwiLCJhb21hcCIsImFvTWFwIiwiYW9NYXBJbnRlbnNpdHkiLCJsaWdodG1hcCIsImxpZ2h0TWFwIiwibGlnaHRNYXBJbnRlbnNpdHkiLCJlbWlzc2l2ZW1hcCIsImVtaXNzaXZlTWFwIiwiYnVtcG1hcCIsImJ1bXBNYXAiLCJidW1wU2NhbGUiLCJub3JtYWxtYXAiLCJub3JtYWxNYXAiLCJub3JtYWxTY2FsZSIsImRpc3BsYWNlbWVudG1hcCIsImRpc3BsYWNlbWVudE1hcCIsImRpc3BsYWNlbWVudFNjYWxlIiwiZGlzcGxhY2VtZW50QmlhcyIsInJvdWdobmVzc21hcCIsInJvdWdobmVzc01hcCIsIm1ldGFsbmVzc21hcCIsIm1ldGFsbmVzc01hcCIsImdyYWRpZW50bWFwIiwiZ3JhZGllbnRNYXAiLCJmb2ciLCJmb2dEZW5zaXR5IiwiZm9nTmVhciIsImZvZ0ZhciIsImZvZ0NvbG9yIiwibGlnaHRzIiwiYW1iaWVudExpZ2h0Q29sb3IiLCJkaXJlY3Rpb25hbExpZ2h0cyIsInByb3BlcnRpZXMiLCJzaGFkb3ciLCJzaGFkb3dCaWFzIiwic2hhZG93UmFkaXVzIiwic2hhZG93TWFwU2l6ZSIsImRpcmVjdGlvbmFsU2hhZG93TWFwIiwiZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgiLCJzcG90TGlnaHRzIiwiY29uZUNvcyIsInBlbnVtYnJhQ29zIiwiZGVjYXkiLCJzcG90U2hhZG93TWFwIiwic3BvdFNoYWRvd01hdHJpeCIsInBvaW50TGlnaHRzIiwic2hhZG93Q2FtZXJhTmVhciIsInNoYWRvd0NhbWVyYUZhciIsInBvaW50U2hhZG93TWFwIiwicG9pbnRTaGFkb3dNYXRyaXgiLCJoZW1pc3BoZXJlTGlnaHRzIiwic2t5Q29sb3IiLCJncm91bmRDb2xvciIsInJlY3RBcmVhTGlnaHRzIiwiYmFzaWMiLCJVbmlmb3Jtc1V0aWxzIiwiVW5pZm9ybXNMaWIiLCJ2ZXJ0ZXhTaGFkZXIiLCJTaGFkZXJDaHVuayIsImZyYWdtZW50U2hhZGVyIiwibGFtYmVydCIsImVtaXNzaXZlIiwicGhvbmciLCJzcGVjdWxhciIsInNoaW5pbmVzcyIsInN0YW5kYXJkIiwicm91Z2huZXNzIiwibWV0YWxuZXNzIiwiZW52TWFwSW50ZW5zaXR5IiwiZGFzaGVkIiwiZGFzaFNpemUiLCJ0b3RhbFNpemUiLCJkZXB0aCIsImN1YmUiLCJ0Q3ViZSIsInRGbGlwIiwiZXF1aXJlY3QiLCJ0RXF1aXJlY3QiLCJkaXN0YW5jZVJHQkEiLCJyZWZlcmVuY2VQb3NpdGlvbiIsIm5lYXJEaXN0YW5jZSIsImZhckRpc3RhbmNlIiwiU2hhZGVyTGliIiwicGh5c2ljYWwiLCJjbGVhckNvYXQiLCJjbGVhckNvYXRSb3VnaG5lc3MiLCJnbCIsImJ1ZmZlclR5cGUiLCJkeW5hbWljIiwiRFlOQU1JQ19EUkFXIiwiU1RBVElDX0RSQVciLCJjcmVhdGVCdWZmZXIiLCJiaW5kQnVmZmVyIiwiYnVmZmVyIiwiYnVmZmVyRGF0YSIsInVzYWdlIiwib25VcGxvYWRDYWxsYmFjayIsIkZMT0FUIiwiVU5TSUdORURfU0hPUlQiLCJTSE9SVCIsIlVOU0lHTkVEX0lOVCIsIklOVCIsIkJZVEUiLCJVTlNJR05FRF9CWVRFIiwiYnl0ZXNQZXJFbGVtZW50IiwiQllURVNfUEVSX0VMRU1FTlQiLCJ1cGRhdGVSYW5nZSIsImJ1ZmZlclN1YkRhdGEiLCJzdWJhcnJheSIsImlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUiLCJidWZmZXJzIiwiZGVsZXRlQnVmZmVyIiwiZGVsZXRlIiwidXBkYXRlQnVmZmVyIiwicmVtb3ZlIiwiX29yZGVyIiwiRXVsZXIiLCJEZWZhdWx0T3JkZXIiLCJSb3RhdGlvbk9yZGVycyIsImFzaW4iLCJzZXRGcm9tUXVhdGVybmlvbiIsInNldEZyb21WZWN0b3IzIiwicmVvcmRlciIsIm5ld09yZGVyIiwidG9WZWN0b3IzIiwib3B0aW9uYWxSZXN1bHQiLCJtYXNrIiwiTGF5ZXJzIiwiZW5hYmxlIiwiZGlzYWJsZSIsImxheWVycyIsIm9iamVjdDNESWQiLCJjaGlsZHJlbiIsIk9iamVjdDNEIiwiRGVmYXVsdFVwIiwib25Sb3RhdGlvbkNoYW5nZSIsIm9uUXVhdGVybmlvbkNoYW5nZSIsIm1vZGVsVmlld01hdHJpeCIsIkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlIiwibWF0cml4V29ybGROZWVkc1VwZGF0ZSIsInZpc2libGUiLCJjYXN0U2hhZG93IiwicmVjZWl2ZVNoYWRvdyIsImZydXN0dW1DdWxsZWQiLCJyZW5kZXJPcmRlciIsInVzZXJEYXRhIiwiaXNPYmplY3QzRCIsIm9uQmVmb3JlUmVuZGVyIiwib25BZnRlclJlbmRlciIsImFwcGx5TWF0cml4Iiwic2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlIiwic2V0Um90YXRpb25Gcm9tRXVsZXIiLCJzZXRSb3RhdGlvbkZyb21NYXRyaXgiLCJzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uIiwicm90YXRlT25BeGlzIiwicTEiLCJyb3RhdGVPbldvcmxkQXhpcyIsInJvdGF0ZVgiLCJyb3RhdGVZIiwicm90YXRlWiIsInRyYW5zbGF0ZU9uQXhpcyIsInRyYW5zbGF0ZVgiLCJ0cmFuc2xhdGVZIiwidHJhbnNsYXRlWiIsImxvY2FsVG9Xb3JsZCIsIndvcmxkVG9Mb2NhbCIsImlzQ2FtZXJhIiwiZ2V0T2JqZWN0QnlJZCIsImdldE9iamVjdEJ5UHJvcGVydHkiLCJnZXRPYmplY3RCeU5hbWUiLCJjaGlsZCIsImdldFdvcmxkUG9zaXRpb24iLCJnZXRXb3JsZFF1YXRlcm5pb24iLCJnZXRXb3JsZFNjYWxlIiwiZ2V0V29ybGREaXJlY3Rpb24iLCJyYXljYXN0IiwidHJhdmVyc2VWaXNpYmxlIiwidHJhdmVyc2VBbmNlc3RvcnMiLCJmb3JjZSIsImdlb21ldHJpZXMiLCJtYXRlcmlhbHMiLCJzaGFwZXMiLCJsaWJyYXJ5IiwiZWxlbWVudCIsInNlcmlhbGl6ZSIsInBhcmFtZXRlcnMiLCJzaGFwZSIsIm1hdGVyaWFsIiwidXVpZHMiLCJleHRyYWN0RnJvbUNhY2hlIiwiY2FjaGUiLCJyZWN1cnNpdmUiLCJwYXJzZSIsIm1hdHJpeFdvcmxkSW52ZXJzZSIsIkNhbWVyYSIsInpvb20iLCJ2aWV3IiwidXBkYXRlUHJvamVjdGlvbk1hdHJpeCIsIk9ydGhvZ3JhcGhpY0NhbWVyYSIsImlzT3J0aG9ncmFwaGljQ2FtZXJhIiwic2V0Vmlld09mZnNldCIsImZ1bGxXaWR0aCIsImZ1bGxIZWlnaHQiLCJlbmFibGVkIiwib2Zmc2V0WCIsIm9mZnNldFkiLCJjbGVhclZpZXdPZmZzZXQiLCJzY2FsZVciLCJ6b29tVyIsInNjYWxlSCIsInpvb21IIiwibWF0ZXJpYWxJbmRleCIsInZlcnRleE5vcm1hbHMiLCJ2ZXJ0ZXhDb2xvcnMiLCJGYWNlMyIsImdlb21ldHJ5SWQiLCJjb2xvcnMiLCJmYWNlcyIsImZhY2VWZXJ0ZXhVdnMiLCJtb3JwaFRhcmdldHMiLCJtb3JwaE5vcm1hbHMiLCJza2luV2VpZ2h0cyIsInNraW5JbmRpY2VzIiwibGluZURpc3RhbmNlcyIsImJvdW5kaW5nQm94IiwiZWxlbWVudHNOZWVkVXBkYXRlIiwidmVydGljZXNOZWVkVXBkYXRlIiwidXZzTmVlZFVwZGF0ZSIsIm5vcm1hbHNOZWVkVXBkYXRlIiwiY29sb3JzTmVlZFVwZGF0ZSIsImxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlIiwiZ3JvdXBzTmVlZFVwZGF0ZSIsIkdlb21ldHJ5IiwidmVydGV4IiwiZmFjZSIsImpsIiwiY29tcHV0ZUJvdW5kaW5nQm94IiwiZnJvbUJ1ZmZlckdlb21ldHJ5IiwidXYyIiwidXZzMiIsInBvc2l0aW9ucyIsIm5vcm1hbHMiLCJ0ZW1wTm9ybWFscyIsInV2cyIsInRlbXBVVnMiLCJ0ZW1wVVZzMiIsImdyb3VwcyIsImdyb3VwIiwiaW5kaWNlcyIsImFkZEZhY2UiLCJjb21wdXRlRmFjZU5vcm1hbHMiLCJhYiIsImZsIiwiY2IiLCJ2QyIsInZCIiwidkEiLCJjb21wdXRlVmVydGV4Tm9ybWFscyIsImFyZWFXZWlnaHRlZCIsInZsIiwiY29tcHV0ZUZsYXRWZXJ0ZXhOb3JtYWxzIiwiY29tcHV0ZU1vcnBoTm9ybWFscyIsIl9fb3JpZ2luYWxGYWNlTm9ybWFsIiwiX19vcmlnaW5hbFZlcnRleE5vcm1hbHMiLCJ0bXBHZW8iLCJmYWNlTm9ybWFscyIsImZhY2VOb3JtYWwiLCJkc3ROb3JtYWxzRmFjZSIsImRzdE5vcm1hbHNWZXJ0ZXgiLCJtYXRlcmlhbEluZGV4T2Zmc2V0IiwidmVydGV4T2Zmc2V0IiwidmVydGljZXMxIiwidmVydGljZXMyIiwiZmFjZXMxIiwiZmFjZXMyIiwidXZzMSIsImNvbG9yczEiLCJjb2xvcnMyIiwidmVydGV4Q29weSIsImZhY2VDb3B5IiwiZmFjZVZlcnRleE5vcm1hbHMiLCJmYWNlVmVydGV4Q29sb3JzIiwidXZDb3B5IiwibWVyZ2VNZXNoIiwibWVzaCIsImlzTWVzaCIsIm1lcmdlVmVydGljZXMiLCJjaGFuZ2VzIiwicHJlY2lzaW9uUG9pbnRzIiwicHJlY2lzaW9uIiwidmVydGljZXNNYXAiLCJ1bmlxdWUiLCJmYWNlSW5kaWNlc1RvUmVtb3ZlIiwiaWR4Iiwic29ydEZhY2VzQnlNYXRlcmlhbEluZGV4IiwiX2lkIiwic29ydCIsIm1hdGVyaWFsSW5kZXhTb3J0IiwibmV3VXZzMiIsIm5ld1V2czEiLCJmYWNlVHlwZSIsInNldEJpdCIsImhhc01hdGVyaWFsIiwiaGFzRmFjZVV2IiwiaGFzRmFjZVZlcnRleFV2IiwiaGFzRmFjZU5vcm1hbCIsImhhc0ZhY2VWZXJ0ZXhOb3JtYWwiLCJoYXNGYWNlQ29sb3IiLCJoYXNGYWNlVmVydGV4Q29sb3IiLCJnZXRVdkluZGV4IiwiZ2V0Tm9ybWFsSW5kZXgiLCJnZXRDb2xvckluZGV4Iiwibm9ybWFsc0hhc2giLCJoYXNoIiwiY29sb3JzSGFzaCIsInV2c0hhc2giLCJrbCIsInV2c0NvcHkiLCJtb3JwaFRhcmdldCIsIm1vcnBoTm9ybWFsIiwiZGVzdFZlcnRleE5vcm1hbCIsInNyY1ZlcnRleE5vcm1hbCIsIml0ZW1TaXplIiwibm9ybWFsaXplZCIsIkJ1ZmZlckF0dHJpYnV0ZSIsImlzQnVmZmVyQXR0cmlidXRlIiwic2V0QXJyYXkiLCJzZXREeW5hbWljIiwiY29weUF0IiwiaW5kZXgxIiwiaW5kZXgyIiwiY29weUFycmF5IiwiY29weUNvbG9yc0FycmF5IiwiY29weVZlY3RvcjJzQXJyYXkiLCJ2ZWN0b3JzIiwiY29weVZlY3RvcjNzQXJyYXkiLCJjb3B5VmVjdG9yNHNBcnJheSIsInNldFhZIiwic2V0WFlaVyIsIm9uVXBsb2FkIiwiSW50OEJ1ZmZlckF0dHJpYnV0ZSIsIlVpbnQ4QnVmZmVyQXR0cmlidXRlIiwiVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlIiwiSW50MTZCdWZmZXJBdHRyaWJ1dGUiLCJVaW50MTZCdWZmZXJBdHRyaWJ1dGUiLCJJbnQzMkJ1ZmZlckF0dHJpYnV0ZSIsIlVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSIsIkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUiLCJGbG9hdDY0QnVmZmVyQXR0cmlidXRlIiwiRGlyZWN0R2VvbWV0cnkiLCJjb21wdXRlR3JvdXBzIiwiZnJvbUdlb21ldHJ5IiwibW9ycGhUYXJnZXRzTGVuZ3RoIiwibW9ycGhUYXJnZXRzUG9zaXRpb24iLCJtb3JwaE5vcm1hbHNMZW5ndGgiLCJtb3JwaFRhcmdldHNOb3JtYWwiLCJ2ZXJ0ZXhVdnMiLCJoYXNGYWNlVmVydGV4VXYyIiwiaGFzU2tpbkluZGljZXMiLCJoYXNTa2luV2VpZ2h0cyIsImJ1ZmZlckdlb21ldHJ5SWQiLCJtb3JwaEF0dHJpYnV0ZXMiLCJkcmF3UmFuZ2UiLCJCdWZmZXJHZW9tZXRyeSIsImdldEluZGV4Iiwic2V0SW5kZXgiLCJhcnJheU1heCIsImFkZEF0dHJpYnV0ZSIsImdldEF0dHJpYnV0ZSIsInJlbW92ZUF0dHJpYnV0ZSIsImFkZEdyb3VwIiwiY2xlYXJHcm91cHMiLCJzZXREcmF3UmFuZ2UiLCJuZWVkc1VwZGF0ZSIsImlzUG9pbnRzIiwiaXNMaW5lIiwidXBkYXRlRnJvbU9iamVjdCIsIl9fZGlyZWN0R2VvbWV0cnkiLCJkaXJlY3QiLCJsaW5lRGlzdGFuY2UiLCJmcm9tRGlyZWN0R2VvbWV0cnkiLCJwQiIsInBDIiwicEEiLCJub3JtYWxpemVOb3JtYWxzIiwiYXR0cmlidXRlMSIsImF0dHJpYnV0ZTIiLCJhdHRyaWJ1dGVTaXplIiwiYXR0cmlidXRlQXJyYXkyIiwiYXR0cmlidXRlQXJyYXkxIiwidG9Ob25JbmRleGVkIiwiYXJyYXkyIiwiZ2VvbWV0cnkyIiwibW9ycGhBdHRyaWJ1dGUiLCJ3aWR0aFNlZ21lbnRzIiwiaGVpZ2h0U2VnbWVudHMiLCJkZXB0aFNlZ21lbnRzIiwiQm94R2VvbWV0cnkiLCJidWlsZFBsYW5lIiwidWRpciIsInZkaXIiLCJncmlkWCIsImdyaWRZIiwiZ3JpZFkxIiwic2VnbWVudEhlaWdodCIsImhlaWdodEhhbGYiLCJncmlkWDEiLCJzZWdtZW50V2lkdGgiLCJ3aWR0aEhhbGYiLCJkZXB0aEhhbGYiLCJ2ZXJ0ZXhDb3VudGVyIiwibnVtYmVyT2ZWZXJ0aWNlcyIsImdyb3VwQ291bnQiLCJncm91cFN0YXJ0IiwiQm94QnVmZmVyR2VvbWV0cnkiLCJQbGFuZUdlb21ldHJ5Iiwic2VnbWVudF9oZWlnaHQiLCJoZWlnaHRfaGFsZiIsInNlZ21lbnRfd2lkdGgiLCJ3aWR0aF9oYWxmIiwiUGxhbmVCdWZmZXJHZW9tZXRyeSIsIm1hdGVyaWFsSWQiLCJibGVuZGluZyIsIk5vcm1hbEJsZW5kaW5nIiwic2lkZSIsIkZyb250U2lkZSIsImZsYXRTaGFkaW5nIiwiTm9Db2xvcnMiLCJ0cmFuc3BhcmVudCIsImJsZW5kU3JjIiwiU3JjQWxwaGFGYWN0b3IiLCJibGVuZERzdCIsIk9uZU1pbnVzU3JjQWxwaGFGYWN0b3IiLCJibGVuZEVxdWF0aW9uIiwiQWRkRXF1YXRpb24iLCJibGVuZFNyY0FscGhhIiwiYmxlbmREc3RBbHBoYSIsImJsZW5kRXF1YXRpb25BbHBoYSIsImRlcHRoRnVuYyIsIkxlc3NFcXVhbERlcHRoIiwiZGVwdGhUZXN0IiwiZGVwdGhXcml0ZSIsImNsaXBwaW5nUGxhbmVzIiwiY2xpcEludGVyc2VjdGlvbiIsImNsaXBTaGFkb3dzIiwic2hhZG93U2lkZSIsImNvbG9yV3JpdGUiLCJwb2x5Z29uT2Zmc2V0IiwicG9seWdvbk9mZnNldEZhY3RvciIsInBvbHlnb25PZmZzZXRVbml0cyIsImRpdGhlcmluZyIsImFscGhhVGVzdCIsInByZW11bHRpcGxpZWRBbHBoYSIsIm92ZXJkcmF3IiwiTWF0ZXJpYWwiLCJpc01hdGVyaWFsIiwib25CZWZvcmVDb21waWxlIiwic2V0VmFsdWVzIiwibmV3VmFsdWUiLCJGbGF0U2hhZGluZyIsImN1cnJlbnRWYWx1ZSIsImlzUm9vdCIsImVtaXNzaXZlSW50ZW5zaXR5Iiwic2l6ZUF0dGVudWF0aW9uIiwibGluZXdpZHRoIiwiZ2FwU2l6ZSIsIndpcmVmcmFtZSIsIndpcmVmcmFtZUxpbmV3aWR0aCIsIndpcmVmcmFtZUxpbmVjYXAiLCJ3aXJlZnJhbWVMaW5lam9pbiIsInNraW5uaW5nIiwiZHN0UGxhbmVzIiwic3JjUGxhbmVzIiwiY29tYmluZSIsIk11bHRpcGx5T3BlcmF0aW9uIiwiTWVzaEJhc2ljTWF0ZXJpYWwiLCJpc01lc2hCYXNpY01hdGVyaWFsIiwiZGVmaW5lcyIsImNsaXBwaW5nIiwiZGVyaXZhdGl2ZXMiLCJmcmFnRGVwdGgiLCJkcmF3QnVmZmVycyIsInNoYWRlclRleHR1cmVMT0QiLCJkZWZhdWx0QXR0cmlidXRlVmFsdWVzIiwiaW5kZXgwQXR0cmlidXRlTmFtZSIsInVuaWZvcm1zTmVlZFVwZGF0ZSIsIlNoYWRlck1hdGVyaWFsIiwiaXNTaGFkZXJNYXRlcmlhbCIsIm9yaWdpbiIsIlJheSIsInJheSIsImF0IiwicmVjYXN0IiwiY2xvc2VzdFBvaW50VG9Qb2ludCIsImRpcmVjdGlvbkRpc3RhbmNlIiwiZGlzdGFuY2VTcVRvUG9pbnQiLCJkaXN0YW5jZVNxVG9TZWdtZW50Iiwib3B0aW9uYWxQb2ludE9uUmF5Iiwib3B0aW9uYWxQb2ludE9uU2VnbWVudCIsInNlZ0NlbnRlciIsInNlZ0RpciIsImRpZmYiLCJhMDEiLCJzcXJEaXN0IiwiZXh0RGV0IiwiczAiLCJiMCIsInNlZ0V4dGVudCIsImludkRldCIsImludGVyc2VjdFNwaGVyZSIsInRjYSIsInJhZGl1czIiLCJ0aGMiLCJ0MCIsInQxIiwiZGlzdGFuY2VUb1BsYW5lIiwiaW50ZXJzZWN0UGxhbmUiLCJkaXN0VG9Qb2ludCIsImludGVyc2VjdEJveCIsInRtYXgiLCJ0eW1pbiIsInR5bWF4IiwidHptaW4iLCJ0em1heCIsImludmRpcnkiLCJpbnZkaXJ6IiwiaW52ZGlyeCIsInRtaW4iLCJpbnRlcnNlY3RUcmlhbmdsZSIsImJhY2tmYWNlQ3VsbGluZyIsImVkZ2UxIiwiZWRnZTIiLCJEZE4iLCJEZFF4RTIiLCJEZEUxeFEiLCJRZE4iLCJMaW5lMyIsImRpc3RhbmNlU3EiLCJjbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyIiwiY2xhbXBUb0xpbmUiLCJzdGFydFAiLCJzdGFydEVuZCIsInN0YXJ0RW5kX3N0YXJ0UCIsInN0YXJ0RW5kMiIsIlRyaWFuZ2xlIiwiZ2V0Tm9ybWFsIiwidGFyZ2V0TGVuZ3RoU3EiLCJnZXRCYXJ5Y29vcmQiLCJkb3QwMCIsImRvdDExIiwiZG90MDEiLCJkZW5vbSIsImRvdDAyIiwiZG90MTIiLCJpbnZEZW5vbSIsInNldEZyb21Qb2ludHNBbmRJbmRpY2VzIiwiaTAiLCJpMSIsImkyIiwiZ2V0QXJlYSIsImdldE1pZHBvaW50IiwiZ2V0UGxhbmUiLCJwcm9qZWN0ZWRQb2ludCIsImVkZ2VMaXN0IiwibWluRGlzdGFuY2UiLCJkcmF3TW9kZSIsIlRyaWFuZ2xlc0RyYXdNb2RlIiwidXBkYXRlTW9ycGhUYXJnZXRzIiwiTWVzaCIsInNldERyYXdNb2RlIiwibW9ycGhUYXJnZXRJbmZsdWVuY2VzIiwibW9ycGhUYXJnZXREaWN0aW9uYXJ5IiwibWwiLCJ1djEiLCJ1djMiLCJiYXJ5Y29vcmQiLCJyYXljYXN0ZXIiLCJCYWNrU2lkZSIsIkRvdWJsZVNpZGUiLCJpbnRlcnNlY3Rpb25Qb2ludFdvcmxkIiwiY2hlY2tJbnRlcnNlY3Rpb24iLCJpbnRlcnNlY3Rpb25Qb2ludCIsImludGVyc2VjdGlvbiIsInV2QSIsInV2QiIsInV2QyIsInV2SW50ZXJzZWN0aW9uIiwiZmFjZUluZGV4IiwiaW50ZXJzZWN0cyIsImludmVyc2VNYXRyaXgiLCJjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uIiwiZnZCIiwiZnZDIiwiaXNNdWx0aU1hdGVyaWFsIiwiZmFjZU1hdGVyaWFsIiwiZnZBIiwidGwiLCJtb3JwaEluZmx1ZW5jZXMiLCJpbmZsdWVuY2UiLCJ0ZW1wQSIsInRhcmdldHMiLCJ0ZW1wQiIsInRlbXBDIiwidXZzX2YiLCJyZW5kZXJlciIsInBsYW5lTWVzaCIsInJlbmRlckxpc3QiLCJzY2VuZSIsImZvcmNlQ2xlYXIiLCJiYWNrZ3JvdW5kIiwic2V0Q2xlYXIiLCJjbGVhckNvbG9yIiwiY2xlYXJBbHBoYSIsImF1dG9DbGVhciIsImF1dG9DbGVhckNvbG9yIiwiYXV0b0NsZWFyRGVwdGgiLCJhdXRvQ2xlYXJTdGVuY2lsIiwiaXNDdWJlVGV4dHVyZSIsImJveE1lc2giLCJwbGFuZUNhbWVyYSIsInJlbmRlckJ1ZmZlckRpcmVjdCIsImdldENsZWFyQ29sb3IiLCJzZXRDbGVhckNvbG9yIiwiZ2V0Q2xlYXJBbHBoYSIsInNldENsZWFyQWxwaGEiLCJyZW5kZXIiLCJkcmF3QXJyYXlzIiwiZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFIiwibWF4SW5zdGFuY2VkQ291bnQiLCJzZXRNb2RlIiwicmVuZGVySW5zdGFuY2VzIiwibWF4QW5pc290cm9weSIsIk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCIsImdldFNoYWRlclByZWNpc2lvbkZvcm1hdCIsIlZFUlRFWF9TSEFERVIiLCJISUdIX0ZMT0FUIiwiRlJBR01FTlRfU0hBREVSIiwiTUVESVVNX0ZMT0FUIiwiZ2V0TWF4UHJlY2lzaW9uIiwibWF4UHJlY2lzaW9uIiwibG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciIsIk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTIiwiTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTIiwiTUFYX1RFWFRVUkVfU0laRSIsIk1BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUiLCJNQVhfVkVSVEVYX0FUVFJJQlMiLCJNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyIsIk1BWF9WQVJZSU5HX1ZFQ1RPUlMiLCJNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTIiwibWF4VmVydGV4VGV4dHVyZXMiLCJ2ZXJ0ZXhUZXh0dXJlcyIsImZsb2F0RnJhZ21lbnRUZXh0dXJlcyIsImdldE1heEFuaXNvdHJvcHkiLCJtYXhUZXh0dXJlcyIsIm1heFRleHR1cmVTaXplIiwibWF4Q3ViZW1hcFNpemUiLCJtYXhBdHRyaWJ1dGVzIiwibWF4VmVydGV4VW5pZm9ybXMiLCJtYXhWYXJ5aW5ncyIsIm1heEZyYWdtZW50VW5pZm9ybXMiLCJmbG9hdFZlcnRleFRleHR1cmVzIiwiZ2xvYmFsU3RhdGUiLCJudW1HbG9iYWxQbGFuZXMiLCJsb2NhbENsaXBwaW5nRW5hYmxlZCIsInJlbmRlcmluZ1NoYWRvd3MiLCJ2aWV3Tm9ybWFsTWF0cml4IiwidW5pZm9ybSIsIm51bVBsYW5lcyIsIm51bUludGVyc2VjdGlvbiIsImluaXQiLCJlbmFibGVMb2NhbENsaXBwaW5nIiwicHJvamVjdFBsYW5lcyIsImJlZ2luU2hhZG93cyIsImVuZFNoYWRvd3MiLCJyZXNldEdsb2JhbFN0YXRlIiwic2V0U3RhdGUiLCJmcm9tQ2FjaGUiLCJsR2xvYmFsIiwibkdsb2JhbCIsImRzdEFycmF5IiwiY2xpcHBpbmdTdGF0ZSIsInNraXBUcmFuc2Zvcm0iLCJuUGxhbmVzIiwidmlld01hdHJpeCIsImZsYXRTaXplIiwiaTQiLCJnZXRFeHRlbnNpb24iLCJidWZmZXJnZW9tZXRyeSIsIm9uR2VvbWV0cnlEaXNwb3NlIiwid2lyZWZyYW1lQXR0cmlidXRlcyIsIm1lbW9yeSIsIl9idWZmZXJHZW9tZXRyeSIsIkVMRU1FTlRfQVJSQVlfQlVGRkVSIiwiZ2VvbWV0cnlBdHRyaWJ1dGVzIiwiQVJSQVlfQlVGRkVSIiwiZ2VvbWV0cnlJbmRleCIsImdldFdpcmVmcmFtZUF0dHJpYnV0ZSIsImRyYXdFbGVtZW50cyIsImRyYXdFbGVtZW50c0luc3RhbmNlZEFOR0xFIiwiZnJhbWUiLCJjYWxscyIsInRyaWFuZ2xlcyIsImxpbmVzIiwiaW5zdGFuY2VDb3VudCIsIlRSSUFOR0xFUyIsIlRSSUFOR0xFX1NUUklQIiwiVFJJQU5HTEVfRkFOIiwiTElORVMiLCJMSU5FX1NUUklQIiwiTElORV9MT09QIiwiUE9JTlRTIiwicHJvZ3JhbXMiLCJhdXRvUmVzZXQiLCJwcm9ncmFtIiwib2JqZWN0SW5mbHVlbmNlcyIsImluZmx1ZW5jZXNMaXN0IiwiaW5mbHVlbmNlcyIsImFic051bWVyaWNhbFNvcnQiLCJnZXRVbmlmb3JtcyIsInNldFZhbHVlIiwidXBkYXRlTGlzdCIsIkN1YmVSZWZsZWN0aW9uTWFwcGluZyIsIkN1YmVUZXh0dXJlIiwic2VxIiwibkJsb2NrcyIsImJsb2NrU2l6ZSIsImZpcnN0RWxlbSIsImFycmF5Q2FjaGVGMzIiLCJhcnJheUNhY2hlSTMyIiwiYWxsb2NUZXh0dXJlVW5pdCIsInVuaWZvcm0xZiIsImFkZHIiLCJ1bmlmb3JtMWkiLCJ1bmlmb3JtMmZ2IiwidW5pZm9ybTJmIiwidW5pZm9ybTNmIiwidW5pZm9ybTNmdiIsInVuaWZvcm00ZnYiLCJ1bmlmb3JtNGYiLCJ1bmlmb3JtTWF0cml4MmZ2IiwidW5pZm9ybU1hdHJpeDNmdiIsIm1hdDNhcnJheSIsInVuaWZvcm1NYXRyaXg0ZnYiLCJtYXQ0YXJyYXkiLCJ1bml0Iiwic2V0VGV4dHVyZTJEIiwiZW1wdHlUZXh0dXJlIiwic2V0VGV4dHVyZUN1YmUiLCJlbXB0eUN1YmVUZXh0dXJlIiwidW5pZm9ybTJpdiIsInVuaWZvcm0zaXYiLCJ1bmlmb3JtNGl2IiwidW5pZm9ybTFmdiIsInVuaWZvcm0xaXYiLCJmbGF0dGVuIiwidW5pdHMiLCJhbGxvY1RleFVuaXRzIiwiYWN0aXZlSW5mbyIsImdldFNpbmd1bGFyU2V0dGVyIiwiZ2V0UHVyZUFycmF5U2V0dGVyIiwiVW5pZm9ybUNvbnRhaW5lciIsIlN0cnVjdHVyZWRVbmlmb3JtIiwiY29udGFpbmVyIiwidW5pZm9ybU9iamVjdCIsInBhdGhMZW5ndGgiLCJwYXRoIiwiUmVQYXRoUGFydCIsImxhc3RJbmRleCIsIm1hdGNoRW5kIiwiaWRJc0luZGV4Iiwic3Vic2NyaXB0IiwiYWRkVW5pZm9ybSIsImdldFByb2dyYW1QYXJhbWV0ZXIiLCJBQ1RJVkVfVU5JRk9STVMiLCJnZXRBY3RpdmVVbmlmb3JtIiwiZ2V0VW5pZm9ybUxvY2F0aW9uIiwicGFyc2VVbmlmb3JtIiwiV2ViR0xVbmlmb3JtcyIsInNldE9wdGlvbmFsIiwidXBsb2FkIiwic2VxV2l0aFZhbHVlIiwiam9pbiIsImNyZWF0ZVNoYWRlciIsInNoYWRlclNvdXJjZSIsInNoYWRlciIsImNvbXBpbGVTaGFkZXIiLCJnZXRTaGFkZXJQYXJhbWV0ZXIiLCJDT01QSUxFX1NUQVRVUyIsImdldFNoYWRlckluZm9Mb2ciLCJhZGRMaW5lTnVtYmVycyIsImZ1bmN0aW9uTmFtZSIsImdldEVuY29kaW5nQ29tcG9uZW50cyIsInRvbmVNYXBwaW5nIiwidG9uZU1hcHBpbmdOYW1lIiwicmVuZGVyZXJFeHRlbnNpb25zIiwiZW52TWFwQ3ViZVVWIiwiZmlsdGVyRW1wdHlMaW5lIiwiY2h1bmtzIiwiQUNUSVZFX0FUVFJJQlVURVMiLCJnZXRBY3RpdmVBdHRyaWIiLCJnZXRBdHRyaWJMb2NhdGlvbiIsInJlcGxhY2UiLCJudW1EaXJMaWdodHMiLCJudW1TcG90TGlnaHRzIiwibnVtUmVjdEFyZWFMaWdodHMiLCJudW1Qb2ludExpZ2h0cyIsIm51bUhlbWlMaWdodHMiLCJudW1DbGlwcGluZ1BsYW5lcyIsIm51bUNsaXBJbnRlcnNlY3Rpb24iLCJpbmNsdWRlIiwicGF0dGVybiIsInNuaXBwZXQiLCJ1bnJvbGwiLCJjb2RlIiwic2hhZG93TWFwVHlwZSIsIlBDRlNoYWRvd01hcCIsInNoYWRvd01hcFR5cGVEZWZpbmUiLCJQQ0ZTb2Z0U2hhZG93TWFwIiwiZW52TWFwVHlwZURlZmluZSIsImVudk1hcE1vZGVEZWZpbmUiLCJlbnZNYXBCbGVuZGluZ0RlZmluZSIsImdlbmVyYXRlRXh0ZW5zaW9ucyIsImdlbmVyYXRlRGVmaW5lcyIsImNyZWF0ZVByb2dyYW0iLCJwcmVmaXhGcmFnbWVudCIsImlzUmF3U2hhZGVyTWF0ZXJpYWwiLCJwcmVmaXhWZXJ0ZXgiLCJjdXN0b21EZWZpbmVzIiwiY3VzdG9tRXh0ZW5zaW9ucyIsInN1cHBvcnRzVmVydGV4VGV4dHVyZXMiLCJnYW1tYUZhY3RvckRlZmluZSIsIm1heEJvbmVzIiwidXNlRm9nIiwiZm9nRXhwIiwidXNlVmVydGV4VGV4dHVyZSIsImRvdWJsZVNpZGVkIiwiZmxpcFNpZGVkIiwic2hhZG93TWFwRW5hYmxlZCIsInBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzIiwiTm9Ub25lTWFwcGluZyIsImdldFRvbmVNYXBwaW5nRnVuY3Rpb24iLCJvdXRwdXRFbmNvZGluZyIsIm1hcEVuY29kaW5nIiwiZW52TWFwRW5jb2RpbmciLCJlbWlzc2l2ZU1hcEVuY29kaW5nIiwiZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uIiwiZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uIiwiZGVwdGhQYWNraW5nIiwicGFyc2VJbmNsdWRlcyIsInJlcGxhY2VMaWdodE51bXMiLCJyZXBsYWNlQ2xpcHBpbmdQbGFuZU51bXMiLCJ1bnJvbGxMb29wcyIsIldlYkdMU2hhZGVyIiwidmVydGV4R2xzbCIsImZyYWdtZW50R2xzbCIsImF0dGFjaFNoYWRlciIsImdsVmVydGV4U2hhZGVyIiwiZ2xGcmFnbWVudFNoYWRlciIsImJpbmRBdHRyaWJMb2NhdGlvbiIsImxpbmtQcm9ncmFtIiwiZ2V0UHJvZ3JhbUluZm9Mb2ciLCJ0cmltIiwiTElOS19TVEFUVVMiLCJydW5uYWJsZSIsImdldEVycm9yIiwiVkFMSURBVEVfU1RBVFVTIiwicHJvZ3JhbUxvZyIsInZlcnRleExvZyIsImZyYWdtZW50TG9nIiwiaGF2ZURpYWdub3N0aWNzIiwiZGlhZ25vc3RpY3MiLCJwcmVmaXgiLCJkZWxldGVTaGFkZXIiLCJjYWNoZWRVbmlmb3JtcyIsImdldEF0dHJpYnV0ZXMiLCJjYWNoZWRBdHRyaWJ1dGVzIiwiZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMiLCJkZXN0cm95IiwiZGVsZXRlUHJvZ3JhbSIsInByb2dyYW1JZENvdW50IiwidXNlZFRpbWVzIiwiY2FwYWJpbGl0aWVzIiwiTWVzaERlcHRoTWF0ZXJpYWwiLCJNZXNoRGlzdGFuY2VNYXRlcmlhbCIsIk1lc2hOb3JtYWxNYXRlcmlhbCIsIk1lc2hMYW1iZXJ0TWF0ZXJpYWwiLCJNZXNoUGhvbmdNYXRlcmlhbCIsIk1lc2hUb29uTWF0ZXJpYWwiLCJNZXNoU3RhbmRhcmRNYXRlcmlhbCIsIk1lc2hQaHlzaWNhbE1hdGVyaWFsIiwiTGluZUJhc2ljTWF0ZXJpYWwiLCJMaW5lRGFzaGVkTWF0ZXJpYWwiLCJQb2ludHNNYXRlcmlhbCIsIlNoYWRvd01hdGVyaWFsIiwic2tlbGV0b24iLCJib25lcyIsIm5WZXJ0ZXhVbmlmb3JtcyIsIm5WZXJ0ZXhNYXRyaWNlcyIsImdhbW1hT3ZlcnJpZGVMaW5lYXIiLCJHYW1tYUVuY29kaW5nIiwiZ2V0UGFyYW1ldGVycyIsInNoYWRvd3MiLCJuQ2xpcFBsYW5lcyIsIm5DbGlwSW50ZXJzZWN0aW9uIiwic2hhZGVySURzIiwiaXNTa2lubmVkTWVzaCIsImFsbG9jYXRlQm9uZXMiLCJnZXRSZW5kZXJUYXJnZXQiLCJzaGFkZXJJRCIsImdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAiLCJjdXJyZW50UmVuZGVyVGFyZ2V0IiwiZ2FtbWFPdXRwdXQiLCJnYW1tYUlucHV0IiwiZW52TWFwTW9kZSIsIkN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nIiwiQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmciLCJpc0ZvZ0V4cDIiLCJtYXhNb3JwaFRhcmdldHMiLCJtYXhNb3JwaE5vcm1hbHMiLCJkaXJlY3Rpb25hbCIsInNwb3QiLCJyZWN0QXJlYSIsImhlbWkiLCJzaGFkb3dNYXAiLCJnZXRQcm9ncmFtQ29kZSIsInBhcmFtZXRlck5hbWVzIiwiYWNxdWlyZVByb2dyYW0iLCJwbCIsInByb2dyYW1JbmZvIiwicmVsZWFzZVByb2dyYW0iLCJyZW5kZXJJdGVtc0luZGV4Iiwib3BhcXVlIiwicmVuZGVySXRlbXMiLCJyZW5kZXJJdGVtIiwicGFpbnRlclNvcnRTdGFibGUiLCJyZXZlcnNlUGFpbnRlclNvcnRTdGFibGUiLCJsaXN0cyIsImxpc3QiLCJsaWdodCIsImhhbGZXaWR0aCIsImhhbGZIZWlnaHQiLCJhbWJpZW50IiwiaW50ZW5zaXR5IiwiaXNBbWJpZW50TGlnaHQiLCJpc0RpcmVjdGlvbmFsTGlnaHQiLCJ2ZWN0b3IzIiwiYmlhcyIsIm1hcFNpemUiLCJkaXJlY3Rpb25hbExlbmd0aCIsImlzU3BvdExpZ2h0IiwicGVudW1icmEiLCJzcG90TGVuZ3RoIiwiaXNSZWN0QXJlYUxpZ2h0IiwibWF0cml4NDIiLCJyZWN0QXJlYUxlbmd0aCIsImlzUG9pbnRMaWdodCIsInBvaW50TGVuZ3RoIiwiaXNIZW1pc3BoZXJlTGlnaHQiLCJoZW1pTGVuZ3RoIiwic2V0dXAiLCJsaWdodHNBcnJheSIsInNoYWRvd3NBcnJheSIsInNwcml0ZXNBcnJheSIsInNoYWRvd0xpZ2h0Iiwic2V0dXBMaWdodHMiLCJwdXNoTGlnaHQiLCJwdXNoU2hhZG93IiwicHVzaFNwcml0ZSIsInJlbmRlclN0YXRlcyIsInJlbmRlclN0YXRlIiwiQmFzaWNEZXB0aFBhY2tpbmciLCJpc01lc2hEZXB0aE1hdGVyaWFsIiwiaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCIsIl9yZW5kZXJlciIsIl9vYmplY3RzIiwiX3Byb2pTY3JlZW5NYXRyaXgiLCJfc2hhZG93TWFwU2l6ZSIsIl9tYXhTaGFkb3dNYXBTaXplIiwiX2xvb2tUYXJnZXQiLCJfbGlnaHRQb3NpdGlvbldvcmxkIiwiX01vcnBoaW5nRmxhZyIsIl9Ta2lubmluZ0ZsYWciLCJfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzIiwiX2RlcHRoTWF0ZXJpYWxzIiwiX2Rpc3RhbmNlTWF0ZXJpYWxzIiwiX21hdGVyaWFsQ2FjaGUiLCJSR0JBRGVwdGhQYWNraW5nIiwidXNlTW9ycGhpbmciLCJ1c2VTa2lubmluZyIsImRlcHRoTWF0ZXJpYWwiLCJkaXN0YW5jZU1hdGVyaWFsIiwiYXV0b1VwZGF0ZSIsIl9zdGF0ZSIsIl9nbCIsIkJMRU5EIiwic2V0VGVzdCIsInNldFNjaXNzb3JUZXN0IiwiY3ViZTJEVmlld1BvcnRzIiwidnBXaWR0aCIsInZwSGVpZ2h0IiwicGFycyIsInNoYWRvd0NhbWVyYSIsImlzU3BvdExpZ2h0U2hhZG93IiwiZmFjZUNvdW50Iiwic2hhZG93TWF0cml4Iiwic2V0UmVuZGVyVGFyZ2V0IiwiY3ViZURpcmVjdGlvbnMiLCJjdWJlVXBzIiwidnBEaW1lbnNpb25zIiwiX2ZydXN0dW0iLCJyZW5kZXJPYmplY3QiLCJsaWdodFBvc2l0aW9uV29ybGQiLCJjdXN0b21EZXB0aE1hdGVyaWFsIiwibWF0ZXJpYWxWYXJpYW50cyIsImN1c3RvbU1hdGVyaWFsIiwiY3VzdG9tRGlzdGFuY2VNYXRlcmlhbCIsInZhcmlhbnRJbmRleCIsImtleUIiLCJrZXlBIiwibWF0ZXJpYWxzRm9yVmFyaWFudCIsImNhY2hlZE1hdGVyaWFsIiwiZ3JvdXBNYXRlcmlhbCIsImdldERlcHRoTWF0ZXJpYWwiLCJDYW52YXNUZXh0dXJlIiwiZWxlbWVudEJ1ZmZlciIsInZlcnRleEJ1ZmZlciIsInV2T2Zmc2V0IiwidXZTY2FsZSIsImZvZ1R5cGUiLCJmb2dEZXB0aCIsImZpbGxTdHlsZSIsImZpbGxSZWN0Iiwic3ByaXRlcyIsInVzZVByb2dyYW0iLCJpbml0QXR0cmlidXRlcyIsImVuYWJsZUF0dHJpYnV0ZSIsImRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzIiwiQ1VMTF9GQUNFIiwidmVydGV4QXR0cmliUG9pbnRlciIsImFjdGl2ZVRleHR1cmUiLCJURVhUVVJFMCIsImlzRm9nIiwib2xkRm9nVHlwZSIsInNjZW5lRm9nVHlwZSIsImRlbnNpdHkiLCJzcHJpdGVQb3NpdGlvbiIsInNwcml0ZVJvdGF0aW9uIiwic3ByaXRlU2NhbGUiLCJzZXRCbGVuZGluZyIsInNldE1hc2siLCJ1dGlscyIsImNvbG9yTWFzayIsImN1cnJlbnRDb2xvck1hc2siLCJsb2NrZWQiLCJzZXRMb2NrZWQiLCJsb2NrIiwiY3VycmVudENvbG9yQ2xlYXIiLCJERVBUSF9URVNUIiwiZGVwdGhNYXNrIiwiY3VycmVudERlcHRoTWFzayIsInNldEZ1bmMiLCJjdXJyZW50RGVwdGhGdW5jIiwiTkVWRVIiLCJBTFdBWVMiLCJMRVNTIiwiTEVRVUFMIiwiRVFVQUwiLCJHRVFVQUwiLCJHUkVBVEVSIiwiTk9URVFVQUwiLCJjdXJyZW50RGVwdGhDbGVhciIsImNsZWFyRGVwdGgiLCJzdGVuY2lsVGVzdCIsIlNURU5DSUxfVEVTVCIsInN0ZW5jaWxNYXNrIiwiY3VycmVudFN0ZW5jaWxNYXNrIiwic3RlbmNpbEZ1bmMiLCJzdGVuY2lsUmVmIiwiY3VycmVudFN0ZW5jaWxGdW5jIiwiY3VycmVudFN0ZW5jaWxSZWYiLCJjdXJyZW50U3RlbmNpbEZ1bmNNYXNrIiwic2V0T3AiLCJzdGVuY2lsRmFpbCIsInN0ZW5jaWxaRmFpbCIsInN0ZW5jaWxaUGFzcyIsImN1cnJlbnRTdGVuY2lsRmFpbCIsImN1cnJlbnRTdGVuY2lsWkZhaWwiLCJjdXJyZW50U3RlbmNpbFpQYXNzIiwic3RlbmNpbE9wIiwic3RlbmNpbCIsImN1cnJlbnRTdGVuY2lsQ2xlYXIiLCJjbGVhclN0ZW5jaWwiLCJtYXhWZXJ0ZXhBdHRyaWJ1dGVzIiwiTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMiLCJWRVJTSU9OIiwiZ2xWZXJzaW9uIiwibGluZVdpZHRoQXZhaWxhYmxlIiwiY3JlYXRlVGV4dHVyZSIsImJpbmRUZXh0dXJlIiwidGV4UGFyYW1ldGVyaSIsIlRFWFRVUkVfTUlOX0ZJTFRFUiIsIk5FQVJFU1QiLCJURVhUVVJFX01BR19GSUxURVIiLCJ0ZXhJbWFnZTJEIiwiUkdCQSIsImVtcHR5VGV4dHVyZXMiLCJURVhUVVJFXzJEIiwiVEVYVFVSRV9DVUJFX01BUCIsIlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCIsImNvbG9yQnVmZmVyIiwic2V0RmxpcFNpZGVkIiwic2V0Q3VsbEZhY2UiLCJDdWxsRmFjZUJhY2siLCJuZXdBdHRyaWJ1dGVzIiwiZW5hYmxlZEF0dHJpYnV0ZXMiLCJlbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSIsImF0dHJpYnV0ZURpdmlzb3JzIiwidmVydGV4QXR0cmliRGl2aXNvckFOR0xFIiwibWVzaFBlckF0dHJpYnV0ZSIsImRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSIsImNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyIsIkNPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIiwiZm9ybWF0cyIsImN1cnJlbnRQcm9ncmFtIiwiTm9CbGVuZGluZyIsIkN1c3RvbUJsZW5kaW5nIiwiY3VycmVudEJsZW5kaW5nIiwiY3VycmVudFByZW11bHRpcGxlZEFscGhhIiwiYmxlbmRFcXVhdGlvblNlcGFyYXRlIiwiRlVOQ19BREQiLCJibGVuZEZ1bmNTZXBhcmF0ZSIsIk9ORSIsImJsZW5kRnVuYyIsIlNSQ19BTFBIQSIsIlpFUk8iLCJPTkVfTUlOVVNfU1JDX0NPTE9SIiwiT05FX01JTlVTX1NSQ19BTFBIQSIsIlNSQ19DT0xPUiIsImN1cnJlbnRCbGVuZEVxdWF0aW9uIiwiY3VycmVudEJsZW5kU3JjIiwiY3VycmVudEJsZW5kRHN0IiwiY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSIsImN1cnJlbnRCbGVuZFNyY0FscGhhIiwiY3VycmVudEJsZW5kRHN0QWxwaGEiLCJjb252ZXJ0IiwiZnJvbnRGYWNlQ1ciLCJzZXRQb2x5Z29uT2Zmc2V0IiwiY3VycmVudEZsaXBTaWRlZCIsImZyb250RmFjZSIsIkNXIiwiQ0NXIiwiY3VsbEZhY2UiLCJDdWxsRmFjZU5vbmUiLCJjdXJyZW50Q3VsbEZhY2UiLCJCQUNLIiwiQ3VsbEZhY2VGcm9udCIsIkZST05UIiwiRlJPTlRfQU5EX0JBQ0siLCJjdXJyZW50TGluZVdpZHRoIiwibGluZVdpZHRoIiwiZmFjdG9yIiwiUE9MWUdPTl9PRkZTRVRfRklMTCIsImN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yIiwiY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyIsIlNDSVNTT1JfVEVTVCIsIndlYmdsU2xvdCIsImN1cnJlbnRUZXh0dXJlU2xvdCIsIndlYmdsVHlwZSIsIndlYmdsVGV4dHVyZSIsImN1cnJlbnRCb3VuZFRleHR1cmVzIiwiYm91bmRUZXh0dXJlIiwiY29tcHJlc3NlZFRleEltYWdlMkQiLCJjdXJyZW50U2Npc3NvciIsImN1cnJlbnRWaWV3cG9ydCIsImVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IiLCJnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMiLCJzZXRNYXRlcmlhbCIsInNldExpbmVXaWR0aCIsIm1heFNpemUiLCJfY2FudmFzIiwiZ2VuZXJhdGVNaXBtYXAiLCJ0ZXh0dXJlUHJvcGVydGllcyIsIl9fbWF4TWlwTGV2ZWwiLCJMT0cyRSIsIk5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyIiwiTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciIsIkxJTkVBUiIsIm9uVGV4dHVyZURpc3Bvc2UiLCJkZWFsbG9jYXRlVGV4dHVyZSIsImlzVmlkZW9UZXh0dXJlIiwicmVuZGVyVGFyZ2V0Iiwib25SZW5kZXJUYXJnZXREaXNwb3NlIiwiZGVhbGxvY2F0ZVJlbmRlclRhcmdldCIsIl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUiLCJkZWxldGVUZXh0dXJlIiwiX193ZWJnbEluaXQiLCJfX3dlYmdsVGV4dHVyZSIsImRlbGV0ZUZyYW1lYnVmZmVyIiwicmVuZGVyVGFyZ2V0UHJvcGVydGllcyIsIl9fd2ViZ2xGcmFtZWJ1ZmZlciIsIl9fd2ViZ2xEZXB0aGJ1ZmZlciIsImRlbGV0ZVJlbmRlcmJ1ZmZlciIsInNsb3QiLCJ1cGRhdGVWaWRlb1RleHR1cmUiLCJfX3ZlcnNpb24iLCJ1cGxvYWRUZXh0dXJlIiwicGl4ZWxTdG9yZWkiLCJVTlBBQ0tfRkxJUF9ZX1dFQkdMIiwiaXNDb21wcmVzc2VkVGV4dHVyZSIsImlzQ29tcHJlc3NlZCIsImN1YmVJbWFnZSIsImNsYW1wVG9NYXhTaXplIiwiaXNQb3dlck9mVHdvSW1hZ2UiLCJnbEZvcm1hdCIsImdsVHlwZSIsInNldFRleHR1cmVQYXJhbWV0ZXJzIiwibWlwbWFwIiwiUkdCRm9ybWF0IiwidGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzIiwidGV4dHVyZVR5cGUiLCJURVhUVVJFX1dSQVBfUyIsIlRFWFRVUkVfV1JBUF9UIiwiQ0xBTVBfVE9fRURHRSIsImZpbHRlckZhbGxiYWNrIiwiRmxvYXRUeXBlIiwiSGFsZkZsb2F0VHlwZSIsIl9fY3VycmVudEFuaXNvdHJvcHkiLCJ0ZXhQYXJhbWV0ZXJmIiwiVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQiLCJVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wiLCJVTlBBQ0tfQUxJR05NRU5UIiwidGV4dHVyZU5lZWRzUG93ZXJPZlR3byIsIm1ha2VQb3dlck9mVHdvIiwiaXNEZXB0aFRleHR1cmUiLCJERVBUSF9DT01QT05FTlQiLCJfaXNXZWJHTDIiLCJpbnRlcm5hbEZvcm1hdCIsIkRFUFRIX0NPTVBPTkVOVDMyRiIsIkRFUFRIX0NPTVBPTkVOVDE2IiwiRGVwdGhGb3JtYXQiLCJVbnNpZ25lZFNob3J0VHlwZSIsIlVuc2lnbmVkSW50VHlwZSIsIkRlcHRoU3RlbmNpbEZvcm1hdCIsIkRFUFRIX1NURU5DSUwiLCJVbnNpZ25lZEludDI0OFR5cGUiLCJmcmFtZWJ1ZmZlciIsImF0dGFjaG1lbnQiLCJ0ZXh0dXJlVGFyZ2V0IiwiYmluZEZyYW1lYnVmZmVyIiwiRlJBTUVCVUZGRVIiLCJmcmFtZWJ1ZmZlclRleHR1cmUyRCIsInJlbmRlcmJ1ZmZlciIsImJpbmRSZW5kZXJidWZmZXIiLCJSRU5ERVJCVUZGRVIiLCJyZW5kZXJidWZmZXJTdG9yYWdlIiwiZnJhbWVidWZmZXJSZW5kZXJidWZmZXIiLCJERVBUSF9BVFRBQ0hNRU5UIiwiREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UIiwiUkdCQTQiLCJpc0N1YmUiLCJ3ZWJnbERlcHRoVGV4dHVyZSIsInNldHVwRGVwdGhUZXh0dXJlIiwiY3JlYXRlUmVuZGVyYnVmZmVyIiwic2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlIiwiY3JlYXRlRnJhbWVidWZmZXIiLCJpc1RhcmdldFBvd2VyT2ZUd28iLCJzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSIsIkNPTE9SX0FUVEFDSE1FTlQwIiwic2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciIsIl92aWRlb1RleHR1cmVzIiwic2V0VGV4dHVyZUN1YmVEeW5hbWljIiwic2V0dXBSZW5kZXJUYXJnZXQiLCJ1cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAiLCJSZXBlYXRXcmFwcGluZyIsIlJFUEVBVCIsIk1pcnJvcmVkUmVwZWF0V3JhcHBpbmciLCJNSVJST1JFRF9SRVBFQVQiLCJORUFSRVNUX01JUE1BUF9ORUFSRVNUIiwiTkVBUkVTVF9NSVBNQVBfTElORUFSIiwiTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciIsIkxJTkVBUl9NSVBNQVBfTkVBUkVTVCIsIkxJTkVBUl9NSVBNQVBfTElORUFSIiwiVW5zaWduZWRTaG9ydDQ0NDRUeXBlIiwiVU5TSUdORURfU0hPUlRfNF80XzRfNCIsIlVuc2lnbmVkU2hvcnQ1NTUxVHlwZSIsIlVOU0lHTkVEX1NIT1JUXzVfNV81XzEiLCJVbnNpZ25lZFNob3J0NTY1VHlwZSIsIlVOU0lHTkVEX1NIT1JUXzVfNl81IiwiQnl0ZVR5cGUiLCJTaG9ydFR5cGUiLCJJbnRUeXBlIiwiSEFMRl9GTE9BVF9PRVMiLCJBbHBoYUZvcm1hdCIsIkFMUEhBIiwiUkdCIiwiTHVtaW5hbmNlRm9ybWF0IiwiTFVNSU5BTkNFIiwiTHVtaW5hbmNlQWxwaGFGb3JtYXQiLCJMVU1JTkFOQ0VfQUxQSEEiLCJTdWJ0cmFjdEVxdWF0aW9uIiwiRlVOQ19TVUJUUkFDVCIsIlJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uIiwiRlVOQ19SRVZFUlNFX1NVQlRSQUNUIiwiWmVyb0ZhY3RvciIsIk9uZUZhY3RvciIsIlNyY0NvbG9yRmFjdG9yIiwiT25lTWludXNTcmNDb2xvckZhY3RvciIsIkRzdEFscGhhRmFjdG9yIiwiRFNUX0FMUEhBIiwiT25lTWludXNEc3RBbHBoYUZhY3RvciIsIk9ORV9NSU5VU19EU1RfQUxQSEEiLCJEc3RDb2xvckZhY3RvciIsIkRTVF9DT0xPUiIsIk9uZU1pbnVzRHN0Q29sb3JGYWN0b3IiLCJPTkVfTUlOVVNfRFNUX0NPTE9SIiwiU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciIsIlNSQ19BTFBIQV9TQVRVUkFURSIsIlJHQl9TM1RDX0RYVDFfRm9ybWF0IiwiUkdCQV9TM1RDX0RYVDFfRm9ybWF0IiwiUkdCQV9TM1RDX0RYVDNfRm9ybWF0IiwiUkdCQV9TM1RDX0RYVDVfRm9ybWF0IiwiQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCIsIkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUIiwiQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQiLCJDT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVCIsIlJHQl9QVlJUQ180QlBQVjFfRm9ybWF0IiwiUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQiLCJSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQiLCJSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQiLCJDT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HIiwiQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRyIsIkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HIiwiQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUciLCJSR0JfRVRDMV9Gb3JtYXQiLCJDT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMIiwiUkdCQV9BU1RDXzR4NF9Gb3JtYXQiLCJSR0JBX0FTVENfNXg0X0Zvcm1hdCIsIlJHQkFfQVNUQ181eDVfRm9ybWF0IiwiUkdCQV9BU1RDXzZ4NV9Gb3JtYXQiLCJSR0JBX0FTVENfNng2X0Zvcm1hdCIsIlJHQkFfQVNUQ184eDVfRm9ybWF0IiwiUkdCQV9BU1RDXzh4Nl9Gb3JtYXQiLCJSR0JBX0FTVENfOHg4X0Zvcm1hdCIsIlJHQkFfQVNUQ18xMHg1X0Zvcm1hdCIsIlJHQkFfQVNUQ18xMHg2X0Zvcm1hdCIsIlJHQkFfQVNUQ18xMHg4X0Zvcm1hdCIsIlJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQiLCJSR0JBX0FTVENfMTJ4MTBfRm9ybWF0IiwiUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCIsIk1pbkVxdWF0aW9uIiwiTWF4RXF1YXRpb24iLCJNSU5fRVhUIiwiTUFYX0VYVCIsIlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMIiwiZm92IiwiYXNwZWN0IiwiZm9jdXMiLCJmaWxtR2F1Z2UiLCJmaWxtT2Zmc2V0IiwiUGVyc3BlY3RpdmVDYW1lcmEiLCJpc1BlcnNwZWN0aXZlQ2FtZXJhIiwic2V0Rm9jYWxMZW5ndGgiLCJmb2NhbExlbmd0aCIsImdldEZpbG1IZWlnaHQiLCJhdGFuIiwidkV4dGVudFNsb3BlIiwiZ2V0Rm9jYWxMZW5ndGgiLCJ0YW4iLCJnZXRFZmZlY3RpdmVGT1YiLCJnZXRGaWxtV2lkdGgiLCJza2V3IiwiY2FtZXJhcyIsIkFycmF5Q2FtZXJhIiwiaXNBcnJheUNhbWVyYSIsImZyYW1lRGF0YSIsIlZSRnJhbWVEYXRhIiwib25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlIiwiY2FtZXJhTCIsImJvdW5kcyIsImNhbWVyYVIiLCJjYW1lcmFWUiIsImRldmljZSIsImlzUHJlc2VudGluZyIsImN1cnJlbnRQaXhlbFJhdGlvIiwiZ2V0RXllUGFyYW1ldGVycyIsImV5ZVBhcmFtZXRlcnMiLCJyZW5kZXJXaWR0aCIsInJlbmRlckhlaWdodCIsImdldFBpeGVsUmF0aW8iLCJjdXJyZW50U2l6ZSIsInNldERyYXdpbmdCdWZmZXJTaXplIiwidXNlckhlaWdodCIsImdldERldmljZSIsInNldERldmljZSIsInNldFBvc2VUYXJnZXQiLCJwb3NlVGFyZ2V0IiwiZ2V0Q2FtZXJhIiwiZGVwdGhOZWFyIiwiZGVwdGhGYXIiLCJnZXRGcmFtZURhdGEiLCJzdGFnZVBhcmFtZXRlcnMiLCJzdGFuZGluZ01hdHJpeCIsInNpdHRpbmdUb1N0YW5kaW5nVHJhbnNmb3JtIiwicG9zZSIsInBvc2VPYmplY3QiLCJvcmllbnRhdGlvbiIsInRlbXBRdWF0ZXJuaW9uIiwidGVtcFBvc2l0aW9uIiwibGVmdFZpZXdNYXRyaXgiLCJyaWdodFZpZXdNYXRyaXgiLCJzdGFuZGluZ01hdHJpeEludmVyc2UiLCJsZWZ0UHJvamVjdGlvbk1hdHJpeCIsInJpZ2h0UHJvamVjdGlvbk1hdHJpeCIsImdldExheWVycyIsImxheWVyIiwibGVmdEJvdW5kcyIsInJpZ2h0Qm91bmRzIiwiZ2V0U3RhbmRpbmdNYXRyaXgiLCJzdWJtaXRGcmFtZSIsIlJFVklTSU9OIiwiX2NvbnRleHQiLCJfYWxwaGEiLCJfZGVwdGgiLCJfc3RlbmNpbCIsIl9hbnRpYWxpYXMiLCJhbnRpYWxpYXMiLCJfcHJlbXVsdGlwbGllZEFscGhhIiwiX3ByZXNlcnZlRHJhd2luZ0J1ZmZlciIsInByZXNlcnZlRHJhd2luZ0J1ZmZlciIsIl9wb3dlclByZWZlcmVuY2UiLCJwb3dlclByZWZlcmVuY2UiLCJkb21FbGVtZW50Iiwic29ydE9iamVjdHMiLCJMaW5lYXJUb25lTWFwcGluZyIsInRvbmVNYXBwaW5nRXhwb3N1cmUiLCJ0b25lTWFwcGluZ1doaXRlUG9pbnQiLCJfaXNDb250ZXh0TG9zdCIsIl9jdXJyZW50UmVuZGVyVGFyZ2V0IiwiX2N1cnJlbnRGcmFtZWJ1ZmZlciIsIl9jdXJyZW50TWF0ZXJpYWxJZCIsIl9jdXJyZW50R2VvbWV0cnlQcm9ncmFtIiwiX2N1cnJlbnRDYW1lcmEiLCJfY3VycmVudEFycmF5Q2FtZXJhIiwiX2N1cnJlbnRWaWV3cG9ydCIsIl9jdXJyZW50U2Npc3NvciIsIl9jdXJyZW50U2Npc3NvclRlc3QiLCJfdXNlZFRleHR1cmVVbml0cyIsIl93aWR0aCIsIl9oZWlnaHQiLCJfcGl4ZWxSYXRpbyIsIl92aWV3cG9ydCIsIl9zY2lzc29yIiwiX3NjaXNzb3JUZXN0IiwiX2NsaXBwaW5nIiwiX2NsaXBwaW5nRW5hYmxlZCIsIl9sb2NhbENsaXBwaW5nRW5hYmxlZCIsIl92ZWN0b3IzIiwib25Db250ZXh0TG9zdCIsIm9uQ29udGV4dFJlc3RvcmUiLCJjb250ZXh0QXR0cmlidXRlcyIsIm1lc3NhZ2UiLCJvYmplY3RzIiwicmVuZGVyTGlzdHMiLCJtb3JwaHRhcmdldHMiLCJidWZmZXJSZW5kZXJlciIsImluZGV4ZWRCdWZmZXJSZW5kZXJlciIsInByb2dyYW1DYWNoZSIsIl90aGlzIiwic3ByaXRlUmVuZGVyZXIiLCJpbml0R0xDb250ZXh0IiwidnIiLCJnZXRDb250ZXh0QXR0cmlidXRlcyIsImZvcmNlQ29udGV4dExvc3MiLCJsb3NlQ29udGV4dCIsImZvcmNlQ29udGV4dFJlc3RvcmUiLCJyZXN0b3JlQ29udGV4dCIsInNldFBpeGVsUmF0aW8iLCJ1cGRhdGVTdHlsZSIsInNldFZpZXdwb3J0IiwiZ2V0RHJhd2luZ0J1ZmZlclNpemUiLCJwaXhlbFJhdGlvIiwiZ2V0Q3VycmVudFZpZXdwb3J0Iiwic2V0U2Npc3NvciIsImJvb2xlYW4iLCJiaXRzIiwiQ09MT1JfQlVGRkVSX0JJVCIsIkRFUFRIX0JVRkZFUl9CSVQiLCJTVEVOQ0lMX0JVRkZFUl9CSVQiLCJjbGVhclRhcmdldCIsInN0b3BBbmltYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsIm9uTWF0ZXJpYWxEaXNwb3NlIiwiZGVhbGxvY2F0ZU1hdGVyaWFsIiwicmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZSIsInJlbmRlckJ1ZmZlckltbWVkaWF0ZSIsImhhc1Bvc2l0aW9ucyIsImhhc05vcm1hbHMiLCJoYXNVdnMiLCJoYXNDb2xvcnMiLCJwb3NpdGlvbkFycmF5IiwicHJvZ3JhbUF0dHJpYnV0ZXMiLCJpc01lc2hQaG9uZ01hdGVyaWFsIiwiaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCIsImlzTWVzaE5vcm1hbE1hdGVyaWFsIiwibm9ybWFsQXJyYXkiLCJueCIsIm55IiwibnoiLCJ1dkFycmF5IiwiY29sb3JBcnJheSIsInNldFByb2dyYW0iLCJnZW9tZXRyeVByb2dyYW0iLCJ1cGRhdGVCdWZmZXJzIiwicmFuZ2VGYWN0b3IiLCJzZXR1cFZlcnRleEF0dHJpYnV0ZXMiLCJkYXRhQ291bnQiLCJyYW5nZVN0YXJ0IiwicmFuZ2VDb3VudCIsImRyYXdFbmQiLCJkcmF3U3RhcnQiLCJkcmF3Q291bnQiLCJnZXRUYXJnZXRQaXhlbFJhdGlvIiwiaXNMaW5lU2VnbWVudHMiLCJpc0xpbmVMb29wIiwiaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSIsInByb2dyYW1BdHRyaWJ1dGUiLCJnZW9tZXRyeUF0dHJpYnV0ZSIsInN0cmlkZSIsImlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIiLCJpc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSIsIm1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyIsInZlcnRleEF0dHJpYjJmdiIsInZlcnRleEF0dHJpYjNmdiIsInZlcnRleEF0dHJpYjRmdiIsInZlcnRleEF0dHJpYjFmdiIsImNvbXBpbGUiLCJjdXJyZW50UmVuZGVyU3RhdGUiLCJpc0xpZ2h0IiwiaW5pdE1hdGVyaWFsIiwiaXNBbmltYXRpbmciLCJyZXF1ZXN0QW5pbWF0aW9uTG9vcEZyYW1lIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiYW5pbWF0aW9uTG9vcCIsInRpbWUiLCJvbkFuaW1hdGlvbkZyYW1lIiwiYW5pbWF0ZSIsInN0YXJ0QW5pbWF0aW9uIiwiY3VycmVudFJlbmRlckxpc3QiLCJwcm9qZWN0T2JqZWN0Iiwib3ZlcnJpZGVNYXRlcmlhbCIsIm9wYXF1ZU9iamVjdHMiLCJyZW5kZXJPYmplY3RzIiwidHJhbnNwYXJlbnRPYmplY3RzIiwiaXNTcHJpdGUiLCJpc0ltbWVkaWF0ZVJlbmRlck9iamVjdCIsImNhbWVyYTIiLCJyZW5kZXJPYmplY3RJbW1lZGlhdGUiLCJtYXRlcmlhbFByb3BlcnRpZXMiLCJsaWdodHNIYXNoIiwicHJvZ3JhbUNoYW5nZSIsIm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cyIsIm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscyIsInVuaWZvcm1zTGlzdCIsInByb2dVbmlmb3JtcyIsInVzZUNhY2hlIiwicF91bmlmb3JtcyIsIm1fdW5pZm9ybXMiLCJyZWZyZXNoUHJvZ3JhbSIsInJlZnJlc2hNYXRlcmlhbCIsInJlZnJlc2hMaWdodHMiLCJjYW1lcmFQb3NpdGlvbiIsInVDYW1Qb3MiLCJpc01lc2hMYW1iZXJ0TWF0ZXJpYWwiLCJib25lVGV4dHVyZSIsImJvbmVNYXRyaWNlcyIsImJvbmVUZXh0dXJlU2l6ZSIsIm1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlIiwicmVmcmVzaFVuaWZvcm1zRm9nIiwicmVmcmVzaFVuaWZvcm1zQ29tbW9uIiwicmVmcmVzaFVuaWZvcm1zTGFtYmVydCIsImlzTWVzaFRvb25NYXRlcmlhbCIsInJlZnJlc2hVbmlmb3Jtc1Rvb24iLCJyZWZyZXNoVW5pZm9ybXNQaG9uZyIsImlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwiLCJyZWZyZXNoVW5pZm9ybXNQaHlzaWNhbCIsInJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkIiwicmVmcmVzaFVuaWZvcm1zRGVwdGgiLCJyZWZyZXNoVW5pZm9ybXNEaXN0YW5jZSIsInJlZnJlc2hVbmlmb3Jtc05vcm1hbCIsImlzTGluZUJhc2ljTWF0ZXJpYWwiLCJyZWZyZXNoVW5pZm9ybXNMaW5lIiwiaXNMaW5lRGFzaGVkTWF0ZXJpYWwiLCJyZWZyZXNoVW5pZm9ybXNEYXNoIiwiaXNQb2ludHNNYXRlcmlhbCIsInJlZnJlc2hVbmlmb3Jtc1BvaW50cyIsImlzU2hhZG93TWF0ZXJpYWwiLCJsdGNfMSIsIkxUQ18xIiwibHRjXzIiLCJMVENfMiIsInV2U2NhbGVNYXAiLCJ0ZXh0dXJlVW5pdCIsIndhcm5lZCIsInNldFRleHR1cmUiLCJyZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzIiwicmVzdG9yZSIsInRleHR1cmVGb3JtYXQiLCJJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCIsIklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSIsImNoZWNrRnJhbWVidWZmZXJTdGF0dXMiLCJGUkFNRUJVRkZFUl9DT01QTEVURSIsInJlYWRQaXhlbHMiLCJjb3B5RnJhbWVidWZmZXJUb1RleHR1cmUiLCJsZXZlbCIsImNvcHlUZXhJbWFnZTJEIiwiY29weVRleHR1cmVUb1RleHR1cmUiLCJzcmNUZXh0dXJlIiwiZHN0VGV4dHVyZSIsInRleFN1YkltYWdlMkQiLCJwaXhlbHMiLCJGb2dFeHAyIiwiRm9nIiwiU2NlbmUiLCJTcHJpdGVNYXRlcmlhbCIsImlzU3ByaXRlTWF0ZXJpYWwiLCJTcHJpdGUiLCJ3b3JsZFBvc2l0aW9uIiwiaW50ZXJzZWN0UG9pbnQiLCJ3b3JsZFNjYWxlIiwiZ3Vlc3NTaXplU3EiLCJsZXZlbHMiLCJMT0QiLCJhZGRMZXZlbCIsImdldE9iamVjdEZvckRpc3RhbmNlIiwibWF0cml4UG9zaXRpb24iLCJib25lSW52ZXJzZXMiLCJjYWxjdWxhdGVJbnZlcnNlcyIsIlNrZWxldG9uIiwiYm9uZSIsImlzQm9uZSIsImlkZW50aXR5TWF0cml4Iiwib2Zmc2V0TWF0cml4IiwiZ2V0Qm9uZUJ5TmFtZSIsIkJvbmUiLCJiaW5kTW9kZSIsImJpbmRNYXRyaXgiLCJiaW5kTWF0cml4SW52ZXJzZSIsImluaXRCb25lcyIsImJpbmQiLCJub3JtYWxpemVTa2luV2VpZ2h0cyIsIlNraW5uZWRNZXNoIiwiZ2JvbmUiLCJyb3RxIiwic2NsIiwic3ciLCJza2luV2VpZ2h0IiwidmVjIiwibGluZWNhcCIsImxpbmVqb2luIiwiTGluZSIsImNvbXB1dGVMaW5lRGlzdGFuY2VzIiwicG9zaXRpb25BdHRyaWJ1dGUiLCJsaW5lUHJlY2lzaW9uIiwidlN0YXJ0IiwidkVuZCIsImludGVyUmF5IiwiaW50ZXJTZWdtZW50IiwiZGlzdFNxIiwicHJlY2lzaW9uU3EiLCJuYlZlcnRpY2VzIiwiTGluZVNlZ21lbnRzIiwiTGluZUxvb3AiLCJQb2ludHMiLCJwYXJhbXMiLCJ0aHJlc2hvbGQiLCJsb2NhbFRocmVzaG9sZCIsInJheVBvaW50RGlzdGFuY2VTcSIsImxvY2FsVGhyZXNob2xkU3EiLCJkaXN0YW5jZVRvUmF5IiwidGVzdFBvaW50IiwiR3JvdXAiLCJpc0dyb3VwIiwidmlkZW8iLCJWaWRlb1RleHR1cmUiLCJyZWFkeVN0YXRlIiwiSEFWRV9DVVJSRU5UX0RBVEEiLCJDb21wcmVzc2VkVGV4dHVyZSIsIkRlcHRoVGV4dHVyZSIsIm9sIiwiZWRnZXMiLCJlZGdlIiwiV2lyZWZyYW1lR2VvbWV0cnkiLCJmdW5jIiwic2xpY2VzIiwic3RhY2tzIiwiUGFyYW1ldHJpY0dlb21ldHJ5IiwicHYiLCJwdSIsInNsaWNlQ291bnQiLCJQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkiLCJkZXRhaWwiLCJQb2x5aGVkcm9uR2VvbWV0cnkiLCJzdWJkaXZpZGUiLCJhcHBwbHlSYWRpdXMiLCJnZW5lcmF0ZVVWcyIsInV2QnVmZmVyIiwiZ2V0VmVydGV4QnlJbmRleCIsInN1YmRpdmlkZUZhY2UiLCJjb2xzIiwicm93cyIsImFqIiwiYmoiLCJwdXNoVmVydGV4IiwiYXppbXV0aCIsImluY2xpbmF0aW9uIiwiY29ycmVjdFVWcyIsImNvcnJlY3RTZWFtIiwiY2VudHJvaWQiLCJjb3JyZWN0VVYiLCJhemkiLCJQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkiLCJUZXRyYWhlZHJvbkdlb21ldHJ5IiwiVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSIsIk9jdGFoZWRyb25HZW9tZXRyeSIsIk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSIsIkljb3NhaGVkcm9uR2VvbWV0cnkiLCJJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwiRG9kZWNhaGVkcm9uR2VvbWV0cnkiLCJEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSIsInR1YnVsYXJTZWdtZW50cyIsInJhZGlhbFNlZ21lbnRzIiwiY2xvc2VkIiwidGFwZXIiLCJ0YW5nZW50cyIsImJ1ZmZlckdlb21ldHJ5IiwiYmlub3JtYWxzIiwiVHViZUdlb21ldHJ5IiwiY29tcHV0ZUZyZW5ldEZyYW1lcyIsImZyYW1lcyIsImdlbmVyYXRlQnVmZmVyRGF0YSIsImdlbmVyYXRlU2VnbWVudCIsImdlbmVyYXRlSW5kaWNlcyIsImdldFBvaW50QXQiLCJOIiwiVHViZUJ1ZmZlckdlb21ldHJ5IiwidHViZSIsImhlaWdodFNjYWxlIiwiVG9ydXNLbm90R2VvbWV0cnkiLCJjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUiLCJQMSIsIlAyIiwicXVPdmVyUCIsImNzIiwiY3UiLCJzdSIsIlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5IiwiYXJjIiwiVG9ydXNHZW9tZXRyeSIsIlRvcnVzQnVmZmVyR2VvbWV0cnkiLCJ0cmlhbmd1bGF0ZSIsImhvbGVJbmRpY2VzIiwiZGltIiwib3V0ZXJMZW4iLCJoYXNIb2xlcyIsIm91dGVyTm9kZSIsImxpbmtlZExpc3QiLCJpbnZTaXplIiwiZWxpbWluYXRlSG9sZXMiLCJlYXJjdXRMaW5rZWQiLCJjbG9ja3dpc2UiLCJzaWduZWRBcmVhIiwiaW5zZXJ0Tm9kZSIsInJlbW92ZU5vZGUiLCJhZ2FpbiIsInN0ZWluZXIiLCJhcmVhIiwiZWFyIiwicGFzcyIsImluZGV4Q3VydmUiLCJpc0Vhckhhc2hlZCIsImlzRWFyIiwiZmlsdGVyUG9pbnRzIiwiY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyIsInNwbGl0RWFyY3V0IiwicG9pbnRJblRyaWFuZ2xlIiwibWluVFkiLCJtYXhUWCIsIm1heFRZIiwiek9yZGVyIiwibWluVFgiLCJuZXh0WiIsInByZXZaIiwibG9jYWxseUluc2lkZSIsImlzVmFsaWREaWFnb25hbCIsInNwbGl0UG9seWdvbiIsImdldExlZnRtb3N0IiwiY29tcGFyZVgiLCJlbGltaW5hdGVIb2xlIiwiaG9sZSIsImZpbmRIb2xlQnJpZGdlIiwiaHgiLCJoeSIsIm14IiwibXkiLCJ0YW5NaW4iLCJzb3J0TGlua2VkIiwidGFpbCIsIm51bU1lcmdlcyIsInBTaXplIiwicVNpemUiLCJpblNpemUiLCJsZWZ0bW9zdCIsInB5IiwiaW50ZXJzZWN0c1BvbHlnb24iLCJtaWRkbGVJbnNpZGUiLCJxMiIsImluc2lkZSIsImFuIiwiYnAiLCJzdW0iLCJjb250b3VyIiwiaXNDbG9ja1dpc2UiLCJwdHMiLCJ0cmlhbmd1bGF0ZVNoYXBlIiwiaG9sZXMiLCJyZW1vdmVEdXBFbmRQdHMiLCJhZGRDb250b3VyIiwiaG9sZUluZGV4IiwiRWFyY3V0IiwiRXh0cnVkZUdlb21ldHJ5IiwiYWRkU2hhcGUiLCJ2ZXJ0aWNlc0FycmF5IiwiY3VydmVTZWdtZW50cyIsInN0ZXBzIiwiYW1vdW50IiwiYmV2ZWxFbmFibGVkIiwiYmV2ZWxUaGlja25lc3MiLCJiZXZlbFNpemUiLCJiZXZlbFNlZ21lbnRzIiwiZXh0cnVkZVBhdGgiLCJVVkdlbmVyYXRvciIsIldvcmxkVVZHZW5lcmF0b3IiLCJleHRydWRlQnlQYXRoIiwiYmlub3JtYWwiLCJwb3NpdGlvbjIiLCJleHRydWRlUHRzIiwiZ2V0U3BhY2VkUG9pbnRzIiwic3BsaW5lVHViZSIsImhsIiwiZXh0cmFjdFBvaW50cyIsInNoYXBlUG9pbnRzIiwiU2hhcGVVdGlscyIsImFob2xlIiwicHQiLCJicyIsInZlcnQiLCJ2bGVuIiwiZmxlbiIsImluUHQiLCJpblByZXYiLCJpbk5leHQiLCJ2X3RyYW5zX3kiLCJzaHJpbmtfYnkiLCJ2X3ByZXZfeSIsInZfbmV4dF95Iiwidl9wcmV2X3giLCJ2X25leHRfeCIsImNvbGxpbmVhcjAiLCJ2X3ByZXZfbGVuc3EiLCJ2X3ByZXZfbGVuIiwidl9uZXh0X2xlbiIsInB0TmV4dFNoaWZ0X3giLCJwdFByZXZTaGlmdF94IiwicHROZXh0U2hpZnRfeSIsInB0UHJldlNoaWZ0X3kiLCJ2X3RyYW5zX3giLCJzZiIsInZfdHJhbnNfbGVuc3EiLCJkaXJlY3Rpb25fZXEiLCJjb250b3VyTW92ZW1lbnRzIiwiZ2V0QmV2ZWxWZWMiLCJvbmVIb2xlTW92ZW1lbnRzIiwidmVydGljZXNNb3ZlbWVudHMiLCJob2xlc01vdmVtZW50cyIsInNjYWxlUHQyIiwiYnVpbGRMaWRGYWNlcyIsImJ1aWxkU2lkZUZhY2VzIiwiZjMiLCJzaWRld2FsbHMiLCJsYXllcm9mZnNldCIsInNsIiwic2xlbjEiLCJzbGVuMiIsImY0IiwicGxhY2Vob2xkZXIiLCJhZGRWZXJ0ZXgiLCJ1dmdlbiIsImdlbmVyYXRlVG9wVVYiLCJuZXh0SW5kZXgiLCJhZGRVViIsImdlbmVyYXRlU2lkZVdhbGxVViIsInZlY3RvcjIiLCJFeHRydWRlQnVmZmVyR2VvbWV0cnkiLCJpbmRleEEiLCJpbmRleEIiLCJpbmRleEMiLCJhX3giLCJhX3kiLCJiX3giLCJiX3kiLCJjX3giLCJjX3kiLCJpbmRleEQiLCJhX3oiLCJiX3oiLCJjX3oiLCJkX3giLCJkX3oiLCJkX3kiLCJ0ZXh0IiwiVGV4dEdlb21ldHJ5IiwiZm9udCIsImlzRm9udCIsImdlbmVyYXRlU2hhcGVzIiwiVGV4dEJ1ZmZlckdlb21ldHJ5IiwicGhpU3RhcnQiLCJwaGlMZW5ndGgiLCJ0aGV0YVN0YXJ0IiwidGhldGFMZW5ndGgiLCJTcGhlcmVHZW9tZXRyeSIsInZlcnRpY2VzUm93IiwiZ3JpZCIsInRoZXRhRW5kIiwiU3BoZXJlQnVmZmVyR2VvbWV0cnkiLCJpbm5lclJhZGl1cyIsIm91dGVyUmFkaXVzIiwidGhldGFTZWdtZW50cyIsInBoaVNlZ21lbnRzIiwiUmluZ0dlb21ldHJ5Iiwic2VnbWVudCIsInJhZGl1c1N0ZXAiLCJ0aGV0YVNlZ21lbnRMZXZlbCIsIlJpbmdCdWZmZXJHZW9tZXRyeSIsInNlZ21lbnRzIiwiTGF0aGVHZW9tZXRyeSIsImludmVyc2VTZWdtZW50cyIsImJhc2UiLCJuMSIsIm4yIiwiTGF0aGVCdWZmZXJHZW9tZXRyeSIsIlNoYXBlR2VvbWV0cnkiLCJzaGFwZUhvbGUiLCJzaGFwZVZlcnRpY2VzIiwic2hhcGVIb2xlcyIsImluZGV4T2Zmc2V0IiwiU2hhcGVCdWZmZXJHZW9tZXRyeSIsInRocmVzaG9sZEFuZ2xlIiwiZmFjZTEiLCJmYWNlMiIsInRocmVzaG9sZERvdCIsInNvdXJjZVZlcnRpY2VzIiwiRWRnZXNHZW9tZXRyeSIsInJhZGl1c1RvcCIsInJhZGl1c0JvdHRvbSIsIm9wZW5FbmRlZCIsIkN5bGluZGVyR2VvbWV0cnkiLCJnZW5lcmF0ZVRvcnNvIiwiZ2VuZXJhdGVDYXAiLCJzaW5UaGV0YSIsImNvc1RoZXRhIiwic2xvcGUiLCJpbmRleFJvdyIsImluZGV4QXJyYXkiLCJjZW50ZXJJbmRleFN0YXJ0IiwiY2VudGVySW5kZXhFbmQiLCJDeWxpbmRlckJ1ZmZlckdlb21ldHJ5IiwiQ29uZUdlb21ldHJ5IiwiQ29uZUJ1ZmZlckdlb21ldHJ5IiwiQ2lyY2xlR2VvbWV0cnkiLCJDaXJjbGVCdWZmZXJHZW9tZXRyeSIsImZyZWV6ZSIsIlJhd1NoYWRlck1hdGVyaWFsIiwiZmlsZXMiLCJmaWxlIiwib25Mb2FkIiwib25Qcm9ncmVzcyIsIm9uRXJyb3IiLCJvblN0YXJ0IiwiaXRlbVN0YXJ0IiwiaXRlbXNUb3RhbCIsImlzTG9hZGluZyIsIml0ZW1zTG9hZGVkIiwiaXRlbUVuZCIsIml0ZW1FcnJvciIsInJlc29sdmVVUkwiLCJ1cmxNb2RpZmllciIsInNldFVSTE1vZGlmaWVyIiwidHJhbnNmb3JtIiwibWFuYWdlciIsIkRlZmF1bHRMb2FkaW5nTWFuYWdlciIsIkZpbGVMb2FkZXIiLCJsb2FkIiwiQ2FjaGUiLCJjYWNoZWQiLCJsb2FkaW5nIiwiZGF0YVVyaVJlZ2V4IiwiZGF0YVVyaVJlZ2V4UmVzdWx0IiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiaXNCYXNlNjQiLCJhdG9iIiwicmVzcG9uc2VUeXBlIiwidG9Mb3dlckNhc2UiLCJyZXNwb25zZSIsIm1pbWVUeXBlIiwicGFyc2VyIiwicGFyc2VGcm9tU3RyaW5nIiwicmVxdWVzdCIsInN0YXR1cyIsImNhbGxiYWNrcyIsIndpdGhDcmVkZW50aWFscyIsIm92ZXJyaWRlTWltZVR5cGUiLCJyZXF1ZXN0SGVhZGVyIiwic2V0UmVxdWVzdEhlYWRlciIsImhlYWRlciIsInNlbmQiLCJzZXRQYXRoIiwic2V0UmVzcG9uc2VUeXBlIiwic2V0V2l0aENyZWRlbnRpYWxzIiwic2V0TWltZVR5cGUiLCJfcGFyc2VyIiwiQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIiLCJsb2FkZXIiLCJ0ZXhEYXRhcyIsImxvYWRlZCIsIm1pcG1hcENvdW50IiwibG9hZFRleHR1cmUiLCJpc0N1YmVtYXAiLCJEYXRhVGV4dHVyZUxvYWRlciIsInRleERhdGEiLCJJbWFnZUxvYWRlciIsImNyb3NzT3JpZ2luIiwic3Vic3RyIiwic2V0Q3Jvc3NPcmlnaW4iLCJDdWJlVGV4dHVyZUxvYWRlciIsInVybHMiLCJUZXh0dXJlTG9hZGVyIiwic2VhcmNoIiwiaXNKUEVHIiwiYXJjTGVuZ3RoRGl2aXNpb25zIiwiQ3VydmUiLCJnZXRQb2ludCIsIm9wdGlvbmFsVGFyZ2V0IiwiZ2V0VXRvVG1hcHBpbmciLCJnZXRQb2ludHMiLCJkaXZpc2lvbnMiLCJnZXRMZW5ndGgiLCJnZXRMZW5ndGhzIiwibGVuZ3RocyIsImNhY2hlQXJjTGVuZ3RocyIsImN1cnJlbnQiLCJ1cGRhdGVBcmNMZW5ndGhzIiwiYXJjTGVuZ3RocyIsInRhcmdldEFyY0xlbmd0aCIsImNvbXBhcmlzb24iLCJsZW5ndGhBZnRlciIsImxlbmd0aEJlZm9yZSIsInNlZ21lbnRMZW5ndGgiLCJzZWdtZW50RnJhY3Rpb24iLCJnZXRUYW5nZW50IiwidDIiLCJwdDIiLCJwdDEiLCJnZXRUYW5nZW50QXQiLCJNQVhfVkFMVUUiLCJ0eiIsIm1hdCIsImZyb21KU09OIiwianNvbiIsImFYIiwiYVkiLCJ4UmFkaXVzIiwieVJhZGl1cyIsImFTdGFydEFuZ2xlIiwiYUVuZEFuZ2xlIiwiYUNsb2Nrd2lzZSIsImFSb3RhdGlvbiIsIkVsbGlwc2VDdXJ2ZSIsImlzRWxsaXBzZUN1cnZlIiwiZGVsdGFBbmdsZSIsInR3b1BpIiwic2FtZVBvaW50cyIsImFSYWRpdXMiLCJBcmNDdXJ2ZSIsImlzQXJjQ3VydmUiLCJjMCIsImluaXRDYXRtdWxsUm9tIiwieDMiLCJ0ZW5zaW9uIiwiaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tIiwiZHQwIiwiZHQxIiwiZHQyIiwiY2FsYyIsInQzIiwiY3VydmVUeXBlIiwiQ2F0bXVsbFJvbUN1cnZlMyIsImlzQ2F0bXVsbFJvbUN1cnZlMyIsImludFBvaW50Iiwid2VpZ2h0IiwicHgkMSIsInB6IiwiUXVhZHJhdGljQmV6aWVyUDEiLCJRdWFkcmF0aWNCZXppZXJQMiIsIkN1YmljQmV6aWVyUDEiLCJDdWJpY0JlemllclAyIiwiQ3ViaWNCZXppZXJQMyIsInYzIiwiQ3ViaWNCZXppZXJDdXJ2ZSIsImlzQ3ViaWNCZXppZXJDdXJ2ZSIsIkN1YmljQmV6aWVyIiwiQ3ViaWNCZXppZXJDdXJ2ZTMiLCJpc0N1YmljQmV6aWVyQ3VydmUzIiwiTGluZUN1cnZlIiwiaXNMaW5lQ3VydmUiLCJMaW5lQ3VydmUzIiwiaXNMaW5lQ3VydmUzIiwiUXVhZHJhdGljQmV6aWVyQ3VydmUiLCJpc1F1YWRyYXRpY0JlemllckN1cnZlIiwiUXVhZHJhdGljQmV6aWVyIiwiUXVhZHJhdGljQmV6aWVyQ3VydmUzIiwiaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLCJTcGxpbmVDdXJ2ZSIsImlzU3BsaW5lQ3VydmUiLCJDYXRtdWxsUm9tIiwiY3VydmVzIiwiYXV0b0Nsb3NlIiwiQ3VydmVQYXRoIiwiY3VydmUiLCJjbG9zZVBhdGgiLCJzdGFydFBvaW50IiwiZW5kUG9pbnQiLCJnZXRDdXJ2ZUxlbmd0aHMiLCJjdXJ2ZUxlbmd0aHMiLCJsZW5zIiwiY2FjaGVMZW5ndGhzIiwic3VtcyIsInJlc29sdXRpb24iLCJjdXJyZW50UG9pbnQiLCJQYXRoIiwibW92ZVRvIiwibGluZVRvIiwicXVhZHJhdGljQ3VydmVUbyIsImFDUHgiLCJhQ1B5IiwiYmV6aWVyQ3VydmVUbyIsImFDUDF4IiwiYUNQMXkiLCJhQ1AyeCIsImFDUDJ5Iiwic3BsaW5lVGhydSIsIm5wdHMiLCJhYnNhcmMiLCJhYnNlbGxpcHNlIiwiZWxsaXBzZSIsImZpcnN0UG9pbnQiLCJsYXN0UG9pbnQiLCJTaGFwZSIsImdldFBvaW50c0hvbGVzIiwiaG9sZXNQdHMiLCJMaWdodCIsIkhlbWlzcGhlcmVMaWdodCIsIkxpZ2h0U2hhZG93IiwiU3BvdExpZ2h0U2hhZG93IiwicG93ZXIiLCJTcG90TGlnaHQiLCJQb2ludExpZ2h0IiwiRGlyZWN0aW9uYWxMaWdodFNoYWRvdyIsIkRpcmVjdGlvbmFsTGlnaHQiLCJBbWJpZW50TGlnaHQiLCJSZWN0QXJlYUxpZ2h0IiwidGltZXMiLCJpbnRlcnBvbGF0aW9uIiwiS2V5ZnJhbWVUcmFjayIsIlN0cmluZ0tleWZyYW1lVHJhY2siLCJWYWx1ZVR5cGVOYW1lIiwiVmFsdWVCdWZmZXJUeXBlIiwiRGVmYXVsdEludGVycG9sYXRpb24iLCJJbnRlcnBvbGF0ZURpc2NyZXRlIiwiSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyIiwiSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoIiwiQm9vbGVhbktleWZyYW1lVHJhY2siLCJwYXJhbWV0ZXJQb3NpdGlvbnMiLCJzYW1wbGVWYWx1ZXMiLCJzYW1wbGVTaXplIiwicmVzdWx0QnVmZmVyIiwiX2NhY2hlZEluZGV4IiwidmFsdWVTaXplIiwiSW50ZXJwb2xhbnQiLCJldmFsdWF0ZSIsInBwIiwidmFsaWRhdGVfaW50ZXJ2YWwiLCJzZWVrIiwibGluZWFyX3NjYW4iLCJmb3J3YXJkX3NjYW4iLCJhZnRlckVuZF8iLCJnaXZlVXBBdCIsInQxZ2xvYmFsIiwiYmVmb3JlU3RhcnRfIiwibWlkIiwiaW50ZXJ2YWxDaGFuZ2VkXyIsImludGVycG9sYXRlXyIsInNldHRpbmdzIiwiRGVmYXVsdFNldHRpbmdzXyIsImdldFNldHRpbmdzXyIsImNvcHlTYW1wbGVWYWx1ZV8iLCJRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQiLCJRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayIsIkludGVycG9sYXRlTGluZWFyIiwiZ2V0VmFsdWVTaXplIiwiQ29sb3JLZXlmcmFtZVRyYWNrIiwiTnVtYmVyS2V5ZnJhbWVUcmFjayIsIl93ZWlnaHRQcmV2IiwiX29mZnNldFByZXYiLCJfd2VpZ2h0TmV4dCIsIl9vZmZzZXROZXh0IiwiQ3ViaWNJbnRlcnBvbGFudCIsImVuZGluZ1N0YXJ0IiwiWmVyb0N1cnZhdHVyZUVuZGluZyIsImVuZGluZ0VuZCIsImlQcmV2IiwiaU5leHQiLCJ0UHJldiIsInROZXh0IiwiaGFsZkR0IiwibzEiLCJvMCIsIm9QIiwib04iLCJ3UCIsIndOIiwicHBwIiwic1AiLCJzTiIsIkxpbmVhckludGVycG9sYW50Iiwib2Zmc2V0MSIsIm9mZnNldDAiLCJ3ZWlnaHQxIiwid2VpZ2h0MCIsIkRpc2NyZXRlSW50ZXJwb2xhbnQiLCJhcnJheVNsaWNlIiwiZnJvbSIsInRvIiwiQW5pbWF0aW9uVXRpbHMiLCJpc1R5cGVkQXJyYXkiLCJjb252ZXJ0QXJyYXkiLCJmb3JjZUNsb25lIiwiaXNWaWV3IiwiZ2V0S2V5ZnJhbWVPcmRlciIsImNvbXBhcmVUaW1lIiwic29ydGVkQXJyYXkiLCJuVmFsdWVzIiwic3JjT2Zmc2V0IiwiZmxhdHRlbkpTT04iLCJqc29uS2V5cyIsInZhbHVlUHJvcGVydHlOYW1lIiwiVGltZUJ1ZmZlclR5cGUiLCJzZXRJbnRlcnBvbGF0aW9uIiwidmFsaWRhdGUiLCJvcHRpbWl6ZSIsIl9nZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lIiwidHJhY2tUeXBlIiwidHJhY2siLCJnZXRJbnRlcnBvbGF0aW9uIiwidHlwZU5hbWUiLCJGbG9hdDMyQXJyYXkiLCJJbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZSIsImZhY3RvcnlNZXRob2QiLCJjcmVhdGVJbnRlcnBvbGFudCIsInNoaWZ0IiwidGltZU9mZnNldCIsInRpbWVTY2FsZSIsInN0YXJ0VGltZSIsImVuZFRpbWUiLCJuS2V5cyIsInZhbGlkIiwiY3VyclRpbWUiLCJwcmV2VGltZSIsInNtb290aEludGVycG9sYXRpb24iLCJJbnRlcnBvbGF0ZVNtb290aCIsIndyaXRlSW5kZXgiLCJ0aW1lTmV4dCIsIm9mZnNldFAiLCJvZmZzZXROIiwia2VlcCIsIndyaXRlT2Zmc2V0IiwicmVhZE9mZnNldCIsIlZlY3RvcktleWZyYW1lVHJhY2siLCJkdXJhdGlvbiIsInRyYWNrcyIsInJlc2V0RHVyYXRpb24iLCJBbmltYXRpb25DbGlwIiwianNvblRyYWNrcyIsImZyYW1lVGltZSIsImZwcyIsImNsaXAiLCJjbGlwVHJhY2tzIiwiQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UiLCJtb3JwaFRhcmdldFNlcXVlbmNlIiwibm9Mb29wIiwibnVtTW9ycGhUYXJnZXRzIiwiZmluZEJ5TmFtZSIsIm9iamVjdE9yQ2xpcEFycmF5IiwiY2xpcEFycmF5IiwiYW5pbWF0aW9ucyIsIkNyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzIiwicGFydHMiLCJhbmltYXRpb25Ub01vcnBoVGFyZ2V0cyIsImFuaW1hdGlvbk1vcnBoVGFyZ2V0cyIsImNsaXBzIiwicGFyc2VBbmltYXRpb24iLCJhbmltYXRpb24iLCJ0cmFja05hbWUiLCJhbmltYXRpb25LZXlzIiwicHJvcGVydHlOYW1lIiwiZGVzdFRyYWNrcyIsImhpZXJhcmNoeSIsImhpZXJhcmNoeVRyYWNrcyIsIm1vcnBoVGFyZ2V0TmFtZXMiLCJhbmltYXRpb25LZXkiLCJtb3JwaFRhcmdldE5hbWUiLCJhZGROb25lbXB0eVRyYWNrIiwiYm9uZU5hbWUiLCJjbGlwTmFtZSIsIk1hdGVyaWFsTG9hZGVyIiwic2V0VGV4dHVyZXMiLCJzaGFkaW5nIiwiZ2V0VGV4dHVyZSIsIkJ1ZmZlckdlb21ldHJ5TG9hZGVyIiwidHlwZWRBcnJheSIsImRyYXdjYWxscyIsIm9mZnNldHMiLCJJbnQ4QXJyYXkiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJJbnQxNkFycmF5IiwiVWludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiVWludDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJMb2FkZXIiLCJIYW5kbGVycyIsImhhbmRsZXJzIiwicmVnZXgiLCJvbkxvYWRTdGFydCIsIm9uTG9hZFByb2dyZXNzIiwib25Mb2FkQ29tcGxldGUiLCJpbml0TWF0ZXJpYWxzIiwidGV4dHVyZVBhdGgiLCJjcmVhdGVNYXRlcmlhbCIsIkFkZGl0aXZlQmxlbmRpbmciLCJTdWJ0cmFjdGl2ZUJsZW5kaW5nIiwiTXVsdGlwbHlCbGVuZGluZyIsImZ1bGxQYXRoIiwidGV4dHVyZUxvYWRlciIsIkJsZW5kaW5nTW9kZSIsIm1hcERpZmZ1c2VSZXBlYXQiLCJtYXBEaWZmdXNlT2Zmc2V0IiwibWFwRGlmZnVzZVdyYXAiLCJtYXBEaWZmdXNlQW5pc290cm9weSIsIm1hcEVtaXNzaXZlUmVwZWF0IiwibWFwRW1pc3NpdmVPZmZzZXQiLCJtYXBFbWlzc2l2ZVdyYXAiLCJtYXBFbWlzc2l2ZUFuaXNvdHJvcHkiLCJtYXBMaWdodFJlcGVhdCIsIm1hcExpZ2h0T2Zmc2V0IiwibWFwTGlnaHRXcmFwIiwibWFwTGlnaHRBbmlzb3Ryb3B5IiwibWFwQU9SZXBlYXQiLCJtYXBBT09mZnNldCIsIm1hcEFPV3JhcCIsIm1hcEFPQW5pc290cm9weSIsIm1hcEJ1bXBSZXBlYXQiLCJtYXBCdW1wT2Zmc2V0IiwibWFwQnVtcFdyYXAiLCJtYXBCdW1wQW5pc290cm9weSIsIm1hcE5vcm1hbFJlcGVhdCIsIm1hcE5vcm1hbE9mZnNldCIsIm1hcE5vcm1hbFdyYXAiLCJtYXBOb3JtYWxBbmlzb3Ryb3B5IiwibWFwU3BlY3VsYXJSZXBlYXQiLCJtYXBTcGVjdWxhck9mZnNldCIsIm1hcFNwZWN1bGFyV3JhcCIsIm1hcFNwZWN1bGFyQW5pc290cm9weSIsIm1hcE1ldGFsbmVzc1JlcGVhdCIsIm1hcE1ldGFsbmVzc09mZnNldCIsIm1hcE1ldGFsbmVzc1dyYXAiLCJtYXBNZXRhbG5lc3NBbmlzb3Ryb3B5IiwibWFwUm91Z2huZXNzUmVwZWF0IiwibWFwUm91Z2huZXNzT2Zmc2V0IiwibWFwUm91Z2huZXNzV3JhcCIsIm1hcFJvdWdobmVzc0FuaXNvdHJvcHkiLCJtYXBBbHBoYVJlcGVhdCIsIm1hcEFscGhhT2Zmc2V0IiwibWFwQWxwaGFXcmFwIiwibWFwQWxwaGFBbmlzb3Ryb3B5IiwiVmVydGV4Q29sb3JzIiwiRmFjZUNvbG9ycyIsIm1hdGVyaWFsTG9hZGVyIiwiZGVjb2RlVGV4dCIsImRlY29kZSIsImZyb21DaGFyQ29kZSIsImVzY2FwZSIsImV4dHJhY3RVcmxCYXNlIiwibGFzdEluZGV4T2YiLCJKU09OTG9hZGVyIiwiTG9hZGVyVXRpbHMiLCJzZXRUZXh0dXJlUGF0aCIsImZpIiwiekxlbmd0aCIsImNvbG9ySW5kZXgiLCJub3JtYWxJbmRleCIsInV2SW5kZXgiLCJpc1F1YWQiLCJmYWNlQSIsImZhY2VCIiwidXZMYXllciIsIm5VdkxheWVycyIsImlzQml0U2V0IiwiaW5mbHVlbmNlc1BlclZlcnRleCIsInNyY1ZlcnRpY2VzIiwiZHN0VmVydGljZXMiLCJtb3JwaENvbG9ycyIsIm91dHB1dEFuaW1hdGlvbnMiLCJtb3JwaEFuaW1hdGlvbkNsaXBzIiwicGFyc2VNb2RlbCIsInBhcnNlU2tpbiIsInBhcnNlTW9ycGhpbmciLCJwYXJzZUFuaW1hdGlvbnMiLCJPYmplY3RMb2FkZXIiLCJzdWJzdHJpbmciLCJwYXJzZVNoYXBlIiwicGFyc2VHZW9tZXRyaWVzIiwicGFyc2VJbWFnZXMiLCJwYXJzZVRleHR1cmVzIiwicGFyc2VNYXRlcmlhbHMiLCJwYXJzZU9iamVjdCIsImRldGFpbHMiLCJnZW9tZXRyeVNoYXBlcyIsImJ1ZmZlckdlb21ldHJ5TG9hZGVyIiwiZ2VvbWV0cnlMb2FkZXIiLCJsb2FkSW1hZ2UiLCJwYXJzZUNvbnN0YW50IiwiVEVYVFVSRV9NQVBQSU5HIiwiVEVYVFVSRV9XUkFQUElORyIsIlRFWFRVUkVfRklMVEVSIiwiZ2V0R2VvbWV0cnkiLCJnZXRNYXRlcmlhbCIsIkN1YmVSZWZyYWN0aW9uTWFwcGluZyIsIkVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nIiwiRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmciLCJTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZyIsInN1YlBhdGhzIiwiY3VycmVudFBhdGgiLCJTaGFwZVBhdGgiLCJ0b1NoYXBlcyIsImlzQ0NXIiwibm9Ib2xlcyIsImluU3VicGF0aHMiLCJ0bXBTaGFwZSIsInRtcFBhdGgiLCJpblBvbHlnb24iLCJwb2x5TGVuIiwiZWRnZUhpZ2hQdCIsImVkZ2VMb3dQdCIsImVkZ2VEeSIsImVkZ2VEeCIsInBlcnBFZGdlIiwiaG9sZXNGaXJzdCIsIm5ld1NoYXBlcyIsIm1haW5JZHgiLCJuZXdTaGFwZUhvbGVzIiwidG1wUG9pbnRzIiwic29saWQiLCJzTGVuIiwic0lkeCIsImJldHRlclNoYXBlSG9sZXMiLCJoSWR4Iiwic2hvIiwiczJJZHgiLCJpc1BvaW50SW5zaWRlUG9seWdvbiIsImhvIiwidG9DaGFuZ2UiLCJmcm9tcyIsInRvcyIsImhvbGVfdW5hc3NpZ25lZCIsImFtYmlndW91cyIsInRtcEhvbGVzIiwiRm9udCIsImNyZWF0ZVBhdGhzIiwicGF0aHMiLCJ5TWF4IiwieU1pbiIsInVuZGVybGluZVRoaWNrbmVzcyIsImNoYXJzIiwiY2hhciIsImxpbmVfaGVpZ2h0IiwiY3JlYXRlUGF0aCIsImdseXBocyIsImdseXBoIiwiY3B4IiwiY3B5IiwiY3B4MSIsImNweTEiLCJjcHgyIiwiY3B5MiIsIl9jYWNoZWRPdXRsaW5lIiwib3V0bGluZSIsImFjdGlvbiIsImhhIiwiRm9udExvYWRlciIsIkF1ZGlvQ29udGV4dCIsIndlYmtpdEF1ZGlvQ29udGV4dCIsInNldENvbnRleHQiLCJBdWRpb0xvYWRlciIsImRlY29kZUF1ZGlvRGF0YSIsImF1ZGlvQnVmZmVyIiwiZXllU2VwIiwiU3RlcmVvQ2FtZXJhIiwieG1heCIsImV5ZUxlZnQiLCJleWVSaWdodCIsInhtaW4iLCJ5bWF4IiwiZXllU2VwT25Qcm9qZWN0aW9uIiwiY3ViZVJlc29sdXRpb24iLCJjYW1lcmFQWCIsImNhbWVyYU5YIiwiY2FtZXJhUFkiLCJjYW1lcmFOWSIsImNhbWVyYVBaIiwiY2FtZXJhTloiLCJDdWJlQ2FtZXJhIiwiZ2FpbiIsImNyZWF0ZUdhaW4iLCJjb25uZWN0IiwiZGVzdGluYXRpb24iLCJBdWRpb0xpc3RlbmVyIiwiZ2V0SW5wdXQiLCJyZW1vdmVGaWx0ZXIiLCJkaXNjb25uZWN0IiwiZ2V0RmlsdGVyIiwic2V0RmlsdGVyIiwiZ2V0TWFzdGVyVm9sdW1lIiwic2V0TWFzdGVyVm9sdW1lIiwic2V0VGFyZ2V0QXRUaW1lIiwiY3VycmVudFRpbWUiLCJwb3NpdGlvblgiLCJzZXRWYWx1ZUF0VGltZSIsInBvc2l0aW9uWSIsInBvc2l0aW9uWiIsImZvcndhcmRYIiwiZm9yd2FyZFkiLCJmb3J3YXJkWiIsInVwWCIsInVwWSIsInVwWiIsInNldE9yaWVudGF0aW9uIiwiYXV0b3BsYXkiLCJsb29wIiwicGxheWJhY2tSYXRlIiwiaXNQbGF5aW5nIiwiaGFzUGxheWJhY2tDb250cm9sIiwic291cmNlVHlwZSIsImZpbHRlcnMiLCJBdWRpbyIsImdldE91dHB1dCIsInNldE5vZGVTb3VyY2UiLCJhdWRpb05vZGUiLCJzZXRCdWZmZXIiLCJwbGF5IiwiY3JlYXRlQnVmZmVyU291cmNlIiwib25lbmRlZCIsIm9uRW5kZWQiLCJwYXVzZSIsImdldEZpbHRlcnMiLCJzZXRGaWx0ZXJzIiwic2V0UGxheWJhY2tSYXRlIiwiZ2V0UGxheWJhY2tSYXRlIiwiZ2V0TG9vcCIsInNldExvb3AiLCJnZXRWb2x1bWUiLCJzZXRWb2x1bWUiLCJwYW5uZXIiLCJjcmVhdGVQYW5uZXIiLCJQb3NpdGlvbmFsQXVkaW8iLCJnZXRSZWZEaXN0YW5jZSIsInJlZkRpc3RhbmNlIiwic2V0UmVmRGlzdGFuY2UiLCJnZXRSb2xsb2ZmRmFjdG9yIiwicm9sbG9mZkZhY3RvciIsInNldFJvbGxvZmZGYWN0b3IiLCJnZXREaXN0YW5jZU1vZGVsIiwiZGlzdGFuY2VNb2RlbCIsInNldERpc3RhbmNlTW9kZWwiLCJnZXRNYXhEaXN0YW5jZSIsIm1heERpc3RhbmNlIiwic2V0TWF4RGlzdGFuY2UiLCJhdWRpbyIsImZmdFNpemUiLCJhbmFseXNlciIsImNyZWF0ZUFuYWx5c2VyIiwiZnJlcXVlbmN5QmluQ291bnQiLCJBdWRpb0FuYWx5c2VyIiwiZ2V0RnJlcXVlbmN5RGF0YSIsImdldEJ5dGVGcmVxdWVuY3lEYXRhIiwiZ2V0QXZlcmFnZUZyZXF1ZW5jeSIsImJpbmRpbmciLCJtaXhGdW5jdGlvbiIsIl9zbGVycCIsIl9zZWxlY3QiLCJfbGVycCIsIl9taXhCdWZmZXJSZWdpb24iLCJjdW11bGF0aXZlV2VpZ2h0IiwidXNlQ291bnQiLCJyZWZlcmVuY2VDb3VudCIsIlByb3BlcnR5TWl4ZXIiLCJhY2N1bXVsYXRlIiwiYWNjdUluZGV4IiwiY3VycmVudFdlaWdodCIsIm1peCIsIm9yaWdpbmFsVmFsdWVPZmZzZXQiLCJzYXZlT3JpZ2luYWxTdGF0ZSIsImdldFZhbHVlIiwicmVzdG9yZU9yaWdpbmFsU3RhdGUiLCJ0YXJnZXRHcm91cCIsIm9wdGlvbmFsUGFyc2VkUGF0aCIsIlByb3BlcnR5QmluZGluZyIsInBhcnNlVHJhY2tOYW1lIiwiX3RhcmdldEdyb3VwIiwiX2JpbmRpbmdzIiwic3Vic2NyaWJlXyIsInBhcnNlZFBhdGgiLCJDb21wb3NpdGUiLCJuQ2FjaGVkT2JqZWN0c18iLCJmaXJzdFZhbGlkSW5kZXgiLCJiaW5kaW5ncyIsInVuYmluZCIsInJvb3ROb2RlIiwiZmluZE5vZGUiLCJub2RlTmFtZSIsInJvb3QiLCJpc0FuaW1hdGlvbk9iamVjdEdyb3VwIiwic2FuaXRpemVOb2RlTmFtZSIsIlJFU0VSVkVEX0NIQVJTX1JFIiwicmVzZXJ2ZWRSZSIsIndvcmRDaGFyIiwid29yZENoYXJPckRvdCIsImRpcmVjdG9yeVJlIiwibm9kZVJlIiwib2JqZWN0UmUiLCJwcm9wZXJ0eVJlIiwidHJhY2tSZSIsIm1hdGNoZXMiLCJvYmplY3ROYW1lIiwib2JqZWN0SW5kZXgiLCJwcm9wZXJ0eUluZGV4IiwicmVzdWx0cyIsImxhc3REb3QiLCJzdXBwb3J0ZWRPYmplY3ROYW1lcyIsImNoaWxkTm9kZSIsInNlYXJjaE5vZGVTdWJ0cmVlIiwic3ViVHJlZU5vZGUiLCJfZ2V0VmFsdWVfdW5hdmFpbGFibGUiLCJfc2V0VmFsdWVfdW5hdmFpbGFibGUiLCJCaW5kaW5nVHlwZSIsIkRpcmVjdCIsIkVudGlyZUFycmF5IiwiQXJyYXlFbGVtZW50IiwiSGFzRnJvbVRvQXJyYXkiLCJWZXJzaW9uaW5nIiwiTm9uZSIsIk5lZWRzVXBkYXRlIiwiTWF0cml4V29ybGROZWVkc1VwZGF0ZSIsIkdldHRlckJ5QmluZGluZ1R5cGUiLCJyZXNvbHZlZFByb3BlcnR5IiwiU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmciLCJ0YXJnZXRPYmplY3QiLCJkZXN0IiwidGFyZ2V0QXJyYXkiLCJzb3VyY2VBcnJheSIsIm5vZGVQcm9wZXJ0eSIsInZlcnNpb25pbmciLCJiaW5kaW5nVHlwZSIsIl9nZXRWYWx1ZV91bmJvdW5kIiwiX3NldFZhbHVlX3VuYm91bmQiLCJfaW5kaWNlc0J5VVVJRCIsIl9wYXRocyIsIl9wYXJzZWRQYXRocyIsIl9iaW5kaW5nc0luZGljZXNCeVBhdGgiLCJzdGF0cyIsInRvdGFsIiwiQW5pbWF0aW9uT2JqZWN0R3JvdXAiLCJuT2JqZWN0cyIsIm5DYWNoZWRPYmplY3RzIiwiaW5kaWNlc0J5VVVJRCIsInBhcnNlZFBhdGhzIiwibkJpbmRpbmdzIiwia25vd25PYmplY3QiLCJsYXN0Q2FjaGVkT2JqZWN0IiwiZmlyc3RBY3RpdmVJbmRleCIsImxhc3RDYWNoZWQiLCJiaW5kaW5nc0ZvclBhdGgiLCJmaXJzdEFjdGl2ZU9iamVjdCIsImxhc3RDYWNoZWRJbmRleCIsImZpcnN0QWN0aXZlIiwidW5jYWNoZSIsImxhc3RPYmplY3QiLCJpbmRpY2VzQnlQYXRoIiwidW5zdWJzY3JpYmVfIiwibGFzdEJpbmRpbmdzSW5kZXgiLCJsYXN0QmluZGluZ3MiLCJsYXN0QmluZGluZ3NQYXRoIiwibWl4ZXIiLCJsb2NhbFJvb3QiLCJfbWl4ZXIiLCJfY2xpcCIsIl9sb2NhbFJvb3QiLCJuVHJhY2tzIiwiaW50ZXJwb2xhbnRzIiwiaW50ZXJwb2xhbnQiLCJpbnRlcnBvbGFudFNldHRpbmdzIiwiX2ludGVycG9sYW50U2V0dGluZ3MiLCJfaW50ZXJwb2xhbnRzIiwiX3Byb3BlcnR5QmluZGluZ3MiLCJfY2FjaGVJbmRleCIsIl9ieUNsaXBDYWNoZUluZGV4IiwiX3RpbWVTY2FsZUludGVycG9sYW50IiwiX3dlaWdodEludGVycG9sYW50IiwiTG9vcFJlcGVhdCIsIl9sb29wQ291bnQiLCJfc3RhcnRUaW1lIiwiX2VmZmVjdGl2ZVRpbWVTY2FsZSIsIl9lZmZlY3RpdmVXZWlnaHQiLCJyZXBldGl0aW9ucyIsInBhdXNlZCIsImNsYW1wV2hlbkZpbmlzaGVkIiwiemVyb1Nsb3BlQXRTdGFydCIsInplcm9TbG9wZUF0RW5kIiwiQW5pbWF0aW9uQWN0aW9uIiwiX2FjdGl2YXRlQWN0aW9uIiwiX2RlYWN0aXZhdGVBY3Rpb24iLCJzdG9wRmFkaW5nIiwic3RvcFdhcnBpbmciLCJpc1J1bm5pbmciLCJfaXNBY3RpdmVBY3Rpb24iLCJpc1NjaGVkdWxlZCIsInN0YXJ0QXQiLCJzZXRFZmZlY3RpdmVXZWlnaHQiLCJnZXRFZmZlY3RpdmVXZWlnaHQiLCJmYWRlSW4iLCJfc2NoZWR1bGVGYWRpbmciLCJmYWRlT3V0IiwiY3Jvc3NGYWRlRnJvbSIsImZhZGVPdXRBY3Rpb24iLCJ3YXJwIiwiZmFkZU91dER1cmF0aW9uIiwic3RhcnRFbmRSYXRpbyIsImZhZGVJbkR1cmF0aW9uIiwiZW5kU3RhcnRSYXRpbyIsImNyb3NzRmFkZVRvIiwiZmFkZUluQWN0aW9uIiwid2VpZ2h0SW50ZXJwb2xhbnQiLCJfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQiLCJzZXRFZmZlY3RpdmVUaW1lU2NhbGUiLCJnZXRFZmZlY3RpdmVUaW1lU2NhbGUiLCJzZXREdXJhdGlvbiIsInN5bmNXaXRoIiwiaGFsdCIsInN0YXJ0VGltZVNjYWxlIiwiZW5kVGltZVNjYWxlIiwiX2xlbmRDb250cm9sSW50ZXJwb2xhbnQiLCJ0aW1lU2NhbGVJbnRlcnBvbGFudCIsImdldE1peGVyIiwiZ2V0Q2xpcCIsImdldFJvb3QiLCJfcm9vdCIsIl91cGRhdGUiLCJkZWx0YVRpbWUiLCJ0aW1lRGlyZWN0aW9uIiwiX3VwZGF0ZVdlaWdodCIsInRpbWVSdW5uaW5nIiwiX3VwZGF0ZVRpbWVTY2FsZSIsIl91cGRhdGVUaW1lIiwiY2xpcFRpbWUiLCJwcm9wZXJ0eU1peGVycyIsImludGVycG9sYW50VmFsdWUiLCJsb29wQ291bnQiLCJMb29wT25jZSIsIl9zZXRFbmRpbmdzIiwiaGFuZGxlX3N0b3AiLCJMb29wUGluZ1BvbmciLCJwaW5nUG9uZyIsImxvb3BEZWx0YSIsInBlbmRpbmciLCJhdFN0YXJ0IiwiYXRFbmQiLCJaZXJvU2xvcGVFbmRpbmciLCJXcmFwQXJvdW5kRW5kaW5nIiwid2VpZ2h0Tm93Iiwid2VpZ2h0VGhlbiIsIl9pbml0TWVtb3J5TWFuYWdlciIsIl9hY2N1SW5kZXgiLCJBbmltYXRpb25NaXhlciIsIl9iaW5kQWN0aW9uIiwicHJvdG90eXBlQWN0aW9uIiwicm9vdFV1aWQiLCJiaW5kaW5nc0J5Um9vdCIsIl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUiLCJiaW5kaW5nc0J5TmFtZSIsIl9hZGRJbmFjdGl2ZUJpbmRpbmciLCJjbGlwVXVpZCIsImFjdGlvbnNGb3JDbGlwIiwiX2FjdGlvbnNCeUNsaXAiLCJrbm93bkFjdGlvbnMiLCJfYWRkSW5hY3RpdmVBY3Rpb24iLCJfbGVuZEJpbmRpbmciLCJfbGVuZEFjdGlvbiIsIl90YWtlQmFja0JpbmRpbmciLCJfdGFrZUJhY2tBY3Rpb24iLCJfYWN0aW9ucyIsIl9uQWN0aXZlQWN0aW9ucyIsIl9uQWN0aXZlQmluZGluZ3MiLCJfY29udHJvbEludGVycG9sYW50cyIsIl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyIsImFjdGlvbnMiLCJjb250cm9sSW50ZXJwb2xhbnRzIiwiYWN0aW9uc0J5Q2xpcCIsImFjdGlvbkJ5Um9vdCIsIl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiIsImxhc3RJbmFjdGl2ZUFjdGlvbiIsImNhY2hlSW5kZXgiLCJrbm93bkFjdGlvbnNGb3JDbGlwIiwibGFzdEtub3duQWN0aW9uIiwiYnlDbGlwQ2FjaGVJbmRleCIsIl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uIiwiX3JlbW92ZUluYWN0aXZlQmluZGluZyIsInByZXZJbmRleCIsImxhc3RBY3RpdmVJbmRleCIsImZpcnN0SW5hY3RpdmVBY3Rpb24iLCJmaXJzdEluYWN0aXZlSW5kZXgiLCJsYXN0QWN0aXZlQWN0aW9uIiwiYmluZGluZ0J5TmFtZSIsInByb3BCaW5kaW5nIiwibGFzdEluYWN0aXZlQmluZGluZyIsInJlbW92ZV9lbXB0eV9tYXAiLCJmaXJzdEluYWN0aXZlQmluZGluZyIsImxhc3RBY3RpdmVCaW5kaW5nIiwiX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIiLCJfX2NhY2hlSW5kZXgiLCJsYXN0QWN0aXZlSW50ZXJwb2xhbnQiLCJjbGlwQWN0aW9uIiwib3B0aW9uYWxSb290IiwiY2xpcE9iamVjdCIsImV4aXN0aW5nQWN0aW9uIiwibmV3QWN0aW9uIiwic3RvcEFsbEFjdGlvbiIsIm5BY3Rpb25zIiwidW5jYWNoZUNsaXAiLCJhY3Rpb25zVG9SZW1vdmUiLCJ1bmNhY2hlUm9vdCIsInVuY2FjaGVBY3Rpb24iLCJVbmlmb3JtIiwiSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiLCJpbnRlcmxlYXZlZEJ1ZmZlciIsIkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIiwiSW50ZXJsZWF2ZWRCdWZmZXIiLCJpc0ludGVybGVhdmVkQnVmZmVyIiwiSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIiLCJJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUiLCJQb2ludENsb3VkIiwiaW50ZXJzZWN0T2JqZWN0IiwiUmF5Y2FzdGVyIiwic2V0RnJvbUNhbWVyYSIsImNvb3JkcyIsImFzY1NvcnQiLCJpbnRlcnNlY3RPYmplY3RzIiwiYXV0b1N0YXJ0Iiwib2xkVGltZSIsImVsYXBzZWRUaW1lIiwicnVubmluZyIsIkNsb2NrIiwiRGF0ZSIsInBlcmZvcm1hbmNlIiwiZ2V0RWxhcHNlZFRpbWUiLCJnZXREZWx0YSIsIm5ld1RpbWUiLCJTcGhlcmljYWwiLCJvdGhlciIsIm1ha2VTYWZlIiwidmVjMyIsIkN5bGluZHJpY2FsIiwiQm94MiIsIkltbWVkaWF0ZVJlbmRlck9iamVjdCIsIm9iakdlb21ldHJ5Iiwibk5vcm1hbHMiLCJWZXJ0ZXhOb3JtYWxzSGVscGVyIiwib2JqUG9zIiwib2JqTm9ybSIsImNvbmUiLCJTcG90TGlnaHRIZWxwZXIiLCJjb25lTGVuZ3RoIiwiY29uZVdpZHRoIiwiYm9uZUxpc3QiLCJnZXRCb25lTGlzdCIsIlNrZWxldG9uSGVscGVyIiwibWF0cml4V29ybGRJbnYiLCJib25lTWF0cml4Iiwic3BoZXJlU2l6ZSIsIlBvaW50TGlnaHRIZWxwZXIiLCJSZWN0QXJlYUxpZ2h0SGVscGVyIiwiSGVtaXNwaGVyZUxpZ2h0SGVscGVyIiwiR3JpZEhlbHBlciIsInJhZGlhbHMiLCJjaXJjbGVzIiwiUG9sYXJHcmlkSGVscGVyIiwiRmFjZU5vcm1hbHNIZWxwZXIiLCJsaWdodFBsYW5lIiwidGFyZ2V0TGluZSIsIkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIiLCJhZGRMaW5lIiwiY29sb3JGcnVzdHVtIiwiY29sb3JDb25lIiwiY29sb3JVcCIsImNvbG9yVGFyZ2V0IiwiY29sb3JDcm9zcyIsImFkZFBvaW50IiwicG9pbnRNYXAiLCJDYW1lcmFIZWxwZXIiLCJzZXRQb2ludCIsIkJveEhlbHBlciIsIkJveDNIZWxwZXIiLCJwb3NpdGlvbnMyIiwiUGxhbmVIZWxwZXIiLCJoZWFkTGVuZ3RoIiwiaGVhZFdpZHRoIiwibGluZUdlb21ldHJ5IiwiY29uZUdlb21ldHJ5Iiwic2V0RGlyZWN0aW9uIiwiQXJyb3dIZWxwZXIiLCJzZXRDb2xvciIsIkF4ZXNIZWxwZXIiLCJjb25zdHJ1Y3QiLCJjcmVhdGVQb2ludHNHZW9tZXRyeSIsImNyZWF0ZUdlb21ldHJ5IiwiY3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnkiLCJmcm9tUG9pbnRzIiwiU3BsaW5lIiwiaW5pdEZyb21BcnJheSIsImdldENvbnRyb2xQb2ludHNBcnJheSIsInJlcGFyYW1ldHJpemVCeUFyY0xlbmd0aCIsInNldENvbG9ycyIsImlzSW50ZXJzZWN0aW9uQm94IiwiaXNJbnRlcnNlY3Rpb25TcGhlcmUiLCJyYW5kb20xNiIsIm5lYXJlc3RQb3dlck9mVHdvIiwibmV4dFBvd2VyT2ZUd28iLCJmbGF0dGVuVG9BcnJheU9mZnNldCIsIm11bHRpcGx5VmVjdG9yMyIsIm11bHRpcGx5VmVjdG9yM0FycmF5IiwiYXBwbHlUb0J1ZmZlciIsImFwcGx5VG9WZWN0b3IzQXJyYXkiLCJleHRyYWN0UG9zaXRpb24iLCJnZXRQb3NpdGlvbiIsIm11bHRpcGx5VG9BcnJheSIsIm11bHRpcGx5VmVjdG9yNCIsInJvdGF0ZUF4aXMiLCJjcm9zc1ZlY3RvciIsInJvdGF0ZUJ5QXhpcyIsIm1ha2VGcnVzdHVtIiwiaXNJbnRlcnNlY3Rpb25MaW5lIiwiaXNJbnRlcnNlY3Rpb25QbGFuZSIsImJhcnljb29yZEZyb21Qb2ludCIsIm1pZHBvaW50IiwiZXh0cmFjdEFsbFBvaW50cyIsImV4dHJ1ZGUiLCJtYWtlR2VvbWV0cnkiLCJmcm9tQXR0cmlidXRlIiwiZGlzdGFuY2VUb01hbmhhdHRhbiIsImxlbmd0aE1hbmhhdHRhbiIsInNldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4Iiwic2V0RXVsZXJGcm9tUXVhdGVybmlvbiIsImdldFBvc2l0aW9uRnJvbU1hdHJpeCIsImdldFNjYWxlRnJvbU1hdHJpeCIsImdldENvbHVtbkZyb21NYXRyaXgiLCJhcHBseVByb2plY3Rpb24iLCJjb21wdXRlVGFuZ2VudHMiLCJnZXRDaGlsZEJ5TmFtZSIsInJlbmRlckRlcHRoIiwiZ2V0V29ybGRSb3RhdGlvbiIsImV1bGVyT3JkZXIiLCJ1c2VRdWF0ZXJuaW9uIiwic2V0TGVucyIsIm9ubHlTaGFkb3ciLCJzaGFkb3dDYW1lcmFGb3YiLCJzaGFkb3dDYW1lcmFMZWZ0Iiwic2hhZG93Q2FtZXJhUmlnaHQiLCJzaGFkb3dDYW1lcmFUb3AiLCJzaGFkb3dDYW1lcmFCb3R0b20iLCJzaGFkb3dDYW1lcmFWaXNpYmxlIiwic2hhZG93RGFya25lc3MiLCJzaGFkb3dNYXBXaWR0aCIsInNoYWRvd01hcEhlaWdodCIsImNvcHlJbmRpY2VzQXJyYXkiLCJhZGRJbmRleCIsImFkZERyYXdDYWxsIiwiY2xlYXJEcmF3Q2FsbHMiLCJjb21wdXRlT2Zmc2V0cyIsImdldEFycmF5cyIsImFkZFNoYXBlTGlzdCIsIndyYXBBcm91bmQiLCJ3cmFwUkdCIiwibWV0YWwiLCJXZWJHTFJlbmRlcmVyIiwiZ2V0Q3VycmVudFJlbmRlclRhcmdldCIsImdldFByZWNpc2lvbiIsInJlc2V0R0xTdGF0ZSIsInN1cHBvcnRzRmxvYXRUZXh0dXJlcyIsInN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXMiLCJzdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMiLCJzdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQyIsInN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQyIsInN1cHBvcnRzQmxlbmRNaW5NYXgiLCJzdXBwb3J0c0luc3RhbmNlZEFycmF5cyIsImVuYWJsZVNjaXNzb3JUZXN0IiwiYWRkUHJlUGx1Z2luIiwiYWRkUG9zdFBsdWdpbiIsInVwZGF0ZVNoYWRvd01hcCIsInNldEZhY2VDdWxsaW5nIiwic2hhZG93TWFwQ3VsbEZhY2UiLCJXZWJHTFNoYWRvd01hcCIsInJlbmRlclJldmVyc2VTaWRlZCIsInJlbmRlclNpbmdsZVNpZGVkIiwiV2ViVlJNYW5hZ2VyIiwic3RhbmRpbmciLCJhdWRpb0xvYWRlciIsImdldERhdGEiLCJ1cGRhdGVDdWJlTWFwIiwib24iLCJjdHgiLCJldmVudHMiLCJvZmYiLCJUWVBFIiwiX2YiLCJnZXRDb25zdHJ1Y3RvciIsIklTX01BUCIsIkFEREVSIiwiX2wiLCJTSVpFIiwiX3ZhbGlkYXRlQ29sbGVjdGlvbiIsImdldEVudHJ5IiwiaGFzIiwiZFAkMiIsInNldFN0cm9uZyIsIm9yaWdpbmFsIiwiU1BFQ0lFUyQyIiwiX2FycmF5U3BlY2llc0NvbnN0cnVjdG9yIiwiSVNfRklORF9JTkRFWCIsIl9hcnJheVNwZWNpZXNDcmVhdGUiLCJfaW9iamVjdCIsIklTX0ZJTFRFUiIsInJlcyIsIk5PX0hPTEVTIiwiSVNfRVZFUlkiLCJJU19TT01FIiwiX2FycmF5TWV0aG9kcyIsIklTX1dFQUsiLCJlYWNoIiwiSVNfQURERVIiLCJkUCQzIiwiX2NvbGxlY3Rpb24iLCJNQVAiLCJfY29sbGVjdGlvblN0cm9uZyIsIl9jb2xsZWN0aW9uVG9Kc29uIiwiQ09MTEVDVElPTiIsIm9mIiwiQSIsIl9zZXRDb2xsZWN0aW9uT2YiLCJtYXBGbiIsIm5leHRJdGVtIiwiX3NldENvbGxlY3Rpb25Gcm9tIiwiTWFwIiwiZmFjdG9yaWVzIiwicGFydEFyZ3MiLCJib3VuZCIsIlJlZmxlY3QiLCJyQ29uc3RydWN0IiwiTkVXX1RBUkdFVF9CVUciLCJBUkdTX0JVRyIsIlRhcmdldCIsIm5ld1RhcmdldCIsIiRhcmdzIiwiX2JpbmQiLCJjb25zdHJ1Y3QkMSIsIlBhcmVudCIsIkNsYXNzIiwiY29uc3RydWN0JDIiLCJfY29uc3RydWN0IiwiX3dyYXBOYXRpdmVTdXBlciIsIl9jYWNoZSIsImNyZWF0ZSQxIiwiZ2V0UHJvdG90eXBlT2YkMiIsIl9FcnJvciIsImNsYXNzSW5zdGFuY2UiLCJjb21wb25lbnQiLCJjbGFzc0NhbGxDaGVjayIsIkNvbXBvc2l0aW9uRXJyb3IiLCJwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuIiwic3RhY2siLCJzdGFja0FycmF5IiwiaW5oZXJpdHMiLCJ3cmFwTmF0aXZlU3VwZXIiLCJFcnJvciIsIl9FcnJvcjIiLCJhY3RpdmVNb2R1bGUiLCJEZXBlbmRlbmN5RXJyb3IiLCJfdGhpczIiLCJkZXBlbmRlbmN5TW9kdWxlIiwiX0Vycm9yMyIsIk1hbmFnZXJFcnJvciIsIl90aGlzMyIsIndhcm5EZXBzIiwiX0V2ZW50cyIsIk1vZHVsZVN5c3RlbSIsImNyZWF0ZUNsYXNzIiwibW9kdWxlcyIsImFwcGx5TW9kdWxlIiwiYXBwbHlCcmlkZ2UiLCJvbkNvcHkiLCJicmlkZ2VNYXAiLCJicmlkZ2UiLCJtb2R1bGVTY29wZSIsImFjdGl2ZSIsImludGVncmF0ZSIsImRpc3Bvc2VNb2R1bGUiLCJfbW9kdWxlIiwibWluaXZlbnRzX2NvbW1vbmpzIiwiX2FycmF5V2l0aEhvbGVzIiwiZ2V0SXRlcmF0b3IiLCJjb3JlX2dldEl0ZXJhdG9yIiwiZ2V0SXRlcmF0b3IkMSIsIl9hcnIiLCJfZSIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl9ub25JdGVyYWJsZVJlc3QiLCJpdGVyYWJsZVRvQXJyYXlMaW1pdCIsIm5vbkl0ZXJhYmxlUmVzdCIsIl9zbGljZWRUb0FycmF5Iiwib2JzZXJ2YWJsZSIsInN5bWJvbE9ic2VydmFibGVQb255ZmlsbCIsIklOSVQiLCJSRVBMQUNFIiwicmVkdWNlciIsInByZWxvYWRlZFN0YXRlIiwiZW5oYW5jZXIiLCJjcmVhdGVTdG9yZSIsImN1cnJlbnRMaXN0ZW5lcnMiLCJuZXh0TGlzdGVuZXJzIiwiaXNEaXNwYXRjaGluZyIsImVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMiLCJpc1N1YnNjcmliZWQiLCJpc1BsYWluT2JqZWN0IiwiY3VycmVudFN0YXRlIiwiY3VycmVudFJlZHVjZXIiLCJuZXh0UmVkdWNlciIsImRpc3BhdGNoIiwiQWN0aW9uVHlwZXMiLCJzdWJzY3JpYmUiLCJvYnNlcnZlciIsImdldFN0YXRlIiwib2JzZXJ2ZVN0YXRlIiwib3V0ZXJTdWJzY3JpYmUiLCJ1bnN1YnNjcmliZSIsIl9yZWYiLCJyZXBsYWNlUmVkdWNlciIsIl9yZWYyIiwiTW9kdWxlTWFuYWdlciIsImN1cnJlbnRNb2R1bGUiLCJfdGhpcyRzdG9yZSRnZXRTdGF0ZTIiLCJzbGljZWRUb0FycmF5IiwiX3RoaXMkc3RvcmUkZ2V0U3RhdGUiLCJjaGFuZ2VkS2V5IiwiZGVwc01hcCIsIm1vZHVsZUV4ZWN1dG9yIiwidXNlIiwiX01vZHVsZVN5c3RlbSIsIkNvbXBvbmVudCIsImRlZmF1bHRzIiwiYXNzZXJ0VGhpc0luaXRpYWxpemVkIiwiaW50ZWdyYXRlTW9kdWxlcyIsIl93YWl0IiwiaXNEZWZmZXJlZCIsIndhaXQiLCJjdXN0b21pemUiLCJvYmplY3RTcHJlYWQiLCJuYXRpdmUiLCJhc3luY1RvR2VuZXJhdG9yIiwicmVnZW5lcmF0b3IiLCJvbkFkZCIsIl9jYWxsZWUiLCJfY29udGV4dDIiLCJfY2FsbGVlMiIsIl94MiIsIl9tYW5hZ2VyIiwiX25hdGl2ZSIsInByb3BlcnR5S2V5IiwicmVjZWl2ZXIiLCJnZXQkMSIsInByb3BlcnR5IiwiX3N1cGVyUHJvcEJhc2UiLCJnZXQkMiIsIl9nZXQiLCJzdXBlclByb3BCYXNlIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDEiLCJtYXBwZXJzIiwibWFwcGVyIiwiZ2V0dGVyIiwiX2xlbjIiLCJfa2V5MiIsIl9sZW4zIiwiX2tleTMiLCJfY2xhc3MiLCJNZXNoQ29tcG9uZW50IiwiX2RlYyIsIm1pcnJvciIsIl9Db21wb25lbnQiLCJnZW9tIiwiX01lc2hDb21wb25lbnQiLCJfY2xhc3MyIiwiX3RoaXMkYXBwbHlCcmlkZ2UiLCJjdXN0b20iLCJidWlsZCIsImFwcGx5Q29tbWFuZCIsIl90aGlzMiRwYXJhbXMiLCJjYXN0IiwicmVjZWl2ZSIsIm9uV3JhcCIsIl9jbGFzcyQxIiwiTGlnaHRDb21wb25lbnQiLCJfZGVjJDEiLCJ3cmFwU2hhZG93IiwiX2NsYXNzJDIiLCJDYW1lcmFDb21wb25lbnQiLCJfZGVjJDIiLCJBcHAiLCJzeXN0ZW0iLCJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJsb29wcyIsInJlcXVlc3RBbmltRnJhbWUiLCJsbCIsImV4ZWN1dGUiLCJjbG9jayIsIkxvb3AiLCJ1c2VDbG9jayIsIndvcmxkIiwiYWRkTG9vcCIsInJlbW92ZUxvb3AiLCJfTGlnaHRDb21wb25lbnQiLCJBbWJpZW50TGlnaHQkJDEiLCJBbWJpZW50TGlnaHQkMSIsIkRpcmVjdGlvbmFsTGlnaHQkJDEiLCJEaXJlY3Rpb25hbExpZ2h0JDEiLCJIZW1pc3BoZXJlTGlnaHQkJDEiLCJIZW1pc3BoZXJlTGlnaHQkMSIsIlBvaW50TGlnaHQkJDEiLCJQb2ludExpZ2h0JDEiLCJTcG90TGlnaHQkJDEiLCJleHBvbmVudCIsIlNwb3RMaWdodCQxIiwiQXJlYUxpZ2h0IiwiX0NhbWVyYUNvbXBvbmVudCIsIkN1YmVDYW1lcmEkJDEiLCJDdWJlQ2FtZXJhJDEiLCJPcnRob2dyYXBoaWNDYW1lcmEkJDEiLCJPcnRob2dyYXBoaWNDYW1lcmEkMSIsImlubmVyV2lkdGgiLCJpbm5lckhlaWdodCIsIlBlcnNwZWN0aXZlQ2FtZXJhJCQxIiwiUGVyc3BlY3RpdmVDYW1lcmEkMSIsIkJveCIsImJ1aWxkR2VvbWV0cnkiLCJDaXJjbGUiLCJDb25lIiwiZ2V0JDMiLCJyYWRpdXNTZWdtZW50cyIsIkN5bGluZGVyIiwiRG9kZWNhaGVkcm9uIiwiRXh0cnVkZSIsIkljb3NhaGVkcm9uIiwiTGF0aGUiLCJMaW5lJCQxIiwidmVydHMiLCJpMyIsIkxpbmUkMSIsIkltcG9ydGVyIiwiX2ZpbHRlciIsInByb2Nlc3NGaWx0ZXIiLCJ1c2VDdXN0b21NYXRlcmlhbCIsIk9jdGFoZWRyb24iLCJQYXJhbWV0cmljIiwiUGxhbmUkJDEiLCJ3U2VnbWVudHMiLCJoU2VnbWVudHMiLCJQbGFuZSQxIiwiaW5kaWNlc09mRmFjZXMiLCJQb2x5aGVkcm9uIiwidmVydGljZXNPZkN1YmUiLCJSaW5nIiwiU2hhcGUkJDEiLCJTaGFwZSQxIiwiU3BoZXJlJCQxIiwiU3BoZXJlJDEiLCJUZXRyYWhlZHJvbiIsIlRleHQiLCJUb3J1cyIsIlRvcnVza25vdCIsIlR1YmUiLCJHcm91cCQkMSIsImFkZFRvIiwiYm9keSIsIkVsZW1lbnRNb2R1bGUiLCJjbGFzc05hbWUiLCJSZW5kZXJpbmdNb2R1bGUiLCJkZXZpY2VQaXhlbFJhdGlvIiwiYmdDb2xvciIsImJnT3BhY2l0eSIsImZpeCIsIl90aGlzJHBhcmFtcyIsImVmZmVjdHMiLCJ0b0ZpeGVkIiwiYWRkaXRpb25hbCIsImFwcGx5QWRkaXRpb25hbCIsImF0dGFjaFRvQ2FudmFzIiwiX2VmZmVjdCIsInJlbmRlckxvb3AiLCJlZmZlY3RMb29wIiwiYXBwIiwiZGVmaW5lIiwiaW50ZWdyYXRlUmVuZGVyZXIiLCJfZWxlbWVudCIsIl9zY2VuZSIsIl9jYW1lcmEiLCJfdGhpczQiLCJTY2VuZU1vZHVsZSIsIndpbGxTY2VuZUJlUmVwbGFjZWQiLCJfc2V0U2NlbmUiLCJTWU1CT0xfQ0hJTERSRU5fRk9SX1NDRU5FIiwic2V0U2NlbmUiLCJnZXRTY2VuZSIsIlJlc2l6ZU1vZHVsZSIsImF1dG8iLCJyZW5kZXJpbmciLCJvZmZzZXRXaWR0aCIsIl90aGlzJGNvbnRhaW5lciIsIm9mZnNldEhlaWdodCIsImdldENvbnRhaW5lciIsImdldFJlc29sdXRpb24iLCJ0cmlnZ2VyIiwiX2NvbnRhaW5lciIsImFkZEF1dG9yZXNpemUiLCJfU2hhZGVyTWF0ZXJpYWwiLCJBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCIsIk1JUF9MRVZFTF8xWDEiLCJ0UHJldmlvdXNMdW0iLCJ0Q3VycmVudEx1bSIsIm1pbkx1bWluYW5jZSIsInRhdSIsImZyYWdtZW50IiwiQm9rZWhNYXRlcmlhbCIsImRvZiIsImFwZXJ0dXJlIiwibWF4Qmx1ciIsImNhbWVyYU5lYXIiLCJjYW1lcmFGYXIiLCJ0RGlmZnVzZSIsInREZXB0aCIsImZyYWdtZW50JDEiLCJ2ZXJ0ZXgkMSIsImFkb3B0Q2FtZXJhU2V0dGluZ3MiLCJDb2xvckVkZ2VzTWF0ZXJpYWwiLCJFREdFX1RIUkVTSE9MRCIsInRleGVsU2l6ZSIsImZyYWdtZW50JDIiLCJ2ZXJ0ZXgkMiIsIkNvbWJpbmVNYXRlcmlhbCIsInRleHR1cmUxIiwidGV4dHVyZTIiLCJvcGFjaXR5MSIsIm9wYWNpdHkyIiwiZnJhZ21lbnQkMyIsInZlcnRleCQzIiwic2V0U2NyZWVuTW9kZUVuYWJsZWQiLCJzY3JlZW5Nb2RlIiwiU0NSRUVOX01PREUiLCJDb252b2x1dGlvbk1hdGVyaWFsIiwiaGFsZlRleGVsU2l6ZSIsImtlcm5lbCIsImZyYWdtZW50JDQiLCJ2ZXJ0ZXgkNCIsInNldFRleGVsU2l6ZSIsImtlcm5lbFNpemUiLCJLZXJuZWxTaXplIiwiTEFSR0UiLCJWRVJZX1NNQUxMIiwiU01BTEwiLCJNRURJVU0iLCJWRVJZX0xBUkdFIiwiSFVHRSIsIkNvcHlNYXRlcmlhbCIsImZyYWdtZW50JDUiLCJ2ZXJ0ZXgkNSIsIkRlcHRoQ29tcGFyaXNvbk1hdGVyaWFsIiwiZnJhZ21lbnQkNiIsInZlcnRleCQ2IiwiUEVSU1BFQ1RJVkVfQ0FNRVJBIiwiRG90U2NyZWVuTWF0ZXJpYWwiLCJhdmVyYWdlIiwib2Zmc2V0UmVwZWF0IiwiZnJhZ21lbnQkNyIsInZlcnRleCQ3Iiwic2V0QXZlcmFnZUVuYWJsZWQiLCJBVkVSQUdFIiwiRmlsbU1hdGVyaWFsIiwibm9pc2UiLCJzY2FubGluZXMiLCJncmV5c2NhbGUiLCJzZXBpYSIsInZpZ25ldHRlIiwiZXNraWwiLCJub2lzZUludGVuc2l0eSIsInNjYW5saW5lSW50ZW5zaXR5IiwiZ3JpZEludGVuc2l0eSIsImdyZXlzY2FsZUludGVuc2l0eSIsInNlcGlhSW50ZW5zaXR5IiwidmlnbmV0dGVPZmZzZXQiLCJ2aWduZXR0ZURhcmtuZXNzIiwic2NhbmxpbmVDb3VudCIsImdyaWRTY2FsZSIsImdyaWRMaW5lV2lkdGgiLCJmcmFnbWVudCQ4IiwidmVydGV4JDgiLCJzZXROb2lzZUVuYWJsZWQiLCJzZXRTY2FubGluZXNFbmFibGVkIiwic2V0R3JpZEVuYWJsZWQiLCJzZXRHcmV5c2NhbGVFbmFibGVkIiwic2V0U2VwaWFFbmFibGVkIiwic2V0VmlnbmV0dGVFbmFibGVkIiwic2V0RXNraWxFbmFibGVkIiwiTk9JU0UiLCJTQ0FOTElORVMiLCJHUklEIiwiR1JFWVNDQUxFIiwiU0VQSUEiLCJWSUdORVRURSIsIkVTS0lMIiwiR2xpdGNoTWF0ZXJpYWwiLCJ0UGVydHVyYiIsInNlZWQiLCJzZWVkWCIsInNlZWRZIiwiZGlzdG9ydGlvblgiLCJkaXN0b3J0aW9uWSIsImNvbFMiLCJmcmFnbWVudCQ5IiwidmVydGV4JDkiLCJHb2RSYXlzTWF0ZXJpYWwiLCJleHBvc3VyZSIsImNsYW1wTWF4IiwiTlVNX1NBTVBMRVNfRkxPQVQiLCJOVU1fU0FNUExFU19JTlQiLCJsaWdodFBvc2l0aW9uIiwiZnJhZ21lbnQkMTAiLCJ2ZXJ0ZXgkMTAiLCJMdW1pbm9zaXR5TWF0ZXJpYWwiLCJsdW1pbmFuY2VSYW5nZSIsImRpc3RpbmN0aW9uIiwibWFza0x1bWluYW5jZSIsImZyYWdtZW50JDExIiwidmVydGV4JDExIiwic2V0Q29sb3JPdXRwdXRFbmFibGVkIiwiY29sb3JPdXRwdXQiLCJzZXRMdW1pbmFuY2VSYW5nZUVuYWJsZWQiLCJDT0xPUiIsIlJBTkdFIiwiT3V0bGluZUJsZW5kTWF0ZXJpYWwiLCJlZGdlU3RyZW5ndGgiLCJwYXR0ZXJuU2NhbGUiLCJ2aXNpYmxlRWRnZUNvbG9yIiwiaGlkZGVuRWRnZUNvbG9yIiwiYWxwaGFCbGVuZGluZyIsInhSYXkiLCJwdWxzZSIsInRNYXNrIiwidEVkZ2VzIiwidFBhdHRlcm4iLCJmcmFnbWVudCQxMiIsInZlcnRleCQxMiIsInNldEFscGhhQmxlbmRpbmdFbmFibGVkIiwic2V0WFJheUVuYWJsZWQiLCJBTFBIQV9CTEVORElORyIsIlhfUkFZIiwiVVNFX1BBVFRFUk4iLCJPdXRsaW5lRWRnZXNNYXRlcmlhbCIsImZyYWdtZW50JDEzIiwidmVydGV4JDEzIiwiUGl4ZWxhdGlvbk1hdGVyaWFsIiwiZ3JhbnVsYXJpdHkiLCJmcmFnbWVudCQxNCIsInZlcnRleCQxNCIsIlJlYWxpc3RpY0Jva2VoTWF0ZXJpYWwiLCJyaW5ncyIsInNhbXBsZXMiLCJzaG93Rm9jdXMiLCJtYW51YWxEb0YiLCJwZW50YWdvbiIsInNoYWRlckZvY3VzIiwibHVtaW5hbmNlVGhyZXNob2xkIiwibHVtaW5hbmNlR2FpbiIsImZyaW5nZSIsImRpdGhlclN0cmVuZ3RoIiwiUklOR1NfSU5UIiwiUklOR1NfRkxPQVQiLCJTQU1QTEVTX0lOVCIsIlNBTVBMRVNfRkxPQVQiLCJmb2NhbFN0b3AiLCJmb2N1c0Nvb3JkcyIsImZvY2FsRGVwdGgiLCJmcmFnbWVudCQxNSIsInZlcnRleCQxNSIsInNldFNob3dGb2N1c0VuYWJsZWQiLCJzZXRNYW51YWxEZXB0aE9mRmllbGRFbmFibGVkIiwic2V0UGVudGFnb25FbmFibGVkIiwic2V0U2hhZGVyRm9jdXNFbmFibGVkIiwiU0hPV19GT0NVUyIsIk1BTlVBTF9ET0YiLCJQRU5UQUdPTiIsIlNIQURFUl9GT0NVUyIsIlNob2NrV2F2ZU1hdGVyaWFsIiwibWF4UmFkaXVzIiwid2F2ZVNpemUiLCJhbXBsaXR1ZGUiLCJjYW1lcmFEaXN0YW5jZSIsImZyYWdtZW50JDE2IiwidmVydGV4JDE2IiwiU01BQUJsZW5kTWF0ZXJpYWwiLCJ0V2VpZ2h0cyIsImZyYWdtZW50JDE3IiwidmVydGV4JDE3IiwiU01BQVdlaWdodHNNYXRlcmlhbCIsIk1BWF9TRUFSQ0hfU1RFUFNfSU5UIiwiTUFYX1NFQVJDSF9TVEVQU19GTE9BVCIsIkFSRUFURVhfTUFYX0RJU1RBTkNFIiwiQVJFQVRFWF9QSVhFTF9TSVpFIiwiQVJFQVRFWF9TVUJURVhfU0laRSIsIlNFQVJDSFRFWF9TSVpFIiwiU0VBUkNIVEVYX1BBQ0tFRF9TSVpFIiwidEFyZWEiLCJ0U2VhcmNoIiwiZnJhZ21lbnQkMTgiLCJ2ZXJ0ZXgkMTgiLCJUb25lTWFwcGluZ01hdGVyaWFsIiwibHVtaW5hbmNlTWFwIiwiYXZlcmFnZUx1bWluYW5jZSIsIm1heEx1bWluYW5jZSIsIm1pZGRsZUdyZXkiLCJmcmFnbWVudCQxOSIsInZlcnRleCQxOSIsIlBhc3MiLCJxdWFkIiwicmVuZGVyVG9TY3JlZW4iLCJuZWVkc1N3YXAiLCJpbnB1dEJ1ZmZlciIsIm91dHB1dEJ1ZmZlciIsIl9QYXNzIiwiQmx1clBhc3MiLCJyZW5kZXJUYXJnZXRYIiwicmVuZGVyVGFyZ2V0WSIsInJlc29sdXRpb25TY2FsZSIsImNvbnZvbHV0aW9uTWF0ZXJpYWwiLCJkaXRoZXJlZENvbnZvbHV0aW9uTWF0ZXJpYWwiLCJnZXRLZXJuZWwiLCJkZXN0UlQiLCJsYXN0UlQiLCJCbG9vbVBhc3MiLCJibHVyUGFzcyIsImNvbWJpbmVNYXRlcmlhbCIsImx1bWlub3NpdHlNYXRlcmlhbCIsImJsZW5kIiwiaW5pdGlhbGl6ZSIsIkJva2VoUGFzcyIsIkNsZWFyTWFza1Bhc3MiLCJDbGVhclBhc3MiLCJEb3RTY3JlZW5QYXNzIiwiRmlsbVBhc3MiLCJzY2FubGluZURlbnNpdHkiLCJHbGl0Y2hQYXNzIiwicGVydHVyYk1hcCIsImdlbmVyYXRlUGVydHVyYk1hcCIsImR0U2l6ZSIsIkdsaXRjaE1vZGUiLCJTUE9SQURJQyIsImJyZWFrUG9pbnQiLCJyYW5kb21JbnQiLCJkdCIsIkNPTlNUQU5UX1dJTEQiLCJyYW5kb21GbG9hdCIsIkNPTlNUQU5UX01JTEQiLCJSZW5kZXJQYXNzIiwiY2xlYXJQYXNzIiwibGlnaHRTb3VyY2UiLCJHb2RSYXlzUGFzcyIsImxpZ2h0U2NlbmUiLCJtYWluU2NlbmUiLCJtYWluQ2FtZXJhIiwicmVuZGVyVGFyZ2V0TWFzayIsInJlbmRlclBhc3NMaWdodCIsInJlbmRlclBhc3NNYXNrIiwic2NyZWVuUG9zaXRpb24iLCJnb2RSYXlzTWF0ZXJpYWwiLCJNYXNrUGFzcyIsIndyaXRlVmFsdWUiLCJjbGVhclZhbHVlIiwiS0VFUCIsIlNoYWRlclBhc3MiLCJ0ZXh0dXJlSUQiLCJPdXRsaW5lUGFzcyIsInJlbmRlclRhcmdldERlcHRoIiwicmVuZGVyVGFyZ2V0RWRnZXMiLCJyZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMiLCJyZW5kZXJQYXNzRGVwdGgiLCJjb3B5UGFzcyIsIm91dGxpbmVFZGdlc01hdGVyaWFsIiwib3V0bGluZUJsZW5kTWF0ZXJpYWwiLCJibHVyIiwic2VsZWN0aW9uIiwicHVsc2VTcGVlZCIsInNlbGVjdGlvbkxheWVyIiwic2V0UGF0dGVyblRleHR1cmUiLCJjbGVhclNlbGVjdGlvbiIsInNldFNlbGVjdGlvblZpc2libGUiLCJQaXhlbGF0aW9uUGFzcyIsInNldFJlc29sdXRpb24iLCJSZWFsaXN0aWNCb2tlaFBhc3MiLCJTYXZlUGFzcyIsInJlc2l6ZSIsIlNob2NrV2F2ZVBhc3MiLCJlcGljZW50ZXIiLCJzcGVlZCIsInNob2NrV2F2ZU1hdGVyaWFsIiwiY29weU1hdGVyaWFsIiwiSEFMRl9QSSIsInNlYXJjaEltYWdlIiwiYXJlYUltYWdlIiwiU01BQVBhc3MiLCJyZW5kZXJUYXJnZXRDb2xvckVkZ2VzIiwicmVuZGVyVGFyZ2V0V2VpZ2h0cyIsImNvbG9yRWRnZXNNYXRlcmlhbCIsIndlaWdodHNNYXRlcmlhbCIsInNlYXJjaFRleHR1cmUiLCJhcmVhVGV4dHVyZSIsImJsZW5kTWF0ZXJpYWwiLCJUZXh0dXJlUGFzcyIsIm9wYWNpdHlTb3VyY2UiLCJUb25lTWFwcGluZ1Bhc3MiLCJyZW5kZXJUYXJnZXRMdW1pbm9zaXR5IiwicmVuZGVyVGFyZ2V0QWRhcHRlZCIsInJlbmRlclRhcmdldFByZXZpb3VzIiwiYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwiLCJ0b25lTWFwcGluZ01hdGVyaWFsIiwiYWRhcHRpdmUiLCJsb2cyIiwiQURBUFRFRF9MVU1JTkFOQ0UiLCJFZmZlY3RDb21wb3NlciIsInBhc3NlcyIsIm9sZFNpemUiLCJuZXdTaXplIiwib2xkUmVuZGVyZXIiLCJwYXJlbnROb2RlIiwiZHJhd2luZ0J1ZmZlclNpemUiLCJzaG93V2FybiIsIlBvc3RQcm9jZXNzb3JNb2R1bGUiLCJkZWJ1ZyIsImNvbXBvc2VyIiwicmVwbGFjZVJlbmRlcmVyIiwiYWRkUGFzcyIsImN1cnJlbnRQYXNzIiwiX3Bhc3MiLCJwb2x5ZmlsbCIsIl90aGlzNSIsIl90aGlzNiIsImJvb2wiLCJFdmVudHNQYXRjaE1vZHVsZSIsIm9yaWdpbk9iamVjdCIsInBhdGNoRXZlbnRzIiwiVmlydHVhbE1vdXNlTW9kdWxlIiwiZ2xvYmFsTW92ZW1lbnQiLCJjdXN0b21YIiwiY3VzdG9tWSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImNsaWVudFgiLCJjbGllbnRZIiwibW91c2UiLCJyZWN0IiwicHJvamVjdGlvblBsYW5lIiwicmVxdWlyZSIsImV2IiwiZ2xvYmFsWCIsImdsb2JhbFkiLCJwb2ludGVyTG9ja0VsZW1lbnQiLCJtb3ZlbWVudFgiLCJtb3ZlbWVudFkiLCJob3ZlcnMiLCJuZXN0ZWQiLCJpc0hvdmVyZWQiLCJDb250cm9sc01vZHVsZSIsImNvbnRyb2xzIiwidXBkYXRlTG9vcCIsIkZvZ01vZHVsZSIsIlN0YXRlTW9kdWxlIiwiaXNFcXVhbCIsImlzRXF1YWxEZWZhdWx0IiwiYWN0aW9uR2VuZXJhdGUiLCJlcXVhbENoZWNrIiwiY29uZmlndXJhdGlvbiIsImN1cnJlbnRDb25maWciLCJwcmV2Q29uZmlnIiwiY29uZmlnIiwiZGVmYXVsdCIsImNvbmZpZ3MiLCJ1cGRhdGVzIiwiY29uZmlnTmFtZSIsInRydWVWYWwiLCJmYWxzZVZhbCIsIl9FdmVudERpc3BhdGNoZXIiLCJldmVudEhhbmRsZXIiLCJUaHJlZU9yYml0Q29udHJvbHMiLCJtaW5ab29tIiwibWF4Wm9vbSIsIm1pblBvbGFyQW5nbGUiLCJtYXhQb2xhckFuZ2xlIiwibWluQXppbXV0aEFuZ2xlIiwibWF4QXppbXV0aEFuZ2xlIiwiZW5hYmxlRGFtcGluZyIsImRhbXBpbmdGYWN0b3IiLCJlbmFibGVab29tIiwiem9vbVNwZWVkIiwiZW5hYmxlUm90YXRlIiwicm90YXRlU3BlZWQiLCJlbmFibGVQYW4iLCJrZXlQYW5TcGVlZCIsImF1dG9Sb3RhdGUiLCJhdXRvUm90YXRlU3BlZWQiLCJlbmFibGVLZXlzIiwiVVAiLCJCT1RUT00iLCJtb3VzZUJ1dHRvbnMiLCJPUkJJVCIsIk1PVVNFIiwiWk9PTSIsIlBBTiIsInRhcmdldDAiLCJwb3NpdGlvbjAiLCJ6b29tMCIsImdldFBvbGFyQW5nbGUiLCJnZXRBemltdXRoYWxBbmdsZSIsImNoYW5nZUV2ZW50IiwiU1RBVEUiLCJOT05FIiwicXVhdCIsInNwaGVyaWNhbCIsInJvdGF0ZUxlZnQiLCJnZXRBdXRvUm90YXRpb25BbmdsZSIsInNwaGVyaWNhbERlbHRhIiwicGFuT2Zmc2V0IiwicXVhdEludmVyc2UiLCJ6b29tQ2hhbmdlZCIsImxhc3RQb3NpdGlvbiIsImxhc3RRdWF0ZXJuaW9uIiwib25Db250ZXh0TWVudSIsIm9uTW91c2VEb3duIiwib25Nb3VzZVdoZWVsIiwib25Ub3VjaFN0YXJ0Iiwib25Ub3VjaEVuZCIsIm9uVG91Y2hNb3ZlIiwib25Nb3VzZU1vdmUiLCJvbk1vdXNlVXAiLCJvbktleURvd24iLCJST1RBVEUiLCJET0xMWSIsIlRPVUNIX1JPVEFURSIsIlRPVUNIX0RPTExZIiwiVE9VQ0hfUEFOIiwib2JqZWN0TWF0cml4IiwiZGVsdGFYIiwiZGVsdGFZIiwidGFyZ2V0RGlzdGFuY2UiLCJwYW5MZWZ0IiwiY2xpZW50SGVpZ2h0IiwicGFuVXAiLCJjbGllbnRXaWR0aCIsImRvbGx5U2NhbGUiLCJyb3RhdGVTdGFydCIsImRvbGx5U3RhcnQiLCJwYW5TdGFydCIsInJvdGF0ZUVuZCIsInJvdGF0ZURlbHRhIiwicm90YXRlVXAiLCJkb2xseUVuZCIsImRvbGx5RGVsdGEiLCJkb2xseUluIiwiZ2V0Wm9vbVNjYWxlIiwiZG9sbHlPdXQiLCJwYW5FbmQiLCJwYW5EZWx0YSIsInBhbiIsImtleUNvZGUiLCJ0b3VjaGVzIiwicGFnZVgiLCJwYWdlWSIsImJ1dHRvbiIsImhhbmRsZU1vdXNlRG93blJvdGF0ZSIsImhhbmRsZU1vdXNlRG93bkRvbGx5IiwiaGFuZGxlTW91c2VEb3duUGFuIiwic3RhcnRFdmVudCIsImhhbmRsZU1vdXNlTW92ZVJvdGF0ZSIsImhhbmRsZU1vdXNlTW92ZURvbGx5IiwiaGFuZGxlTW91c2VNb3ZlUGFuIiwiZW5kRXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJoYW5kbGVNb3VzZVdoZWVsIiwiaGFuZGxlS2V5RG93biIsImhhbmRsZVRvdWNoU3RhcnRSb3RhdGUiLCJoYW5kbGVUb3VjaFN0YXJ0RG9sbHkiLCJoYW5kbGVUb3VjaFN0YXJ0UGFuIiwiaGFuZGxlVG91Y2hNb3ZlUm90YXRlIiwiaGFuZGxlVG91Y2hNb3ZlRG9sbHkiLCJoYW5kbGVUb3VjaE1vdmVQYW4iLCJfQ29udHJvbHNNb2R1bGUiLCJPcmJpdENvbnRyb2xzTW9kdWxlIiwiZm9sbG93Iiwic2V0Q29udHJvbHMiLCJzZXRVcGRhdGUiLCJ1cGRhdGVQcm9jZXNzb3IiLCJEeW5hbWljR2VvbWV0cnlNb2R1bGUiLCJnXyIsInVwZGF0ZVBhcmFtcyIsIl9sb29wIiwiVGV4dHVyZU1vZHVsZSIsIl9tYXRlcmlhbCIsIl9yZWYkdHlwZSIsIl9yZWYkb2Zmc2V0IiwiX3JlZiRyZXBlYXQiLCJfcmVmJHdyYXAiLCJfcmVmJG1hcHBpbmciLCJfcmVmJGZpeCIsInRleCIsImlzRGVmZXJyZWQiLCJBbmltYXRpb25Nb2R1bGUiLCJfbWVzaCIsIkRlZmluZU1vZHVsZSIsIl9JbXBvcnRlciIsIk1vZGVsIiwiX2dldFByb3RvdHlwZU9mMiIsIkNhbWVyYU1vZHVsZSIsInRoaXMiLCJTdGF0c01vZHVsZSIsIlN0YXRzIiwic2hvd1BhbmVsIiwiZG9tIiwicHJlUHJvY2VzcyIsImJlZ2luIiwicG9zdFByb2Nlc3MiLCJ1bnNoaWZ0Il0sIm1hcHBpbmdzIjoiO0FBeVJBLFNBQVMsZUFBZSxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUU7RUFDOUMsSUFBSSxFQUFFLFFBQVEsWUFBWSxXQUFXLENBQUMsRUFBRTtJQUN0QyxNQUFNLElBQUksU0FBUyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7R0FDMUQ7Q0FDRjs7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7RUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7SUFDckMsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUM7SUFDdkQsVUFBVSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDL0IsSUFBSSxPQUFPLElBQUksVUFBVSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ3RELE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7R0FDM0Q7Q0FDRjs7QUFFRCxTQUFTLFlBQVksQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRTtFQUMxRCxJQUFJLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxD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LENBQVV5SSxHQUFLRixFQUFMLENBQVVJLEVBQVYsQ0FBZUwsR0FBS0ksRUFBTCxDQUFVRixFQUFuQyxDQUNBLEtBQUtuZSxFQUFMLENBQVVvZSxHQUFLRixFQUFMLENBQVVDLEVBQVYsQ0FBZUYsR0FBS0ksRUFBTCxDQUFVQyxFQUFuQyxDQUVBLENBUEQsUUFPWTVKLFFBQVUsS0FBZixDQUF1QixDQUU3QixLQUFLZSxFQUFMLENBQVV3SSxHQUFLQyxFQUFMLENBQVVDLEVBQVYsQ0FBZUMsR0FBS0MsRUFBTCxDQUFVQyxFQUFuQyxDQUNBLEtBQUs1SSxFQUFMLENBQVUwSSxHQUFLQyxFQUFMLENBQVVGLEVBQVYsQ0FBZUYsR0FBS0MsRUFBTCxDQUFVSSxFQUFuQyxDQUNBLEtBQUszSSxFQUFMLENBQVV5SSxHQUFLRixFQUFMLENBQVVJLEVBQVYsQ0FBZUwsR0FBS0ksRUFBTCxDQUFVRixFQUFuQyxDQUNBLEtBQUtuZSxFQUFMLENBQVVvZSxHQUFLRixFQUFMLENBQVVDLEVBQVYsQ0FBZUYsR0FBS0ksRUFBTCxDQUFVQyxFQUFuQyxDQUVBLENBUE0sUUFPSzVKLFFBQVUsS0FBZixDQUF1QixDQUU3QixLQUFLZSxFQUFMLENBQVV3SSxHQUFLQyxFQUFMLENBQVVDLEVBQVYsQ0FBZUMsR0FBS0MsRUFBTCxDQUFVQyxFQUFuQyxDQUNBLEtBQUs1SSxFQUFMLENBQVUwSSxHQUFLQyxFQUFMLENBQVVGLEVBQVYsQ0FBZUYsR0FBS0MsRUFBTCxDQUFVSSxFQUFuQyxDQUNBLEtBQUszSSxFQUFMLENBQVV5SSxHQUFLRixFQUFMLENBQVVJLEVBQVYsQ0FBZUwsR0FBS0ksRUFBTCxDQUFVRixFQUFuQyxDQUNBLEtBQUtuZSxFQUFMLENBQVVvZSxHQUFLRixFQUFMLENBQVVDLEVBQVYsQ0FBZUYsR0FBS0ksRUFBTCxDQUFVQyxFQUFuQyxDQUVBLENBUE0sUUFPSzVKLFFBQVUsS0FBZixDQUF1QixDQUU3QixLQUFLZSxFQUFMLENBQVV3SSxHQUFLQyxFQUFMLENBQVVDLEVBQVYsQ0FBZUMsR0FBS0MsRUFBTCxDQUFVQyxFQUFuQyxDQUNBLEtBQUs1SSxFQUFMLENBQVUwSSxHQUFLQyxFQUFMLENBQVVGLEVBQVYsQ0FBZUYsR0FBS0MsRUFBTCxDQUFVSSxFQUFuQyxDQUNBLEtBQUszSSxFQUFMLENBQVV5SSxHQUFLRixFQUFMLENBQVVJLEVBQVYsQ0FBZUwsR0FBS0ksRUFBTCxDQUFVRixFQUFuQyxDQUNBLEtBQUtuZSxFQUFMLENBQVVvZSxHQUFLRixFQUFMLENBQVVDLEVBQVYsQ0FBZUYsR0FBS0ksRUFBTCxDQUFVQyxFQUFuQyxDQUVBLENBUE0sUUFPSzVKLFFBQVUsS0FBZixDQUF1QixDQUU3QixLQUFLZSxFQUFMLENBQVV3SSxHQUFLQyxFQUFMLENBQVVDLEVBQVYsQ0FBZUMsR0FBS0MsRUFBTCxDQUFVQyxFQUFuQyxDQUNBLEtBQUs1SSxFQUFMLENBQVUwSSxHQUFLQyxFQUFMLENBQVVGLEVBQVYsQ0FBZUYsR0FBS0MsRUFBTCxDQUFVSSxFQUFuQyxDQUNBLEtBQUszSSxFQUFMLENBQVV5SSxHQUFLRixFQUFMLENBQVVJLEVBQVYsQ0FBZUwsR0FBS0ksRUFBTCxDQUFVRixFQUFuQyxDQUNBLEtBQUtuZSxFQUFMLENBQVVvZSxHQUFLRixFQUFMLENBQVVDLEVBQVYsQ0FBZUYsR0FBS0ksRUFBTCxDQUFVQyxFQUFuQyxDQUVBLENBUE0sUUFPSzVKLFFBQVUsS0FBZixDQUF1QixDQUU3QixLQUFLZSxFQUFMLENBQVV3SSxHQUFLQyxFQUFMLENBQVVDLEVBQVYsQ0FBZUMsR0FBS0MsRUFBTCxDQUFVQyxFQUFuQyxDQUNBLEtBQUs1SSxFQUFMLENBQVUwSSxHQUFLQyxFQUFMLENBQVVGLEVBQVYsQ0FBZUYsR0FBS0MsRUFBTCxDQUFVSSxFQUFuQyxDQUNBLEtBQUszSSxFQUFMLENBQVV5SSxHQUFLRixFQUFMLENBQVVJLEVBQVYsQ0FBZUwsR0FBS0ksRUFBTCxDQUFVRixFQUFuQyxDQUNBLEtBQUtuZSxFQUFMLENBQVVvZSxHQUFLRixFQUFMLENBQVVDLEVBQVYsQ0FBZUYsR0FBS0ksRUFBTCxDQUFVQyxFQUFuQyxD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Q0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQ3JnQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQWM7QUFDcGYsT0FBTyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2ZixDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxD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